[pve-devel] Custom storage plugins API
Alexander Schmid
alex at modula-shop-systems.de
Wed Jan 18 10:34:05 CET 2017
Hello Dietmar,
has someone found time to have a look at this ?
For finishing my SCST-Plugin it would be good to know if there will be a
way to catch qemu-img convert from a custom implementation.
Also, as my plugin activates snaps temporary via a clone of the snap and
exposes this as an iscsi-target, it would be crucial that
deactivate_volume is called for cleanup.
Really would love a way to clone from older Snapshots with ZFS over
iSCSI but don't feel very comfortable with the situation that the
storage-plugin needs patching other parts like QemuServer.pm
Worst-case, i`d think about bundling the plugin in a .deb with
dependencys and post-install triggers that do the patch to prevent
breaking the storage with an PVE-Update. But this is really not what i
want to do ...
Guess some of the things how it allows to access older snapshots in ZFS
might also be a nice addition to the zfsplugin in general.
I think it should work with the bundled iscsi-targets, too.
Best regards,
Alex
Am 13.01.17 um 10:55 schrieb Alexander Schmid:
> Am 13.01.17 um 10:44 schrieb Dietmar Maurer:
>>> I also extended ZFSPlugin to allow access to Snapshots (via zfs
>>> snapshot
>>> + clone + iSCISI Target on the Clone) and cloning from Snapshots (via
>>> send/rcv on a clone). Therefore i had some minor changes in
>>> QemuServer.pm to allow this. Any chance these could be taken into
>>> one of
>>> the next releases ?
>> A first step would be to send the code to list (else nobody known what
>> you really talk about).
>>
> Currently, i only changed qemu_img_convert to allow sort of delegation
> to the storage-plugin. See comments.
>
> This would let the storage-plugin jump-in, in my case zfs send/rcv is
> used in favour of qemu-img convert as it's much faster.
>
> Not sure about the call of deactivate_volume in the end and if it
> might break other storage implementations.
>
> I needed it to do some cleanup on the iscsi-targets that were
> temporary created on the snap.
>
> sub qemu_img_convert {
> my ($src_volid, $dst_volid, $size, $snapname,
> $is_zero_initialized) = @_;
>
> my $storecfg = PVE::Storage::config();
> my ($src_storeid, $src_volname) =
> PVE::Storage::parse_volume_id($src_volid, 1);
> my ($dst_storeid, $dst_volname) =
> PVE::Storage::parse_volume_id($dst_volid, 1);
>
> if ($src_storeid && $dst_storeid) {
>
> PVE::Storage::activate_volumes($storecfg, [$src_volid], $snapname);
>
> my $src_scfg = PVE::Storage::storage_config($storecfg, $src_storeid);
> my $dst_scfg = PVE::Storage::storage_config($storecfg, $dst_storeid);
>
> my $src_format = qemu_img_format($src_scfg, $src_volname);
> my $dst_format = qemu_img_format($dst_scfg, $dst_volname);
>
> my $src_path = PVE::Storage::path($storecfg, $src_volid, $snapname);
> my $dst_path = PVE::Storage::path($storecfg, $dst_volid);
>
> #BEGIN addition
> my $src_storage_plugin =
> PVE::Storage::Plugin->lookup($src_scfg->{type});
> my $dst_storage_plugin =
> PVE::Storage::Plugin->lookup($dst_scfg->{type});
>
> # in many cases the storage may have a better idea how to convert:
> # if src and dst format is the same
> # and src_storeid is dst_storeid
> # and the storage has the feature
> # and the feature is implemented as volume_copy /
> volume_snapshot_copy
> # let the storage do the work as it quite sure is faster
> if ( $src_format eq $dst_format ) {
> if( $src_storeid eq $dst_storeid ) {
> # this is the same storage
> # and storage is capable of materializing snaps
> if( $snapname ) {
> my $canCopySnap =
> PVE::Storage::volume_has_feature($storecfg, 'copy', $src_volid,
> $snapname, undef) && $src_storage_plugin->can('volume_snapshot_copy');
> if( $canCopySnap ) {
> print "delegate to storage plugin
> volume_snapshot_copy (snap $snapname)\n";
> $src_storage_plugin->volume_snapshot_copy($src_scfg, $src_volname,
> $snapname, $dst_volname);
>
> $src_storage_plugin->deactivate_volume($src_storeid, $src_scfg,
> $src_volname, $snapname);
>
> return 1;
> }
> }
>
> my $canCopyVolume =
> PVE::Storage::volume_has_feature($storecfg, 'copy', $src_volid, undef,
> undef) && $src_storage_plugin->can('volume_copy');
> if ( $canCopyVolume ) {
> print "delegate to storage plugin: volume_copy (base)\n";
> $src_storage_plugin->volume_copy($src_scfg,
> $src_volname, $dst_volname);
>
> $src_storage_plugin->deactivate_volume($src_storeid, $src_scfg,
> $src_volname, $snapname);
>
> return 1;
> }
> }
> }
> #END addition
>
>
> my $cmd = [];
> push @$cmd, '/usr/bin/qemu-img', 'convert', '-p', '-n';
> push @$cmd, '-s', $snapname if($snapname && $src_format eq "qcow2");
> push @$cmd, '-f', $src_format, '-O', $dst_format, $src_path;
> if ($is_zero_initialized) {
> push @$cmd, "zeroinit:$dst_path";
> } else {
> push @$cmd, $dst_path;
> }
>
> my $parser = sub {
> my $line = shift;
> if($line =~ m/\((\S+)\/100\%\)/){
> my $percent = $1;
> my $transferred = int($size * $percent / 100);
> my $remaining = $size - $transferred;
>
> print "transferred: $transferred bytes remaining: $remaining
> bytes total: $size bytes progression: $percent %\n";
> }
>
> };
>
> eval { run_command($cmd, timeout => undef, outfunc => $parser); };
> my $err = $@;
>
> # added: deactivate the src-volume, even on failure
> # this can be safely called as qemu_img_convert is never called on
> a running volume (that is not a snap)
> $src_storage_plugin->deactivate_volume($src_storeid, $src_scfg,
> $src_volname, $snapname);
>
> die "copy failed: $err" if $err;
>
> }
> }
>
> _______________________________________________
> 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