diff --git a/kmod/src/server.c b/kmod/src/server.c index 73a74223..6367e350 100644 --- a/kmod/src/server.c +++ b/kmod/src/server.c @@ -1586,6 +1586,13 @@ static int server_commit_log_trees(struct super_block *sb, if (ret < 0 || committed) goto unlock; + /* make sure _update succeeds before we modify srch items */ + ret = scoutfs_btree_dirty(sb, &server->alloc, &server->wri, &super->logs_root, &key); + if (ret < 0) { + err_str = "dirtying lt item"; + goto unlock; + } + /* try to rotate the srch log when big enough */ mutex_lock(&server->srch_mutex); ret = scoutfs_srch_rotate_log(sb, &server->alloc, &server->wri, @@ -1600,6 +1607,7 @@ static int server_commit_log_trees(struct super_block *sb, ret = scoutfs_btree_update(sb, &server->alloc, &server->wri, &super->logs_root, &key, <, sizeof(lt)); + BUG_ON(ret < 0); /* dirtying should have guaranteed success */ if (ret < 0) err_str = "updating log trees item"; diff --git a/kmod/src/srch.c b/kmod/src/srch.c index 2cb99b4c..ebf113e6 100644 --- a/kmod/src/srch.c +++ b/kmod/src/srch.c @@ -995,6 +995,14 @@ int scoutfs_srch_rotate_log(struct super_block *sb, le64_to_cpu(sfl->ref.blkno), 0); ret = scoutfs_btree_insert(sb, alloc, wri, root, &key, sfl, sizeof(*sfl)); + /* + * While it's fine to replay moving the client's logging srch + * file to the core btree item, server commits should keep it + * from happening. So we'll warn if we see it happen. This can + * be removed eventually. + */ + if (WARN_ON_ONCE(ret == -EEXIST)) + ret = 0; if (ret == 0) { memset(sfl, 0, sizeof(*sfl)); scoutfs_inc_counter(sb, srch_rotate_log);