volser: preserve stats over reclones and restores
authorMichael Meffie <mmeffie@sinenomine.net>
Thu, 23 Feb 2012 17:34:44 +0000 (12:34 -0500)
committerDerrick Brashear <shadow@dementix.org>
Sat, 12 May 2012 13:33:26 +0000 (06:33 -0700)
Optionally, preserve the volume usage statistics instead of clearing
them during reclone and restore operations.

Change-Id: I436b39b129b892912533ddeff5569b07224b075c
Reviewed-on: http://gerrit.openafs.org/3312
Reviewed-by: Alistair Ferguson <alistair.ferguson@mac.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

doc/man-pages/pod8/fragments/volserver-options.pod
doc/man-pages/pod8/fragments/volserver-synopsis.pod
src/vol/vol_prototypes.h
src/vol/vutil.c
src/volser/dumpstuff.c
src/volser/volmain.c
src/volser/volprocs.c

index 3c61666..6ac5ebb 100644 (file)
@@ -74,6 +74,12 @@ user.admin PTS entry. Sites whose Kerberos realms don't have these collisions
 between principal names may disable this check by starting the server
 with this option.
 
+=item B<-preserve-vol-stats>
+
+Preserve volume access statistics over volume restore and reclone operations.
+By default, volume access statistics are reset during volume restore and reclone
+operations.
+
 =item B<-help>
 
 Prints the online help for this command. All other valid options are
index 03ca28a..1d7805d 100644 (file)
@@ -5,4 +5,4 @@ B<volserver>
     S<<< [B<-d> <I<debug level>>] >>>
     [B<-nojumbo>] [B<-jumbo>] 
     [B<-enable_peer_stats>] [B<-enable_process_stats>] 
-    [B<-allow-dotted-principals>] [B<-help>]
+    [B<-allow-dotted-principals>] [B<-preserve-vol-stats>] [B<-help>]
index 4d7a709..eec1ccf 100644 (file)
@@ -22,6 +22,8 @@ extern void AssignVolumeName(VolumeDiskData * vol, char *name, char *ext);
 extern void AssignVolumeName_r(VolumeDiskData * vol, char *name, char *ext);
 extern void ClearVolumeStats(VolumeDiskData * vol);
 extern void ClearVolumeStats_r(VolumeDiskData * vol);
+extern void CopyVolumeStats(VolumeDiskData * from, VolumeDiskData * to);
+extern void CopyVolumeStats_r(VolumeDiskData * from, VolumeDiskData * to);
 extern afs_int32 CopyVolumeHeader(VolumeDiskData *, VolumeDiskData *);
 
 #endif
index 80bbf97..007b1ec 100644 (file)
@@ -386,6 +386,34 @@ ClearVolumeStats_r(VolumeDiskData * vol)
     vol->dayUseDate = 0;
 }
 
+void
+CopyVolumeStats_r(VolumeDiskData * from, VolumeDiskData * to)
+{
+    memcpy(to->weekUse, from->weekUse, sizeof(to->weekUse));
+    to->dayUse = from->dayUse;
+    to->dayUseDate = from->dayUseDate;
+    if (from->stat_initialized) {
+       memcpy(to->stat_reads, from->stat_reads, sizeof(to->stat_reads));
+       memcpy(to->stat_writes, from->stat_writes, sizeof(to->stat_writes));
+       memcpy(to->stat_fileSameAuthor, from->stat_fileSameAuthor,
+              sizeof(to->stat_fileSameAuthor));
+       memcpy(to->stat_fileDiffAuthor, from->stat_fileDiffAuthor,
+              sizeof(to->stat_fileDiffAuthor));
+       memcpy(to->stat_dirSameAuthor, from->stat_dirSameAuthor,
+              sizeof(to->stat_dirSameAuthor));
+       memcpy(to->stat_dirDiffAuthor, from->stat_dirDiffAuthor,
+              sizeof(to->stat_dirDiffAuthor));
+    }
+}
+
+void
+CopyVolumeStats(VolumeDiskData * from, VolumeDiskData * to)
+{
+    VOL_LOCK;
+    CopyVolumeStats_r(from, to);
+    VOL_UNLOCK;
+}
+
 /**
  * read an existing volume disk header.
  *
index 3a6639a..91f725c 100644 (file)
@@ -49,6 +49,7 @@
 /*@printflike@*/ extern void Log(const char *format, ...);
 
 extern int DoLogging;
+extern int DoPreserveVolumeStats;
 
 
 /* Forward Declarations */
@@ -1195,11 +1196,16 @@ RestoreVolume(struct rx_call *call, Volume * avp, int incremental,
     afs_foff_t *b1 = NULL, *b2 = NULL;
     int s1 = 0, s2 = 0, delo = 0, tdelo;
     int tag;
+    VolumeDiskData saved_header;
 
     iod_Init(iodp, call);
 
     vp = avp;
 
+    if (DoPreserveVolumeStats) {
+       CopyVolumeStats(&V_disk(vp), &saved_header);
+    }
+
     if (!ReadDumpHeader(iodp, &header)) {
        Log("1 Volser: RestoreVolume: Error reading header file for dump; aborted\n");
        return VOLSERREAD_DUMPERROR;
@@ -1268,7 +1274,11 @@ RestoreVolume(struct rx_call *call, Volume * avp, int incremental,
     }
 
   clean:
-    ClearVolumeStats(&vol);
+    if (DoPreserveVolumeStats) {
+       CopyVolumeStats(&saved_header, &vol);
+    } else {
+       ClearVolumeStats(&vol);
+    }
     if (V_needsSalvaged(vp)) {
        /* needsSalvaged may have been set while we tried to write volume data.
         * prevent it from getting overwritten. */
index 8971495..458dfd6 100644 (file)
@@ -68,6 +68,7 @@ int udpBufSize = 0;           /* UDP buffer size for receive */
 
 int rxBind = 0;
 int rxkadDisableDotCheck = 0;
+int DoPreserveVolumeStats = 0;
 
 #define ADDRSPERSITE 16         /* Same global is in rx/rx_user.c */
 afs_uint32 SHostAddrs[ADDRSPERSITE];
@@ -360,6 +361,8 @@ main(int argc, char **argv)
            rx_enablePeerRPCStats();
        } else if (strcmp(argv[code], "-enable_process_stats") == 0) {
            rx_enableProcessRPCStats();
+       } else if (strcmp(argv[code], "-preserve-vol-stats") == 0) {
+           DoPreserveVolumeStats = 1;
        }
 #ifndef AFS_NT40_ENV
        else if (strcmp(argv[code], "-syslog") == 0) {
index 29d3229..8996fe0 100644 (file)
@@ -54,6 +54,7 @@
 
 extern int DoLogging;
 extern struct afsconf_dir *tdir;
+extern int DoPreserveVolumeStats;
 
 extern void LogError(afs_int32 errcode);
 
@@ -890,6 +891,7 @@ VolReClone(struct rx_call *acid, afs_int32 atrans, afs_int32 cloneId)
     afs_int32 newType;
     struct volser_trans *tt, *ttc;
     char caller[MAXKTCNAMELEN];
+    VolumeDiskData saved_header;
 
     /*not a super user */
     if (!afsconf_SuperUser(tdir, acid, caller))
@@ -946,6 +948,10 @@ VolReClone(struct rx_call *acid, afs_int32 atrans, afs_int32 cloneId)
        goto fail;
     }
 
+    if (DoPreserveVolumeStats) {
+       CopyVolumeStats(&V_disk(clonevp), &saved_header);
+    }
+
     error = 0;
     Log("1 Volser: Clone: Recloning volume %u to volume %u\n", tt->volid,
        cloneId);
@@ -972,7 +978,11 @@ VolReClone(struct rx_call *acid, afs_int32 atrans, afs_int32 cloneId)
      * for ROs. But do not update copyDate; let it stay so we can identify
      * when the clone was first created. */
     V_creationDate(clonevp) = time(0);
-    ClearVolumeStats(&V_disk(clonevp));
+    if (DoPreserveVolumeStats) {
+       CopyVolumeStats(&saved_header, &V_disk(clonevp));
+    } else {
+       ClearVolumeStats(&V_disk(clonevp));
+    }
     V_destroyMe(clonevp) = 0;
     V_inService(clonevp) = 0;
     if (newType == backupVolume) {