The branch, v3-2-ctdb has been updated
       via  01e96570df7dacc2384ae5e76276dd43baf0420d (commit)
       via  b75ff265346d9e0dc7fa42232ecd9fcfc95e0d14 (commit)
       via  c60b23bd37366ff8b6144332d877dc24a0ae878e (commit)
       via  5b8dc0972c98340f8b98b626b8b27ba85ccd17cb (commit)
      from  568921e84308237c49c673dccd2a19866e5ced0d (commit)

http://gitweb.samba.org/?p=obnox/samba-ctdb.git;a=shortlog;h=v3-2-ctdb


- Log -----------------------------------------------------------------
commit 01e96570df7dacc2384ae5e76276dd43baf0420d
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 11:26:26 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 minutes to 1m50s on my box.
    
    Michael

commit b75ff265346d9e0dc7fa42232ecd9fcfc95e0d14
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 11:25:44 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 c60b23bd37366ff8b6144332d877dc24a0ae878e
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 5b8dc0972c98340f8b98b626b8b27ba85ccd17cb
Author: Michael Adam <[email protected]>
Date:   Tue Feb 24 11:23:52 2009 +0100

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

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

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


Changeset truncated at 500 lines:

diff --git a/source/lib/smbconf/smbconf.c b/source/lib/smbconf/smbconf.c
index 5d5049c..5534f97 100644
--- a/source/lib/smbconf/smbconf.c
+++ b/source/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/source/lib/smbconf/smbconf.h b/source/lib/smbconf/smbconf.h
index 9ff9a83..699a62d 100644
--- a/source/lib/smbconf/smbconf.h
+++ b/source/lib/smbconf/smbconf.h
@@ -113,4 +113,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/source/lib/smbconf/smbconf_private.h 
b/source/lib/smbconf/smbconf_private.h
index b0333e9..3465694 100644
--- a/source/lib/smbconf/smbconf_private.h
+++ b/source/lib/smbconf/smbconf_private.h
@@ -62,6 +62,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/source/lib/smbconf/smbconf_reg.c b/source/lib/smbconf/smbconf_reg.c
index ad3ddf8..8c71c4f 100644
--- a/source/lib/smbconf/smbconf_reg.c
+++ b/source/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/source/lib/smbconf/smbconf_txt.c b/source/lib/smbconf/smbconf_txt.c
index b4c4203..1a75bed 100644
--- a/source/lib/smbconf/smbconf_txt.c
+++ b/source/lib/smbconf/smbconf_txt.c
@@ -611,6 +611,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,
@@ -632,6 +646,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/source/registry/reg_api.c b/source/registry/reg_api.c
index e9a7145..4db4f3c 100644
--- a/source/registry/reg_api.c
+++ b/source/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",
+                         dos_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",
+                                 dos_errstr(werr)));
+               }
+       } else {
+               werr = regdb_transaction_commit();
+               if (!W_ERROR_IS_OK(werr)) {
+                       DEBUG(0, ("reg_deletekey_recursive_trans: "
+                                 "error committing transaction: %s\n",
+                                 dos_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/source/registry/reg_backend_db.c b/source/registry/reg_backend_db.c
index 1e2e8aa..6a00df7 100644
--- a/source/registry/reg_backend_db.c
+++ b/source/registry/reg_backend_db.c
@@ -474,6 +474,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/source/utils/net_conf.c b/source/utils/net_conf.c
index 6639b85..4f4ad85 100644
--- a/source/utils/net_conf.c
+++ b/source/utils/net_conf.c
@@ -314,6 +314,12 @@ static int net_conf_import(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", dos_errstr(werr));
+               goto done;
+       }
+
        if (servicename != NULL) {
                struct smbconf_service *service = NULL;
 
@@ -321,11 +327,11 @@ static int net_conf_import(struct smbconf_ctx *conf_ctx,
                                         servicename,
                                         &service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                werr = import_process_service(conf_ctx, service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
        } else {
                struct smbconf_service **services = NULL;
@@ -335,23 +341,38 @@ static int net_conf_import(struct smbconf_ctx *conf_ctx,
                                          &num_shares,
                                          &services);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                if (!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(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",
+                        dos_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",
+                        dos_errstr(werr));
+       }
 
 done:
        TALLOC_FREE(mem_ctx);


-- 
SAMBA-CTDB repository

Reply via email to