[SCM] SAMBA-CTDB repository - branch v3-2-ctdb updated - build_3.2.7_ctdb.54-144-g01e9657

Michael Adam obnox at samba.org
Thu Feb 26 10:09:55 GMT 2009


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 <obnox at samba.org>
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 <obnox at samba.org>
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 <obnox at samba.org>
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 <obnox at samba.org>
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


More information about the samba-cvs mailing list