ubik: update ubik_dbVersion during SDISK_SendFile 16/12716/3
authorMarcio Barbosa <mbarbosa@sinenomine.net>
Mon, 21 Aug 2017 19:50:14 +0000 (15:50 -0400)
committerBenjamin Kaduk <kaduk@mit.edu>
Sat, 20 Jan 2018 20:54:55 +0000 (15:54 -0500)
The ubik_dbVersion global represents the sync site's database version
and it is mostly used by the remote sites for sanity checks. Currently,
this global is updated when database changes are made on the sync site
(SDISK_Commit or SDISK_SetVersion), as well as every time we vote "yes"
for the sync-site in a beacon reply. Unfortunately, ubik_dbVersion is
not updated when a copy of the sync site's database is received via
DISK_SendFile, and it won't get updated until our next "yes" vote.
During this window, the current database version will not match
ubik_dbVersion. As a result, any write transaction during this time
frame will fail on the remote site in question.

To fix this problem, do not wait for the next beacon packet to update
ubik_dbVersion when the sync site's database is received; just update
it when we get the new database. Since no write transactions are
allowed while the db is transferring, ubik_dbVersion can be safely
updated.

Change-Id: Ide7a695a69cb3229ad585d9e56c5ddc2efb76dd7
Reviewed-on: https://gerrit.openafs.org/12716
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Andrew Deason <adeason@dson.org>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/ubik/remote.c

index 1c5a6af..d3d0f13 100644 (file)
@@ -596,6 +596,7 @@ failed:
            ("Ubik: Synchronize database with server %s failed (error = %d)\n",
             afs_inet_ntoa_r(otherHost, hoststr), code);
     } else {
+       uvote_set_dbVersion(*avers);
        ubik_print("Ubik: Synchronize database completed\n");
     }
     DBRELE(dbase);