r25528: Only do transactions on registry.tdb if anything changes
authorVolker Lendecke <vlendec@samba.org>
Fri, 5 Oct 2007 20:42:14 +0000 (20:42 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:31:12 +0000 (12:31 -0500)
I got annoyed by the fsync calls clobbering my harddrive when smbd started up
for debugging.

... things you do on a plane without internet

source/registry/reg_db.c

index 8d1271df8b8c062fff2ff3476f1c4f21f7dc4f2c..489c094b1507d5281493f9c265836d0614453c31 100644 (file)
@@ -399,14 +399,47 @@ BOOL regdb_store_keys( const char *key, REGSUBKEY_CTR *ctr )
        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 @@ int regdb_fetch_values( const char* key, REGVAL_CTR *values )
 
 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 @@ BOOL regdb_store_values( const char *key, REGVAL_CTR *values )
        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 ;