From 36c398b072a0d010a5a3bd55e92dfc9155329bdc Mon Sep 17 00:00:00 2001
From: Donald Buczek <buczek@molgen.mpg.de>
Date: Mon, 7 Apr 2025 10:10:45 +0200
Subject: [PATCH] pbackup: Maintain stat_generation on move

When we move a run from one volume to another and dedup on the target
volume, use the smaller (older) generation number of the two source runs
which are joined, because both can contribute data.

Remove "review" fuse for cmd_move.
---
 bin/pbackup | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/bin/pbackup b/bin/pbackup
index cc46e12..2807092 100755
--- a/bin/pbackup
+++ b/bin/pbackup
@@ -931,8 +931,8 @@ sub move {
         # newest run not on target volume
         #
 
-        my  ($stat_rowid, $src_volume_id, $src_volume_path, $stat_started, $path_path, $job_id) = $dbh->selectrow_array(<<'EOF', undef, $job_name, $dst_volume_id);
-SELECT stat.rowid, volume_id, volume_path, stat_started, path_path, job_id
+        my  ($stat_rowid, $src_volume_id, $src_volume_path, $stat_started, $path_path, $job_id, $src_stat_generation) = $dbh->selectrow_array(<<'EOF', undef, $job_name, $dst_volume_id);
+SELECT stat.rowid, volume_id, volume_path, stat_started, path_path, job_id, stat_generation
 FROM stat, volume, job, path
 WHERE
   job_name = ? AND volume_id <> ?
@@ -967,8 +967,8 @@ EOF
                 redo;
             }
 
-            my ($linkfrom_job_name, $linkfrom_stat_started, $linkfrom_path_path) = $dbh->selectrow_array(<<'EOF', undef, $linkfrom_stat_rowid);
-SELECT job_name, stat_started, path_path
+            my ($linkfrom_job_name, $linkfrom_stat_started, $linkfrom_path_path, $dst_stat_generation) = $dbh->selectrow_array(<<'EOF', undef, $linkfrom_stat_rowid);
+SELECT job_name, stat_started, path_path, stat_generation
 FROM stat,  job, path
 WHERE stat_job_id = job_id
 AND job_path_id = path_id
@@ -983,7 +983,8 @@ EOF
             rsync_copy("$src_volume_path/$job_name/$run_name/", "$dst_volume_path/$job_name/$run_name", "$dst_volume_path/$linkfrom_job_name/$linkfrom_run_name");
             rename("$src_volume_path/$job_name/$run_name", "$src_volume_path/$job_name/$run_name.BEING_DELETED") or
                 die "$src_volume_path/$job_name/$run_name $src_volume_path/$job_name/$run_name.BEING_DELETED : $!\n";
-            $dbh->do('UPDATE stat SET stat_volume_id = ? WHERE rowid = ?', undef, $dst_volume_id, $stat_rowid);
+            my $new_stat_generation = $src_stat_generation < $dst_stat_generation ? $src_stat_generation : $dst_stat_generation;
+            $dbh->do('UPDATE stat SET stat_volume_id = ?, stat_generation = ? WHERE rowid = ?', undef, $dst_volume_id, $new_stat_generation, $stat_rowid);
             lck_unlock("RUN.$stat_rowid", LCK_EX);
             lck_unlock("RUN.$linkfrom_stat_rowid", LCK_EX);
         } else {
@@ -1430,7 +1431,6 @@ sub cmd_expire {
 }
 
 sub cmd_move {
-    die "move code needs review w.r.t. stat_generation\n";
     my ($job_name, $to) = @_;  # 'prj_AGHucho' ,  [ 'C4123' ]
     upid_register_self();
     move($job_name, $to, 'MOVE   ');