Commit 6b999f45 authored by Rusty Russell's avatar Rusty Russell

tdb2: make internal coalesce() function return length coalesced.

This makes life easier for the next patch.
parent 48241893
...@@ -333,10 +333,10 @@ static tdb_off_t ftable_offset(struct tdb_context *tdb, unsigned int ftable) ...@@ -333,10 +333,10 @@ static tdb_off_t ftable_offset(struct tdb_context *tdb, unsigned int ftable)
return off; return off;
} }
/* Note: we unlock the current bucket if we coalesce or fail. */ /* Note: we unlock the current bucket if we coalesce (> 0) or fail (-ve). */
static tdb_bool_err coalesce(struct tdb_context *tdb, static tdb_len_t coalesce(struct tdb_context *tdb,
tdb_off_t off, tdb_off_t b_off, tdb_off_t off, tdb_off_t b_off,
tdb_len_t data_len) tdb_len_t data_len)
{ {
tdb_off_t end; tdb_off_t end;
struct tdb_free_record rec; struct tdb_free_record rec;
...@@ -414,7 +414,7 @@ static tdb_bool_err coalesce(struct tdb_context *tdb, ...@@ -414,7 +414,7 @@ static tdb_bool_err coalesce(struct tdb_context *tdb,
/* Didn't find any adjacent free? */ /* Didn't find any adjacent free? */
if (end == off + sizeof(struct tdb_used_record) + data_len) if (end == off + sizeof(struct tdb_used_record) + data_len)
return false; return 0;
/* OK, expand initial record */ /* OK, expand initial record */
ecode = tdb_read_convert(tdb, off, &rec, sizeof(rec)); ecode = tdb_read_convert(tdb, off, &rec, sizeof(rec));
...@@ -453,7 +453,8 @@ static tdb_bool_err coalesce(struct tdb_context *tdb, ...@@ -453,7 +453,8 @@ static tdb_bool_err coalesce(struct tdb_context *tdb,
if (ecode != TDB_SUCCESS) { if (ecode != TDB_SUCCESS) {
return ecode; return ecode;
} }
return true; /* Return usable length. */
return end - off - sizeof(struct tdb_used_record);
err: err:
/* To unify error paths, we *always* unlock bucket on error. */ /* To unify error paths, we *always* unlock bucket on error. */
...@@ -506,9 +507,8 @@ again: ...@@ -506,9 +507,8 @@ again:
while (off) { while (off) {
const struct tdb_free_record *r; const struct tdb_free_record *r;
tdb_len_t len; tdb_len_t len, coal;
tdb_off_t next; tdb_off_t next;
int coal;
r = tdb_access_read(tdb, off, sizeof(*r), true); r = tdb_access_read(tdb, off, sizeof(*r), true);
if (TDB_PTR_IS_ERR(r)) { if (TDB_PTR_IS_ERR(r)) {
...@@ -544,14 +544,14 @@ again: ...@@ -544,14 +544,14 @@ again:
/* Since we're going slow anyway, try coalescing here. */ /* Since we're going slow anyway, try coalescing here. */
coal = coalesce(tdb, off, b_off, len); coal = coalesce(tdb, off, b_off, len);
if (coal == 1) { if (TDB_OFF_IS_ERR(coal)) {
/* This has unlocked list, restart. */
goto again;
}
if (coal < 0) {
/* This has already unlocked on error. */ /* This has already unlocked on error. */
return coal; return coal;
} }
if (coal > 0) {
/* This has unlocked list, restart. */
goto again;
}
off = next; off = next;
} }
......
...@@ -91,7 +91,8 @@ int main(int argc, char *argv[]) ...@@ -91,7 +91,8 @@ int main(int argc, char *argv[])
b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024)); b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
/* Lock and coalesce. */ /* Lock and coalesce. */
ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0); ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1); ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024)
== 1024 + sizeof(struct tdb_used_record) + 2048);
ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0); ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0);
ok1(free_record_length(tdb, layout->elem[1].base.off) ok1(free_record_length(tdb, layout->elem[1].base.off)
== 1024 + sizeof(struct tdb_used_record) + 2048); == 1024 + sizeof(struct tdb_used_record) + 2048);
...@@ -114,7 +115,8 @@ int main(int argc, char *argv[]) ...@@ -114,7 +115,8 @@ int main(int argc, char *argv[])
b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024)); b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
/* Lock and coalesce. */ /* Lock and coalesce. */
ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0); ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1); ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024)
== 1024 + sizeof(struct tdb_used_record) + 512);
ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0); ok1(tdb->file->allrecord_lock.count == 0 && tdb->file->num_lockrecs == 0);
ok1(free_record_length(tdb, layout->elem[1].base.off) ok1(free_record_length(tdb, layout->elem[1].base.off)
== 1024 + sizeof(struct tdb_used_record) + 512); == 1024 + sizeof(struct tdb_used_record) + 512);
...@@ -138,7 +140,9 @@ int main(int argc, char *argv[]) ...@@ -138,7 +140,9 @@ int main(int argc, char *argv[])
b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024)); b_off = bucket_off(tdb->ftable_off, size_to_bucket(1024));
/* Lock and coalesce. */ /* Lock and coalesce. */
ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0); ok1(tdb_lock_free_bucket(tdb, b_off, TDB_LOCK_WAIT) == 0);
ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) == 1); ok1(coalesce(tdb, layout->elem[1].base.off, b_off, 1024) ==
1024 + sizeof(struct tdb_used_record) + 512
+ sizeof(struct tdb_used_record) + 256);
ok1(tdb->file->allrecord_lock.count == 0 ok1(tdb->file->allrecord_lock.count == 0
&& tdb->file->num_lockrecs == 0); && tdb->file->num_lockrecs == 0);
ok1(free_record_length(tdb, layout->elem[1].base.off) ok1(free_record_length(tdb, layout->elem[1].base.off)
......
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