[pve-devel] [PATCH v3 pve-zsync 2/2] Detect other instances of the same job and improve checks for a disabled job

Fabian Ebner f.ebner at proxmox.com
Mon Oct 7 11:16:11 CEST 2019


A 'waiting' state is introduced and other 'waiting' and 'syncing'
instances of the same job are now detected by moving the check out
from the sync lock. There are two new checks that allow disabling a job
while it is 'syncing' or 'waiting'. Previously when sync finished it would
re-enable such a job involuntarily.
Disabling a 'waiting' job causes it to not sync anymore.

Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
---

Changes from v2:
    * Split into 2 patches

Changes from v1:
    * Added 2 additional checks to not involuntarily re-enable a disabled job

 pve-zsync | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/pve-zsync b/pve-zsync
index f7bf5bd..677e937 100755
--- a/pve-zsync
+++ b/pve-zsync
@@ -581,18 +581,32 @@ sub destroy_job {
 sub sync {
     my ($param) = @_;
 
-    my $date = get_date();
+    my $date;
     my $job;
     my $dest;
     my $source;
     my $vm_type;
 
+    locked("$CONFIG_PATH/cron_and_state.lock", sub {
+	$job = eval { get_job($param); };
+
+	if ($job) {
+	    if (defined($job->{state}) && ($job->{state} eq "syncing" || $job->{state} eq "waiting")) {
+		die "Job --source $param->{source} --name $param->{name} is already scheduled to sync\n";
+	    }
+	    $job->{state} = "waiting";
+	    update_state($job);
+	}
+    });
+
     locked("$CONFIG_PATH/sync.lock", sub {
 	locked("$CONFIG_PATH/cron_and_state.lock", sub {
+	    #job might've changed since we waited for the sync lock, but we can be sure it's not syncing
+	    $date = get_date();
 	    eval { $job = get_job($param); };
 
-	    if ($job && defined($job->{state}) && $job->{state} eq "syncing") {
-		die "Job --source $param->{source} --name $param->{name} is syncing at the moment";
+	    if ($job && defined($job->{state}) && $job->{state} eq "stopped") {
+		die "Job --source $param->{source} --name $param->{name} has been disabled\n";
 	    }
 
 	    $dest = parse_target($param->{dest});
@@ -647,11 +661,18 @@ sub sync {
 	    die "$err\n";
 	}
 
-	if ($job) {
-	    $job->{state} = "ok";
-	    $job->{lsync} = $date;
-	    locked("$CONFIG_PATH/cron_and_state.lock", sub { update_state($job); });
-	}
+	locked("$CONFIG_PATH/cron_and_state.lock", sub {
+	    eval { $job = get_job($param); };
+	    if ($job) {
+		if (defined($job->{state}) && $job->{state} eq "stopped") {
+		    $job->{state} = "stopped";
+		} else {
+		    $job->{state} = "ok";
+		}
+		$job->{lsync} = $date;
+		update_state($job);
+	    }
+	});
     }); #sync lock
 }
 
-- 
2.20.1





More information about the pve-devel mailing list