From 893feb97db3638c6f7a222aabf35b63e76e590b4 Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Tue, 7 Dec 2010 21:23:53 -0500 Subject: [PATCH] DAFS: allow salvager to detect whether FSYNC server is DAFS in order to enable the right commands and print the right errors, query for DAFS-only FSYNC op. doesn't use bozo InstanceInfo as it's possible you can run fileserver outside of bos. (cherry picked from commit b9ecf28c6c7c232823ac9b44cd00db9afab81c91) Reviewed-on: http://gerrit.openafs.org/3486 Reviewed-by: Andrew Deason Tested-by: BuildBot Reviewed-by: Derrick Brashear Change-Id: If53edc8d100d5eacaf4aaad9feee96211e24e1a2 Reviewed-on: http://gerrit.openafs.org/4277 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/tsalvaged/Makefile.in | 2 +- src/vol/salvager.c | 56 ++++++++++++++++++------- src/vol/vol-salvage.c | 87 ++++++++++++++++++++++++++++++++------- src/vol/vol-salvage.h | 1 + src/vol/volume.h | 2 + 5 files changed, 117 insertions(+), 31 deletions(-) diff --git a/src/tsalvaged/Makefile.in b/src/tsalvaged/Makefile.in index c45c3c28b..750eeb281 100644 --- a/src/tsalvaged/Makefile.in +++ b/src/tsalvaged/Makefile.in @@ -18,7 +18,7 @@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ CC=${MT_CC} CFLAGS=${COMMON_CFLAGS} -I.. -DNINTERFACE ${MT_CFLAGS} -DRXDEBUG -DFSSYNC_BUILD_CLIENT \ -DSALVSYNC_BUILD_SERVER -DSALVSYNC_BUILD_CLIENT -DAFS_DEMAND_ATTACH_FS -SCFLAGS=${COMMON_CFLAGS} -I.. -DNINTERFACE ${XCFLAGS} ${ARCHFLAGS} -DRXDEBUG -DFSSYNC_BUILD_CLIENT +SCFLAGS=${COMMON_CFLAGS} -I.. -DNINTERFACE ${XCFLAGS} ${ARCHFLAGS} -DRXDEBUG -DFSSYNC_BUILD_CLIENT -DAFS_DEMAND_ATTACH_FS CCRULE=${CC} ${CFLAGS} -c $? SCCRULE=${CC} ${SCFLAGS} -c $? -o $@ diff --git a/src/vol/salvager.c b/src/vol/salvager.c index a9ec7a86f..da5c168a4 100644 --- a/src/vol/salvager.c +++ b/src/vol/salvager.c @@ -165,9 +165,11 @@ handleit(struct cmd_syndesc *as, void *arock) char *msg = "Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!"; +#ifndef AFS_NT40_ENV if (useSyslog) Log(msg); else +#endif printf("%s\n", msg); Exit(0); @@ -192,7 +194,7 @@ handleit(struct cmd_syndesc *as, void *arock) Testing = 1; if (as->parms[4].items) /* -inodes */ ListInodeOption = 1; - if (as->parms[5].items || as->parms[20].items) /* -force, -f */ + if (as->parms[5].items || as->parms[21].items) /* -force, -f */ ForceSalvage = 1; if (as->parms[6].items) /* -oktozap */ OKToZap = 1; @@ -273,23 +275,14 @@ handleit(struct cmd_syndesc *as, void *arock) char *msg = "Exiting immediately without salvage. Look into the FileLog to find volumes which really need to be salvaged!"; +#ifndef AFS_NT40_ENV if (useSyslog) Log(msg); else +#endif printf("%s\n", msg); Exit(0); } -#elif defined(DEMAND_ATTACH_ENABLE) - if (seenvol && !as->parms[19].items) { - char * msg = - "The standalone salvager cannot be run concurrently with a Demand Attach Fileserver. Please use 'salvageserver -client ' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, add the -forceDAFS flag to your salvager command line."; - - if (useSyslog) - Log(msg); - else - printf("%s\n", msg); - Exit(1); - } #endif if (get_salvage_lock) { @@ -322,6 +315,40 @@ handleit(struct cmd_syndesc *as, void *arock) Log("errors encountered initializing volume package; salvage aborted\n"); Exit(1); } + + /* + * Ok to defer this as Exit will clean up and no real work is done + * init'ing volume package + */ + if (seenvol) { + char *msg = NULL; +#ifdef AFS_DEMAND_ATTACH_FS + if (!AskDAFS()) { + msg = + "The DAFS dasalvager cannot be run with a non-DAFS fileserver. Please use 'salvager'."; + } + if (!msg && !as->parms[20].items) { + msg = + "The standalone salvager cannot be run concurrently with a Demand Attach Fileserver. Please use 'salvageserver -client ' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, add the -forceDAFS flag to your salvager command line."; + } +#else + if (AskDAFS()) { + msg = + "The non-DAFS salvager cannot be run with a Demand Attach Fileserver. Please use 'salvageserver -client ' to manually schedule volume salvages with the salvageserver (new versions of 'bos salvage' automatically do this for you). Or, if you insist on using the standalone salvager, run dasalvager with the -forceDAFS flag."; + } +#endif + + if (msg) { +#ifndef AFS_NT40_ENV + if (useSyslog) + Log("%s", msg); + else +#endif + printf("%s\n", msg); + Exit(1); + } + } + DInit(10); #ifdef AFS_NT40_ENV if (myjob.cj_number != NOT_CHILD) { @@ -489,11 +516,12 @@ main(int argc, char **argv) #ifdef FAST_RESTART cmd_AddParm(ts, "-DontSalvage", CMD_FLAG, CMD_OPTIONAL, "Don't salvage. This my be set in BosConfig to let the fileserver restart immediately after a crash. Bad volumes will be taken offline"); -#elif defined(DEMAND_ATTACH_ENABLE) +#elif defined(AFS_DEMAND_ATTACH_FS) + cmd_Seek(ts, 20); /* skip DontSalvage */ cmd_AddParm(ts, "-forceDAFS", CMD_FLAG, CMD_OPTIONAL, "For Demand Attach Fileserver, permit a manual volume salvage outside of the salvageserver"); #endif /* FAST_RESTART */ - cmd_Seek(ts, 20); + cmd_Seek(ts, 21); /* skip DontSalvage and forceDAFS if needed */ cmd_AddParm(ts, "-f", CMD_FLAG, CMD_OPTIONAL, "Alias for -force"); err = cmd_Dispatch(argc, argv); Exit(err); diff --git a/src/vol/vol-salvage.c b/src/vol/vol-salvage.c index bb1923a52..69a619ec2 100644 --- a/src/vol/vol-salvage.c +++ b/src/vol/vol-salvage.c @@ -4346,20 +4346,27 @@ AskOffline(struct SalvInfo *salvinfo, VolumeId volumeId) if (code == SYNC_OK) { break; } else if (code == SYNC_DENIED) { -#ifdef DEMAND_ATTACH_ENABLE - Log("AskOffline: file server denied offline request; a general salvage may be required.\n"); -#else - Log("AskOffline: file server denied offline request; a general salvage is required.\n"); -#endif + if (AskDAFS()) + Log("AskOffline: file server denied offline request; a general salvage may be required.\n"); + else + Log("AskOffline: file server denied offline request; a general salvage is required.\n"); Abort("Salvage aborted\n"); } else if (code == SYNC_BAD_COMMAND) { Log("AskOffline: fssync protocol mismatch (bad command word '%d'); salvage aborting.\n", FSYNC_VOL_OFF); -#ifdef DEMAND_ATTACH_ENABLE - Log("AskOffline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n"); + if (AskDAFS()) { +#ifdef AFS_DEMAND_ATTACH_FS + Log("AskOffline: please make sure dafileserver, davolserver, salvageserver and dasalvager binaries are same version.\n"); +#else + Log("AskOffline: fileserver is DAFS but we are not.\n"); +#endif + } else { +#ifdef AFS_DEMAND_ATTACH_FS + Log("AskOffline: fileserver is not DAFS but we are.\n"); #else - Log("AskOffline: please make sure fileserver, volserver and salvager binaries are same version.\n"); + Log("AskOffline: please make sure fileserver, volserver and salvager binaries are same version.\n"); #endif + } Abort("Salvage aborted\n"); } else if (i < 2) { /* try it again */ @@ -4374,6 +4381,50 @@ AskOffline(struct SalvInfo *salvinfo, VolumeId volumeId) } } +/* don't want to pass around state; remember it here */ +static int isDAFS = -1; +int +AskDAFS(void) +{ + afs_int32 code, i, ret = 0; + SYNC_response res; + + /* we don't care if we race. the answer shouldn't change */ + if (isDAFS != -1) + return isDAFS; + + memset(&res, 0, sizeof(res)); + + for (i = 0; i < 3; i++) { + code = FSYNC_VolOp(1, NULL, + FSYNC_VOL_QUERY_VOP, FSYNC_SALVAGE, &res); + + if (code == SYNC_OK) { + ret = 1; + break; + } else if (code == SYNC_DENIED) { + ret = 1; + break; + } else if (code == SYNC_BAD_COMMAND) { + ret = 0; + break; + } else if (code == SYNC_FAILED) { + if (res.hdr.reason == FSYNC_UNKNOWN_VOLID) + ret = 1; + else + ret = 0; + } else if (i < 2) { + /* try it again */ + Log("AskDAFS: request to query fileserver failed; trying again...\n"); + FSYNC_clientFinis(); + FSYNC_clientInit(); + } + } + + isDAFS = ret; + return ret; +} + void AskOnline(struct SalvInfo *salvinfo, VolumeId volumeId) { @@ -4390,11 +4441,7 @@ AskOnline(struct SalvInfo *salvinfo, VolumeId volumeId) } else if (code == SYNC_BAD_COMMAND) { Log("AskOnline: fssync protocol mismatch (bad command word '%d')\n", FSYNC_VOL_ON); -#ifdef DEMAND_ATTACH_ENABLE - Log("AskOnline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n"); -#else - Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n"); -#endif + Log("AskOnline: please make sure file server binaries are same version.\n"); break; } else if (i < 2) { /* try it again */ @@ -4421,11 +4468,19 @@ AskDelete(struct SalvInfo *salvinfo, VolumeId volumeId) } else if (code == SYNC_BAD_COMMAND) { Log("AskOnline: fssync protocol mismatch (bad command word '%d')\n", FSYNC_VOL_DONE); -#ifdef DEMAND_ATTACH_ENABLE - Log("AskOnline: please make sure fileserver, volserver, salvageserver and salvager binaries are same version.\n"); + if (AskDAFS()) { +#ifdef AFS_DEMAND_ATTACH_FS + Log("AskOnline: please make sure dafileserver, davolserver, salvageserver and dasalvager binaries are same version.\n"); #else - Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n"); + Log("AskOnline: fileserver is DAFS but we are not.\n"); #endif + } else { +#ifdef AFS_DEMAND_ATTACH_FS + Log("AskOnline: fileserver is not DAFS but we are.\n"); +#else + Log("AskOnline: please make sure fileserver, volserver and salvager binaries are same version.\n"); +#endif + } break; } else if (i < 2) { /* try it again */ diff --git a/src/vol/vol-salvage.h b/src/vol/vol-salvage.h index 9fcc3f38a..1c6c2d517 100644 --- a/src/vol/vol-salvage.h +++ b/src/vol/vol-salvage.h @@ -193,6 +193,7 @@ extern void Exit(int code) AFS_NORETURN; extern int Fork(void); extern int Wait(char *prog); extern char *ToString(const char *s); +extern int AskDAFS(void); extern void AskOffline(struct SalvInfo *salvinfo, VolumeId volumeId); extern void AskOnline(struct SalvInfo *salvinfo, VolumeId volumeId); extern void AskDelete(struct SalvInfo *salvinfo, VolumeId volumeId); diff --git a/src/vol/volume.h b/src/vol/volume.h index e6742eda4..d5214356c 100644 --- a/src/vol/volume.h +++ b/src/vol/volume.h @@ -100,6 +100,8 @@ extern pthread_t vol_glock_holder; #define VTRANS_LOCK MUTEX_ENTER(&vol_trans_mutex) #define VTRANS_UNLOCK MUTEX_EXIT(&vol_trans_mutex) #else /* AFS_PTHREAD_ENV */ +#define VOL_CV_WAIT(cv) +#define VOL_CV_TIMEDWAIT(cv, ts, to) #define VOL_LOCK #define VOL_UNLOCK #define VSALVSYNC_LOCK -- 2.39.5