svn commit: samba r25528 - in branches: SAMBA_3_2/source/registry SAMBA_3_2_0/source/registry

vlendec at samba.org vlendec at samba.org
Fri Oct 5 20:42:20 GMT 2007


Author: vlendec
Date: 2007-10-05 20:42:14 +0000 (Fri, 05 Oct 2007)
New Revision: 25528

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25528

Log:
Only do transactions on registry.tdb if anything changes
    
I got annoyed by the fsync calls clobbering my harddrive when smbd started up
for debugging.
    
... things you do on a plane without internet



Modified:
   branches/SAMBA_3_2/source/registry/reg_db.c
   branches/SAMBA_3_2_0/source/registry/reg_db.c


Changeset:
Modified: branches/SAMBA_3_2/source/registry/reg_db.c
===================================================================
--- branches/SAMBA_3_2/source/registry/reg_db.c	2007-10-05 20:33:55 UTC (rev 25527)
+++ branches/SAMBA_3_2/source/registry/reg_db.c	2007-10-05 20:42:14 UTC (rev 25528)
@@ -399,14 +399,47 @@
 	REGSUBKEY_CTR *subkeys = NULL, *old_subkeys = NULL;
 	char *oldkeyname;
 	
+	/*
+	 * fetch a list of the old subkeys so we can determine if anything has
+	 * changed
+	 */
+
+	if ( !(old_subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) {
+		DEBUG(0,("regdb_store_keys: talloc() failure!\n"));
+		goto fail;
+	}
+
+	regdb_fetch_keys( key, old_subkeys );
+
+	if (ctr->num_subkeys == old_subkeys->num_subkeys) {
+
+		for (i = 0; i<ctr->num_subkeys; i++) {
+			if (strcmp(ctr->subkeys[i],
+				   old_subkeys->subkeys[i]) != 0) {
+				break;
+			}
+		}
+		if (i == ctr->num_subkeys) {
+			/*
+			 * Nothing changed, no point to even start a tdb
+			 * transaction
+			 */
+			TALLOC_FREE(old_subkeys);
+			return True;
+		}
+	}
+
 	if ( tdb_transaction_start( tdb_reg->tdb ) == -1 ) {
 		DEBUG(0, ("regdb_store_keys: tdb_transaction_start failed\n"));
 		return False;
 	}
 
-	/* fetch a list of the old subkeys so we can determine if any were
-	 * deleted */
-	
+	/*
+	 * Re-fetch the old keys inside the transaction
+	 */
+
+	TALLOC_FREE(old_subkeys);
+
 	if ( !(old_subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) {
 		DEBUG(0,("regdb_store_keys: talloc() failure!\n"));
 		goto fail;
@@ -660,7 +693,7 @@
 
 BOOL regdb_store_values( const char *key, REGVAL_CTR *values )
 {
-	TDB_DATA data;
+	TDB_DATA old_data, data;
 	pstring keystr;
 	int len, ret;
 	
@@ -684,8 +717,19 @@
 	pstr_sprintf( keystr, "%s/%s", REG_VALUE_PREFIX, key );
 	normalize_reg_path( keystr );
 	
+	old_data = tdb_fetch_bystring(tdb_reg->tdb, keystr);
+
+	if ((old_data.dptr != NULL)
+	    && (old_data.dsize == data.dsize)
+	    && (memcmp(old_data.dptr, data.dptr, data.dsize) == 0)) {
+		SAFE_FREE(old_data.dptr);
+		SAFE_FREE(data.dptr);
+		return True;
+	}
+
 	ret = tdb_trans_store_bystring(tdb_reg->tdb, keystr, data, TDB_REPLACE);
 	
+	SAFE_FREE( old_data.dptr );
 	SAFE_FREE( data.dptr );
 	
 	return ret != -1 ;

Modified: branches/SAMBA_3_2_0/source/registry/reg_db.c
===================================================================
--- branches/SAMBA_3_2_0/source/registry/reg_db.c	2007-10-05 20:33:55 UTC (rev 25527)
+++ branches/SAMBA_3_2_0/source/registry/reg_db.c	2007-10-05 20:42:14 UTC (rev 25528)
@@ -399,14 +399,47 @@
 	REGSUBKEY_CTR *subkeys = NULL, *old_subkeys = NULL;
 	char *oldkeyname;
 	
+	/*
+	 * fetch a list of the old subkeys so we can determine if anything has
+	 * changed
+	 */
+
+	if ( !(old_subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) {
+		DEBUG(0,("regdb_store_keys: talloc() failure!\n"));
+		goto fail;
+	}
+
+	regdb_fetch_keys( key, old_subkeys );
+
+	if (ctr->num_subkeys == old_subkeys->num_subkeys) {
+
+		for (i = 0; i<ctr->num_subkeys; i++) {
+			if (strcmp(ctr->subkeys[i],
+				   old_subkeys->subkeys[i]) != 0) {
+				break;
+			}
+		}
+		if (i == ctr->num_subkeys) {
+			/*
+			 * Nothing changed, no point to even start a tdb
+			 * transaction
+			 */
+			TALLOC_FREE(old_subkeys);
+			return True;
+		}
+	}
+
 	if ( tdb_transaction_start( tdb_reg->tdb ) == -1 ) {
 		DEBUG(0, ("regdb_store_keys: tdb_transaction_start failed\n"));
 		return False;
 	}
 
-	/* fetch a list of the old subkeys so we can determine if any were
-	 * deleted */
-	
+	/*
+	 * Re-fetch the old keys inside the transaction
+	 */
+
+	TALLOC_FREE(old_subkeys);
+
 	if ( !(old_subkeys = TALLOC_ZERO_P( ctr, REGSUBKEY_CTR )) ) {
 		DEBUG(0,("regdb_store_keys: talloc() failure!\n"));
 		goto fail;
@@ -660,7 +693,7 @@
 
 BOOL regdb_store_values( const char *key, REGVAL_CTR *values )
 {
-	TDB_DATA data;
+	TDB_DATA old_data, data;
 	pstring keystr;
 	int len, ret;
 	
@@ -684,8 +717,19 @@
 	pstr_sprintf( keystr, "%s/%s", REG_VALUE_PREFIX, key );
 	normalize_reg_path( keystr );
 	
+	old_data = tdb_fetch_bystring(tdb_reg->tdb, keystr);
+
+	if ((old_data.dptr != NULL)
+	    && (old_data.dsize == data.dsize)
+	    && (memcmp(old_data.dptr, data.dptr, data.dsize) == 0)) {
+		SAFE_FREE(old_data.dptr);
+		SAFE_FREE(data.dptr);
+		return True;
+	}
+
 	ret = tdb_trans_store_bystring(tdb_reg->tdb, keystr, data, TDB_REPLACE);
 	
+	SAFE_FREE( old_data.dptr );
 	SAFE_FREE( data.dptr );
 	
 	return ret != -1 ;



More information about the samba-cvs mailing list