The attached patch makes the fileserver's callback counters accessible through xstat_fs_test (collection ID 3).

(It is useful that you can set the number of callback slots for the fileserver and even more so if you have a way to find out whether you did right).

One might argue that xstat_fs_test is stone-age and that afsmonitor would have been the infinitesimally more modern place to make them accessible. Both tools are virtually useless on their own but xstat_fs_test can at least be hooked up easily to something that fits in the 21st century. We monitor callbacks with MRTG, work on interfacing with EDG monitoring tools is under way.

(Bcc'ed to openafs-bugs)
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Rainer Toebbicke
European Laboratory for Particle Physics(CERN) - Geneva, Switzerland
Phone: +41 22 767 8985       Fax: +41 22 767 7155
*** openafs/src/xstat/xstat_fs_test.c.o1381     2005-01-31 05:14:51.000000000 
+0100
--- openafs/src/xstat/xstat_fs_test.c   2005-05-31 13:59:57.000000000 +0200
***************
*** 493,498 ****
--- 493,526 ----
      PrintOverallPerfInfo(perfP);
  }
  
+ static char *CbCounterStrings[] = {
+     "DeleteFiles",
+     "DeleteCallBacks",
+     "BreakCallBacks",
+     "AddCallBack",
+     "GotSomeSpaces",
+     "DeleteAllCallBacks",
+     "nFEs", "nCBs", "nblks",
+     "CBsTimedOut",
+     "nbreakers",
+     "GSS1", "GSS2", "GSS3", "GSS4", "GSS5"
+ };
+ 
+ 
+ void
+ PrintCbCounters() {
+     int numInt32s = sizeof(CbCounterStrings)/sizeof(char *);
+     int i;
+     afs_uint32 *val=xstat_fs_Results.data.AFS_CollData_val;
+ 
+     if (numInt32s > xstat_fs_Results.data.AFS_CollData_len)
+       numInt32s = xstat_fs_Results.data.AFS_CollData_len;
+ 
+     for (i=0; i<numInt32s; i++) {
+       printf("\t%10u %s\n", val[i], CbCounterStrings[i]);
+     }
+ }
+ 
  
  /*------------------------------------------------------------------------
   * FS_Handler
***************
*** 549,554 ****
--- 577,586 ----
        PrintFullPerfInfo();
        break;
  
+     case AFS_XSTATSCOLL_CBSTATS:
+       PrintCbCounters();
+       break;
+ 
      default:
        printf("** Unknown collection: %d\n",
               xstat_fs_Results.collectionNumber);
*** openafs/src/viced/afsfileprocs.c.1rig       2005-04-06 10:32:03.000000000 
+0200
--- openafs/src/viced/afsfileprocs.c    2005-05-31 12:29:52.000000000 +0200
***************
*** 5803,5808 ****
--- 5803,5838 ----
  #endif
        break;
  
+     case AFS_XSTATSCOLL_CBSTATS:
+       afs_perfstats.numPerfCalls++;
+ 
+       dataBytes = sizeof(struct cbcounters);
+       dataBuffP = (afs_int32 *) malloc(dataBytes);
+       {
+           extern struct cbcounters cbstuff;
+           dataBuffP[0]=cbstuff.DeleteFiles;
+           dataBuffP[1]=cbstuff.DeleteCallBacks;
+           dataBuffP[2]=cbstuff.BreakCallBacks;
+           dataBuffP[3]=cbstuff.AddCallBacks;
+           dataBuffP[4]=cbstuff.GotSomeSpaces;
+           dataBuffP[5]=cbstuff.DeleteAllCallBacks;
+           dataBuffP[6]=cbstuff.nFEs;
+           dataBuffP[7]=cbstuff.nCBs;
+           dataBuffP[8]=cbstuff.nblks;
+           dataBuffP[9]=cbstuff.CBsTimedOut;
+           dataBuffP[10]=cbstuff.nbreakers;
+           dataBuffP[11]=cbstuff.GSS1;
+           dataBuffP[12]=cbstuff.GSS2;
+           dataBuffP[13]=cbstuff.GSS3;
+           dataBuffP[14]=cbstuff.GSS4;
+           dataBuffP[15]=cbstuff.GSS5;
+       }
+ 
+       a_dataP->AFS_CollData_len = dataBytes >> 2;
+       a_dataP->AFS_CollData_val = dataBuffP;
+       break;
+ 
+ 
      default:
        /*
         * Illegal collection number.
*** openafs/src/fsint/common.xg.o1382   2003-03-04 17:19:48.000000000 +0100
--- openafs/src/fsint/common.xg 2005-06-01 14:13:52.000000000 +0200
***************
*** 127,132 ****
--- 127,133 ----
  const AFS_XSTATSCOLL_CALL_INFO = 0;    /*FS call counting & info*/
  const AFS_XSTATSCOLL_PERF_INFO = 1;    /*FS performance info*/
  const AFS_XSTATSCOLL_FULL_PERF_INFO = 2; /*Full FS performance info*/
+ const AFS_XSTATSCOLL_CBSTATS = 3;      /*Callback package counters */
  
  typedef afs_uint32 VolumeId;
  typedef afs_uint32 VolId;

Reply via email to