make tdbbackup use transactions
[samba.git] / lib / tdb / tools / tdbbackup.c
index 6f3ca48314f0ccbb0b48bcecf1637e0e3f628290..83c0e16399e1e1792559882e7dec73ca623e32ee 100644 (file)
@@ -126,9 +126,17 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
                return 1;
        }
 
-       /* lock the old tdb */
-       if (tdb_lockall(tdb) != 0) {
-               fprintf(stderr,"Failed to lock %s\n", old_name);
+       if (tdb_transaction_start(tdb) != 0) {
+               printf("Failed to start transaction on old tdb\n");
+               tdb_close(tdb);
+               tdb_close(tdb_new);
+               unlink(tmp_name);
+               free(tmp_name);
+               return 1;
+       }
+
+       if (tdb_transaction_start(tdb_new) != 0) {
+               printf("Failed to start transaction on new tdb\n");
                tdb_close(tdb);
                tdb_close(tdb_new);
                unlink(tmp_name);
@@ -152,6 +160,14 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
        /* close the old tdb */
        tdb_close(tdb);
 
+       if (tdb_transaction_commit(tdb_new) != 0) {
+               fprintf(stderr, "Failed to commit new tdb\n");
+               tdb_close(tdb_new);
+               unlink(tmp_name);
+               free(tmp_name);         
+               return 1;
+       }
+
        /* close the new tdb and re-open read-only */
        tdb_close(tdb_new);
        tdb_new = tdb_open(tmp_name, 0, TDB_DEFAULT, O_RDONLY, 0);
@@ -173,9 +189,6 @@ static int backup_tdb(const char *old_name, const char *new_name, int hash_size)
                return 1;
        }
 
-       /* make sure the new tdb has reached stable storage */
-       fsync(tdb_fd(tdb_new));
-
        /* close the new tdb and rename it to .bak */
        tdb_close(tdb_new);
        if (rename(tmp_name, new_name) != 0) {