[Fedora-directory-commits] ldapserver/ldap/servers/slapd/back-ldbm archive.c, 1.7, 1.8

Noriko Hosoi (nhosoi) fedora-directory-commits at redhat.com
Thu Jan 12 00:29:14 UTC 2006


Author: nhosoi

Update of /cvs/dirsec/ldapserver/ldap/servers/slapd/back-ldbm
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv22527/back-ldbm

Modified Files:
	archive.c 
Log Message:
[174774] Backup does not clear the backup directory prior to performing backup; Restore tries to restore all the fles from the backupdir
1) if the specified backup directory exists, rename it to <dir>.bak
2) support relative dir for the backup/restore dir, e.g., "bak2db bak/mybak" 



Index: archive.c
===================================================================
RCS file: /cvs/dirsec/ldapserver/ldap/servers/slapd/back-ldbm/archive.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- archive.c	25 Apr 2005 16:24:23 -0000	1.7
+++ archive.c	12 Jan 2006 00:29:04 -0000	1.8
@@ -42,8 +42,10 @@
 int ldbm_back_archive2ldbm( Slapi_PBlock *pb )
 {
     struct ldbminfo    *li;
+    char *instancedir = NULL;
+    char *orig_dir = NULL;
     char *directory = NULL;
-	char *backendname = NULL;
+    char *backendname = NULL;
     int return_value = -1;
     int task_flags = 0;
     int run_from_cmdline = 0;
@@ -51,12 +53,20 @@
     int is_old_to_new = 0;
 
     slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li );
-    slapi_pblock_get( pb, SLAPI_SEQ_VAL, &directory );
-	slapi_pblock_get( pb, SLAPI_BACKEND_INSTANCE_NAME, &backendname);
+    slapi_pblock_get( pb, SLAPI_SEQ_VAL, &orig_dir );
+    slapi_pblock_get( pb, SLAPI_BACKEND_INSTANCE_NAME, &backendname);
     slapi_pblock_get( pb, SLAPI_BACKEND_TASK, &task );
     slapi_pblock_get( pb, SLAPI_TASK_FLAGS, &task_flags );
     li->li_flags = run_from_cmdline = (task_flags & TASK_RUNNING_FROM_COMMANDLINE);
 
+    if ( !orig_dir || !*orig_dir ) {
+        LDAPDebug( LDAP_DEBUG_ANY, "archive2db: no archive name\n",
+                   0, 0, 0 );
+        return( -1 );
+    }
+    instancedir = config_get_instancedir();
+    directory = rel2abspath_ext(orig_dir, instancedir);
+
     /* check the current idl format vs backup DB version */
     if (idl_get_idl_new())
     {
@@ -99,7 +109,7 @@
                       "to restore old formated backup onto the new server, "
                       "please use command line utility \"bak2db\" .\n");
             }
-            return -1;
+            goto out;
         }
         /* server is up -- mark all backends busy */
         for (inst_obj = objset_first_obj(li->li_instance_set); inst_obj;
@@ -131,7 +141,7 @@
                 }
                 object_release(inst_obj2);
                 object_release(inst_obj);
-                return -1;
+                goto out;
             }
         }
 
@@ -237,26 +247,97 @@
             }
         }
     }
-
+out:
+    slapi_ch_free_string(&directory);
     return return_value;
 }
 
 int ldbm_back_ldbm2archive( Slapi_PBlock *pb )
 {
     struct ldbminfo    *li;
+    char *orig_dir = NULL;
     char *directory = NULL;
+    char *dir_bak = NULL;
+    char *instancedir = NULL;
     int return_value = -1;
     int task_flags = 0;
     int run_from_cmdline = 0;
     Slapi_Task *task;
+    struct stat sbuf;
 
     slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li );
-    slapi_pblock_get( pb, SLAPI_SEQ_VAL, &directory );
+    slapi_pblock_get( pb, SLAPI_SEQ_VAL, &orig_dir );
     slapi_pblock_get( pb, SLAPI_TASK_FLAGS, &task_flags );
     li->li_flags = run_from_cmdline = (task_flags & TASK_RUNNING_FROM_COMMANDLINE);
 
     slapi_pblock_get( pb, SLAPI_BACKEND_TASK, &task );
 
+    if ( !orig_dir || !*orig_dir ) {
+        LDAPDebug( LDAP_DEBUG_ANY, "db2archive: no archive name\n",
+                   0, 0, 0 );
+        return( -1 );
+    }
+    instancedir = config_get_instancedir();
+    directory = rel2abspath_ext(orig_dir, instancedir);
+    if (stat(directory, &sbuf) == 0) {
+        int baklen = strlen(directory) + 5; /* ".bak\0" */
+        dir_bak = slapi_ch_malloc(baklen);
+        PR_snprintf(dir_bak, baklen, "%s.bak", directory);
+        LDAPDebug(LDAP_DEBUG_ANY, "db2archive: %s exists. Renaming to %s\n",
+                                  directory, dir_bak, 0);
+        if (task) {
+            slapi_task_log_notice(task, "%s exists. Renaming to %s\n",
+                                        directory, dir_bak);
+        }
+        if (stat(dir_bak, &sbuf) == 0) {
+            return_value = ldbm_delete_dirs(dir_bak);
+            if (0 != return_value) {
+                LDAPDebug(LDAP_DEBUG_ANY,
+                            "db2archive: %s exists and failed to delete it.\n",
+                            dir_bak, 0, 0);
+                if (task) {
+                    slapi_task_log_notice(task,
+                            "%s exists and failed to delete it.\n", dir_bak);
+                }
+                return_value = -1;
+                goto out;
+            }
+        }
+        return_value = PR_Rename(directory, dir_bak);
+        if (return_value != PR_SUCCESS) {
+            PRErrorCode prerr = PR_GetError();
+            LDAPDebug(LDAP_DEBUG_ANY,
+                            "db2archive: Failed to rename \"%s\" to \"%s\".",
+                            directory, dir_bak, 0);
+            LDAPDebug(LDAP_DEBUG_ANY,
+                            SLAPI_COMPONENT_NAME_NSPR " error %d (%s)",
+                            prerr, slapd_pr_strerror(prerr), 0);
+            if (task) {
+                slapi_task_log_notice(task,
+                            "Failed to rename \"%s\" to \"%s\".",
+                            directory, dir_bak, 0);
+                slapi_task_log_notice(task,
+                            SLAPI_COMPONENT_NAME_NSPR " error %d (%s)",
+                            prerr, slapd_pr_strerror(prerr), 0);
+            }
+            return_value = -1;
+            goto out;
+        }
+    }
+    if (0 != MKDIR(directory,SLAPD_DEFAULT_DIR_MODE) && EEXIST != errno) {
+        char *msg = dblayer_strerror(errno);
+
+        LDAPDebug(LDAP_DEBUG_ANY,
+                  "db2archive: mkdir(%s) failed; errno %i (%s)\n",
+                  directory, errno, msg ? msg : "unknown");
+        if (task) {
+            slapi_task_log_notice(task,
+                                  "mkdir(%s) failed; errno %i (%s)",
+                                  directory, errno, msg ? msg : "unknown");
+        }
+        goto err;
+    }
+
     /* No ldbm be's exist until we process the config information. */
     if (run_from_cmdline) {
         mapping_tree_init();
@@ -297,43 +378,36 @@
                 }
                 object_release(inst_obj2);
                 object_release(inst_obj);
-                return -1;
+                goto err;
             }
         }
     }
 
-    if ( !directory || !*directory ) {
-        LDAPDebug( LDAP_DEBUG_ANY, "db2archive: no archive name\n",
-                   0, 0, 0 );
-        return( -1 );
-    }
-    if (0 != MKDIR(directory,SLAPD_DEFAULT_DIR_MODE) && EEXIST != errno) {
-        char *msg = dblayer_strerror(errno);
-
-        LDAPDebug(LDAP_DEBUG_ANY,
-                  "db2archive: mkdir(%s) failed; errno %i (%s)\n",
-                  directory, errno, msg ? msg : "unknown");
-        if (task) {
-            slapi_task_log_notice(task,
-                                  "mkdir(%s) failed; errno %i (%s)",
-                                  directory, errno, msg ? msg : "unknown");
-        }
-    }
-
     /* start the database code up, do not attempt to perform recovery */
     if (run_from_cmdline &&
-        0 != dblayer_start(li,DBLAYER_ARCHIVE_MODE|DBLAYER_NO_DBTHREADS_MODE)) {
+        0 != (return_value = dblayer_start(li,DBLAYER_ARCHIVE_MODE|DBLAYER_NO_DBTHREADS_MODE))) {
         LDAPDebug(LDAP_DEBUG_ANY, "db2archive: Failed to init database\n",
                   0, 0, 0);
         if (task) {
             slapi_task_log_notice(task, "Failed to init database");
         }
-        return( -1 );
+        goto rel_err;
+    }
+
+    if (slapd_comp_path(directory, li->li_directory) == 0) {
+        LDAPDebug(LDAP_DEBUG_ANY,
+                "db2archive: Cannot archive to the db directory.\n", 0, 0, 0);
+        if (task) {
+            slapi_task_log_notice(task, "Cannot archive to the db directory.\n");
+        }
+        return_value = -1;
+        goto rel_err;
     }
 
     /* tell it to archive */
     return_value = dblayer_backup(li, directory, task);
 
+rel_err: 
     /* close the database down again */
     if (run_from_cmdline &&
         0 != dblayer_close(li,DBLAYER_ARCHIVE_MODE|DBLAYER_NO_DBTHREADS_MODE)) {
@@ -359,6 +433,19 @@
             instance_set_not_busy(inst);
         }
     }
-
+err:
+    if (return_value != 0) {
+        LDAPDebug(LDAP_DEBUG_ANY, "db2archive: Rename %s back to %s\n",
+                                  dir_bak, directory, 0);
+        if (task) {
+            slapi_task_log_notice(task, "Rename %s back to %s\n",
+                                        dir_bak, directory);
+        }
+        ldbm_delete_dirs(directory);
+        PR_Rename(dir_bak, directory);
+    }
+out:
+    slapi_ch_free_string(&dir_bak);
+    slapi_ch_free_string(&directory);
     return return_value;
 }




More information about the Fedora-directory-commits mailing list