ubik: Skip sleep on first pass in urecovery loop 03/14803/2
authorAndrew Deason <adeason@sinenomine.net>
Fri, 18 Sep 2020 01:54:54 +0000 (20:54 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 14 Oct 2021 16:05:11 +0000 (12:05 -0400)
When running a dbserver without any remote sites, we become the sync
site immediately, since there aren't any other sites so we don't need
to do any processing of votes. The ubik database can thus be accessed
immediately, except we cannot start ubik write transactions right
away, since UBIK_RECHAVEDB will not be set, causing
urecovery_AllBetter() to fail.

UBIK_RECHAVEDB is not set immediately, because urecovery_Interact
sleeps 4 seconds at the beginning of its loop, so no recovery flags
will be set for the first 4 seconds during startup. This makes it
impossible to start any ubik write transactions for the first 4
seconds, even if we're the only site. That may not be a significant
amount of time for a user (since a dbserver daemon doesn't startup too
frequently), but this can cause huge delays for automated testing of
dbservers.

To get rid of this unnecessary delay, just skip this delay the first
time we go through the urecovery_Interact loop.

Change-Id: Ie6653b7b742dcf37798a6bf340b29c283ac3bc4c
Reviewed-on: https://gerrit.openafs.org/14803
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/ubik/recovery.c

index e622505..2b837b4 100644 (file)
@@ -471,6 +471,7 @@ urecovery_Interact(void *dummy)
     char pbuffer[1028];
     int fd = -1;
     afs_int32 pass;
+    int first;
 
     memset(pbuffer, 0, sizeof(pbuffer));
 
@@ -479,15 +480,18 @@ urecovery_Interact(void *dummy)
     /* otherwise, begin interaction */
     urecovery_state = 0;
     lastProbeTime = 0;
-    while (1) {
-       /* Run through this loop every 4 seconds */
-       tv.tv_sec = 4;
-       tv.tv_usec = 0;
+    for (first = 1; ; first = 0) {
+       if (!first) {
+           /* Run through this loop every 4 seconds (but don't wait 4 seconds
+            * the first time around). */
+           tv.tv_sec = 4;
+           tv.tv_usec = 0;
 #ifdef AFS_PTHREAD_ENV
-       select(0, 0, 0, 0, &tv);
+           select(0, 0, 0, 0, &tv);
 #else
-       IOMGR_Select(0, 0, 0, 0, &tv);
+           IOMGR_Select(0, 0, 0, 0, &tv);
 #endif
+       }
 
        ViceLog(5, ("recovery running in state %x\n", urecovery_state));