/*
* 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.
*
* $Id: //eng/uds-releases/jasper/src/uds/cacheCounters.h#1 $
*/
#ifndef CACHE_COUNTERS_H
#define CACHE_COUNTERS_H
#include "typeDefs.h"
/**
* Basic counts of hits and misses for a given type of cache probe.
**/
typedef struct cacheCountsByKind {
/** Number of hits */
uint64_t hits;
/** Number of misses */
uint64_t misses;
/** Number of probes for data already queued for read */
uint64_t queued;
} CacheCountsByKind;
/**
* The various types of cache probes we care about.
**/
typedef enum cacheProbeType {
/** First attempt to look up an index page, for a given request. */
CACHE_PROBE_INDEX_FIRST = 0,
/** First attempt to look up a record page, for a given request. */
CACHE_PROBE_RECORD_FIRST,
/** Second or later attempt to look up an index page, for a given request. */
CACHE_PROBE_INDEX_RETRY,
/** Second or later attempt to look up a record page, for a given request. */
CACHE_PROBE_RECORD_RETRY
} CacheProbeType;
enum {
/** Flag bit to indicate that failures shouldn't be recorded. */
CACHE_PROBE_IGNORE_FAILURE = 128
};
/**
* Result-type counts for both kinds of data pages in the page cache.
**/
typedef struct cacheCountsByPageType {
/** His/miss counts for index pages. */
CacheCountsByKind indexPage;
/** Hit/miss counts for record pages. */
CacheCountsByKind recordPage;
} CacheCountsByPageType;
/**
* All the counters used for an entry cache.
**/
typedef struct cacheCounters {
// counters for the page cache
/** Hit/miss counts for the first attempt per request */
CacheCountsByPageType firstTime;
/** Hit/miss counts when a second (or later) attempt is needed */
CacheCountsByPageType retried;
/** Number of cache entry invalidations due to single-entry eviction */
uint64_t evictions;
/** Number of cache entry invalidations due to chapter expiration */
uint64_t expirations;
// counters for the sparse chapter index cache
/** Hit/miss counts for the sparse cache chapter probes */
CacheCountsByKind sparseChapters;
/** Hit/miss counts for the sparce cache name searches */
CacheCountsByKind sparseSearches;
} CacheCounters;
/**
* Success/failure assessment of cache probe result.
**/
typedef enum cacheResultKind {
/** The requested entry was found in the cache */
CACHE_RESULT_HIT,
/** The requested entry was not found in the cache */
CACHE_RESULT_MISS,
/** The requested entry wasn't found in the cache but is queued for read */
CACHE_RESULT_QUEUED
} CacheResultKind;
/**
* Increment one of the cache counters.
*
* @param counters pointer to the counters
* @param probeType type of access done
* @param kind result of probe
**/
void incrementCacheCounter(CacheCounters *counters,
int probeType,
CacheResultKind kind);
#endif /* CACHE_COUNTERS_H */