From dfceff1d3a66e76246537738720f411330808d64 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Thu, 23 Feb 2012 12:34:44 -0500 Subject: [PATCH] volser: preserve stats over reclones and restores 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 Reviewed-by: Derrick Brashear Tested-by: BuildBot --- doc/man-pages/pod8/fragments/volserver-options.pod | 6 +++++ .../pod8/fragments/volserver-synopsis.pod | 2 +- src/vol/vol_prototypes.h | 2 ++ src/vol/vutil.c | 28 ++++++++++++++++++++++ src/volser/dumpstuff.c | 12 +++++++++- src/volser/volmain.c | 3 +++ src/volser/volprocs.c | 12 +++++++++- 7 files changed, 62 insertions(+), 3 deletions(-) diff --git a/doc/man-pages/pod8/fragments/volserver-options.pod b/doc/man-pages/pod8/fragments/volserver-options.pod index 3c61666..6ac5ebb 100644 --- a/doc/man-pages/pod8/fragments/volserver-options.pod +++ b/doc/man-pages/pod8/fragments/volserver-options.pod @@ -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 diff --git a/doc/man-pages/pod8/fragments/volserver-synopsis.pod b/doc/man-pages/pod8/fragments/volserver-synopsis.pod index 03ca28a..1d7805d 100644 --- a/doc/man-pages/pod8/fragments/volserver-synopsis.pod +++ b/doc/man-pages/pod8/fragments/volserver-synopsis.pod @@ -5,4 +5,4 @@ B S<<< [B<-d> >] >>> [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>] diff --git a/src/vol/vol_prototypes.h b/src/vol/vol_prototypes.h index 4d7a709..eec1ccf 100644 --- a/src/vol/vol_prototypes.h +++ b/src/vol/vol_prototypes.h @@ -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 diff --git a/src/vol/vutil.c b/src/vol/vutil.c index 80bbf97..007b1ec 100644 --- a/src/vol/vutil.c +++ b/src/vol/vutil.c @@ -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. * diff --git a/src/volser/dumpstuff.c b/src/volser/dumpstuff.c index 3a6639a..91f725c 100644 --- a/src/volser/dumpstuff.c +++ b/src/volser/dumpstuff.c @@ -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. */ diff --git a/src/volser/volmain.c b/src/volser/volmain.c index 89714951..458dfd6 100644 --- a/src/volser/volmain.c +++ b/src/volser/volmain.c @@ -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) { diff --git a/src/volser/volprocs.c b/src/volser/volprocs.c index 29d3229..8996fe0 100644 --- a/src/volser/volprocs.c +++ b/src/volser/volprocs.c @@ -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) { -- 1.9.4