blob: c5855719a4b09d34270726615cea60c51e4b65f3 [file] [edit]
// Copyright The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package xfs_test
import (
"strings"
"testing"
"github.com/google/go-cmp/cmp"
"github.com/prometheus/procfs/xfs"
)
func TestParseStats(t *testing.T) {
tests := []struct {
name string
s string
fs bool
stats *xfs.Stats
invalid bool
}{
{
name: "empty file OK",
},
{
name: "short or empty lines and unknown labels ignored",
s: "one\n\ntwo 1 2 3\n",
stats: &xfs.Stats{},
},
{
name: "bad uint32",
s: "extent_alloc XXX",
invalid: true,
},
{
name: "bad uint64",
s: "xpc XXX",
invalid: true,
},
{
name: "extent_alloc bad",
s: "extent_alloc 1",
invalid: true,
},
{
name: "extent_alloc OK",
s: "extent_alloc 1 2 3 4",
stats: &xfs.Stats{
ExtentAllocation: xfs.ExtentAllocationStats{
ExtentsAllocated: 1,
BlocksAllocated: 2,
ExtentsFreed: 3,
BlocksFreed: 4,
},
},
},
{
name: "abt bad",
s: "abt 1",
invalid: true,
},
{
name: "abt OK",
s: "abt 1 2 3 4",
stats: &xfs.Stats{
AllocationBTree: xfs.BTreeStats{
Lookups: 1,
Compares: 2,
RecordsInserted: 3,
RecordsDeleted: 4,
},
},
},
{
name: "blk_map bad",
s: "blk_map 1",
invalid: true,
},
{
name: "blk_map OK",
s: "blk_map 1 2 3 4 5 6 7",
stats: &xfs.Stats{
BlockMapping: xfs.BlockMappingStats{
Reads: 1,
Writes: 2,
Unmaps: 3,
ExtentListInsertions: 4,
ExtentListDeletions: 5,
ExtentListLookups: 6,
ExtentListCompares: 7,
},
},
},
{
name: "bmbt bad",
s: "bmbt 1",
invalid: true,
},
{
name: "bmbt OK",
s: "bmbt 1 2 3 4",
stats: &xfs.Stats{
BlockMapBTree: xfs.BTreeStats{
Lookups: 1,
Compares: 2,
RecordsInserted: 3,
RecordsDeleted: 4,
},
},
},
{
name: "dir bad",
s: "dir 1",
invalid: true,
},
{
name: "dir OK",
s: "dir 1 2 3 4",
stats: &xfs.Stats{
DirectoryOperation: xfs.DirectoryOperationStats{
Lookups: 1,
Creates: 2,
Removes: 3,
Getdents: 4,
},
},
},
{
name: "trans bad",
s: "trans 1",
invalid: true,
},
{
name: "trans OK",
s: "trans 1 2 3",
stats: &xfs.Stats{
Transaction: xfs.TransactionStats{
Sync: 1,
Async: 2,
Empty: 3,
},
},
},
{
name: "ig bad",
s: "ig 1",
invalid: true,
},
{
name: "ig OK",
s: "ig 1 2 3 4 5 6 7",
stats: &xfs.Stats{
InodeOperation: xfs.InodeOperationStats{
Attempts: 1,
Found: 2,
Recycle: 3,
Missed: 4,
Duplicate: 5,
Reclaims: 6,
AttributeChange: 7,
},
},
},
{
name: "log bad",
s: "log 1",
invalid: true,
},
{
name: "log OK",
s: "log 1 2 3 4 5",
stats: &xfs.Stats{
LogOperation: xfs.LogOperationStats{
Writes: 1,
Blocks: 2,
NoInternalBuffers: 3,
Force: 4,
ForceSleep: 5,
},
},
},
{
name: "rw bad",
s: "rw 1",
invalid: true,
},
{
name: "rw OK",
s: "rw 1 2",
stats: &xfs.Stats{
ReadWrite: xfs.ReadWriteStats{
Write: 1,
Read: 2,
},
},
},
{
name: "attr bad",
s: "attr 1",
invalid: true,
},
{
name: "attr OK",
s: "attr 1 2 3 4",
stats: &xfs.Stats{
AttributeOperation: xfs.AttributeOperationStats{
Get: 1,
Set: 2,
Remove: 3,
List: 4,
},
},
},
{
name: "icluster bad",
s: "icluster 1",
invalid: true,
},
{
name: "icluster OK",
s: "icluster 1 2 3",
stats: &xfs.Stats{
InodeClustering: xfs.InodeClusteringStats{
Iflush: 1,
Flush: 2,
FlushInode: 3,
},
},
},
{
name: "vnodes bad",
s: "vnodes 1",
invalid: true,
},
{
name: "vnodes (missing free) OK",
s: "vnodes 1 2 3 4 5 6 7",
stats: &xfs.Stats{
Vnode: xfs.VnodeStats{
Active: 1,
Allocate: 2,
Get: 3,
Hold: 4,
Release: 5,
Reclaim: 6,
Remove: 7,
},
},
},
{
name: "vnodes (with free) OK",
s: "vnodes 1 2 3 4 5 6 7 8",
stats: &xfs.Stats{
Vnode: xfs.VnodeStats{
Active: 1,
Allocate: 2,
Get: 3,
Hold: 4,
Release: 5,
Reclaim: 6,
Remove: 7,
Free: 8,
},
},
},
{
name: "buf bad",
s: "buf 1",
invalid: true,
},
{
name: "buf OK",
s: "buf 1 2 3 4 5 6 7 8 9",
stats: &xfs.Stats{
Buffer: xfs.BufferStats{
Get: 1,
Create: 2,
GetLocked: 3,
GetLockedWaited: 4,
BusyLocked: 5,
MissLocked: 6,
PageRetries: 7,
PageFound: 8,
GetRead: 9,
},
},
},
{
name: "xpc bad",
s: "xpc 1",
invalid: true,
},
{
name: "xpc OK",
s: "xpc 1 2 3",
stats: &xfs.Stats{
ExtendedPrecision: xfs.ExtendedPrecisionStats{
FlushBytes: 1,
WriteBytes: 2,
ReadBytes: 3,
},
},
},
{
name: "xstrat bad",
s: "xstrat 1",
invalid: true,
},
{
name: "xstrat OK",
s: "xstrat 1 2",
stats: &xfs.Stats{
Xstrat: xfs.XstratStats{
Quick: 1,
Split: 2,
},
},
},
{
name: "push_ail bad",
s: "push_ail 1 2 3 4 5",
invalid: true,
},
{
name: "push_ail OK",
s: "push_ail 1 2 3 4 5 6 7 8 9 10",
stats: &xfs.Stats{
PushAil: xfs.PushAilStats{
TryLogspace: 1,
SleepLogspace: 2,
Pushes: 3,
Success: 4,
PushBuf: 5,
Pinned: 6,
Locked: 7,
Flushing: 8,
Restarts: 9,
Flush: 10,
},
},
},
{
name: "debug bad",
s: "debug 1 2",
invalid: true,
},
{
name: "debug OK",
s: "debug 1",
stats: &xfs.Stats{
Debug: xfs.DebugStats{
Enabled: 1,
},
},
},
{
name: "qm bad",
s: "qm 1 2 3 4 5 6 7",
invalid: true,
},
{
name: "qm bad",
s: "qm 1 2 3 4 5 6 7 8 9 10",
invalid: true,
},
{
name: "qm OK",
s: "qm 1 2 3 4 5 6 7 8",
stats: &xfs.Stats{
QuotaManager: xfs.QuotaManagerStats{
Reclaims: 1,
ReclaimMisses: 2,
DquoteDups: 3,
CacheMisses: 4,
CacheHits: 5,
Wants: 6,
ShakeReclaims: 7,
InactReclaims: 8,
},
},
},
{
name: "qm OK",
s: "qm 1 2 3 4 5 6 7 8 9",
stats: &xfs.Stats{
QuotaManager: xfs.QuotaManagerStats{
Reclaims: 1,
ReclaimMisses: 2,
DquoteDups: 3,
CacheMisses: 4,
CacheHits: 5,
Wants: 6,
ShakeReclaims: 7,
InactReclaims: 8,
Unused: 9,
},
},
},
{
name: "abtb2 bad",
s: "abtb2 1 2 3 4 5 6",
invalid: true,
},
{
name: "abtb2 OK",
s: "abtb2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeAllocBlocks2: xfs.BtreeAllocBlocks2Stats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "abtc2 bad",
s: "abtc2 1 2 3 4 5 6",
invalid: true,
},
{
name: "abtc2 OK",
s: "abtc2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeAllocContig2: xfs.BtreeAllocContig2Stats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "bmbt2 bad",
s: "bmbt2 1 2 3 4 5 6",
invalid: true,
},
{
name: "bmbt2 OK",
s: "bmbt2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeBlockMap2: xfs.BtreeBlockMap2Stats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "ibt2 bad",
s: "ibt2 1 2 3 4 5 6",
invalid: true,
},
{
name: "ibt2 OK",
s: "ibt2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeInode2: xfs.BtreeInode2Stats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "fibt2 bad",
s: "fibt2 1 2 3 4 5 6",
invalid: true,
},
{
name: "fibt2 OK",
s: "fibt2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeFreeInode2: xfs.BtreeFreeInode2Stats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rmapbt bad",
s: "rmapbt 1 2 3 4 5 6",
invalid: true,
},
{
name: "rmapbt OK",
s: "rmapbt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeReverseMap: xfs.BtreeReverseMapStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "refcntbt bad",
s: "refcntbt 1 2 3 4 5 6",
invalid: true,
},
{
name: "refcntbt OK",
s: "refcntbt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeRefCount: xfs.BtreeRefCountStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rmapbt_mem bad",
s: "rmapbt_mem 1 2 3 4 5 6",
invalid: true,
},
{
name: "rmapbt_mem OK",
s: "rmapbt_mem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeReverseMapMem: xfs.BtreeReverseMapMemStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rcbagbt bad",
s: "rcbagbt 1 2 3 4 5 6",
invalid: true,
},
{
name: "rcbagbt OK",
s: "rcbagbt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeRcbag: xfs.BtreeRcbagStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rtrmapbt bad",
s: "rtrmapbt 1 2 3 4 5 6",
invalid: true,
},
{
name: "rtrmapbt OK",
s: "rtrmapbt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeRtReverseMap: xfs.BtreeRtReverseMapStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rtrmapbt_mem bad",
s: "rtrmapbt_mem 1 2 3 4 5 6",
invalid: true,
},
{
name: "rtrmapbt_mem OK",
s: "rtrmapbt_mem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeRtReverseMapMem: xfs.BtreeRtReverseMapMemStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "rtrefcntbt bad",
s: "rtrefcntbt 1 2 3 4 5 6",
invalid: true,
},
{
name: "rtrefcntbt OK",
s: "rtrefcntbt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15",
stats: &xfs.Stats{
BtreeRtRefCount: xfs.BtreeRtRefCountStats{
Lookup: 1,
Compare: 2,
Insrec: 3,
Delrec: 4,
NewRoot: 5,
KillRoot: 6,
Increment: 7,
Decrement: 8,
Lshift: 9,
Rshift: 10,
Split: 11,
Join: 12,
Alloc: 13,
Free: 14,
Moves: 15,
},
},
},
{
name: "zoned bad",
s: "zoned 1 2",
invalid: true,
},
{
name: "zoned OK",
s: "zoned 1 2 3 4",
stats: &xfs.Stats{
Zoned: xfs.ZonedStats{
GcReadCalls: 1,
GcWriteCalls: 2,
GcZoneResetCalls: 3,
},
},
},
{
name: "metafile bad uint32",
s: "metafile abc",
invalid: true,
},
{
name: "metafile OK",
s: "metafile 1 2",
stats: &xfs.Stats{
MetaFile: xfs.MetaFileStats{
Inodes: 1,
},
},
},
{
name: "defer_relog bad",
s: "defer_relog 1 2",
invalid: true,
},
{
name: "defer_relog OK",
s: "defer_relog 42",
stats: &xfs.Stats{
DeferRelog: xfs.DeferRelogStats{
Count: 42,
},
},
},
{
name: "gc xpc bad uint64",
s: "gc xpc abc",
invalid: true,
},
{
name: "gc xpc OK",
s: "gc xpc 999",
stats: &xfs.Stats{
GcXpc: xfs.GcXpcStats{
Bytes: 999,
},
},
},
{
name: "fixtures OK",
fs: true,
stats: &xfs.Stats{
ExtentAllocation: xfs.ExtentAllocationStats{
ExtentsAllocated: 92447,
BlocksAllocated: 97589,
ExtentsFreed: 92448,
BlocksFreed: 93751,
},
AllocationBTree: xfs.BTreeStats{
Lookups: 0,
Compares: 0,
RecordsInserted: 0,
RecordsDeleted: 0,
},
BlockMapping: xfs.BlockMappingStats{
Reads: 1767055,
Writes: 188820,
Unmaps: 184891,
ExtentListInsertions: 92447,
ExtentListDeletions: 92448,
ExtentListLookups: 2140766,
ExtentListCompares: 0,
},
BlockMapBTree: xfs.BTreeStats{
Lookups: 0,
Compares: 0,
RecordsInserted: 0,
RecordsDeleted: 0,
},
DirectoryOperation: xfs.DirectoryOperationStats{
Lookups: 185039,
Creates: 92447,
Removes: 92444,
Getdents: 136422,
},
Transaction: xfs.TransactionStats{
Sync: 706,
Async: 944304,
Empty: 0,
},
InodeOperation: xfs.InodeOperationStats{
Attempts: 185045,
Found: 58807,
Recycle: 0,
Missed: 126238,
Duplicate: 0,
Reclaims: 33637,
AttributeChange: 22,
},
LogOperation: xfs.LogOperationStats{
Writes: 2883,
Blocks: 113448,
NoInternalBuffers: 9,
Force: 17360,
ForceSleep: 739,
},
ReadWrite: xfs.ReadWriteStats{
Write: 107739,
Read: 94045,
},
AttributeOperation: xfs.AttributeOperationStats{
Get: 4,
Set: 0,
Remove: 0,
List: 0,
},
InodeClustering: xfs.InodeClusteringStats{
Iflush: 8677,
Flush: 7849,
FlushInode: 135802,
},
Vnode: xfs.VnodeStats{
Active: 92601,
Allocate: 0,
Get: 0,
Hold: 0,
Release: 92444,
Reclaim: 92444,
Remove: 92444,
Free: 0,
},
Buffer: xfs.BufferStats{
Get: 2666287,
Create: 7122,
GetLocked: 2659202,
GetLockedWaited: 3599,
BusyLocked: 2,
MissLocked: 7085,
PageRetries: 0,
PageFound: 10297,
GetRead: 7085,
},
ExtendedPrecision: xfs.ExtendedPrecisionStats{
FlushBytes: 399724544,
WriteBytes: 92823103,
ReadBytes: 86219234,
},
PushAil: xfs.PushAilStats{
TryLogspace: 945014,
SleepLogspace: 0,
Pushes: 134260,
Success: 15483,
PushBuf: 0,
Pinned: 3940,
Locked: 464,
Flushing: 159985,
Restarts: 0,
Flush: 40,
},
Xstrat: xfs.XstratStats{
Quick: 92447,
Split: 0,
},
Debug: xfs.DebugStats{
Enabled: 0,
},
QuotaManager: xfs.QuotaManagerStats{
Reclaims: 0,
ReclaimMisses: 0,
DquoteDups: 0,
CacheMisses: 0,
CacheHits: 0,
Wants: 0,
ShakeReclaims: 0,
InactReclaims: 0,
},
BtreeAllocBlocks2: xfs.BtreeAllocBlocks2Stats{
Lookup: 184941,
Compare: 1277345,
Insrec: 13257,
Delrec: 13278,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 2746147,
},
BtreeAllocContig2: xfs.BtreeAllocContig2Stats{
Lookup: 345295,
Compare: 2416764,
Insrec: 172637,
Delrec: 172658,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 21406023,
},
BtreeBlockMap2: xfs.BtreeBlockMap2Stats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeInode2: xfs.BtreeInode2Stats{
Lookup: 343004,
Compare: 1358467,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeFreeInode2: xfs.BtreeFreeInode2Stats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeReverseMap: xfs.BtreeReverseMapStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeRefCount: xfs.BtreeRefCountStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeReverseMapMem: xfs.BtreeReverseMapMemStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeRcbag: xfs.BtreeRcbagStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeRtReverseMap: xfs.BtreeRtReverseMapStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeRtReverseMapMem: xfs.BtreeRtReverseMapMemStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
BtreeRtRefCount: xfs.BtreeRtRefCountStats{
Lookup: 0,
Compare: 0,
Insrec: 0,
Delrec: 0,
NewRoot: 0,
KillRoot: 0,
Increment: 0,
Decrement: 0,
Lshift: 0,
Rshift: 0,
Split: 0,
Join: 0,
Alloc: 0,
Free: 0,
Moves: 0,
},
Zoned: xfs.ZonedStats{
GcReadCalls: 0,
GcWriteCalls: 0,
GcZoneResetCalls: 0,
},
MetaFile: xfs.MetaFileStats{
Inodes: 0,
},
DeferRelog: xfs.DeferRelogStats{
Count: 0,
},
GcXpc: xfs.GcXpcStats{
Bytes: 0,
},
},
},
}
for _, tt := range tests {
var (
stats *xfs.Stats
err error
)
if tt.s != "" {
stats, err = xfs.ParseStats(strings.NewReader(tt.s))
}
if tt.fs {
xfs, err := xfs.NewFS("testdata/fixtures/proc", "testdata/fixtures/sys")
if err != nil {
t.Fatalf("failed to access xfs fs: %v", err)
}
stats, err = xfs.ProcStat()
if err != nil {
t.Fatalf("failed to gather xfs stats: %v", err)
}
}
if tt.invalid && err == nil {
t.Error("expected an error, but none occurred")
}
if !tt.invalid && err != nil {
t.Errorf("unexpected error: %v", err)
}
if diff := cmp.Diff(tt.stats, stats); diff != "" {
t.Fatalf("unexpected XFS stats (-want +got):\n%s", diff)
}
}
}
const (
linux614StatsPrefix = `extent_alloc 4841 1382197 3198 1341523
abt 0 0 0 0
blk_map 2115317 2567929 18137 12841 12363 5130917 0
bmbt 0 0 0 0
dir 669509 14982 13231 155344
trans 1 184826 0
ig 656660 133557 0 523103 0 269933 8926
log 6444 80186 36 6343 5938
push_ail 187025 0 123178 16362 0 2882 1133 318 0 318
xstrat 4612 0
rw 2516859 5862583
attr 43947 21 23 2446
icluster 0 6036 18228
vnodes 253170 0 0 0 278269 278269 278269 0
buf 2879784 35660 2844127 2677019 2487 35657 10 0 35347
abtb2 13643 138539 706 795 0 0 26 0 26 0 0 0 0 0 502133
abtc2 26954 261791 7513 7602 0 0 42 9 32 4 0 0 0 0 4377106
bmbt2 1139 7786 139 90 0 0 0 0 0 0 0 0 0 0 1307
ibt2 28009 311571 63 42 0 0 0 0 1 0 0 0 0 0 4354
fibt2 41067 163441 8178 8255 0 0 0 0 0 0 0 0 0 0 34399
rmapbt 27442 493733 6653 4919 0 0 1540 1437 1007 1063 22 5 22 5 1032463
refcntbt 17690 177736 1608 1608 0 0 82 13 13 66 1 1 1 1 468361
rmapbt_mem 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
rcbagbt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
rtrmapbt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
rtrmapbt_mem 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
rtrefcntbt 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
qm 0 0 0 0 0 0 0 0
`
linux614StatsSuffix = `xpc 5113102336 7894530294 22776079333
defer_relog 1
debug 0
`
linux614Stats = linux614StatsPrefix + linux614StatsSuffix
linux70Stats = linux614StatsPrefix + `zoned 0 0 0
metafile 0
` + linux614StatsSuffix + `gc xpc 0
`
)
func TestParseStatsLinux614(t *testing.T) {
stats, err := xfs.ParseStats(strings.NewReader(linux614Stats))
if err != nil {
t.Fatalf("failed to parse Linux 6.14 XFS stats: %v", err)
}
if want, got := uint32(0), stats.BtreeRtRefCount.Lookup; want != got {
t.Fatalf("unexpected rtrefcntbt lookup: want %d, got %d", want, got)
}
if want, got := uint64(1), stats.DeferRelog.Count; want != got {
t.Fatalf("unexpected defer_relog count: want %d, got %d", want, got)
}
}
func TestParseStatsLinux70(t *testing.T) {
stats, err := xfs.ParseStats(strings.NewReader(linux70Stats))
if err != nil {
t.Fatalf("failed to parse Linux 7.0 XFS stats: %v", err)
}
if want, got := (xfs.ZonedStats{}), stats.Zoned; want != got {
t.Fatalf("unexpected zoned stats: want %+v, got %+v", want, got)
}
if want, got := uint32(0), stats.MetaFile.Inodes; want != got {
t.Fatalf("unexpected metafile inodes: want %d, got %d", want, got)
}
if want, got := uint64(1), stats.DeferRelog.Count; want != got {
t.Fatalf("unexpected defer_relog count: want %d, got %d", want, got)
}
if want, got := uint64(5113102336), stats.ExtendedPrecision.FlushBytes; want != got {
t.Fatalf("unexpected xpc flush bytes: want %d, got %d", want, got)
}
}