Commit 3d917ba6 authored by Rusty Russell's avatar Rusty Russell

tdb2: rework transaction.c internal functions to return enum TDB_ERROR.

In particular, tdb_needs_recovery() can now indicate an error occurred,
rather than returning true.
parent 3835bb95
......@@ -264,10 +264,7 @@ enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb)
tdb_allrecord_unlock(tdb, F_WRLCK);
return ecode;
}
if (tdb_transaction_recover(tdb) == -1) {
ecode = tdb->ecode;
}
ecode = tdb_transaction_recover(tdb);
tdb_unlock_open(tdb);
tdb_allrecord_unlock(tdb, F_WRLCK);
......@@ -333,16 +330,21 @@ static enum TDB_ERROR tdb_nest_lock(struct tdb_context *tdb,
/* First time we grab a lock, perhaps someone died in commit? */
if (!(flags & TDB_LOCK_NOCHECK)
&& tdb->num_lockrecs == 0
&& unlikely(tdb_needs_recovery(tdb))) {
tdb_brunlock(tdb, ltype, offset, 1);
ecode = tdb_lock_and_recover(tdb);
if (ecode == TDB_SUCCESS) {
ecode = tdb_brlock(tdb, ltype, offset, 1, flags);
}
if (ecode != TDB_SUCCESS) {
return ecode;
&& tdb->num_lockrecs == 0) {
tdb_bool_err berr = tdb_needs_recovery(tdb);
if (berr != false) {
tdb_brunlock(tdb, ltype, offset, 1);
if (berr < 0)
return berr;
ecode = tdb_lock_and_recover(tdb);
if (ecode == TDB_SUCCESS) {
ecode = tdb_brlock(tdb, ltype, offset, 1,
flags);
}
if (ecode != TDB_SUCCESS) {
return ecode;
}
}
}
......@@ -448,6 +450,7 @@ enum TDB_ERROR tdb_allrecord_lock(struct tdb_context *tdb, int ltype,
enum tdb_lock_flags flags, bool upgradable)
{
enum TDB_ERROR ecode;
tdb_bool_err berr;
/* FIXME: There are no locks on read-only dbs */
if (tdb->read_only) {
......@@ -517,16 +520,21 @@ again:
tdb->allrecord_lock.off = upgradable;
/* Now check for needing recovery. */
if (!(flags & TDB_LOCK_NOCHECK) && unlikely(tdb_needs_recovery(tdb))) {
tdb_allrecord_unlock(tdb, ltype);
ecode = tdb_lock_and_recover(tdb);
if (ecode != TDB_SUCCESS) {
return ecode;
}
goto again;
}
if (flags & TDB_LOCK_NOCHECK)
return TDB_SUCCESS;
return TDB_SUCCESS;
berr = tdb_needs_recovery(tdb);
if (likely(berr == false))
return TDB_SUCCESS;
tdb_allrecord_unlock(tdb, ltype);
if (berr < 0)
return berr;
ecode = tdb_lock_and_recover(tdb);
if (ecode != TDB_SUCCESS) {
return ecode;
}
goto again;
}
enum TDB_ERROR tdb_lock_open(struct tdb_context *tdb, enum tdb_lock_flags flags)
......
......@@ -560,8 +560,8 @@ bool tdb_has_expansion_lock(struct tdb_context *tdb);
enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb);
/* transaction.c: */
int tdb_transaction_recover(struct tdb_context *tdb);
bool tdb_needs_recovery(struct tdb_context *tdb);
enum TDB_ERROR tdb_transaction_recover(struct tdb_context *tdb);
tdb_bool_err tdb_needs_recovery(struct tdb_context *tdb);
/* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
......
......@@ -177,6 +177,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
ssize_t rlen;
struct tdb_header hdr;
struct tdb_attribute_seed *seed = NULL;
tdb_bool_err berr;
enum TDB_ERROR ecode;
tdb = malloc(sizeof(*tdb));
......@@ -350,7 +351,12 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
tdb->methods->oob(tdb, tdb->map_size + 1, true);
/* Now it's fully formed, recover if necessary. */
if (tdb_needs_recovery(tdb)) {
berr = tdb_needs_recovery(tdb);
if (unlikely(berr != false)) {
if (berr < 0) {
ecode = berr;
goto fail;
}
ecode = tdb_lock_and_recover(tdb);
if (ecode != TDB_SUCCESS) {
tdb->ecode = ecode;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment