ubik: SDISK_Begin no quorum, wrong db, no transaction

When processing an DISK_Begin RPC verify that there is an active quorum
and that the local database is current.  Otherwise, fail the RPC with
a UNOQUORUM error.

The returned error must be UNOQUORUM instead of USYNC becase the returned
error code will be returned by the coordinator's ContactQuorum_iterate()
to the client that triggered the write transaction.  Most ubik clients
will only retry if the error is UNOQUORUM.

FIXES 131997

Change-Id: Icaa30e6aca82e7e7d33e9171a4f023970aba61df
Reviewed-on: http://gerrit.openafs.org/11689
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Daria Brashear <shadow@your-file-system.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Reviewed-by: Jeffrey Hutzelman <jhutz@cmu.edu>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
(cherry picked from commit d47beca132)
Reviewed-on: http://gerrit.openafs.org/11773
Reviewed-by: Chas Williams <3chas3@gmail.com>
Reviewed-by: Stephan Wiesand <stephan.wiesand@desy.de>
This commit is contained in:
Jeffrey Altman 2015-01-22 01:14:28 -05:00 committed by Stephan Wiesand
parent 3da7b78ea9
commit 09c1b9d5cf

View File

@ -71,6 +71,10 @@ SDISK_Begin(struct rx_call *rxcall, struct ubik_tid *atid)
return code;
}
DBHOLD(ubik_dbase);
if (urecovery_AllBetter(ubik_dbase, 0) == 0) {
code = UNOQUORUM;
goto out;
}
urecovery_CheckTid(atid);
if (ubik_currentTrans) {
/* If the thread is not waiting for lock - ok to end it */
@ -89,6 +93,7 @@ SDISK_Begin(struct rx_call *rxcall, struct ubik_tid *atid)
ubik_currentTrans->tid.epoch = atid->epoch;
ubik_currentTrans->tid.counter = atid->counter;
}
out:
DBRELE(ubik_dbase);
return code;
}