1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "bufio"
18 "bytes"
19 "fmt"
20 "io"
21 "strconv"
22 "strings"
23
24 "github.com/prometheus/procfs/internal/util"
25 )
26
27
28 type Fscacheinfo struct {
29
30 IndexCookiesAllocated uint64
31
32 DataStorageCookiesAllocated uint64
33
34 SpecialCookiesAllocated uint64
35
36 ObjectsAllocated uint64
37
38 ObjectAllocationsFailure uint64
39
40 ObjectsAvailable uint64
41
42 ObjectsDead uint64
43
44 ObjectsWithoutCoherencyCheck uint64
45
46 ObjectsWithCoherencyCheck uint64
47
48 ObjectsNeedCoherencyCheckUpdate uint64
49
50 ObjectsDeclaredObsolete uint64
51
52 PagesMarkedAsBeingCached uint64
53
54 UncachePagesRequestSeen uint64
55
56 AcquireCookiesRequestSeen uint64
57
58 AcquireRequestsWithNullParent uint64
59
60 AcquireRequestsRejectedNoCacheAvailable uint64
61
62 AcquireRequestsSucceeded uint64
63
64 AcquireRequestsRejectedDueToError uint64
65
66 AcquireRequestsFailedDueToEnomem uint64
67
68 LookupsNumber uint64
69
70 LookupsNegative uint64
71
72 LookupsPositive uint64
73
74 ObjectsCreatedByLookup uint64
75
76 LookupsTimedOutAndRequed uint64
77 InvalidationsNumber uint64
78 InvalidationsRunning uint64
79
80 UpdateCookieRequestSeen uint64
81
82 UpdateRequestsWithNullParent uint64
83
84 UpdateRequestsRunning uint64
85
86 RelinquishCookiesRequestSeen uint64
87
88 RelinquishCookiesWithNullParent uint64
89
90 RelinquishRequestsWaitingCompleteCreation uint64
91
92 RelinquishRetries uint64
93
94 AttributeChangedRequestsSeen uint64
95
96 AttributeChangedRequestsQueued uint64
97
98 AttributeChangedRejectDueToEnobufs uint64
99
100 AttributeChangedFailedDueToEnomem uint64
101
102 AttributeChangedOps uint64
103
104 AllocationRequestsSeen uint64
105
106 AllocationOkRequests uint64
107
108 AllocationWaitingOnLookup uint64
109
110 AllocationsRejectedDueToEnobufs uint64
111
112 AllocationsAbortedDueToErestartsys uint64
113
114 AllocationOperationsSubmitted uint64
115
116 AllocationsWaitedForCPU uint64
117
118 AllocationsAbortedDueToObjectDeath uint64
119
120 RetrievalsReadRequests uint64
121
122 RetrievalsOk uint64
123
124 RetrievalsWaitingLookupCompletion uint64
125
126 RetrievalsReturnedEnodata uint64
127
128 RetrievalsRejectedDueToEnobufs uint64
129
130 RetrievalsAbortedDueToErestartsys uint64
131
132 RetrievalsFailedDueToEnomem uint64
133
134 RetrievalsRequests uint64
135
136 RetrievalsWaitingCPU uint64
137
138 RetrievalsAbortedDueToObjectDeath uint64
139
140 StoreWriteRequests uint64
141
142 StoreSuccessfulRequests uint64
143
144 StoreRequestsOnPendingStorage uint64
145
146 StoreRequestsRejectedDueToEnobufs uint64
147
148 StoreRequestsFailedDueToEnomem uint64
149
150 StoreRequestsSubmitted uint64
151
152 StoreRequestsRunning uint64
153
154 StorePagesWithRequestsProcessing uint64
155
156 StoreRequestsDeleted uint64
157
158 StoreRequestsOverStoreLimit uint64
159
160 ReleaseRequestsAgainstPagesWithNoPendingStorage uint64
161
162 ReleaseRequestsAgainstPagesStoredByTimeLockGranted uint64
163
164 ReleaseRequestsIgnoredDueToInProgressStore uint64
165
166 PageStoresCancelledByReleaseRequests uint64
167 VmscanWaiting uint64
168
169 OpsPending uint64
170
171 OpsRunning uint64
172
173 OpsEnqueued uint64
174
175 OpsCancelled uint64
176
177 OpsRejected uint64
178
179 OpsInitialised uint64
180
181 OpsDeferred uint64
182
183 OpsReleased uint64
184
185 OpsGarbageCollected uint64
186
187 CacheopAllocationsinProgress uint64
188
189 CacheopLookupObjectInProgress uint64
190
191 CacheopLookupCompleteInPorgress uint64
192
193 CacheopGrabObjectInProgress uint64
194 CacheopInvalidations uint64
195
196 CacheopUpdateObjectInProgress uint64
197
198 CacheopDropObjectInProgress uint64
199
200 CacheopPutObjectInProgress uint64
201
202 CacheopAttributeChangeInProgress uint64
203
204 CacheopSyncCacheInProgress uint64
205
206 CacheopReadOrAllocPageInProgress uint64
207
208 CacheopReadOrAllocPagesInProgress uint64
209
210 CacheopAllocatePageInProgress uint64
211
212 CacheopAllocatePagesInProgress uint64
213
214 CacheopWritePagesInProgress uint64
215
216 CacheopUncachePagesInProgress uint64
217
218 CacheopDissociatePagesInProgress uint64
219
220 CacheevLookupsAndCreationsRejectedLackSpace uint64
221
222 CacheevStaleObjectsDeleted uint64
223
224 CacheevRetiredWhenReliquished uint64
225
226 CacheevObjectsCulled uint64
227 }
228
229
230
231 func (fs FS) Fscacheinfo() (Fscacheinfo, error) {
232 b, err := util.ReadFileNoStat(fs.proc.Path("fs/fscache/stats"))
233 if err != nil {
234 return Fscacheinfo{}, err
235 }
236
237 m, err := parseFscacheinfo(bytes.NewReader(b))
238 if err != nil {
239 return Fscacheinfo{}, fmt.Errorf("%s: Cannot parse %v: %w", ErrFileParse, m, err)
240 }
241
242 return *m, nil
243 }
244
245 func setFSCacheFields(fields []string, setFields ...*uint64) error {
246 var err error
247 if len(fields) < len(setFields) {
248 return fmt.Errorf("%s: Expected %d, but got %d: %w", ErrFileParse, len(setFields), len(fields), err)
249 }
250
251 for i := range setFields {
252 *setFields[i], err = strconv.ParseUint(strings.Split(fields[i], "=")[1], 0, 64)
253 if err != nil {
254 return err
255 }
256 }
257 return nil
258 }
259
260 func parseFscacheinfo(r io.Reader) (*Fscacheinfo, error) {
261 var m Fscacheinfo
262 s := bufio.NewScanner(r)
263 for s.Scan() {
264 fields := strings.Fields(s.Text())
265 if len(fields) < 2 {
266 return nil, fmt.Errorf("%w: malformed Fscacheinfo line: %q", ErrFileParse, s.Text())
267 }
268
269 switch fields[0] {
270 case "Cookies:":
271 err := setFSCacheFields(fields[1:], &m.IndexCookiesAllocated, &m.DataStorageCookiesAllocated,
272 &m.SpecialCookiesAllocated)
273 if err != nil {
274 return &m, err
275 }
276 case "Objects:":
277 err := setFSCacheFields(fields[1:], &m.ObjectsAllocated, &m.ObjectAllocationsFailure,
278 &m.ObjectsAvailable, &m.ObjectsDead)
279 if err != nil {
280 return &m, err
281 }
282 case "ChkAux":
283 err := setFSCacheFields(fields[2:], &m.ObjectsWithoutCoherencyCheck, &m.ObjectsWithCoherencyCheck,
284 &m.ObjectsNeedCoherencyCheckUpdate, &m.ObjectsDeclaredObsolete)
285 if err != nil {
286 return &m, err
287 }
288 case "Pages":
289 err := setFSCacheFields(fields[2:], &m.PagesMarkedAsBeingCached, &m.UncachePagesRequestSeen)
290 if err != nil {
291 return &m, err
292 }
293 case "Acquire:":
294 err := setFSCacheFields(fields[1:], &m.AcquireCookiesRequestSeen, &m.AcquireRequestsWithNullParent,
295 &m.AcquireRequestsRejectedNoCacheAvailable, &m.AcquireRequestsSucceeded, &m.AcquireRequestsRejectedDueToError,
296 &m.AcquireRequestsFailedDueToEnomem)
297 if err != nil {
298 return &m, err
299 }
300 case "Lookups:":
301 err := setFSCacheFields(fields[1:], &m.LookupsNumber, &m.LookupsNegative, &m.LookupsPositive,
302 &m.ObjectsCreatedByLookup, &m.LookupsTimedOutAndRequed)
303 if err != nil {
304 return &m, err
305 }
306 case "Invals":
307 err := setFSCacheFields(fields[2:], &m.InvalidationsNumber, &m.InvalidationsRunning)
308 if err != nil {
309 return &m, err
310 }
311 case "Updates:":
312 err := setFSCacheFields(fields[1:], &m.UpdateCookieRequestSeen, &m.UpdateRequestsWithNullParent,
313 &m.UpdateRequestsRunning)
314 if err != nil {
315 return &m, err
316 }
317 case "Relinqs:":
318 err := setFSCacheFields(fields[1:], &m.RelinquishCookiesRequestSeen, &m.RelinquishCookiesWithNullParent,
319 &m.RelinquishRequestsWaitingCompleteCreation, &m.RelinquishRetries)
320 if err != nil {
321 return &m, err
322 }
323 case "AttrChg:":
324 err := setFSCacheFields(fields[1:], &m.AttributeChangedRequestsSeen, &m.AttributeChangedRequestsQueued,
325 &m.AttributeChangedRejectDueToEnobufs, &m.AttributeChangedFailedDueToEnomem, &m.AttributeChangedOps)
326 if err != nil {
327 return &m, err
328 }
329 case "Allocs":
330 if strings.Split(fields[2], "=")[0] == "n" {
331 err := setFSCacheFields(fields[2:], &m.AllocationRequestsSeen, &m.AllocationOkRequests,
332 &m.AllocationWaitingOnLookup, &m.AllocationsRejectedDueToEnobufs, &m.AllocationsAbortedDueToErestartsys)
333 if err != nil {
334 return &m, err
335 }
336 } else {
337 err := setFSCacheFields(fields[2:], &m.AllocationOperationsSubmitted, &m.AllocationsWaitedForCPU,
338 &m.AllocationsAbortedDueToObjectDeath)
339 if err != nil {
340 return &m, err
341 }
342 }
343 case "Retrvls:":
344 if strings.Split(fields[1], "=")[0] == "n" {
345 err := setFSCacheFields(fields[1:], &m.RetrievalsReadRequests, &m.RetrievalsOk, &m.RetrievalsWaitingLookupCompletion,
346 &m.RetrievalsReturnedEnodata, &m.RetrievalsRejectedDueToEnobufs, &m.RetrievalsAbortedDueToErestartsys,
347 &m.RetrievalsFailedDueToEnomem)
348 if err != nil {
349 return &m, err
350 }
351 } else {
352 err := setFSCacheFields(fields[1:], &m.RetrievalsRequests, &m.RetrievalsWaitingCPU, &m.RetrievalsAbortedDueToObjectDeath)
353 if err != nil {
354 return &m, err
355 }
356 }
357 case "Stores":
358 if strings.Split(fields[2], "=")[0] == "n" {
359 err := setFSCacheFields(fields[2:], &m.StoreWriteRequests, &m.StoreSuccessfulRequests,
360 &m.StoreRequestsOnPendingStorage, &m.StoreRequestsRejectedDueToEnobufs, &m.StoreRequestsFailedDueToEnomem)
361 if err != nil {
362 return &m, err
363 }
364 } else {
365 err := setFSCacheFields(fields[2:], &m.StoreRequestsSubmitted, &m.StoreRequestsRunning,
366 &m.StorePagesWithRequestsProcessing, &m.StoreRequestsDeleted, &m.StoreRequestsOverStoreLimit)
367 if err != nil {
368 return &m, err
369 }
370 }
371 case "VmScan":
372 err := setFSCacheFields(fields[2:], &m.ReleaseRequestsAgainstPagesWithNoPendingStorage,
373 &m.ReleaseRequestsAgainstPagesStoredByTimeLockGranted, &m.ReleaseRequestsIgnoredDueToInProgressStore,
374 &m.PageStoresCancelledByReleaseRequests, &m.VmscanWaiting)
375 if err != nil {
376 return &m, err
377 }
378 case "Ops":
379 if strings.Split(fields[2], "=")[0] == "pend" {
380 err := setFSCacheFields(fields[2:], &m.OpsPending, &m.OpsRunning, &m.OpsEnqueued, &m.OpsCancelled, &m.OpsRejected)
381 if err != nil {
382 return &m, err
383 }
384 } else {
385 err := setFSCacheFields(fields[2:], &m.OpsInitialised, &m.OpsDeferred, &m.OpsReleased, &m.OpsGarbageCollected)
386 if err != nil {
387 return &m, err
388 }
389 }
390 case "CacheOp:":
391 if strings.Split(fields[1], "=")[0] == "alo" {
392 err := setFSCacheFields(fields[1:], &m.CacheopAllocationsinProgress, &m.CacheopLookupObjectInProgress,
393 &m.CacheopLookupCompleteInPorgress, &m.CacheopGrabObjectInProgress)
394 if err != nil {
395 return &m, err
396 }
397 } else if strings.Split(fields[1], "=")[0] == "inv" {
398 err := setFSCacheFields(fields[1:], &m.CacheopInvalidations, &m.CacheopUpdateObjectInProgress,
399 &m.CacheopDropObjectInProgress, &m.CacheopPutObjectInProgress, &m.CacheopAttributeChangeInProgress,
400 &m.CacheopSyncCacheInProgress)
401 if err != nil {
402 return &m, err
403 }
404 } else {
405 err := setFSCacheFields(fields[1:], &m.CacheopReadOrAllocPageInProgress, &m.CacheopReadOrAllocPagesInProgress,
406 &m.CacheopAllocatePageInProgress, &m.CacheopAllocatePagesInProgress, &m.CacheopWritePagesInProgress,
407 &m.CacheopUncachePagesInProgress, &m.CacheopDissociatePagesInProgress)
408 if err != nil {
409 return &m, err
410 }
411 }
412 case "CacheEv:":
413 err := setFSCacheFields(fields[1:], &m.CacheevLookupsAndCreationsRejectedLackSpace, &m.CacheevStaleObjectsDeleted,
414 &m.CacheevRetiredWhenReliquished, &m.CacheevObjectsCulled)
415 if err != nil {
416 return &m, err
417 }
418 }
419 }
420
421 return &m, nil
422 }
423
View as plain text