Mercurial > nomad > experimental
changeset 1218:0067e7bbc9b5
objstore: run transaction cleanup callbacks in correct order
We must iterate backwards to undo each action. If we don't, we risk
inconsistency. For example, consider the scenario:
A file has the owner of 0 and the following two transaction entries are
created in a transaction:
1. setattr: owner = 1000, old owner = 0
2. setattr: owner = 2000, old owner = 1000
If we end up running the cleanup code, we expect the owner to be 0 again.
For that to happen, we must run cleanup for entry 1 *after* we cleaned up
entry 2.
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Fri, 17 Apr 2020 11:21:05 -0400 |
parents | 69df794fd719 |
children | c1d0d4b7d8d5 |
files | src/objstore/txn.c |
diffstat | 1 files changed, 2 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/objstore/txn.c Fri Apr 17 10:43:03 2020 -0400 +++ b/src/objstore/txn.c Fri Apr 17 11:21:05 2020 -0400 @@ -131,8 +131,8 @@ int i; if (!complete) { - /* TODO: should we interate backwards? */ - for (i = 0; i < ARRAY_LEN(txn->entries); i++) { + /* must iterate backwards to undo changes in reverse order */ + for (i = ARRAY_LEN(txn->entries); i >= 0; i--) { struct txn_entry *entry = &txn->entries[i]; switch (entry->op) {