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
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>]
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
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.
*
/*@printflike@*/ extern void Log(const char *format, ...);
extern int DoLogging;
+extern int DoPreserveVolumeStats;
/* Forward Declarations */
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;
}
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. */
int rxBind = 0;
int rxkadDisableDotCheck = 0;
+int DoPreserveVolumeStats = 0;
#define ADDRSPERSITE 16 /* Same global is in rx/rx_user.c */
afs_uint32 SHostAddrs[ADDRSPERSITE];
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) {
extern int DoLogging;
extern struct afsconf_dir *tdir;
+extern int DoPreserveVolumeStats;
extern void LogError(afs_int32 errcode);
afs_int32 newType;
struct volser_trans *tt, *ttc;
char caller[MAXKTCNAMELEN];
+ VolumeDiskData saved_header;
/*not a super user */
if (!afsconf_SuperUser(tdir, acid, caller))
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);
* 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) {