Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / afs / afs_stats.h
CommitLineData
805e021f
CE
1/*
2 * Copyright 2000, International Business Machines Corporation and others.
3 * All Rights Reserved.
4 *
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
8 */
9
10/*
11 * Statistics gathering stuff for the AFS cache manager.
12 */
13/*
14 * The remainder of this file contains the statistics gathering stuff.
15 */
16
17#ifndef __OPENAFS_AFS_STATS_H__
18#define __OPENAFS_AFS_STATS_H__
19
20#include "afs/param.h"
21
22/* the following is to work around a VAX compiler limitation */
23#if defined(vax)
24#undef AFS_NOSTATS
25#define AFS_NOSTATS
26#endif /* VAX environment */
27
28#ifdef AFS_NOSTATS
29
30/*
31 * The data collection routines are simply no-ops
32 */
33#define AFS_STATCNT(arg)
34#define AFS_MEANCNT(arg, value)
35#define AFS_STATS(arg)
36#define XSTATS_DECLS
37#define XSTATS_START_TIME(arg)
38#define XSTATS_START_CMTIME(arg)
39#define XSTATS_END_TIME
40
41#else /* AFS_NOSTATS */
42
43#define AFS_STATS(arg) arg
44#ifndef KERNEL
45/* NOTE: Ensure this is the same size in user and kernel mode. */
46typedef struct {
47 afs_int32 tv_sec;
48 afs_int32 tv_usec;
49} osi_timeval32_t;
50#endif /* !KERNEL */
51
52#define XSTATS_DECLS struct afs_stats_opTimingData *opP = NULL; \
53 osi_timeval_t opStartTime = { 0, 0}, opStopTime, elapsedTime
54
55#define XSTATS_START_TIME(arg) \
56 opP = &(afs_stats_cmfullperf.rpc.fsRPCTimes[arg]); \
57 osi_GetuTime(&opStartTime);
58
59#define XSTATS_START_CMTIME(arg) \
60 opP = &(afs_stats_cmfullperf.rpc.cmRPCTimes[arg]); \
61 osi_GetuTime(&opStartTime);
62
63#define XSTATS_END_TIME osi_GetuTime(&opStopTime); \
64 (opP->numOps)++; \
65 if (!code) { (opP->numSuccesses)++; \
66 afs_stats_GetDiff(elapsedTime, opStartTime, opStopTime); \
67 afs_stats_AddTo((opP->sumTime), elapsedTime); \
68 afs_stats_SquareAddTo((opP->sqrTime), elapsedTime); \
69 if (afs_stats_TimeLessThan(elapsedTime, (opP->minTime))) { \
70 afs_stats_TimeAssign((opP->minTime), elapsedTime); \
71 } if (afs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) { \
72 afs_stats_TimeAssign((opP->maxTime), elapsedTime); } }
73
74#endif /* AFS_NOSTATS */
75
76
77
78struct afs_MeanStats {
79 afs_int32 average;
80 afs_int32 elements;
81};
82
83/*
84 * struct afs_CMCallStats
85 * This is the place where we keep records on each and every
86 * function call.
87 *
88 * This structure is encoded as a binary blob and thrown at the client
89 * for use by the xstat_cm interface. As the datastructure is unversioned,
90 * some rules apply;
91 * *) Never add elements to the middle of the list. Everything new
92 * must go at the end
93 * *) Never remove elements from the list. If a function dies, don't
94 * remove it's entry here (by all means, flag it as dead, though)
95 * *) Never make elements conditional on preprocessor symbols. Doing
96 * this would mean that the client has to be built with exactly
97 * the same options as you are. Which isn't a great idea.
98 *
99 */
100#define AFS_CM_CALL_STATS \
101 AFS_CS(afs_init) /* afs_aix_subr.c */ \
102 AFS_CS(gop_rdwr) /* afs_aix_subr.c */ \
103 AFS_CS(aix_gnode_rele) /* afs_aix_subr.c */ \
104 AFS_CS(gettimeofday) /* afs_aix_subr.c */ \
105 AFS_CS(m_cpytoc) /* afs_aix_subr.c */ \
106 AFS_CS(aix_vattr_null) /* afs_aix_subr.c */ \
107 AFS_CS(afs_gn_ftrunc) /* afs_aixops.c */ \
108 AFS_CS(afs_gn_rdwr) /* afs_aixops.c */ \
109 AFS_CS(afs_gn_ioctl) /* afs_aixops.c */ \
110 AFS_CS(afs_gn_lockctl) /* afs_aixops.c */ \
111 AFS_CS(afs_gn_readlink) /* afs_aixops.c */ \
112 AFS_CS(afs_gn_readdir) /* afs_aixops.c */ \
113 AFS_CS(afs_gn_select) /* afs_aixops.c */ \
114 AFS_CS(afs_gn_strategy) /* afs_aixops.c */ \
115 AFS_CS(afs_gn_symlink) /* afs_aixops.c */ \
116 AFS_CS(afs_gn_revoke) /* afs_aixops.c */ \
117 AFS_CS(afs_gn_link) /* afs_aixops.c */ \
118 AFS_CS(afs_gn_mkdir) /* afs_aixops.c */ \
119 AFS_CS(afs_gn_mknod) /* afs_aixops.c */ \
120 AFS_CS(afs_gn_remove) /* afs_aixops.c */ \
121 AFS_CS(afs_gn_rename) /* afs_aixops.c */ \
122 AFS_CS(afs_gn_rmdir) /* afs_aixops.c */ \
123 AFS_CS(afs_gn_fid) /* afs_aixops.c */ \
124 AFS_CS(afs_gn_lookup) /* afs_aixops.c */ \
125 AFS_CS(afs_gn_open) /* afs_aixops.c */ \
126 AFS_CS(afs_gn_create) /* afs_aixops.c */ \
127 AFS_CS(afs_gn_hold) /* afs_aixops.c */ \
128 AFS_CS(afs_gn_close) /* afs_aixops.c */ \
129 AFS_CS(afs_gn_map) /* afs_aixops.c */ \
130 AFS_CS(afs_gn_rele) /* afs_aixops.c */ \
131 AFS_CS(afs_gn_unmap) /* afs_aixops.c */ \
132 AFS_CS(afs_gn_access) /* afs_aixops.c */ \
133 AFS_CS(afs_gn_getattr) /* afs_aixops.c */ \
134 AFS_CS(afs_gn_setattr) /* afs_aixops.c */ \
135 AFS_CS(afs_gn_fclear) /* afs_aixops.c */ \
136 AFS_CS(afs_gn_fsync) /* afs_aixops.c */ \
137 AFS_CS(pHash) /* afs_buffer.c */ \
138 AFS_CS(DInit) /* afs_buffer.c */ \
139 AFS_CS(DRead) /* afs_buffer.c */ \
140 AFS_CS(FixupBucket) /* afs_buffer.c */ \
141 AFS_CS(afs_newslot) /* afs_buffer.c */ \
142 AFS_CS(DRelease) /* afs_buffer.c */ \
143 AFS_CS(DFlush) /* afs_buffer.c */ \
144 AFS_CS(DFlushEntry) /* afs_buffer.c */ \
145 AFS_CS(DVOffset) /* afs_buffer.c */ \
146 AFS_CS(DZap) /* afs_buffer.c */ \
147 AFS_CS(DNew) /* afs_buffer.c */ \
148 AFS_CS(shutdown_bufferpackage) /* afs_buffer.c */ \
149 AFS_CS(afs_CheckKnownBad) /* afs_cache.c */ \
150 AFS_CS(afs_RemoveVCB) /* afs_cache.c */ \
151 AFS_CS(afs_NewVCache) /* afs_cache.c */ \
152 AFS_CS(afs_FlushActiveVcaches) /* afs_cache.c */ \
153 AFS_CS(afs_VerifyVCache) /* afs_cache.c */ \
154 AFS_CS(afs_WriteVCache) /* afs_cache.c */ \
155 AFS_CS(afs_GetVCache) /* afs_cache.c */ \
156 AFS_CS(afs_StuffVcache) /* afs_cache.c */ \
157 AFS_CS(afs_FindVCache) /* afs_cache.c */ \
158 AFS_CS(afs_PutDCache) /* afs_cache.c */ \
159 AFS_CS(afs_PutVCache) /* afs_cache.c */ \
160 AFS_CS(CacheStoreProc) /* afs_cache.c */ \
161 AFS_CS(afs_FindDCache) /* afs_cache.c */ \
162 AFS_CS(afs_TryToSmush) /* afs_cache.c */ \
163 AFS_CS(afs_AdjustSize) /* afs_cache.c */ \
164 AFS_CS(afs_CheckSize) /* afs_cache.c */ \
165 AFS_CS(afs_StoreWarn) /* afs_cache.c */ \
166 AFS_CS(CacheFetchProc) /* afs_cache.c */ \
167 AFS_CS(UFS_CacheStoreProc) /* afs_cache.c */ \
168 AFS_CS(UFS_CacheFetchProc) /* afs_cache.c */ \
169 AFS_CS(afs_GetDCache) /* afs_cache.c */ \
170 AFS_CS(afs_SimpleVStat) /* afs_cache.c */ \
171 AFS_CS(afs_ProcessFS) /* afs_cache.c */ \
172 AFS_CS(afs_InitCacheInfo) /* afs_cache.c */ \
173 AFS_CS(afs_InitVolumeInfo) /* afs_cache.c */ \
174 AFS_CS(afs_InitCacheFile) /* afs_cache.c */ \
175 AFS_CS(afs_CacheInit) /* afs_cache.c */ \
176 AFS_CS(afs_GetDSlot) /* afs_cache.c */ \
177 AFS_CS(afs_WriteThroughDSlots) /* afs_cache.c */ \
178 AFS_CS(afs_MemGetDSlot) /* afs_cache.c */ \
179 AFS_CS(afs_UFSGetDSlot) /* afs_cache.c */ \
180 AFS_CS(afs_StoreDCache) /* afs_cache.c */ \
181 AFS_CS(afs_StoreMini) /* afs_cache.c */ \
182 AFS_CS(shutdown_cache) /* afs_cache.c */ \
183 AFS_CS(afs_StoreAllSegments) /* afs_cache.c */ \
184 AFS_CS(afs_InvalidateAllSegments) /* afs_cache.c */ \
185 AFS_CS(afs_TruncateAllSegments) /* afs_cache.c */ \
186 AFS_CS(afs_CheckVolSync) /* afs_cache.c */ \
187 AFS_CS(afs_wakeup) /* afs_cache.c */ \
188 AFS_CS(afs_CFileOpen) /* afs_cache.c */ \
189 AFS_CS(afs_CFileTruncate) /* afs_cache.c */ \
190 AFS_CS(afs_GetDownD) /* afs_cache.c */ \
191 AFS_CS(afs_WriteDCache) /* afs_cache.c */ \
192 AFS_CS(afs_FlushDCache) /* afs_cache.c */ \
193 AFS_CS(afs_GetDownDSlot) /* afs_cache.c */ \
194 AFS_CS(afs_FlushVCache) /* afs_cache.c */ \
195 AFS_CS(afs_GetDownV) /* afs_cache.c */ \
196 AFS_CS(afs_QueueVCB) /* afs_cache.c */ \
197 AFS_CS(afs_call) /* afs_call.c */ \
198 AFS_CS(afs_syscall_call) /* afs_call.c */ \
199 AFS_CS(syscall) /* afs_call.c */ \
200 AFS_CS(lpioctl) /* afs_call.c */ \
201 AFS_CS(lsetpag) /* afs_call.c */ \
202 AFS_CS(afs_syscall) /* afs_call.c */ \
203 AFS_CS(afs_CheckInit) /* afs_call.c */ \
204 AFS_CS(afs_shutdown) /* afs_call.c */ \
205 AFS_CS(shutdown_BKG) /* afs_call.c */ \
206 AFS_CS(shutdown_afstest) /* afs_call.c */ \
207 AFS_CS(SRXAFSCB_GetCE) /* afs_callback.c */ \
208 AFS_CS(ClearCallBack) /* afs_callback.c */ \
209 AFS_CS(SRXAFSCB_GetLock) /* afs_callback.c */ \
210 AFS_CS(SRXAFSCB_CallBack) /* afs_callback.c */ \
211 AFS_CS(SRXAFSCB_InitCallBackState) /* afs_callback.c */ \
212 AFS_CS(SRXAFSCB_Probe) /* afs_callback.c */ \
213 AFS_CS(afs_RXCallBackServer) /* afs_callback.c */ \
214 AFS_CS(shutdown_CB) /* afs_callback.c */ \
215 AFS_CS(afs_Chunk) /* afs_chunk.c */ \
216 AFS_CS(afs_ChunkBase) /* afs_chunk.c */ \
217 AFS_CS(afs_ChunkOffset) /* afs_chunk.c */ \
218 AFS_CS(afs_ChunkSize) /* afs_chunk.c */ \
219 AFS_CS(afs_ChunkToBase) /* afs_chunk.c */ \
220 AFS_CS(afs_ChunkToSize) /* afs_chunk.c */ \
221 AFS_CS(afs_SetChunkSize) /* afs_chunk.c */ \
222 AFS_CS(afs_config) /* afs_config.c */ \
223 AFS_CS(mem_freebytes) /* afs_config.c */ \
224 AFS_CS(mem_getbytes) /* afs_config.c */ \
225 AFS_CS(fpalloc) /* afs_config.c */ \
226 AFS_CS(kluge_init) /* afs_config.c */ \
227 AFS_CS(ufdalloc) /* afs_config.c */ \
228 AFS_CS(ufdfree) /* afs_config.c */ \
229 AFS_CS(commit) /* afs_config.c */ \
230 AFS_CS(dev_ialloc) /* afs_config.c */ \
231 AFS_CS(ffree) /* afs_config.c */ \
232 AFS_CS(iget) /* afs_config.c */ \
233 AFS_CS(iptovp) /* afs_config.c */ \
234 AFS_CS(ilock) /* afs_config.c */ \
235 AFS_CS(irele) /* afs_config.c */ \
236 AFS_CS(iput) /* afs_config.c */ \
237 AFS_CS(afs_Daemon) /* afs_daemons.c */ \
238 AFS_CS(afs_CheckRootVolume) /* afs_daemons.c */ \
239 AFS_CS(BPath) /* afs_daemons.c */ \
240 AFS_CS(BPrefetch) /* afs_daemons.c */ \
241 AFS_CS(BStore) /* afs_daemons.c */ \
242 AFS_CS(afs_BBusy) /* afs_daemons.c */ \
243 AFS_CS(afs_BQueue) /* afs_daemons.c */ \
244 AFS_CS(afs_BRelease) /* afs_daemons.c */ \
245 AFS_CS(afs_BackgroundDaemon) /* afs_daemons.c */ \
246 AFS_CS(shutdown_daemons) /* afs_daemons.c */ \
247 AFS_CS(exporter_add) /* afs_exporter.c */ \
248 AFS_CS(exporter_find) /* afs_exporter.c */ \
249 AFS_CS(afs_gfs_kalloc) /* afs_gfs_subr.c */ \
250 AFS_CS(IsAfsVnode) /* afs_gfs_subr.c */ \
251 AFS_CS(SetAfsVnode) /* afs_gfs_subr.c */ \
252 AFS_CS(afs_gfs_kfree) /* afs_gfs_subr.c */ \
253 AFS_CS(gop_lookupname) /* afs_gfs_subr.c */ \
254 AFS_CS(gfsvop_getattr) /* afs_gfs_subr.c */ \
255 AFS_CS(gfsvop_rdwr) /* afs_gfs_subr.c */ \
256 AFS_CS(afs_uniqtime) /* afs_gfs_subr.c */ \
257 AFS_CS(gfs_vattr_null) /* afs_gfs_subr.c */ \
258 AFS_CS(afs_lock) /* afs_gfsops.c */ \
259 AFS_CS(afs_unlock) /* afs_gfsops.c */ \
260 AFS_CS(afs_update) /* afs_gfsops.c */ \
261 AFS_CS(afs_gclose) /* afs_gfsops.c */ \
262 AFS_CS(afs_gopen) /* afs_gfsops.c */ \
263 AFS_CS(afs_greadlink) /* afs_gfsops.c */ \
264 AFS_CS(afs_select) /* afs_gfsops.c */ \
265 AFS_CS(afs_gbmap) /* afs_gfsops.c */ \
266 AFS_CS(afs_getfsdata) /* afs_gfsops.c */ \
267 AFS_CS(afs_gsymlink) /* afs_gfsops.c */ \
268 AFS_CS(afs_namei) /* afs_gfsops.c */ \
269 AFS_CS(printgnode) /* afs_gfsops.c */ \
270 AFS_CS(HaveGFSLock) /* afs_gfsops.c */ \
271 AFS_CS(afs_gmount) /* afs_gfsops.c */ \
272 AFS_CS(AddGFSLock) /* afs_gfsops.c */ \
273 AFS_CS(RemoveGFSLock) /* afs_gfsops.c */ \
274 AFS_CS(afs_grlock) /* afs_gfsops.c */ \
275 AFS_CS(afs_gumount) /* afs_gfsops.c */ \
276 AFS_CS(afs_gget) /* afs_gfsops.c */ \
277 AFS_CS(afs_glink) /* afs_gfsops.c */ \
278 AFS_CS(afs_gmkdir) /* afs_gfsops.c */ \
279 AFS_CS(afs_sbupdate) /* afs_gfsops.c */ \
280 AFS_CS(afs_unlink) /* afs_gfsops.c */ \
281 AFS_CS(afs_grmdir) /* afs_gfsops.c */ \
282 AFS_CS(afs_makenode) /* afs_gfsops.c */ \
283 AFS_CS(afs_grename) /* afs_gfsops.c */ \
284 AFS_CS(afs_rele) /* afs_gfsops.c */ \
285 AFS_CS(afs_syncgp) /* afs_gfsops.c */ \
286 AFS_CS(afs_getval) /* afs_gfsops.c */ \
287 AFS_CS(afs_gfshack) /* afs_gfsops.c */ \
288 AFS_CS(afs_trunc) /* afs_gfsops.c */ \
289 AFS_CS(afs_rwgp) /* afs_gfsops.c */ \
290 AFS_CS(afs_stat) /* afs_gfsops.c */ \
291 AFS_CS(afsc_link) /* afs_hp_subr.c */ \
292 AFS_CS(hpsobind) /* afs_hp_subr.c */ \
293 AFS_CS(hpsoclose) /* afs_hp_subr.c */ \
294 AFS_CS(hpsocreate) /* afs_hp_subr.c */ \
295 AFS_CS(hpsoreserve) /* afs_hp_subr.c */ \
296 AFS_CS(afs_vfs_mount) /* afs_hp_subr.c */ \
297 AFS_CS(devtovfs) /* afs_istuff.c */ \
298 AFS_CS(igetinode) /* afs_istuff.c */ \
299 AFS_CS(afs_syscall_iopen) /* afs_istuff.c */ \
300 AFS_CS(iopen) /* afs_istuff.c */ \
301 AFS_CS(afs_syscall_iincdec) /* afs_istuff.c */ \
302 AFS_CS(afs_syscall_ireadwrite) /* afs_istuff.c */ \
303 AFS_CS(iincdec) /* afs_istuff.c */ \
304 AFS_CS(ireadwrite) /* afs_istuff.c */ \
305 AFS_CS(oiread) /* afs_istuff.c */ \
306 AFS_CS(AHash) /* afs_istuff.c */ \
307 AFS_CS(QTOA) /* afs_istuff.c */ \
308 AFS_CS(afs_FindPartByDev) /* afs_istuff.c */ \
309 AFS_CS(aux_init) /* afs_istuff.c */ \
310 AFS_CS(afs_GetNewPart) /* afs_istuff.c */ \
311 AFS_CS(afs_InitAuxVolFile) /* afs_istuff.c */ \
312 AFS_CS(afs_CreateAuxEntry) /* afs_istuff.c */ \
313 AFS_CS(afs_GetAuxSlot) /* afs_istuff.c */ \
314 AFS_CS(afs_GetDownAux) /* afs_istuff.c */ \
315 AFS_CS(afs_FlushAuxCache) /* afs_istuff.c */ \
316 AFS_CS(afs_GetAuxInode) /* afs_istuff.c */ \
317 AFS_CS(afs_PutAuxInode) /* afs_istuff.c */ \
318 AFS_CS(afs_ReadAuxInode) /* afs_istuff.c */ \
319 AFS_CS(afs_WriteAuxInode) /* afs_istuff.c */ \
320 AFS_CS(afs_auxcall) /* afs_istuff.c */ \
321 AFS_CS(tmpdbg_auxtbl) /* afs_istuff.c */ \
322 AFS_CS(tmpdbg_parttbl) /* afs_istuff.c */ \
323 AFS_CS(idec) /* afs_istuff.c */ \
324 AFS_CS(iinc) /* afs_istuff.c */ \
325 AFS_CS(iread) /* afs_istuff.c */ \
326 AFS_CS(iwrite) /* afs_istuff.c */ \
327 AFS_CS(getinode) /* afs_istuff.c */ \
328 AFS_CS(trygetfs) /* afs_istuff.c */ \
329 AFS_CS(iforget) /* afs_istuff.c */ \
330 AFS_CS(afs_syscall_icreate) /* afs_istuff.c */ \
331 AFS_CS(icreate) /* afs_istuff.c */ \
332 AFS_CS(Lock_Init) /* afs_lock.c */ \
333 AFS_CS(Lock_Obtain) /* afs_lock.c */ \
334 AFS_CS(Lock_ReleaseR) /* afs_lock.c */ \
335 AFS_CS(Lock_ReleaseW) /* afs_lock.c */ \
336 AFS_CS(afs_BozonLock) /* UNUSED */ \
337 AFS_CS(afs_BozonUnlock) /* UNUSED */ \
338 AFS_CS(osi_SleepR) /* afs_lock.c */ \
339 AFS_CS(osi_SleepS) /* afs_lock.c */ \
340 AFS_CS(osi_SleepW) /* afs_lock.c */ \
341 AFS_CS(osi_Sleep) /* afs_lock */ \
342 AFS_CS(afs_BozonInit) /* UNUSED */ \
343 AFS_CS(afs_CheckBozonLock) /* UNUSED */ \
344 AFS_CS(afs_CheckBozonLockBlocking) /* UNUSED */ \
345 AFS_CS(xxxinit) /* afs_main.c */ \
346 AFS_CS(KernelEntry) /* afs_main.c */ \
347 AFS_CS(afs_InitMemCache) /* afs_memcache.c */ \
348 AFS_CS(afs_LookupMCE) /* afs_memcache.c */ \
349 AFS_CS(afs_MemReadBlk) /* afs_memcache.c */ \
350 AFS_CS(afs_MemReadUIO) /* afs_memcache.c */ \
351 AFS_CS(afs_MemWriteBlk) /* afs_memcache.c */ \
352 AFS_CS(afs_MemCacheStoreProc) /* afs_memcache.c */ \
353 AFS_CS(afs_MemCacheTruncate) /* afs_memcache.c */ \
354 AFS_CS(afs_MemWriteUIO) /* afs_memcache.c */ \
355 AFS_CS(afs_MemCacheFetchProc) /* afs_memcache.c */ \
356 AFS_CS(afs_vnode_pager_create) /* afs_next_aux.c */ \
357 AFS_CS(next_KernelEntry) /* afs_next_subr.c */ \
358 AFS_CS(afs_GetNfsClientPag) /* afs_nfsclnt.c */ \
359 AFS_CS(afs_FindNfsClientPag) /* afs_nfsclnt.c */ \
360 AFS_CS(afs_PutNfsClientPag) /* afs_nfsclnt.c */ \
361 AFS_CS(afs_nfsclient_reqhandler) /* afs_nfsclnt.c */ \
362 AFS_CS(afs_nfsclient_GC) /* afs_nfsclnt.c */ \
363 AFS_CS(afs_nfsclient_hold) /* afs_nfsclnt.c */ \
364 AFS_CS(afs_nfsclient_stats) /* afs_nfsclnt.c */ \
365 AFS_CS(afs_nfsclient_sysname) /* afs_nfsclnt.c */ \
366 AFS_CS(afs_nfsclient_shutdown) /* afs_nfsclnt.c */ \
367 AFS_CS(afs_rfs_readdir_fixup) /* afs_nfssrv.c */ \
368 AFS_CS(afs_rfs_dispatch) /* afs_nfssrv.c */ \
369 AFS_CS(afs_xnfs_svc) /* afs_nfssrv.c */ \
370 AFS_CS(afs_xdr_putrddirres) /* afs_nfssrv.c */ \
371 AFS_CS(afs_rfs_readdir) /* afs_nfssrv.c */ \
372 AFS_CS(afs_rfs_rddirfree) /* afs_nfssrv.c */ \
373 AFS_CS(rfs_dupcreate) /* afs_nfssrv.c */ \
374 AFS_CS(rfs_dupsetattr) /* afs_nfssrv.c */ \
375 AFS_CS(Nfs2AfsCall) /* afs_nfssrv.c */ \
376 AFS_CS(afs_sun_xuntext) /* afs_osi.c */ \
377 AFS_CS(osi_Active) /* afs_osi.c */ \
378 AFS_CS(osi_FlushPages) /* afs_osi.c */ \
379 AFS_CS(osi_FlushText) /* afs_osi.c */ \
380 AFS_CS(osi_CallProc) /* afs_osi.c */ \
381 AFS_CS(osi_CancelProc) /* afs_osi.c */ \
382 AFS_CS(osi_Invisible) /* afs_osi.c */ \
383 AFS_CS(osi_Time) /* afs_osi.c */ \
384 AFS_CS(osi_Alloc) /* afs_osi_alloc.c */ \
385 AFS_CS(osi_SetTime) /* afs_osi.c */ \
386 AFS_CS(osi_Dump) /* afs_osi.c */ \
387 AFS_CS(osi_Free) /* afs_osi_alloc.c */ \
388 AFS_CS(shutdown_osi) /* afs_osi.c */ \
389 AFS_CS(osi_UFSOpen) /* afs_osifile.c */ \
390 AFS_CS(osi_Close) /* afs_osifile.c */ \
391 AFS_CS(osi_Stat) /* afs_osifile.c */ \
392 AFS_CS(osi_Truncate) /* afs_osifile.c */ \
393 AFS_CS(osi_Read) /* afs_osifile.c */ \
394 AFS_CS(osi_Write) /* afs_osifile.c */ \
395 AFS_CS(osi_MapStrategy) /* afs_osifile.c */ \
396 AFS_CS(shutdown_osifile) /* afs_osifile.c */ \
397 AFS_CS(osi_FreeLargeSpace) /* afs_osi_alloc.c */ \
398 AFS_CS(osi_FreeSmallSpace) /* afs_osi_alloc.c */ \
399 AFS_CS(pkt_iodone) /* afs_osinet.c */ \
400 AFS_CS(shutdown_osinet) /* afs_osi_alloc.c */ \
401 AFS_CS(afs_cs) /* afs_osinet.c */ \
402 AFS_CS(osi_AllocLargeSpace) /* afs_osi_alloc.c */ \
403 AFS_CS(osi_AllocSmallSpace) /* afs_osi_alloc.c */ \
404 AFS_CS(osi_CloseToTheEdge) /* afs_osinet.c */ \
405 AFS_CS(osi_xgreedy) /* afs_osinet.c */ \
406 AFS_CS(osi_FreeSocket) /* afs_osinet.c */ \
407 AFS_CS(osi_NewSocket) /* afs_osinet.c */ \
408 AFS_CS(trysblock) /* afs_osinet.c */ \
409 AFS_CS(osi_NetSend) /* afs_osinet.c */ \
410 AFS_CS(WaitHack) /* afs_osinet.c */ \
411 AFS_CS(osi_CancelWait) /* afs_osinet.c */ \
412 AFS_CS(osi_InitWaitHandle) /* afs_osinet.c */ \
413 AFS_CS(osi_Wakeup) /* afs_osinet.c */ \
414 AFS_CS(osi_Wait) /* afs_osinet.c */ \
415 AFS_CS(dirp_Read) /* afs_physio.c */ \
416 AFS_CS(dirp_SetCacheDev) /* afs_physio.c */ \
417 AFS_CS(Die) /* afs_physio.c */ \
418 AFS_CS(dirp_Cpy) /* afs_physio.c */ \
419 AFS_CS(dirp_Eq) /* afs_physio.c */ \
420 AFS_CS(dirp_Write) /* afs_physio.c */ \
421 AFS_CS(dirp_Zap) /* afs_physio.c */ \
422 AFS_CS(PSetVolumeStatus) /* afs_pioctl.c */ \
423 AFS_CS(PFlush) /* afs_pioctl.c */ \
424 AFS_CS(PNewStatMount) /* afs_pioctl.c */ \
425 AFS_CS(PGetTokens) /* afs_pioctl.c */ \
426 AFS_CS(PUnlog) /* afs_pioctl.c */ \
427 AFS_CS(PCheckServers) /* afs_pioctl.c */ \
428 AFS_CS(PMariner) /* afs_pioctl.c */ \
429 AFS_CS(PCheckAuth) /* afs_pioctl.c */ \
430 AFS_CS(PCheckVolNames) /* afs_pioctl.c */ \
431 AFS_CS(PFindVolume) /* afs_pioctl.c */ \
432 AFS_CS(Prefetch) /* afs_pioctl.c */ \
433 AFS_CS(PGetCacheSize) /* afs_pioctl.c */ \
434 AFS_CS(PRemoveCallBack) /* afs_pioctl.c */ \
435 AFS_CS(PSetCacheSize) /* afs_pioctl.c */ \
436 AFS_CS(PViceAccess) /* afs_pioctl.c */ \
437 AFS_CS(PListCells) /* afs_pioctl.c */ \
438 AFS_CS(PNewCell) /* afs_pioctl.c */ \
439 AFS_CS(PRemoveMount) /* afs_pioctl.c */ \
440 AFS_CS(HandleIoctl) /* afs_pioctl.c */ \
441 AFS_CS(_AFSIOCTL) /* afs_pioctl.c */ \
442 AFS_CS(_VALIDAFSIOCTL) /* afs_pioctl.c */ \
443 AFS_CS(PGetCellStatus) /* afs_pioctl.c */ \
444 AFS_CS(PSetCellStatus) /* afs_pioctl.c */ \
445 AFS_CS(PVenusLogging) /* afs_pioctl.c */ \
446 AFS_CS(PFlushVolumeData) /* afs_pioctl.c */ \
447 AFS_CS(PSetSysName) /* afs_pioctl.c */ \
448 AFS_CS(PExportAfs) /* afs_pioctl.c */ \
449 AFS_CS(HandleClientContext) /* afs_pioctl.c */ \
450 AFS_CS(afs_ioctl) /* afs_pioctl.c */ \
451 AFS_CS(afs_xioctl) /* afs_pioctl.c */ \
452 AFS_CS(afs_pioctl) /* afs_pioctl.c */ \
453 AFS_CS(afs_syscall_pioctl) /* afs_pioctl.c */ \
454 AFS_CS(HandlePioctl) /* afs_pioctl.c */ \
455 AFS_CS(PGetAcl) /* afs_pioctl.c */ \
456 AFS_CS(PGetFID) /* afs_pioctl.c */ \
457 AFS_CS(PSetAcl) /* afs_pioctl.c */ \
458 AFS_CS(PBogus) /* afs_pioctl.c */ \
459 AFS_CS(PGetFileCell) /* afs_pioctl.c */ \
460 AFS_CS(PGetWSCell) /* afs_pioctl.c */ \
461 AFS_CS(PNoop) /* afs_pioctl.c */ \
462 AFS_CS(PGetUserCell) /* afs_pioctl.c */ \
463 AFS_CS(PSetTokens) /* afs_pioctl.c */ \
464 AFS_CS(PGetVolumeStatus) /* afs_pioctl.c */ \
465 AFS_CS(afs_ResetAccessCache) /* afs_resource.c */ \
466 AFS_CS(afs_FindUser) /* afs_resource.c */ \
467 AFS_CS(afs_ResetUserConns) /* afs_resource.c */ \
468 AFS_CS(afs_ResourceInit) /* afs_resource.c */ \
469 AFS_CS(afs_GetCell) /* afs_resource.c */ \
470 AFS_CS(afs_GetCellByIndex) /* afs_resource.c */ \
471 AFS_CS(afs_GetCellByName) /* afs_resource.c */ \
472 AFS_CS(afs_GetRealCellByIndex) /* afs_resource.c */ \
473 AFS_CS(afs_NewCell) /* afs_resource.c */ \
474 AFS_CS(afs_GetUser) /* afs_resource.c */ \
475 AFS_CS(afs_PutUser) /* afs_resource.c */ \
476 AFS_CS(afs_SetPrimary) /* afs_resource.c */ \
477 AFS_CS(CheckVLDB) /* afs_resource.c */ \
478 AFS_CS(afs_GetVolume) /* afs_resource.c */ \
479 AFS_CS(afs_GetVolumeByName) /* afs_resource.c */ \
480 AFS_CS(InstallVolumeEntry) /* afs_resource.c */ \
481 AFS_CS(InstallVolumeInfo) /* afs_resource.c */ \
482 AFS_CS(afs_FindServer) /* afs_resource.c */ \
483 AFS_CS(afs_PutVolume) /* afs_resource.c */ \
484 AFS_CS(afs_random) /* afs_resource.c */ \
485 AFS_CS(ranstage) /* afs_resource.c */ \
486 AFS_CS(RemoveUserConns) /* afs_resource.c */ \
487 AFS_CS(afs_MarinerLog) /* afs_resource.c */ \
488 AFS_CS(afs_vtoi) /* afs_resource.c */ \
489 AFS_CS(afs_GetServer) /* afs_resource.c */ \
490 AFS_CS(afs_SortServers) /* afs_resource.c */ \
491 AFS_CS(afs_Conn) /* afs_resource.c */ \
492 AFS_CS(afs_ConnByHost) /* afs_resource.c */ \
493 AFS_CS(afs_ConnByMHosts) /* afs_resource.c */ \
494 AFS_CS(afs_Analyze) /* afs_resource.c */ \
495 AFS_CS(afs_PutConn) /* afs_resource.c */ \
496 AFS_CS(afs_ResetVolumeInfo) /* afs_resource.c */ \
497 AFS_CS(StartLogFile) /* afs_resource.c */ \
498 AFS_CS(afs_SetLogFile) /* afs_resource.c */ \
499 AFS_CS(EndLogFile) /* afs_resource.c */ \
500 AFS_CS(afs_dp) /* afs_resource.c */ \
501 AFS_CS(fprf) /* afs_resource.c */ \
502 AFS_CS(fprint) /* afs_resource.c */ \
503 AFS_CS(fprintn) /* afs_resource.c */ \
504 AFS_CS(afs_CheckLocks) /* afs_resource.c */ \
505 AFS_CS(puttofile) /* afs_resource.c */ \
506 AFS_CS(shutdown_AFS) /* afs_resource.c */ \
507 AFS_CS(afs_CheckCacheResets) /* afs_resource.c */ \
508 AFS_CS(afs_GCUserData) /* afs_resource.c */ \
509 AFS_CS(VSleep) /* afs_resource.c */ \
510 AFS_CS(afs_CheckCode) /* afs_resource.c */ \
511 AFS_CS(afs_CopyError) /* afs_resource.c */ \
512 AFS_CS(afs_FinalizeReq) /* afs_resource.c */ \
513 AFS_CS(afs_cv2string) /* afs_resource.c */ \
514 AFS_CS(afs_FindVolCache) /* afs_resource.c */ \
515 AFS_CS(afs_GetVolCache) /* afs_resource.c */ \
516 AFS_CS(afs_GetVolSlot) /* afs_resource.c */ \
517 AFS_CS(afs_WriteVolCache) /* afs_resource.c */ \
518 AFS_CS(afs_UFSGetVolSlot) /* afs_resource.c */ \
519 AFS_CS(afs_CheckVolumeNames) /* afs_resource.c */ \
520 AFS_CS(afs_MemGetVolSlot) /* afs_resource.c */ \
521 AFS_CS(print_internet_address) /* afs_resource.c */ \
522 AFS_CS(CheckVLServer) /* afs_resource.c */ \
523 AFS_CS(HaveCallBacksFrom) /* afs_resource.c */ \
524 AFS_CS(ServerDown) /* afs_resource.c */ \
525 AFS_CS(afs_CheckServers) /* afs_resource.c */ \
526 AFS_CS(afs_AddToMean) /* afs_stat.c */ \
527 AFS_CS(afs_GetCMStat) /* afs_stat.c */ \
528 AFS_CS(afs_getpage) /* afs_sun_subr.c */ \
529 AFS_CS(afs_putpage) /* afs_sun_subr.c */ \
530 AFS_CS(afs_nfsrdwr) /* afs_sun_subr.c */ \
531 AFS_CS(afs_map) /* afs_sun_subr.c */ \
532 AFS_CS(afs_cmp) /* afs_sun_subr.c */ \
533 AFS_CS(afs_cntl) /* afs_sun_subr.c */ \
534 AFS_CS(afs_dump) /* afs_sun_subr.c */ \
535 AFS_CS(afs_realvp) /* afs_sun_subr.c */ \
536 AFS_CS(afs_PageLeft) /* afs_sun_subr.c */ \
537 AFS_CS(afsinit) /* afs_vfsops.c */ \
538 AFS_CS(afs_mount) /* afs_vfsops.c */ \
539 AFS_CS(afs_unmount) /* afs_vfsops.c */ \
540 AFS_CS(afs_root) /* afs_vfsops.c */ \
541 AFS_CS(afs_statfs) /* afs_vfsops.c */ \
542 AFS_CS(afs_sync) /* afs_vfsops.c */ \
543 AFS_CS(afs_vget) /* afs_vfsops.c */ \
544 AFS_CS(afs_mountroot) /* afs_vfsops.c */ \
545 AFS_CS(afs_swapvp) /* afs_vfsops.c */ \
546 AFS_CS(afs_AddMarinerName) /* afs_vnodeops.c */ \
547 AFS_CS(afs_setpag) /* afs_vnodeops.c */ \
548 AFS_CS(genpag) /* afs_vnodeops.c */ \
549 AFS_CS(getpag) /* afs_vnodeops.c */ \
550 AFS_CS(afs_GetMariner) /* afs_vnodeops.c */ \
551 AFS_CS(afs_badop) /* afs_vnodeops.c */ \
552 AFS_CS(afs_index) /* afs_vnodeops.c */ \
553 AFS_CS(afs_noop) /* afs_vnodeops.c */ \
554 AFS_CS(afs_open) /* afs_vnodeops.c */ \
555 AFS_CS(afs_closex) /* afs_vnodeops.c */ \
556 AFS_CS(afs_close) /* afs_vnodeops.c */ \
557 AFS_CS(afs_MemWrite) /* afs_vnodeops.c */ \
558 AFS_CS(afs_write) /* afs_vnodeops.c */ \
559 AFS_CS(afs_UFSWrite) /* afs_vnodeops.c */ \
560 AFS_CS(afs_rdwr) /* afs_vnodeops.c */ \
561 AFS_CS(afs_MemRead) /* afs_vnodeops.c */ \
562 AFS_CS(afs_read) /* afs_vnodeops.c */ \
563 AFS_CS(FIXUPSTUPIDINODE) /* afs_vnodeops.c */ \
564 AFS_CS(afs_UFSRead) /* afs_vnodeops.c */ \
565 AFS_CS(afs_CopyOutAttrs) /* afs_vnodeops.c */ \
566 AFS_CS(afs_getattr) /* afs_vnodeops.c */ \
567 AFS_CS(afs_VAttrToAS) /* afs_vnodeops.c */ \
568 AFS_CS(afs_setattr) /* afs_vnodeops.c */ \
569 AFS_CS(EvalMountPoint) /* afs_vnodeops.c */ \
570 AFS_CS(afs_access) /* afs_vnodeops.c */ \
571 AFS_CS(ENameOK) /* afs_vnodeops.c */ \
572 AFS_CS(HandleAtName) /* afs_vnodeops.c */ \
573 AFS_CS(getsysname) /* afs_vnodeops.c */ \
574 AFS_CS(strcat) /* afs_vnodeops.c */ \
575 AFS_CS(afs_lookup) /* afs_vnodeops.c */ \
576 AFS_CS(afs_create) /* afs_vnodeops.c */ \
577 AFS_CS(afs_LocalHero) /* afs_vnodeops.c */ \
578 AFS_CS(FetchWholeEnchilada) /* afs_vnodeops.c */ \
579 AFS_CS(afs_remove) /* afs_vnodeops.c */ \
580 AFS_CS(afs_link) /* afs_vnodeops.c */ \
581 AFS_CS(afs_rename) /* afs_vnodeops.c */ \
582 AFS_CS(afs_InitReq) /* afs_vnodeops.c */ \
583 AFS_CS(afs_mkdir) /* afs_vnodeops.c */ \
584 AFS_CS(BlobScan) /* afs_vnodeops.c */ \
585 AFS_CS(afs_rmdir) /* afs_vnodeops.c */ \
586 AFS_CS(RecLen) /* afs_vnodeops.c */ \
587 AFS_CS(RoundToInt) /* afs_vnodeops.c */ \
588 AFS_CS(afs_readdir_with_offlist) /* afs_vnodeops.c */ \
589 AFS_CS(DIRSIZ_LEN) /* afs_vnodeops.c */ \
590 AFS_CS(afs_readdir_move) /* afs_vnodeops.c */ \
591 AFS_CS(afs_readdir_iter) /* afs_vnodeops.c */ \
592 AFS_CS(HandleFlock) /* afs_vnodeops.c */ \
593 AFS_CS(afs_readdir) /* afs_vnodeops.c */ \
594 AFS_CS(afs_symlink) /* afs_vnodeops.c */ \
595 AFS_CS(afs_HandleLink) /* afs_vnodeops.c */ \
596 AFS_CS(afs_MemHandleLink) /* afs_vnodeops.c */ \
597 AFS_CS(afs_UFSHandleLink) /* afs_vnodeops.c */ \
598 AFS_CS(afs_readlink) /* afs_vnodeops.c */ \
599 AFS_CS(afs_fsync) /* afs_vnodeops.c */ \
600 AFS_CS(afs_inactive) /* afs_vnodeops.c */ \
601 AFS_CS(afs_ustrategy) /* afs_vnodeops.c */ \
602 AFS_CS(afs_bread) /* afs_vnodeops.c */ \
603 AFS_CS(afs_brelse) /* afs_vnodeops.c */ \
604 AFS_CS(afs_bmap) /* afs_vnodeops.c */ \
605 AFS_CS(afs_fid) /* afs_vnodeops.c */ \
606 AFS_CS(afs_strategy) /* afs_vnodeops.c */ \
607 AFS_CS(afs_FakeClose) /* afs_vnodeops.c */ \
608 AFS_CS(afs_FakeOpen) /* afs_vnodeops.c */ \
609 AFS_CS(afs_StoreOnLastReference) /* afs_vnodeops.c */ \
610 AFS_CS(afs_GetAccessBits) /* afs_vnodeops.c */ \
611 AFS_CS(afs_AccessOK) /* afs_vnodeops.c */ \
612 AFS_CS(shutdown_vnodeops) /* afs_vnodeops.c */ \
613 AFS_CS(afsio_copy) /* afs_vnodeops.c */ \
614 AFS_CS(afsio_trim) /* afs_vnodeops.c */ \
615 AFS_CS(afs_page_read) /* afs_vnodeops.c */ \
616 AFS_CS(afs_page_write) /* afs_vnodeops.c */ \
617 AFS_CS(afsio_skip) /* afs_vnodeops.c */ \
618 AFS_CS(afs_read1dir) /* afs_vnodeops.c */ \
619 AFS_CS(afs_get_groups_from_pag) /* afs_vnodeops.c */ \
620 AFS_CS(afs_get_pag_from_groups) /* afs_vnodeops.c */ \
621 AFS_CS(PagInCred) /* afs_vnodeops.c */ \
622 AFS_CS(afs_getgroups) /* afs_vnodeops.c */ \
623 AFS_CS(setpag) /* afs_vnodeops.c */ \
624 AFS_CS(afs_setgroups) /* afs_vnodeops.c */ \
625 AFS_CS(afs_page_in) /* afs_vnodeops.c */ \
626 AFS_CS(afs_page_out) /* afs_vnodeops.c */ \
627 AFS_CS(AddPag) /* afs_vnodeops.c */ \
628 AFS_CS(afs_AdvanceFD) /* afs_vnodeops.c */ \
629 AFS_CS(afs_lockf) /* afs_vnodeops.c */ \
630 AFS_CS(afs_xsetgroups) /* afs_vnodeops.c */ \
631 AFS_CS(afs_nlinks) /* afs_vnodeops.c */ \
632 AFS_CS(DoLockWarning) /* afs_vnodeops.c */ \
633 AFS_CS(afs_lockctl) /* afs_vnodeops.c */ \
634 AFS_CS(afs_xflock) /* afs_vnodeops.c */ \
635 AFS_CS(PSetSPrefs) /* afs_pioctl.c */ \
636 AFS_CS(PGetSPrefs) /* afs_pioctl.c */ \
637 AFS_CS(afs_warn) /* afs_warn.c */ \
638 AFS_CS(afs_warnuser) /* afs_warn.c */ \
639 AFS_CS(afs_pagein) /* afs_hp_subr.c */ \
640 AFS_CS(afs_pageout) /* afs_hp_subr.c */ \
641 AFS_CS(afs_hp_strategy) /* afs_hp_subr.c */ \
642 AFS_CS(PGetCPrefs) /* afs_pioctl.c */ \
643 AFS_CS(PSetCPrefs) /* afs_pioctl.c */ \
644 AFS_CS(SRXAFSCB_WhoAreYou) /* afs_callback.c */ \
645 AFS_CS(afs_DiscardDCache) /* afs_dcache.c */ \
646 AFS_CS(afs_FreeDiscardedDCache) /* afs_dcache.c */ \
647 AFS_CS(afs_MaybeFreeDiscardedDCache) /* afs_dcache.c */ \
648 AFS_CS(PFlushMount) /* afs_pioctl.c */ \
649 AFS_CS(SRXAFSCB_GetServerPrefs) /* afs_callback.c */ \
650 AFS_CS(SRXAFSCB_GetCellServDB) /* afs_callback.c */ \
651 AFS_CS(SRXAFSCB_GetLocalCell) /* afs_callback.c */ \
652 AFS_CS(afs_MarshallCacheConfig) /* afs_callback.c */ \
653 AFS_CS(SRXAFSCB_GetCacheConfig) /* afs_callback.c */ \
654 AFS_CS(SRXAFSCB_GetCE64) /* afs_callback.c */ \
655 AFS_CS(SRXAFSCB_GetCellByNum) /* afs_callback.c */ \
656 AFS_CS(BPrefetchNoCache) /* afs_daemons.c */ \
657 AFS_CS(afs_ReadNoCache) /* osi_vnodeops.c */ \
658 AFS_CS(PSetTokens2) /* afs_pioctl.c */ \
659 AFS_CS(PPrefetchFromTape) /* afs_pioctl.c */ \
660 AFS_CS(PFlushAllVolumeData) /* afs_pioctl.c */ \
661 AFS_CS(afs_InitVolSlot) /* afs_volume.c */ \
662 AFS_CS(afs_SetupVolSlot) /* afs_volume.c */
663
664struct afs_CMCallStats {
665#define AFS_CS(call) afs_int32 C_ ## call;
666 AFS_CM_CALL_STATS
667#undef AFS_CS
668};
669
670struct afs_CMMeanStats {
671 struct afs_MeanStats something; /* fill this in */
672};
673
674struct afs_CMStats {
675 struct afs_CMCallStats callInfo;
676 struct afs_CMMeanStats meanInfo;
677};
678
679/*
680 * This is the structure accessible by specifying the
681 * AFSCB_XSTATSCOLL_CALL_INFO collection to the xstat package.
682 */
683extern struct afs_CMStats afs_cmstats;
684
685/*
686 * Constants to track downtime durations:
687 * Bucket 0: dur <= 10 min
688 * Bucket 1: 10 min < dur <= 30 min
689 * Bucket 2: 30 min < dur <= 1 hour
690 * Bucket 3: 1 hour < dur <= 2 hours
691 * Bucket 4: 2 hours < dur <= 4 hours
692 * Bucket 5: 4 hours < dur <= 8 hours
693 * Bucket 6: dur >= 8 hours
694 */
695#define AFS_STATS_NUM_DOWNTIME_DURATION_BUCKETS 7
696
697#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET0 600 /*10 minutes */
698#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET1 1800 /*30 minutes */
699#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET2 3600 /*60 minutes */
700#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET3 7200 /*2 hours */
701#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET4 14400 /*4 hours */
702#define AFS_STATS_MAX_DOWNTIME_DURATION_BUCKET5 28800 /*8 hours */
703
704/*
705 * Constants to track downtime incidents:
706 * Bucket 0: down = 0 times
707 * Bucket 1: down = 1 time
708 * Bucket 2: 1 time < down <= 5 times
709 * Bucket 3: 5 times < down <= 10 times
710 * Bucket 4: 10 times < down <= 50 times
711 * Bucket 5: down > 50 times
712 */
713#define AFS_STATS_NUM_DOWNTIME_INCIDENTS_BUCKETS 6
714
715#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET0 0
716#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET1 1
717#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET2 5
718#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET3 10
719#define AFS_STATS_MAX_DOWNTIME_INCIDENTS_BUCKET4 50
720
721/*
722 * Numbers used to track aggregate up/downtime stats for servers. We'll
723 * keep these numbers separately for FS and VL server records, and then
724 * again separately for servers in the same cell as this client machine
725 * and those outside the client's cell.
726 */
727struct afs_stats_SrvUpDownInfo {
728 afs_int32 numTtlRecords; /*# records, active or inactive */
729 afs_int32 numUpRecords; /*# (active) records currently marked up */
730 afs_int32 numDownRecords; /*# (active) records currently marked down */
731 afs_int32 sumOfRecordAges; /*Sum of server record lifetimes */
732 afs_int32 ageOfYoungestRecord; /*Age of youngest server record */
733 afs_int32 ageOfOldestRecord; /*Age of oldest server record */
734 afs_int32 numDowntimeIncidents; /*Number of (completed) downtime incidents */
735 afs_int32 numRecordsNeverDown; /*Number of server records never marked down */
736 afs_int32 maxDowntimesInARecord; /*Max downtimes seen by any record */
737 afs_int32 sumOfDowntimes; /*Sum of all (completed) downtimes, in seconds */
738 afs_int32 shortestDowntime; /*Shortest downtime, in seconds */
739 afs_int32 longestDowntime; /*Longest downtime, in seconds */
740 /*
741 * Arrays keeping distributions on downtime durations and number of
742 * downtime incidents.
743 */
744 afs_int32 downDurations[AFS_STATS_NUM_DOWNTIME_DURATION_BUCKETS];
745 afs_int32 downIncidents[AFS_STATS_NUM_DOWNTIME_INCIDENTS_BUCKETS];
746};
747
748/*
749 * Define indices for the server up/downtime arrays below.
750 */
751#define AFS_STATS_UPDOWN_IDX_SAME_CELL 0
752#define AFS_STATS_UPDOWN_IDX_DIFF_CELL 1
753
754/*
755 * Performance numbers for the Cache Manager.
756 */
757struct afs_stats_CMPerf {
758 afs_int32 numPerfCalls; /*# of performance calls rcvd */
759
760 afs_int32 epoch; /*Cache Manager epoch time */
761 afs_int32 numCellsVisible; /*# cells we know about */
762 afs_int32 numCellsContacted; /*# cells corresponded with */
763 afs_int32 dlocalAccesses; /*# data accesses to files within cell */
764 afs_int32 vlocalAccesses; /*# stat accesses to files within cell */
765 afs_int32 dremoteAccesses; /*# data accesses to files outside of cell */
766 afs_int32 vremoteAccesses; /*# stat accesses to files outside of cell */
767 afs_int32 cacheNumEntries; /*# cache entries */
768 afs_int32 cacheBlocksTotal; /*# (1K) blocks configured for cache */
769 afs_int32 cacheBlocksInUse; /*# cache blocks actively in use */
770 afs_int32 cacheBlocksOrig; /*# cache blocks at bootup */
771 afs_int32 cacheMaxDirtyChunks; /*Max # dirty cache chunks tolerated */
772 afs_int32 cacheCurrDirtyChunks; /*Current # dirty cache chunks */
773 afs_int32 dcacheHits; /*# data files found in local cache */
774 afs_int32 vcacheHits; /*# stat entries found in local cache */
775 afs_int32 dcacheMisses; /*# data files NOT found in local cache */
776 afs_int32 vcacheMisses; /*# stat entries NOT found in local cache */
777 afs_int32 cacheFlushes; /*# files flushed from cache */
778 afs_int32 cacheFilesReused; /*# cache files reused */
779 afs_int32 ProtServerAddr; /*Addr of Protection Server used */
780 afs_int32 vcacheXAllocs; /* Additionally allocated vcaches */
781 afs_int32 dcacheXAllocs; /* Additionally allocated dcaches */
782
783 /*
784 * Some stats related to our buffer package
785 */
786 afs_int32 bufAlloced; /* # of buffers allocated by afs */
787 afs_int32 bufHits; /* # of pages found on buffer cache */
788 afs_int32 bufMisses; /* # of pages NOT found on buffer cache */
789 afs_int32 bufFlushDirty; /* # of cached dirty bufs flushed because all busy */
790
791 /*
792 * Stats that keep track of all allocated/used objects in CM
793 */
794 afs_int32 LargeBlocksActive; /* # of currently used large free pool entries */
795 afs_int32 LargeBlocksAlloced; /* # of allocated large free pool entries */
796 afs_int32 SmallBlocksActive; /* # of currently used small free pool entries */
797 afs_int32 SmallBlocksAlloced; /* # of allocated used small free pool entries */
798 afs_int32 MediumBlocksActive; /* # of currently used medium free pool entries */
799 afs_int32 MediumBlocksAlloced; /* # of allocated used medium free pool entries */
800 afs_int32 OutStandingMemUsage; /* # of alloced memory */
801 afs_int32 OutStandingAllocs; /* Outstanding osi_allocs (no osi_frees yet) */
802 afs_int32 CallBackAlloced; /* # callback structures allocated */
803 afs_int32 CallBackFlushes; /* # callback flush operations performed */
804
805 /*
806 * Accounting stats having to do with the server table & records.
807 */
808 afs_int32 srvRecords; /*# of servers currently on record */
809 afs_int32 srvRecordsHWM; /* Server record high water mark */
810 afs_int32 srvNumBuckets; /* Num server hash chain buckets */
811 afs_int32 srvMaxChainLength; /* Max server hash chain length */
812 afs_int32 srvMaxChainLengthHWM; /* Server hash chain high water mark */
813
814 /*
815 * Stats having to do with the systype upon which the Cache Manager
816 * is running.
817 */
818 afs_int32 sysName_ID; /*Sysname ID for host hardware */
819
820 /*
821 * Stats recording downtime characteristics for each File Server and Volume
822 * Location Server we've dealt with, both within the same cell and in
823 * other cells.
824 */
825 struct afs_stats_SrvUpDownInfo fs_UpDown[2];
826 struct afs_stats_SrvUpDownInfo vl_UpDown[2];
827
828 afs_uint32 cbloops;
829 afs_uint32 osiread_efaults;
830 afs_int32 cacheBlocksDiscarded; /*# cache blocks free but not truncated */
831 afs_int32 cacheBucket0_Discarded;
832 afs_int32 cacheBucket1_Discarded;
833 afs_int32 cacheBucket2_Discarded;
834
835 /*
836 * Spares for future expansion.
837 */
838 afs_int32 spare[10]; /*Spares */
839};
840
841
842/*
843 * Values denoting the File Server and Cache Manager opcodes.
844 */
845#define AFS_STATS_FS_RPCIDX_FETCHDATA 0
846#define AFS_STATS_FS_RPCIDX_FETCHACL 1
847#define AFS_STATS_FS_RPCIDX_FETCHSTATUS 2
848#define AFS_STATS_FS_RPCIDX_STOREDATA 3
849#define AFS_STATS_FS_RPCIDX_STOREACL 4
850#define AFS_STATS_FS_RPCIDX_STORESTATUS 5
851#define AFS_STATS_FS_RPCIDX_REMOVEFILE 6
852#define AFS_STATS_FS_RPCIDX_CREATEFILE 7
853#define AFS_STATS_FS_RPCIDX_RENAME 8
854#define AFS_STATS_FS_RPCIDX_SYMLINK 9
855#define AFS_STATS_FS_RPCIDX_LINK 10
856#define AFS_STATS_FS_RPCIDX_MAKEDIR 11
857#define AFS_STATS_FS_RPCIDX_REMOVEDIR 12
858#define AFS_STATS_FS_RPCIDX_SETLOCK 13
859#define AFS_STATS_FS_RPCIDX_EXTENDLOCK 14
860#define AFS_STATS_FS_RPCIDX_RELEASELOCK 15
861#define AFS_STATS_FS_RPCIDX_GETSTATISTICS 16
862#define AFS_STATS_FS_RPCIDX_GIVEUPCALLBACKS 17
863#define AFS_STATS_FS_RPCIDX_GETVOLUMEINFO 18
864#define AFS_STATS_FS_RPCIDX_GETVOLUMESTATUS 19
865#define AFS_STATS_FS_RPCIDX_SETVOLUMESTATUS 20
866#define AFS_STATS_FS_RPCIDX_GETROOTVOLUME 21
867#define AFS_STATS_FS_RPCIDX_CHECKTOKEN 22
868#define AFS_STATS_FS_RPCIDX_GETTIME 23
869#define AFS_STATS_FS_RPCIDX_NGETVOLUMEINFO 24
870#define AFS_STATS_FS_RPCIDX_BULKSTATUS 25
871#define AFS_STATS_FS_RPCIDX_XSTATSVERSION 26
872#define AFS_STATS_FS_RPCIDX_GETXSTATS 27
873#define AFS_STATS_FS_RPCIDX_XLOOKUP 28
874#define AFS_STATS_FS_RPCIDX_RESIDENCYRPCS 29
875
876#define AFS_STATS_NUM_FS_RPC_OPS 30
877
878#define AFS_STATS_FS_RPCIDXES_ISWRITE(X) (((X > AFS_STATS_FS_RPCIDX_FETCHSTATUS) && (X < AFS_STATS_FS_RPCIDX_GETSTATISTICS)) || (X == AFS_STATS_FS_RPCIDX_SETVOLUMESTATUS))
879#define AFS_STATS_FS_RPCIDXES_WRITE_RETRIABLE(X) ((X >= AFS_STATS_FS_RPCIDX_STOREDATA) && (X <= AFS_STATS_FS_RPCIDX_STORESTATUS))
880
881#define AFS_STATS_FS_XFERIDX_FETCHDATA 0
882#define AFS_STATS_FS_XFERIDX_STOREDATA 1
883
884#define AFS_STATS_NUM_FS_XFER_OPS 2
885
886#define AFS_STATS_CM_RPCIDX_CALLBACK 0
887#define AFS_STATS_CM_RPCIDX_INITCALLBACKSTATE 1
888#define AFS_STATS_CM_RPCIDX_PROBE 2
889#define AFS_STATS_CM_RPCIDX_GETLOCK 3
890#define AFS_STATS_CM_RPCIDX_GETCE 4
891#define AFS_STATS_CM_RPCIDX_XSTATSVERSION 5
892#define AFS_STATS_CM_RPCIDX_GETXSTATS 6
893
894#define AFS_STATS_NUM_CM_RPC_OPS 7
895
896
897/*
898 * Record to track timing numbers for each Cache Manager RPC operation.
899 */
900struct afs_stats_opTimingData {
901 afs_int32 numOps; /*Number of operations executed */
902 afs_int32 numSuccesses; /*Number of successful ops */
903 osi_timeval32_t sumTime; /*Sum of sample timings */
904 osi_timeval32_t sqrTime; /*Sum of squares of sample timings */
905 osi_timeval32_t minTime; /*Minimum timing value observed */
906 osi_timeval32_t maxTime; /*Minimum timing value observed */
907};
908
909/*
910 * We discriminate byte size transfers into this many buckets.
911 */
912#define AFS_STATS_NUM_XFER_BUCKETS 9
913
914#define AFS_STATS_MAXBYTES_BUCKET0 128
915#define AFS_STATS_MAXBYTES_BUCKET1 1024
916#define AFS_STATS_MAXBYTES_BUCKET2 8192
917#define AFS_STATS_MAXBYTES_BUCKET3 16384
918#define AFS_STATS_MAXBYTES_BUCKET4 32768
919#define AFS_STATS_MAXBYTES_BUCKET5 131072
920#define AFS_STATS_MAXBYTES_BUCKET6 524288
921#define AFS_STATS_MAXBYTES_BUCKET7 1048576
922
923/*
924 * Record to track timings and byte sizes for data transfers.
925 */
926struct afs_stats_xferData {
927 afs_int32 numXfers; /*Number of successful xfers */
928 afs_int32 numSuccesses; /*Number of successful xfers */
929 osi_timeval32_t sumTime; /*Sum of timing values */
930 osi_timeval32_t sqrTime; /*Sum of squares of timing values */
931 osi_timeval32_t minTime; /*Minimum xfer time recorded */
932 osi_timeval32_t maxTime; /*Maximum xfer time recorded */
933 afs_int32 sumBytes; /*Sum of KBytes transferred */
934 afs_int32 minBytes; /*Minimum value observed */
935 afs_int32 maxBytes; /*Maximum value observed */
936 afs_int32 count[AFS_STATS_NUM_XFER_BUCKETS]; /*Tally for each range of bytes */
937};
938
939/*
940 * Macros to operate on time values.
941 *
942 * afs_stats_TimeLessThan(t1, t2) Non-zero if t1 is less than t2
943 * afs_stats_TimeGreaterThan(t1, t2) Non-zero if t1 is greater than t2
944 * afs_stats_GetDiff(t3, t1, t2) Set t3 to the difference between
945 * t1 and t2 (t1 is less than or
946 * equal to t2).
947 * afs_stats_AddTo(t1, t2) Add t2 to t1
948 * afs_stats_TimeAssign(t1, t2) Assign time t2 to t1
949 * afs_stats_SquareAddTo(t1,t2) Add square of t2 to t1
950 */
951#define afs_stats_TimeLessThan(t1, t2) \
952 ((t1.tv_sec < t2.tv_sec) ? 1 : \
953 (t1.tv_sec > t2.tv_sec) ? 0 : \
954 (t1.tv_usec < t2.tv_usec) ? 1 : \
955 0)
956
957#define afs_stats_TimeGreaterThan(t1, t2) \
958 ((t1.tv_sec > t2.tv_sec) ? 1 : \
959 (t1.tv_sec < t2.tv_sec) ? 0 : \
960 (t1.tv_usec > t2.tv_usec) ? 1 : \
961 0)
962
963#define afs_stats_GetDiff(t3, t1, t2) \
964{ \
965 /* \
966 * If the microseconds of the later time are smaller than \
967 * the earlier time, set up for proper subtraction (doing \
968 * the carry). \
969 */ \
970 if (t2.tv_usec < t1.tv_usec) { \
971 t2.tv_usec += 1000000; \
972 t2.tv_sec -= 1; \
973 } \
974 t3.tv_sec = t2.tv_sec - t1.tv_sec; \
975 t3.tv_usec = t2.tv_usec - t1.tv_usec; \
976}
977
978#define afs_stats_AddTo(t1, t2) \
979{ \
980 t1.tv_sec += t2.tv_sec; \
981 t1.tv_usec += t2.tv_usec; \
982 if (t1.tv_usec > 1000000) { \
983 t1.tv_usec -= 1000000; \
984 t1.tv_sec++; \
985 } \
986}
987
988#define afs_stats_TimeAssign(t1, t2) \
989{ \
990 t1.tv_sec = t2.tv_sec; \
991 t1.tv_usec = t2.tv_usec; \
992}
993/*
994 * We calculate the square of a timeval as follows:
995 *
996 * The timeval struct contains two ints - the number of seconds and the
997 * number of microseconds. These two numbers together gives the correct
998 * amount of time => t = t.tv_sec + (t.tv_usec / 1000000);
999 *
1000 * if x = t.tv_sec and y = (t.tv_usec / 1000000) then the square is simply:
1001 *
1002 * x^2 + 2xy + y^2
1003 *
1004 * Since we are trying to avoid floating point math, we use the following
1005 * observations to simplify the above equation:
1006 *
1007 * The resulting t.tv_sec (x') only depends upon the x^2 + 2xy portion
1008 * of the equation. This is easy to see if you think about y^2 in
1009 * decimal notation. y^2 is always < 0 since y < 0. Therefore in calculating
1010 * x', we can ignore y^2 (we do need to take care of rounding which is
1011 * done below).
1012 *
1013 * Similarly, in calculating t.tv_usec (y') we can ignore x^2 and concentrate
1014 * on 2xy + y^2.
1015 *
1016 * You'll notice that both x' and y' depend upon 2xy. We can further
1017 * simplify things by realizing that x' depends on upon the integer
1018 * portion of the 2xy term. We can get part of this integer by
1019 * multiplying 2 * x * t.tv_usec and then truncating the result by
1020 * / 1000000. Similarly, we can get the decimal portion of this term
1021 * by performing the same multiplication and then % 1000000. It is
1022 * possible that the decimal portion will in fact contain some of the
1023 * integer portion (this will be taken care of when we ensure that y'
1024 * is less than 1000000).
1025 *
1026 * The only other non-obvious calculation involves y^2. The key to
1027 * understanding this part of the calculation is to expand y again
1028 * in a nonobvious manner. We do this via the following expansion:
1029 *
1030 * y = t.tv_usec / 1000000;
1031 * let abcdef represent the six digits of t.tv_usec then we have:
1032 * t.tv_usec / 1000000 = abc/1000 + def/1000000;
1033 *
1034 * squaring yields:
1035 *
1036 * y^2 = (abc/1000)^2 + 2 * (abc/1000) * (def/1000000) + (def/1000000)^2
1037 *
1038 * Examining this equation yields the following observations:
1039 *
1040 * The second term can be calculated by multiplying abc and def then
1041 * shifting the decimal correctly.
1042 *
1043 * (def/1000000)^2 contributes only to rounding and we only round up
1044 * if def > 707.
1045 *
1046 * These two observations are the basis for the somewhat cryptic
1047 * calculation of usec^2 (i.e. they are the "tricks").
1048 */
1049
1050#define afs_stats_SquareAddTo(t1, t2) \
1051{ \
1052 /* \
1053 * We use some tricks here to avoid floating point arithmetic \
1054 */ \
1055 if(t2.tv_sec > 0 ) \
1056 { \
1057 t1.tv_sec += t2.tv_sec * t2.tv_sec \
1058 + 2 * t2.tv_sec * t2.tv_usec /1000000; \
1059 t1.tv_usec += (2 * t2.tv_sec * t2.tv_usec) % 1000000 \
1060 + (t2.tv_usec / 1000)*(t2.tv_usec / 1000) \
1061 + 2 * (t2.tv_usec / 1000) * (t2.tv_usec % 1000) / 1000 \
1062 + (((t2.tv_usec % 1000) > 707) ? 1 : 0); \
1063 } \
1064 else \
1065 { \
1066 t1.tv_usec += (t2.tv_usec / 1000)*(t2.tv_usec / 1000) \
1067 + 2 * (t2.tv_usec / 1000) * (t2.tv_usec % 1000) / 1000 \
1068 + (((t2.tv_usec % 1000) > 707) ? 1 : 0); \
1069 } \
1070 if (t1.tv_usec > 1000000) { \
1071 t1.tv_usec -= 1000000; \
1072 t1.tv_sec++; \
1073 } \
1074}
1075
1076
1077
1078
1079/*
1080 * Structure recording RPC outcomes.
1081 */
1082struct afs_stats_RPCErrors {
1083 afs_int32 err_Server; /*Server down error */
1084 afs_int32 err_Network; /*Network error */
1085 afs_int32 err_Protection; /*Protection violation */
1086 afs_int32 err_Volume; /*Volume-related error */
1087 afs_int32 err_VolumeBusies; /*"Volume busy conditions encountered */
1088 afs_int32 err_Other; /*Misc other errors */
1089};
1090
1091
1092/*
1093 * Structure holding RPC interface opcode measurements for the Cache Manager.
1094 */
1095struct afs_stats_RPCOpInfo {
1096 struct afs_stats_opTimingData
1097 fsRPCTimes[AFS_STATS_NUM_FS_RPC_OPS]; /*Individual FS RPC op timings */
1098 struct afs_stats_RPCErrors
1099 fsRPCErrors[AFS_STATS_NUM_FS_RPC_OPS]; /*Individual FS RPC op errors */
1100 struct afs_stats_xferData
1101 fsXferTimes[AFS_STATS_NUM_FS_XFER_OPS]; /*Individual FS RPC xfer timings */
1102 struct afs_stats_opTimingData
1103 cmRPCTimes[AFS_STATS_NUM_CM_RPC_OPS]; /*Individual CM RPC op timings */
1104};
1105
1106/*
1107 * Structure holding authentication info for the CM.
1108 */
1109struct afs_stats_AuthentInfo {
1110 /*
1111 * This first set of fields don't have any history - they are simply
1112 * snapshots of the system at the time of the probe.
1113 */
1114 afs_int32 curr_PAGs; /*Current number of PAGs */
1115 afs_int32 curr_Records; /*Current # of records in table */
1116 afs_int32 curr_AuthRecords; /*Current # of authenticated
1117 * records (w/valid ticket) */
1118 afs_int32 curr_UnauthRecords; /*Current # of unauthenticated
1119 * records (w/o any ticket at all) */
1120 afs_int32 curr_MaxRecordsInPAG; /*Max records for a single PAG */
1121 afs_int32 curr_LongestChain; /*Length of longest current hash chain */
1122
1123 /*
1124 * This second set of fields are values accumulated over the lifetme
1125 * of the current CM incarnation.
1126 */
1127 afs_int32 PAGCreations; /*# PAG creations */
1128 afs_int32 TicketUpdates; /*# ticket additions/refreshes */
1129 afs_int32 HWM_PAGs; /*High water mark - # PAGs */
1130 afs_int32 HWM_Records; /* " - # records */
1131 afs_int32 HWM_MaxRecordsInPAG; /* " - max records for a single PAG */
1132 afs_int32 HWM_LongestChain; /* " - longest hash chain */
1133};
1134
1135/*
1136 * [Un]replicated file access. These count the number of RXAFS_FetchData
1137 * calls get accomplished, and their need to call upon other replicas in
1138 * case of failure.
1139 */
1140struct afs_stats_AccessInfo {
1141 afs_int32 unreplicatedRefs; /*# references to unreplicated data */
1142 afs_int32 replicatedRefs; /*# references to replicated data */
1143 afs_int32 numReplicasAccessed; /*# replicas accessed */
1144 afs_int32 maxReplicasPerRef; /*Max # replicas accessed per ref */
1145 afs_int32 refFirstReplicaOK; /*# references satisfied by 1st replica */
1146};
1147
1148/*
1149 * Structure holding authoring info for the CM. We keep track of
1150 * the results of writes on files and directories independently.
1151 * Results cover all objects in the cache uniformly.
1152 */
1153struct afs_stats_AuthorInfo {
1154 afs_int32 fileSameAuthor; /*File write by same author */
1155 afs_int32 fileDiffAuthor; /*File write by diff author */
1156 afs_int32 dirSameAuthor; /*Directory write by same author */
1157 afs_int32 dirDiffAuthor; /*Directory write by diff author */
1158};
1159
1160/*
1161 * Structure holding ``full'' CM peformance measurements.
1162 */
1163struct afs_stats_CMFullPerf {
1164 afs_int32 numFullPerfCalls; /*Number of accesses */
1165 struct afs_stats_CMPerf perf; /*General performance stats */
1166 struct afs_stats_RPCOpInfo rpc; /*RPC op stats */
1167 struct afs_stats_AuthentInfo authent; /*Authentication stats */
1168 struct afs_stats_AccessInfo accessinf; /*Access stats */
1169 struct afs_stats_AuthorInfo author; /*Authorship stats */
1170};
1171
1172/*
1173 * These are the storage declarations for the structures accessible
1174 * via the xstat package.
1175 */
1176/* extern struct afs_stats_CMPerf afs_stats_cmperf; */
1177/* extern struct afs_stats_CMFullPerf afs_stats_cmfullperf; */
1178/* extern afs_int32 afs_stats_XferSumBytes[]; */
1179
1180#ifndef AFS_NOSTATS
1181/*
1182 * We define routines to keep running counts and means. For the
1183 * running count, we have to concatenate the ``C_'' prefix on to
1184 * the routine name passed in as an argument to get the right
1185 * field name.
1186 */
1187#define AFS_STATCNT(arg) ((afs_cmstats.callInfo.C_ ## arg)++)
1188
1189#define AFS_MEANCNT(arg, value) \
1190 (afs_AddToMean(((afs_cmstats.meanInfo).(arg)),value))
1191
1192#endif /* AFS_NOSTATS */
1193
1194
1195#endif /* __OPENAFS_AFS_STATS_H__ */