From: Rusty Russell Date: Fri, 17 Jul 2009 04:38:12 +0000 (+0930) Subject: YA corner case: help assumption by putting cancelled transactions first. X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=585513b42903a9f3af0737649fb75f6903722c64;hp=21413347e7b4f3e42eee7b717bcb3e26f52cb736 YA corner case: help assumption by putting cancelled transactions first. --- diff --git a/ccan/tdb/tools/replay_trace.c b/ccan/tdb/tools/replay_trace.c index 087bd876..4afe900a 100644 --- a/ccan/tdb/tools/replay_trace.c +++ b/ccan/tdb/tools/replay_trace.c @@ -962,6 +962,12 @@ static bool in_transaction(const struct op op[], unsigned int i) return op[i].group_start && starts_transaction(&op[op[i].group_start]); } +static bool successful_transaction(const struct op *op) +{ + return starts_transaction(op) + && op[op->group_len].op == OP_TDB_TRANSACTION_COMMIT; +} + static bool starts_traverse(const struct op *op) { return op->op == OP_TDB_TRAVERSE_START @@ -1265,8 +1271,21 @@ static void sort_ops(struct keyinfo hash[], char *filename[], struct op *op[], return a->op_num - b->op_num; /* Otherwise, arrange by serial order. */ - return op[a->file][a->op_num].serial - - op[b->file][b->op_num].serial; + if (op[a->file][a->op_num].serial != + op[b->file][b->op_num].serial) + return op[a->file][a->op_num].serial + - op[b->file][b->op_num].serial; + + /* Cancelled transactions are assumed to happen first. */ + if (starts_transaction(&op[a->file][a->op_num]) + && !successful_transaction(&op[a->file][a->op_num])) + return -1; + if (starts_transaction(&op[b->file][b->op_num]) + && !successful_transaction(&op[b->file][b->op_num])) + return 1; + + /* No idea. */ + return 0; } /* Now sort into serial order. */