/*
* Copyright (c) 2020 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
#ifndef STATISTICS_H
#define STATISTICS_H
#include "header.h"
#include "types.h"
enum {
STATISTICS_VERSION = 31,
};
typedef struct {
/** The total number of slabs from which blocks may be allocated */
uint64_t slabCount;
/** The total number of slabs from which blocks have ever been allocated */
uint64_t slabsOpened;
/** The number of times since loading that a slab has been re-opened */
uint64_t slabsReopened;
} BlockAllocatorStatistics;
/**
* Counters for tracking the number of items written (blocks, requests, etc.)
* that keep track of totals at steps in the write pipeline. Three counters
* allow the number of buffered, in-memory items and the number of in-flight,
* unacknowledged writes to be derived, while still tracking totals for
* reporting purposes
**/
typedef struct {
/** The total number of items on which processing has started */
uint64_t started;
/** The total number of items for which a write operation has been issued */
uint64_t written;
/** The total number of items for which a write operation has completed */
uint64_t committed;
} CommitStatistics;
/** Counters for events in the recovery journal */
typedef struct {
/** Number of times the on-disk journal was full */
uint64_t diskFull;
/** Number of times the recovery journal requested slab journal commits. */
uint64_t slabJournalCommitsRequested;
/** Write/Commit totals for individual journal entries */
CommitStatistics entries;
/** Write/Commit totals for journal blocks */
CommitStatistics blocks;
} RecoveryJournalStatistics;
/** The statistics for the compressed block packer. */
typedef struct {
/** Number of compressed data items written since startup */
uint64_t compressedFragmentsWritten;
/** Number of blocks containing compressed items written since startup */
uint64_t compressedBlocksWritten;
/** Number of VIOs that are pending in the packer */
uint64_t compressedFragmentsInPacker;
} PackerStatistics;
/** The statistics for the slab journals. */
typedef struct {
/** Number of times the on-disk journal was full */
uint64_t diskFullCount;
/** Number of times an entry was added over the flush threshold */
uint64_t flushCount;
/** Number of times an entry was added over the block threshold */
uint64_t blockedCount;
/** Number of times a tail block was written */
uint64_t blocksWritten;
/** Number of times we had to wait for the tail to write */
uint64_t tailBusyCount;
} SlabJournalStatistics;
/** The statistics for the slab summary. */
typedef struct {
/** Number of blocks written */
uint64_t blocksWritten;
} SlabSummaryStatistics;
/** The statistics for the reference counts. */
typedef struct {
/** Number of reference blocks written */
uint64_t blocksWritten;
} RefCountsStatistics;
/** The statistics for the block map. */
typedef struct {
/** number of dirty (resident) pages */
uint32_t dirtyPages;
/** number of clean (resident) pages */
uint32_t cleanPages;
/** number of free pages */
uint32_t freePages;
/** number of pages in failed state */
uint32_t failedPages;
/** number of pages incoming */
uint32_t incomingPages;
/** number of pages outgoing */
uint32_t outgoingPages;
/** how many times free page not avail */
uint32_t cachePressure;
/** number of getVDOPageAsync() for read */
uint64_t readCount;
/** number or getVDOPageAsync() for write */
uint64_t writeCount;
/** number of times pages failed to read */
uint64_t failedReads;
/** number of times pages failed to write */
uint64_t failedWrites;
/** number of gets that are reclaimed */
uint64_t reclaimed;
/** number of gets for outgoing pages */
uint64_t readOutgoing;
/** number of gets that were already there */
uint64_t foundInCache;
/** number of gets requiring discard */
uint64_t discardRequired;
/** number of gets enqueued for their page */
uint64_t waitForPage;
/** number of gets that have to fetch */
uint64_t fetchRequired;
/** number of page fetches */
uint64_t pagesLoaded;
/** number of page saves */
uint64_t pagesSaved;
/** the number of flushes issued */
uint64_t flushCount;
} BlockMapStatistics;
/** The dedupe statistics from hash locks */
typedef struct {
/** Number of times the UDS advice proved correct */
uint64_t dedupeAdviceValid;
/** Number of times the UDS advice proved incorrect */
uint64_t dedupeAdviceStale;
/** Number of writes with the same data as another in-flight write */
uint64_t concurrentDataMatches;
/** Number of writes whose hash collided with an in-flight write */
uint64_t concurrentHashCollisions;
} HashLockStatistics;
/** Counts of error conditions in VDO. */
typedef struct {
/** number of times VDO got an invalid dedupe advice PBN from UDS */
uint64_t invalidAdvicePBNCount;
/** number of times a VIO completed with a VDO_NO_SPACE error */
uint64_t noSpaceErrorCount;
/** number of times a VIO completed with a VDO_READ_ONLY error */
uint64_t readOnlyErrorCount;
} ErrorStatistics;
/** The statistics of the vdo service. */
struct vdoStatistics {
uint32_t version;
uint32_t releaseVersion;
/** Number of blocks used for data */
uint64_t dataBlocksUsed;
/** Number of blocks used for VDO metadata */
uint64_t overheadBlocksUsed;
/** Number of logical blocks that are currently mapped to physical blocks */
uint64_t logicalBlocksUsed;
/** number of physical blocks */
BlockCount physicalBlocks;
/** number of logical blocks */
BlockCount logicalBlocks;
/** Size of the block map page cache, in bytes */
uint64_t blockMapCacheSize;
/** String describing the active write policy of the VDO */
char writePolicy[15];
/** The physical block size */
uint64_t blockSize;
/** Number of times the VDO has successfully recovered */
uint64_t completeRecoveries;
/** Number of times the VDO has recovered from read-only mode */
uint64_t readOnlyRecoveries;
/** String describing the operating mode of the VDO */
char mode[15];
/** Whether the VDO is in recovery mode */
bool inRecoveryMode;
/** What percentage of recovery mode work has been completed */
uint8_t recoveryPercentage;
/** The statistics for the compressed block packer */
PackerStatistics packer;
/** Counters for events in the block allocator */
BlockAllocatorStatistics allocator;
/** Counters for events in the recovery journal */
RecoveryJournalStatistics journal;
/** The statistics for the slab journals */
SlabJournalStatistics slabJournal;
/** The statistics for the slab summary */
SlabSummaryStatistics slabSummary;
/** The statistics for the reference counts */
RefCountsStatistics refCounts;
/** The statistics for the block map */
BlockMapStatistics blockMap;
/** The dedupe statistics from hash locks */
HashLockStatistics hashLock;
/** Counts of error conditions */
ErrorStatistics errors;
};
/**
* Get the proc file path for reading VDOStatistics.
*
* @return The proc file path
**/
static inline const char *getVDOStatisticsProcFile(void) {
return "dedupe_stats";
}
#endif /* not STATISTICS_H */