[pve-devel] [PATCH manager] Treat pvesr as a worker for storage operations

Fabian Ebner f.ebner at proxmox.com
Tue Oct 29 11:56:02 CET 2019


We currently have a 5 seconds timeout for zfs_request for non-workers and
that is too low for some use cases of pvesr. As a workaround we create
fake workers doing the storage operations and use our own timeouts.

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

Is 60 a good value for the timeout?
Should we make the timeout configurable via the replication config?

 PVE/CLI/pvesr.pm | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm
index cb79e2bf..95550860 100644
--- a/PVE/CLI/pvesr.pm
+++ b/PVE/CLI/pvesr.pm
@@ -136,14 +136,22 @@ __PACKAGE__->register_method ({
 	    my $images = $plugin->list_images($storeid, $scfg, $vmid, undef, $cache);
 	    push @$volids, map { $_->{volid} } @$images;
 	}
-	my ($last_snapshots, $cleaned_replicated_volumes) = PVE::Replication::prepare($storecfg, $volids, $jobid, $last_sync, $parent_snapname, $logfunc);
-	foreach my $volid (keys %$cleaned_replicated_volumes) {
-	    if (!$wanted_volids->{$volid}) {
-		$logfunc->("$jobid: delete stale volume '$volid'");
-		PVE::Storage::vdisk_free($storecfg, $volid);
-		delete $last_snapshots->{$volid};
+
+	# FIXME: We currently manually set the worker flag here to avoid
+	# low I/O timeouts. This should be replaced by a lightweight worker
+	# once we have those.
+	my $last_snapshots = PVE::Tools::run_fork_with_timeout(60, sub {
+	    PVE::RPCEnvironment->set_worker_flag(1);
+	    my ($last_snapshots, $cleaned_replicated_volumes) = PVE::Replication::prepare($storecfg, $volids, $jobid, $last_sync, $parent_snapname, $logfunc);
+	    foreach my $volid (keys %$cleaned_replicated_volumes) {
+		if (!$wanted_volids->{$volid}) {
+		    $logfunc->("$jobid: delete stale volume '$volid'");
+		    PVE::Storage::vdisk_free($storecfg, $volid);
+		    delete $last_snapshots->{$volid};
+		}
 	    }
-	}
+	    return $last_snapshots;
+	});
 
 	print to_json($last_snapshots) . "\n";
 
@@ -200,8 +208,14 @@ __PACKAGE__->register_method ({
 	    print STDERR "$msg\n";
 	};
 
-	my $last_snapshots = PVE::Replication::prepare(
-	    $storecfg, $volids, $jobid, $last_sync, undef, $logfunc);
+	# FIXME: We currently manually set the worker flag here to avoid
+	# low I/O timeouts. This should be replaced by a lightweight worker
+	# once we have those.
+	PVE::Tools::run_fork_with_timeout(60, sub {
+	    PVE::RPCEnvironment->set_worker_flag(1);
+	    my $last_snapshots = PVE::Replication::prepare(
+		$storecfg, $volids, $jobid, $last_sync, undef, $logfunc);
+	});
 
 	return undef;
     }});
-- 
2.20.1





More information about the pve-devel mailing list