X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=ccan%2Ftdb%2Ftools%2Freplay_trace.c;h=4afe900aa8e8317587e2f4eb0d84572d74fc221b;hp=88a3b64e7c64aa030734dd8de4fa72ce31f58ffd;hb=585513b42903a9f3af0737649fb75f6903722c64;hpb=bb43e536aa8502aa12876b8dadb7b9aeff85bbb4 diff --git a/ccan/tdb/tools/replay_trace.c b/ccan/tdb/tools/replay_trace.c index 88a3b64e..4afe900a 100644 --- a/ccan/tdb/tools/replay_trace.c +++ b/ccan/tdb/tools/replay_trace.c @@ -435,8 +435,10 @@ static void op_analyze_traverse(const char *filename, op[start].group_len = op_num - start; + /* Don't roll in nested traverse/chainlock */ for (i = start; i <= op_num; i++) - op[i].group_start = start; + if (!op[i].group_start) + op[i].group_start = start; } /* Keep -Wmissing-declarations happy: */ @@ -960,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 @@ -1263,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. */