2 * Copyright 2000, International Business Machines Corporation and others.
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
10 /* An abstracted interface for recording fs statistics data */
12 #include <afsconfig.h>
13 #include <afs/param.h>
17 #include <afs/afsint.h>
18 #include <afs/ihandle.h>
26 fsstats_StartOp(struct fsstats *stats, int index)
28 stats->opP = &(afs_FullPerfStats.det.rpcOpTimes[index]);
30 (stats->opP->numOps)++;
32 FT_GetTimeOfDay(&stats->opStartTime, NULL);
36 fsstats_FinishOp(struct fsstats *stats, int code)
38 struct timeval opStopTime, elapsedTime;
40 FT_GetTimeOfDay(&opStopTime, NULL);
43 (stats->opP->numSuccesses)++;
44 fs_stats_GetDiff(elapsedTime, stats->opStartTime, opStopTime);
45 fs_stats_AddTo((stats->opP->sumTime), elapsedTime);
46 fs_stats_SquareAddTo((stats->opP->sqrTime), elapsedTime);
47 if (fs_stats_TimeLessThan(elapsedTime, (stats->opP->minTime))) {
48 fs_stats_TimeAssign((stats->opP->minTime), elapsedTime);
50 if (fs_stats_TimeGreaterThan(elapsedTime, (stats->opP->maxTime))) {
51 fs_stats_TimeAssign((stats->opP->maxTime), elapsedTime);
58 fsstats_StartXfer(struct fsstats *stats, int index)
60 FT_GetTimeOfDay(&stats->xferStartTime, NULL);
61 stats->xferP = &(afs_FullPerfStats.det.xferOpTimes[index]);
65 fsstats_FinishXfer(struct fsstats *stats, int code,
66 afs_sfsize_t bytesToXfer, afs_sfsize_t bytesXferred,
69 struct timeval xferStopTime;
70 struct timeval elapsedTime;
73 * At this point, the data transfer is done, for good or ill. Remember
74 * when the transfer ended, bump the number of successes/failures, and
75 * integrate the transfer size and elapsed time into the stats. If the
76 * operation failed, we jump to the appropriate point.
78 FT_GetTimeOfDay(&xferStopTime, 0);
80 (stats->xferP->numXfers)++;
82 (stats->xferP->numSuccesses)++;
85 * Bump the xfer sum by the number of bytes actually sent, NOT the
88 *remainder += bytesXferred;
89 (stats->xferP->sumBytes) += (*remainder >> 10);
91 if (bytesXferred < stats->xferP->minBytes)
92 stats->xferP->minBytes = bytesXferred;
93 if (bytesXferred > stats->xferP->maxBytes)
94 stats->xferP->maxBytes = bytesXferred;
97 * Tally the size of the object. Note: we tally the actual size,
98 * NOT the number of bytes that made it out over the wire.
100 if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET0)
101 (stats->xferP->count[0])++;
102 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET1)
103 (stats->xferP->count[1])++;
104 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET2)
105 (stats->xferP->count[2])++;
106 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET3)
107 (stats->xferP->count[3])++;
108 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET4)
109 (stats->xferP->count[4])++;
110 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET5)
111 (stats->xferP->count[5])++;
112 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET6)
113 (stats->xferP->count[6])++;
114 else if (bytesToXfer <= FS_STATS_MAXBYTES_BUCKET7)
115 (stats->xferP->count[7])++;
117 (stats->xferP->count[8])++;
119 fs_stats_GetDiff(elapsedTime, stats->xferStartTime, xferStopTime);
120 fs_stats_AddTo((stats->xferP->sumTime), elapsedTime);
121 fs_stats_SquareAddTo((stats->xferP->sqrTime), elapsedTime);
122 if (fs_stats_TimeLessThan(elapsedTime, (stats->xferP->minTime))) {
123 fs_stats_TimeAssign((stats->xferP->minTime), elapsedTime);
125 if (fs_stats_TimeGreaterThan(elapsedTime, (stats->xferP->maxTime))) {
126 fs_stats_TimeAssign((stats->xferP->maxTime), elapsedTime);
135 fsstats_StartOp(struct fsstats *stats, int index)
141 fsstats_FinishOp(struct fsstats *stats, int code)
147 fsstats_StartXfer(struct fsstats *stats)
153 fsstats_FinishXfer(struct fsstats *stats, int code,
154 afs_sfsize_t bytesToXfer, afs_sfsize_t bytesXferred,