The branch, master has been updated
       via  42b8d6b3084e235beb8e4ed4215b5973e769ada3 (commit)
       via  bd121b532cf5a6728b7605072f725cc9c6d47f48 (commit)
       via  9f97674ef759c65b874028b7af01fcc65f8dac23 (commit)
       via  ba0e944c46b5c5e11c2539e15c9fe099a6c39fd1 (commit)
      from  170830c0089088e7e30a3aa2d0c6d65b01ab83a0 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 42b8d6b3084e235beb8e4ed4215b5973e769ada3
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 10:54:13 2009 +0100

    s3:net: wrap net conf import into one big transaction
    
    This speeds up "net conf import" of a file with 2000 shares
    from 11 minutest to 1m50s on my box.
    
    Michael

commit bd121b532cf5a6728b7605072f725cc9c6d47f48
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 10:52:30 2009 +0100

    s3:libsmbconf: add transactions to the libsmbconf api
    
    This is useful for wrapping higher level aggregate operations
    in transactions. The text backend implementations just return
    WERR_OK, the registry backend implementatoins use the
    regdb_transaction_start|commit|cancel routines just added.
    
    Michael

commit 9f97674ef759c65b874028b7af01fcc65f8dac23
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 15:40:05 2009 +0100

    s3:registry: wrap deletekey_recursive in one big transaction.
    
    This speeds up "net conf drop" with 2000 shares on my box from
    4m40s to 1m50s, leaving virtually only cpu load.
    
    Michael

commit ba0e944c46b5c5e11c2539e15c9fe099a6c39fd1
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 10:44:48 2009 +0100

    s3:registry: provide transaction_start|commit|cancel fns for the registry 
tdb
    
    Michael

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

Summary of changes:
 lib/smbconf/smbconf.c             |   15 +++++++++++++
 lib/smbconf/smbconf.h             |    4 +++
 lib/smbconf/smbconf_private.h     |    3 ++
 lib/smbconf/smbconf_txt.c         |   17 +++++++++++++++
 source3/include/proto.h           |    3 ++
 source3/lib/smbconf/smbconf_reg.c |   18 ++++++++++++++++
 source3/registry/reg_api.c        |   40 +++++++++++++++++++++++++++++++++++-
 source3/registry/reg_backend_db.c |   18 ++++++++++++++++
 source3/utils/net_conf.c          |   33 +++++++++++++++++++++++++-----
 9 files changed, 143 insertions(+), 8 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/smbconf/smbconf.c b/lib/smbconf/smbconf.c
index 595fd23..f25ccae 100644
--- a/lib/smbconf/smbconf.c
+++ b/lib/smbconf/smbconf.c
@@ -399,3 +399,18 @@ WERROR smbconf_delete_global_includes(struct smbconf_ctx 
*ctx)
 
        return werr;
 }
+
+WERROR smbconf_transaction_start(struct smbconf_ctx *ctx)
+{
+       return ctx->ops->transaction_start(ctx);
+}
+
+WERROR smbconf_transaction_commit(struct smbconf_ctx *ctx)
+{
+       return ctx->ops->transaction_commit(ctx);
+}
+
+WERROR smbconf_transaction_cancel(struct smbconf_ctx *ctx)
+{
+       return ctx->ops->transaction_cancel(ctx);
+}
diff --git a/lib/smbconf/smbconf.h b/lib/smbconf/smbconf.h
index 106fae6..517302a 100644
--- a/lib/smbconf/smbconf.h
+++ b/lib/smbconf/smbconf.h
@@ -94,4 +94,8 @@ WERROR smbconf_set_global_includes(struct smbconf_ctx *ctx,
 WERROR smbconf_delete_includes(struct smbconf_ctx *ctx, const char *service);
 WERROR smbconf_delete_global_includes(struct smbconf_ctx *ctx);
 
+WERROR smbconf_transaction_start(struct smbconf_ctx *ctx);
+WERROR smbconf_transaction_commit(struct smbconf_ctx *ctx);
+WERROR smbconf_transaction_cancel(struct smbconf_ctx *ctx);
+
 #endif /*  _LIBSMBCONF_H_  */
diff --git a/lib/smbconf/smbconf_private.h b/lib/smbconf/smbconf_private.h
index c9e4418..e6998ad 100644
--- a/lib/smbconf/smbconf_private.h
+++ b/lib/smbconf/smbconf_private.h
@@ -68,6 +68,9 @@ struct smbconf_ops {
                               uint32_t num_includes, const char **includes);
        WERROR (*delete_includes)(struct smbconf_ctx *ctx,
                                  const char *service);
+       WERROR (*transaction_start)(struct smbconf_ctx *ctx);
+       WERROR (*transaction_commit)(struct smbconf_ctx *ctx);
+       WERROR (*transaction_cancel)(struct smbconf_ctx *ctx);
 };
 
 struct smbconf_ctx {
diff --git a/lib/smbconf/smbconf_txt.c b/lib/smbconf/smbconf_txt.c
index 1df4a9f..501382c 100644
--- a/lib/smbconf/smbconf_txt.c
+++ b/lib/smbconf/smbconf_txt.c
@@ -612,6 +612,20 @@ static WERROR smbconf_txt_delete_includes(struct 
smbconf_ctx *ctx,
        return WERR_NOT_SUPPORTED;
 }
 
+static WERROR smbconf_txt_transaction_start(struct smbconf_ctx *ctx)
+{
+       return WERR_OK;
+}
+
+static WERROR smbconf_txt_transaction_commit(struct smbconf_ctx *ctx)
+{
+       return WERR_OK;
+}
+
+static WERROR smbconf_txt_transaction_cancel(struct smbconf_ctx *ctx)
+{
+       return WERR_OK;
+}
 
 static struct smbconf_ops smbconf_ops_txt = {
        .init                   = smbconf_txt_init,
@@ -633,6 +647,9 @@ static struct smbconf_ops smbconf_ops_txt = {
        .get_includes           = smbconf_txt_get_includes,
        .set_includes           = smbconf_txt_set_includes,
        .delete_includes        = smbconf_txt_delete_includes,
+       .transaction_start      = smbconf_txt_transaction_start,
+       .transaction_commit     = smbconf_txt_transaction_commit,
+       .transaction_cancel     = smbconf_txt_transaction_cancel,
 };
 
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 2d92b0f..559d62f 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5049,6 +5049,9 @@ WERROR init_registry_data(void);
 WERROR regdb_init(void);
 WERROR regdb_open( void );
 int regdb_close( void );
+WERROR regdb_transaction_start(void);
+WERROR regdb_transaction_commit(void);
+WERROR regdb_transaction_cancel(void);
 int regdb_get_seqnum(void);
 bool regdb_store_keys(const char *key, REGSUBKEY_CTR *ctr);
 int regdb_fetch_keys(const char *key, REGSUBKEY_CTR *ctr);
diff --git a/source3/lib/smbconf/smbconf_reg.c 
b/source3/lib/smbconf/smbconf_reg.c
index b1e34e5..5a5c0ea 100644
--- a/source3/lib/smbconf/smbconf_reg.c
+++ b/source3/lib/smbconf/smbconf_reg.c
@@ -1066,6 +1066,21 @@ done:
        return werr;
 }
 
+static WERROR smbconf_reg_transaction_start(struct smbconf_ctx *ctx)
+{
+       return regdb_transaction_start();
+}
+
+static WERROR smbconf_reg_transaction_commit(struct smbconf_ctx *ctx)
+{
+       return regdb_transaction_commit();
+}
+
+static WERROR smbconf_reg_transaction_cancel(struct smbconf_ctx *ctx)
+{
+       return regdb_transaction_cancel();
+}
+
 struct smbconf_ops smbconf_ops_reg = {
        .init                   = smbconf_reg_init,
        .shutdown               = smbconf_reg_shutdown,
@@ -1086,6 +1101,9 @@ struct smbconf_ops smbconf_ops_reg = {
        .get_includes           = smbconf_reg_get_includes,
        .set_includes           = smbconf_reg_set_includes,
        .delete_includes        = smbconf_reg_delete_includes,
+       .transaction_start      = smbconf_reg_transaction_start,
+       .transaction_commit     = smbconf_reg_transaction_commit,
+       .transaction_cancel     = smbconf_reg_transaction_cancel,
 };
 
 
diff --git a/source3/registry/reg_api.c b/source3/registry/reg_api.c
index a5f3935..4dde493 100644
--- a/source3/registry/reg_api.c
+++ b/source3/registry/reg_api.c
@@ -1133,18 +1133,54 @@ done:
        return werr;
 }
 
+static WERROR reg_deletekey_recursive_trans(TALLOC_CTX *ctx,
+                                           struct registry_key *parent,
+                                           const char *path,
+                                           bool del_key)
+{
+       WERROR werr;
+
+       werr = regdb_transaction_start();
+       if (!W_ERROR_IS_OK(werr)) {
+               DEBUG(0, ("reg_deletekey_recursive_trans: "
+                         "error starting transaction: %s\n",
+                         win_errstr(werr)));
+               return werr;
+       }
+
+       werr = reg_deletekey_recursive_internal(ctx, parent, path, del_key);
+
+       if (!W_ERROR_IS_OK(werr)) {
+               werr = regdb_transaction_cancel();
+               if (!W_ERROR_IS_OK(werr)) {
+                       DEBUG(0, ("reg_deletekey_recursive_trans: "
+                                 "error cancelling transaction: %s\n",
+                                 win_errstr(werr)));
+               }
+       } else {
+               werr = regdb_transaction_commit();
+               if (!W_ERROR_IS_OK(werr)) {
+                       DEBUG(0, ("reg_deletekey_recursive_trans: "
+                                 "error committing transaction: %s\n",
+                                 win_errstr(werr)));
+               }
+       }
+
+       return werr;
+}
+
 WERROR reg_deletekey_recursive(TALLOC_CTX *ctx,
                               struct registry_key *parent,
                               const char *path)
 {
-       return reg_deletekey_recursive_internal(ctx, parent, path, true);
+       return reg_deletekey_recursive_trans(ctx, parent, path, true);
 }
 
 WERROR reg_deletesubkeys_recursive(TALLOC_CTX *ctx,
                                   struct registry_key *parent,
                                   const char *path)
 {
-       return reg_deletekey_recursive_internal(ctx, parent, path, false);
+       return reg_deletekey_recursive_trans(ctx, parent, path, false);
 }
 
 #if 0
diff --git a/source3/registry/reg_backend_db.c 
b/source3/registry/reg_backend_db.c
index 689bd10..960e884 100644
--- a/source3/registry/reg_backend_db.c
+++ b/source3/registry/reg_backend_db.c
@@ -482,6 +482,24 @@ int regdb_close( void )
        return 0;
 }
 
+WERROR regdb_transaction_start(void)
+{
+       return (regdb->transaction_start(regdb) == 0) ?
+               WERR_OK : WERR_REG_IO_FAILURE;
+}
+
+WERROR regdb_transaction_commit(void)
+{
+       return (regdb->transaction_commit(regdb) == 0) ?
+               WERR_OK : WERR_REG_IO_FAILURE;
+}
+
+WERROR regdb_transaction_cancel(void)
+{
+       return (regdb->transaction_cancel(regdb) == 0) ?
+               WERR_OK : WERR_REG_IO_FAILURE;
+}
+
 /***********************************************************************
  return the tdb sequence number of the registry tdb.
  this is an indicator for the content of the registry
diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c
index 0c2cd24..05b552c 100644
--- a/source3/utils/net_conf.c
+++ b/source3/utils/net_conf.c
@@ -331,6 +331,12 @@ static int net_conf_import(struct net_context *c, struct 
smbconf_ctx *conf_ctx,
                         "would import the following configuration:\n\n");
        }
 
+       werr = smbconf_transaction_start(conf_ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_printf("error starting transaction: %s\n", win_errstr(werr));
+               goto done;
+       }
+
        if (servicename != NULL) {
                struct smbconf_service *service = NULL;
 
@@ -338,11 +344,11 @@ static int net_conf_import(struct net_context *c, struct 
smbconf_ctx *conf_ctx,
                                         servicename,
                                         &service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                werr = import_process_service(c, conf_ctx, service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
        } else {
                struct smbconf_service **services = NULL;
@@ -352,24 +358,39 @@ static int net_conf_import(struct net_context *c, struct 
smbconf_ctx *conf_ctx,
                                          &num_shares,
                                          &services);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                if (!c->opt_testmode) {
                        werr = smbconf_drop(conf_ctx);
                        if (!W_ERROR_IS_OK(werr)) {
-                               goto done;
+                               goto cancel;
                        }
                }
                for (sidx = 0; sidx < num_shares; sidx++) {
                        werr = import_process_service(c, conf_ctx,
                                                      services[sidx]);
                        if (!W_ERROR_IS_OK(werr)) {
-                               goto done;
+                               goto cancel;
                        }
                }
        }
 
-       ret = 0;
+       werr = smbconf_transaction_commit(conf_ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_printf("error committing transaction: %s\n",
+                        win_errstr(werr));
+       } else {
+               ret = 0;
+       }
+
+       goto done;
+
+cancel:
+       werr = smbconf_transaction_cancel(conf_ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_printf("error cancelling transaction: %s\n",
+                        win_errstr(werr));
+       }
 
 done:
        TALLOC_FREE(mem_ctx);


-- 
Samba Shared Repository

Reply via email to