[pve-devel] [PATCH] remove running from Storage and check it in QemuServer

Alexandre DERUMIER aderumier at odiso.com
Wed May 6 11:01:56 CEST 2015


seem to be ok !


BTW,
I wonder if we could replace  qmp  "snapshot-drive" (from internal-snapshot-async.patch)

by upstream qemu qmp method

blockdev-snapshot-internal-sync

http://git.qemu.org/?p=qemu.git;a=blob_plain;f=qmp-commands.hx;hb=HEAD

One advantage is that multiple drive can be snapshotted in a transaction.

from history we have done this snapshot-drive because no method existed at this time.

I think we just need to keep savevm_start, savevm_stop from internal-snapshot-async.patch,
to be able to save the vmstate to external file/volume.




blockdev-snapshot-internal-sync
-------------------------------

Synchronously take an internal snapshot of a block device when the format of
image used supports it.  If the name is an empty string, or a snapshot with
name already exists, the operation will fail.

Arguments:

- "device": device name to snapshot (json-string)
- "name": name of the new snapshot (json-string)

Example:

-> { "execute": "blockdev-snapshot-internal-sync",
                "arguments": { "device": "ide-hd0",
                               "name": "snapshot0" }
   }
<- { "return": {} }

EQMP

    {
        .name       = "blockdev-snapshot-delete-internal-sync",
        .args_type  = "device:B,id:s?,name:s?",
        .mhandler.cmd_new =
                      qmp_marshal_input_blockdev_snapshot_delete_internal_sync,
    },

SQMP
blockdev-snapshot-delete-internal-sync
--------------------------------------

Synchronously delete an internal snapshot of a block device when the format of
image used supports it.  The snapshot is identified by name or id or both.  One
of name or id is required.  If the snapshot is not found, the operation will
fail.

Arguments:

- "device": device name (json-string)
- "id": ID of the snapshot (json-string, optional)
- "name": name of the snapshot (json-string, optional)

Example:

-> { "execute": "blockdev-snapshot-delete-internal-sync",
                "arguments": { "device": "ide-hd0",
                               "name": "snapshot0" }
   }
<- { "return": {
                   "id": "1",
                   "name": "snapshot0",
                   "vm-state-size": 0,
                   "date-sec": 1000012,
                   "date-nsec": 10,
                   "vm-clock-sec": 100,
                   "vm-clock-nsec": 20
     }
   }


----- Mail original -----
De: "Wolfgang Link" <w.link at proxmox.com>
À: "pve-devel" <pve-devel at pve.proxmox.com>
Envoyé: Mercredi 6 Mai 2015 09:57:34
Objet: [pve-devel] [PATCH] remove running from Storage and check it in	QemuServer

It is better to check if a VM is running in QemuServer then in Storage. 
for the Storage there is no difference if it is running or not. 

Signed-off-by: Wolfgang Link <w.link at proxmox.com> 
--- 
PVE/QemuServer.pm | 29 +++++++++++++++++++++++------ 
1 file changed, 23 insertions(+), 6 deletions(-) 

diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm 
index 708b208..9a4e2ee 100644 
--- a/PVE/QemuServer.pm 
+++ b/PVE/QemuServer.pm 
@@ -31,6 +31,8 @@ use PVE::QMPClient; 
use PVE::RPCEnvironment; 
use Time::HiRes qw(gettimeofday); 

+my $qemu_snap_storage = {rbd => 1, sheepdog => 1}; 
+ 
my $cpuinfo = PVE::ProcFSTools::read_cpuinfo(); 

# Note about locking: we use flock on the config file protect 
@@ -3777,12 +3779,11 @@ sub qemu_volume_snapshot { 

my $running = check_running($vmid); 

- return if !PVE::Storage::volume_snapshot($storecfg, $volid, $snap, $running); 
- 
- return if !$running; 
- 
- vm_mon_cmd($vmid, "snapshot-drive", device => $deviceid, name => $snap); 
- 
+ if ($running && do_snapshots_with_qemu($storecfg, $volid)){ 
+ vm_mon_cmd($vmid, "snapshot-drive", device => $deviceid, name => $snap); 
+ } else { 
+ PVE::Storage::volume_snapshot($storecfg, $volid, $snap); 
+ } 
} 

sub qemu_volume_snapshot_delete { 
@@ -5772,6 +5773,22 @@ my $savevm_wait = sub { 
} 
}; 

+sub do_snapshots_with_qemu { 
+ my ($storecfg, $volid) = @_; 
+ 
+ my $storage_name = PVE::Storage::parse_volume_id($volid); 
+ 
+ if ($qemu_snap_storage->{$storecfg->{ids}->{$storage_name}->{type}} ){ 
+ return 1; 
+ } 
+ 
+ if ($volid =~ m/\.(qcow2|qed)$/){ 
+ return 1; 
+ } 
+ 
+ return undef; 
+} 
+ 
sub snapshot_create { 
my ($vmid, $snapname, $save_vmstate, $comment) = @_; 

-- 
2.1.4 


_______________________________________________ 
pve-devel mailing list 
pve-devel at pve.proxmox.com 
http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel 



More information about the pve-devel mailing list