]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Add optimized version of the hardlink detection in BVFS
authorEric Bollengier <eric@baculasystems.com>
Fri, 5 Jun 2020 06:46:33 +0000 (08:46 +0200)
committerEric Bollengier <eric@baculasystems.com>
Thu, 29 Apr 2021 08:44:19 +0000 (10:44 +0200)
bacula/src/cats/bvfs.c
bacula/src/cats/bvfs.h

index 51e6fe951a4cc6d647cf109ef559d2230036b740..0fa744dca79e6096cab378f86a12f3fb96de8d53 100644 (file)
@@ -1395,6 +1395,17 @@ int Bvfs::checkhardlinks_cb(int fields, char **row)
    return 0;
 }
 
+#ifdef COMMUNITY
+bool Bvfs::can_use_insert_hardlinks_fast()
+{
+   return false;
+}
+bool Bvfs::insert_hardlinks_fast(char *output_table)
+{
+   return insert_hardlinks(output_table);
+}
+#endif
+
 bool Bvfs::insert_hardlinks(char *output_table)
 {
    /* Check hardlinks. We get LStat fields, and we check if we need to add a FileIndex */
@@ -1485,6 +1496,8 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *output_table)
    int num;
    bool init=false;
    bool ret=false;
+   bool use_insert_hardlinks_fast = false;
+
    /* check args */
    if ((*fileid   && !is_a_number_list(fileid))  ||
        (*dirid    && !is_a_number_list(dirid))   ||
@@ -1499,6 +1512,10 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *output_table)
 
    db->bdb_lock();
 
+   if (can_use_insert_hardlinks_fast()) {
+      use_insert_hardlinks_fast = true;
+   }
+
    /* Cleanup old tables first */
    Mmsg(query, "DROP TABLE btemp%s", output_table);
    db->bdb_sql_query(query.c_str());
@@ -1668,8 +1685,15 @@ bool Bvfs::compute_restore_list(char *fileid, char *dirid, char *output_table)
       }
    }
 
-   if (!insert_hardlinks(output_table)) {
-      goto bail_out;
+   if (use_insert_hardlinks_fast) {
+      if (!insert_hardlinks_fast(output_table)) {
+         goto bail_out;
+      }
+
+   } else {
+      if (!insert_hardlinks(output_table)) {
+         goto bail_out;
+      }
    }
 
    if (!check_permissions(output_table)) {
index 73808402227c75bb266c132bb82677d249e9cd52..3544a9d5d04c1975a280942ff46d15fd7912cb8d 100644 (file)
@@ -255,6 +255,12 @@ public:
    /* Handle hardlinks if any */
    bool insert_hardlinks(char *output_table);
 
+   /* Handle hardlinks if any */
+   bool insert_hardlinks_fast(char *output_table);
+
+   /* Check if this function can be used */
+   bool can_use_insert_hardlinks_fast();
+
    /* Get a list of volumes */
    void get_volumes(FileId_t fileid);