[pve-devel] applied: [PATCH storage] plugin loader: add an APIAGE

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Nov 19 12:18:47 CET 2018


On 11/16/18 1:54 PM, Wolfgang Bumiller wrote:
> With the addition of the map/unmap_volume() methods we made
> an (actually unnecessary) API version bump.
> All current users of these methods fall back to path() when
> they return undef, so plugins implementing version 1 are
> in fact compatible currently. (In fact, the default
> Plugin::map_volume() could fall back to it on its own, but
> doesn't currently).
> 
> For now let's just allow plugins older plugins to also be
> loaded by introducing an API age variable. With it, if we
> have a reason to break older plugins, we can have a
> deprecation period during which older plugins cause a
> warning instead of refusing to load altogether.


applied, thanks!

> 
> Signed-off-by: Wolfgang Bumiller <w.bumiller at proxmox.com>
> ---
>  PVE/Storage.pm | 34 ++++++++++++++++++++++++----------
>  1 file changed, 24 insertions(+), 10 deletions(-)
> 
> diff --git a/PVE/Storage.pm b/PVE/Storage.pm
> index a5f7fdb..64b3fc9 100755
> --- a/PVE/Storage.pm
> +++ b/PVE/Storage.pm
> @@ -38,6 +38,10 @@ use PVE::Storage::DRBDPlugin;
>  
>  # Storage API version. Icrement it on changes in storage API interface.
>  use constant APIVER => 2;
> +# Age is the number of versions we're backward compatible with.
> +# This is like having 'current=APIVER' and age='APIAGE' in libtool,
> +# see https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
> +use constant APIAGE => 1;
>  
>  # load standard plugins
>  PVE::Storage::DirPlugin->register();
> @@ -65,18 +69,28 @@ if ( -d '/usr/share/perl5/PVE/Storage/Custom' ) {
>  
>  	eval {
>  	    require $file;
> +
> +	    # Check perl interface:
> +	    die "not derived from PVE::Storage::Plugin\n"
> +		if !$modname->isa('PVE::Storage::Plugin');
> +	    die "does not provide an api() method\n"
> +		if !$modname->can('api');
> +	    # Check storage API version and that file is really storage plugin.
> +	    my $version = $modname->api();
> +	    die "implements an API version newer than current\n"
> +		if $version > APIVER;
> +	    die "API version too old, pluse update the plugin\n"
> +		if $version < (APIVER-APIAGE);
> +	    import $file;
> +	    $modname->register();
> +
> +	    # If we got this far and the API version is not the same, make some
> +	    # noise:
> +	    warn "Plugin \"$modname\" is implementing an older storage API, an upgrade is recommended\n"
> +		if $version != APIVER;
>  	};
>  	if ($@) {
> -	    warn $@;
> -	# Check storage API version and that file is really storage plugin.
> -	} elsif ($modname->isa('PVE::Storage::Plugin') && $modname->can('api') && $modname->api() == APIVER) {
> -            eval {
> -	        import $file;
> -	        $modname->register();
> -            };
> -            warn $@ if $@;
> -	} else {
> -	    warn "Error loading storage plugin \"$modname\" because of API version mismatch. Please, update it.\n"
> +	    warn "Error loading storage plugin \"$modname\": $@";
>  	}
>      });
>  }
> 





More information about the pve-devel mailing list