The branch, v3-6-test has been updated
       via  b1fe69d s3:registry: add a warning debug message when the sorted 
subkeys is created from key_exists()
       via  fc26b96 s3:registry: recreate the sorted subkeys cache when storing 
keys
       via  39bc60c s3:registry: add create_sorted_subkeys() to delete and 
recreate the sorted subkeys key
       via  42b3df6 s3:registry: turn create_sorted_subkeys_internal to 
NTSTATUS return type
       via  8ea96a2 s3:registry: rename create_sorted_subkeys() to 
create_sorted_subkeys_internal()
       via  1a0a2f3 s3:registry: fix a typo in a debug message
      from  d137081 s3-libnetjoin: fix uninitialized variable.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-6-test


- Log -----------------------------------------------------------------
commit b1fe69df942e6e831e42b84aade0fb74d6bc6a0f
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 16:19:41 2011 +0200

    s3:registry: add a warning debug message when the sorted subkeys is created 
from key_exists()

commit fc26b96a392f824cf18ab8524a5eaddfd2c03c5c
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 15:58:48 2011 +0200

    s3:registry: recreate the sorted subkeys cache when storing keys
    
    This is to avoid turning the next read operation into a write op.

commit 39bc60c77d5083c5ca68a83f55a3c6efde9b78a7
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 15:27:01 2011 +0200

    s3:registry: add create_sorted_subkeys() to delete and recreate the sorted 
subkeys key
    
    This is to be used from other places than the key_exists() code path.

commit 42b3df64d497894b8a45861c54f2958bf3c28e24
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 14:53:48 2011 +0200

    s3:registry: turn create_sorted_subkeys_internal to NTSTATUS return type
    
    (from bool)

commit 8ea96a246c903d787cc0a79c33ffbce5b0307af8
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 14:49:10 2011 +0200

    s3:registry: rename create_sorted_subkeys() to 
create_sorted_subkeys_internal()

commit 1a0a2f35e2bfbc5194de846fde4ae800338b3311
Author: Michael Adam <ob...@samba.org>
Date:   Wed May 11 14:17:21 2011 +0200

    s3:registry: fix a typo in a debug message

-----------------------------------------------------------------------

Summary of changes:
 source3/registry/reg_backend_db.c |   55 ++++++++++++++++++++++++-------------
 1 files changed, 36 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/registry/reg_backend_db.c 
b/source3/registry/reg_backend_db.c
index 6024a35..fa79c68 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -47,6 +47,8 @@ static int regdb_fetch_values_internal(struct db_context *db, 
const char* key,
 static bool regdb_store_values_internal(struct db_context *db, const char *key,
                                        struct regval_ctr *values);
 
+static NTSTATUS create_sorted_subkeys(const char *key);
+
 /* List the deepest path into the registry.  All part components will be 
created.*/
 
 /* If you want to have a part of the path controlled by the tdb and part by
@@ -831,22 +833,9 @@ static WERROR regdb_store_keys_internal2(struct db_context 
*db,
        W_ERROR_NOT_OK_GOTO_DONE(werr);
 
        /*
-        * Delete a sorted subkey cache for regdb_key_exists, will be
-        * recreated automatically
+        * recreate the sorted subkey cache for regdb_key_exists()
         */
-       keyname = talloc_asprintf(ctx, "%s\\%s", REG_SORTED_SUBKEYS_PREFIX,
-                                 keyname);
-       if (keyname == NULL) {
-               werr = WERR_NOMEM;
-               goto done;
-       }
-
-       werr = ntstatus_to_werror(dbwrap_delete_bystring(db, keyname));
-
-       /* don't treat WERR_NOT_FOUND as an error here */
-       if (W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) {
-               werr = WERR_OK;
-       }
+       werr = ntstatus_to_werror(create_sorted_subkeys(keyname));
 
 done:
        TALLOC_FREE(ctx);
@@ -1407,7 +1396,8 @@ done:
        return status;
 }
 
-static bool create_sorted_subkeys(const char *key, const char *sorted_keyname)
+static NTSTATUS create_sorted_subkeys_internal(const char *key,
+                                              const char *sorted_keyname)
 {
        NTSTATUS status;
        struct create_sorted_subkeys_context sorted_ctx;
@@ -1419,7 +1409,26 @@ static bool create_sorted_subkeys(const char *key, const 
char *sorted_keyname)
                                 create_sorted_subkeys_action,
                                 &sorted_ctx);
 
-       return NT_STATUS_IS_OK(status);
+       return status;
+}
+
+static NTSTATUS create_sorted_subkeys(const char *key)
+{
+       char *sorted_subkeys_keyname;
+       NTSTATUS status;
+
+       sorted_subkeys_keyname = talloc_asprintf(talloc_tos(), "%s\\%s",
+                                                REG_SORTED_SUBKEYS_PREFIX,
+                                                key);
+       if (sorted_subkeys_keyname == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto done;
+       }
+
+       status = create_sorted_subkeys_internal(key, sorted_subkeys_keyname);
+
+done:
+       return status;
 }
 
 struct scan_subkey_state {
@@ -1499,13 +1508,21 @@ static bool scan_parent_subkeys(struct db_context *db, 
const char *parent,
        if (state.scanned) {
                result = state.found;
        } else {
+               NTSTATUS status;
+
                res = db->transaction_start(db);
                if (res != 0) {
-                       DEBUG(0, ("error starting transacion\n"));
+                       DEBUG(0, ("error starting transaction\n"));
                        goto fail;
                }
 
-               if (!create_sorted_subkeys(path, key)) {
+               DEBUG(2, (__location__ " WARNING: recreating the sorted "
+                         "subkeys cache for key '%s' from scan_parent_subkeys "
+                         "this should not happen (too frequently)...\n",
+                         path));
+
+               status = create_sorted_subkeys_internal(path, key);
+               if (!NT_STATUS_IS_OK(status)) {
                        res = db->transaction_cancel(db);
                        if (res != 0) {
                                smb_panic("Failed to cancel transaction.");


-- 
Samba Shared Repository

Reply via email to