From 356ed8644c0099a70ece5b7d5104662454d03ef8 Mon Sep 17 00:00:00 2001 From: Gregor Beck Date: Mon, 1 Aug 2011 15:27:46 +0200 Subject: s3:registry avoid updating keys which are going to be deleted in reg_deletekey_recursive this changes the complexity from O(n^2) to O(n) and reduces the time of a 'net conf drop' with 10000 shares from 6min to 1.5s Signed-off-by: Michael Adam --- source3/registry/reg_backend_db.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 62d482069c..57d6d3980c 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1287,6 +1287,7 @@ struct regdb_delete_subkey_context { const char *key; const char *subkey; const char *path; + bool lazy; }; static NTSTATUS regdb_delete_subkey_action(struct db_context *db, @@ -1302,6 +1303,10 @@ static NTSTATUS regdb_delete_subkey_action(struct db_context *db, werr = regdb_delete_key_lists(db, delete_ctx->path); W_ERROR_NOT_OK_GOTO_DONE(werr); + if (delete_ctx->lazy) { + goto done; + } + werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); @@ -1323,7 +1328,7 @@ done: return werror_to_ntstatus(werr); } -static WERROR regdb_delete_subkey(const char *key, const char *subkey) +static WERROR regdb_delete_subkey(const char *key, const char *subkey, bool lazy) { WERROR werr; char *path; @@ -1349,6 +1354,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) delete_ctx.key = key; delete_ctx.subkey = subkey; delete_ctx.path = path; + delete_ctx.lazy = lazy; werr = ntstatus_to_werror(dbwrap_trans_do(regdb, regdb_delete_subkey_action, -- cgit