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) ...@@ -264,10 +264,7 @@ enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb)
tdb_allrecord_unlock(tdb, F_WRLCK); tdb_allrecord_unlock(tdb, F_WRLCK);
return ecode; return ecode;
} }
if (tdb_transaction_recover(tdb) == -1) { ecode = tdb_transaction_recover(tdb);
ecode = tdb->ecode;
}
tdb_unlock_open(tdb); tdb_unlock_open(tdb);
tdb_allrecord_unlock(tdb, F_WRLCK); tdb_allrecord_unlock(tdb, F_WRLCK);
...@@ -333,18 +330,23 @@ static enum TDB_ERROR tdb_nest_lock(struct tdb_context *tdb, ...@@ -333,18 +330,23 @@ static enum TDB_ERROR tdb_nest_lock(struct tdb_context *tdb,
/* First time we grab a lock, perhaps someone died in commit? */ /* First time we grab a lock, perhaps someone died in commit? */
if (!(flags & TDB_LOCK_NOCHECK) if (!(flags & TDB_LOCK_NOCHECK)
&& tdb->num_lockrecs == 0 && tdb->num_lockrecs == 0) {
&& unlikely(tdb_needs_recovery(tdb))) { tdb_bool_err berr = tdb_needs_recovery(tdb);
if (berr != false) {
tdb_brunlock(tdb, ltype, offset, 1); tdb_brunlock(tdb, ltype, offset, 1);
if (berr < 0)
return berr;
ecode = tdb_lock_and_recover(tdb); ecode = tdb_lock_and_recover(tdb);
if (ecode == TDB_SUCCESS) { if (ecode == TDB_SUCCESS) {
ecode = tdb_brlock(tdb, ltype, offset, 1, flags); ecode = tdb_brlock(tdb, ltype, offset, 1,
flags);
} }
if (ecode != TDB_SUCCESS) { if (ecode != TDB_SUCCESS) {
return ecode; return ecode;
} }
} }
}
tdb->lockrecs[tdb->num_lockrecs].off = offset; tdb->lockrecs[tdb->num_lockrecs].off = offset;
tdb->lockrecs[tdb->num_lockrecs].count = 1; tdb->lockrecs[tdb->num_lockrecs].count = 1;
...@@ -448,6 +450,7 @@ enum TDB_ERROR tdb_allrecord_lock(struct tdb_context *tdb, int ltype, ...@@ -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_lock_flags flags, bool upgradable)
{ {
enum TDB_ERROR ecode; enum TDB_ERROR ecode;
tdb_bool_err berr;
/* FIXME: There are no locks on read-only dbs */ /* FIXME: There are no locks on read-only dbs */
if (tdb->read_only) { if (tdb->read_only) {
...@@ -517,16 +520,21 @@ again: ...@@ -517,16 +520,21 @@ again:
tdb->allrecord_lock.off = upgradable; tdb->allrecord_lock.off = upgradable;
/* Now check for needing recovery. */ /* Now check for needing recovery. */
if (!(flags & TDB_LOCK_NOCHECK) && unlikely(tdb_needs_recovery(tdb))) { if (flags & TDB_LOCK_NOCHECK)
return TDB_SUCCESS;
berr = tdb_needs_recovery(tdb);
if (likely(berr == false))
return TDB_SUCCESS;
tdb_allrecord_unlock(tdb, ltype); tdb_allrecord_unlock(tdb, ltype);
if (berr < 0)
return berr;
ecode = tdb_lock_and_recover(tdb); ecode = tdb_lock_and_recover(tdb);
if (ecode != TDB_SUCCESS) { if (ecode != TDB_SUCCESS) {
return ecode; return ecode;
} }
goto again; goto again;
}
return TDB_SUCCESS;
} }
enum TDB_ERROR tdb_lock_open(struct tdb_context *tdb, enum tdb_lock_flags flags) 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); ...@@ -560,8 +560,8 @@ bool tdb_has_expansion_lock(struct tdb_context *tdb);
enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb); enum TDB_ERROR tdb_lock_and_recover(struct tdb_context *tdb);
/* transaction.c: */ /* transaction.c: */
int tdb_transaction_recover(struct tdb_context *tdb); enum TDB_ERROR tdb_transaction_recover(struct tdb_context *tdb);
bool tdb_needs_recovery(struct tdb_context *tdb); tdb_bool_err tdb_needs_recovery(struct tdb_context *tdb);
/* tdb.c: */ /* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb, 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, ...@@ -177,6 +177,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
ssize_t rlen; ssize_t rlen;
struct tdb_header hdr; struct tdb_header hdr;
struct tdb_attribute_seed *seed = NULL; struct tdb_attribute_seed *seed = NULL;
tdb_bool_err berr;
enum TDB_ERROR ecode; enum TDB_ERROR ecode;
tdb = malloc(sizeof(*tdb)); tdb = malloc(sizeof(*tdb));
...@@ -350,7 +351,12 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags, ...@@ -350,7 +351,12 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
tdb->methods->oob(tdb, tdb->map_size + 1, true); tdb->methods->oob(tdb, tdb->map_size + 1, true);
/* Now it's fully formed, recover if necessary. */ /* 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); ecode = tdb_lock_and_recover(tdb);
if (ecode != TDB_SUCCESS) { if (ecode != TDB_SUCCESS) {
tdb->ecode = ecode; 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