# targets are either a VMID, or a 'host:zpool/path' with 'host:' being optional
my $TARGETRE = qr!^(?:($HOSTRE):)?(\d+|(?:[\w\-_]+)(/.+)?)$!;
+my $DISK_KEY_RE = qr/^(?:(?:(?:virtio|ide|scsi|sata|efidisk|mp)\d+)|rootfs): /;
+
my $command = $ARGV[0];
if (defined($command) && $command ne 'help' && $command ne 'printpod') {
update_state($job);
}); #cron and state lock
- eval {
- sync($param) if !$param->{skip};
- };
- if(my $err = $@) {
+ return if $param->{skip};
+
+ eval { sync($param) };
+ if (my $err = $@) {
destroy_job($param);
print $err;
}
sub sync {
my ($param) = @_;
+ my $job;
+
+ locked("$CONFIG_PATH/cron_and_state.lock", sub {
+ eval { $job = 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 {
my $date = get_date();
- my $job;
my $dest;
my $source;
my $vm_type;
locked("$CONFIG_PATH/cron_and_state.lock", sub {
+ #job might've changed while we waited for the sync lock, but we can be sure it's not syncing
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});
locked("$CONFIG_PATH/cron_and_state.lock", sub {
eval { $job = get_job($param); };
if ($job) {
- $job->{state} = "ok";
+ if (defined($job->{state}) && $job->{state} eq "stopped") {
+ $job->{state} = "stopped";
+ } else {
+ $job->{state} = "ok";
+ }
$job->{lsync} = $date;
update_state($job);
}
my $line = $1;
next if $line =~ /media=cdrom/;
- next if $line !~ m/^(?:((?:virtio|ide|scsi|sata|mp)\d+)|rootfs): /;
+ next if $line !~ m/$DISK_KEY_RE/;
#QEMU if backup is not set include in sync
next if $vm_type eq 'qemu' && ($line =~ m/backup=(?i:0|no|off|false)/);
my $disk = undef;
my $stor = undef;
- if($line =~ m/^(?:(?:(?:virtio|ide|scsi|sata|mp)\d+)|rootfs): (.*)$/) {
+ if($line =~ m/$DISK_KEY_RE(.*)$/) {
my @parameter = split(/,/,$1);
foreach my $opt (@parameter) {