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) {