public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches
@ 2022-05-23 10:54 Aaron Lauterer
  2022-06-13 13:00 ` Aaron Lauterer
  2022-06-14  8:53 ` [pve-devel] applied: " Fabian Grünbichler
  0 siblings, 2 replies; 3+ messages in thread
From: Aaron Lauterer @ 2022-05-23 10:54 UTC (permalink / raw)
  To: pve-devel

The changes in cfe46e2d4a97a83f1bbe6ad656e6416399309ba2 git not catch
all situations.
In the case of a guest having 2 disk images with the same name on a pool
with the same name but in two different ceph clusters we still had
issues when starting it. The first disk got mapped as expected. The
second disk did not get mapped because we returned the old $path to
"/dev/rbd/<pool>/<image>" because it already existed from the first
disk.

In the case that only the "old" /dev/rbd path exists and we do not have
the /dev/rbd-pve/<cluster>/... path available, we now check if the
cluster fsid used by that rbd device matches the one we expect. If it
does, then we are in the situation that the image has been mapped before
the new rbd-pve udev rule was introduced. If it does not, then we have
the situation of an ambiguous mapping in /dev/rbd and return the
$pve_path.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
---
 PVE/Storage/RBDPlugin.pm | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
index 3511914..eeeaf3f 100644
--- a/PVE/Storage/RBDPlugin.pm
+++ b/PVE/Storage/RBDPlugin.pm
@@ -3,6 +3,7 @@ package PVE::Storage::RBDPlugin;
 use strict;
 use warnings;
 
+use Cwd qw(abs_path);
 use IO::File;
 use JSON;
 use Net::IP;
@@ -13,7 +14,7 @@ use PVE::JSONSchema qw(get_standard_option);
 use PVE::ProcFSTools;
 use PVE::RADOS;
 use PVE::Storage::Plugin;
-use PVE::Tools qw(run_command trim);
+use PVE::Tools qw(run_command trim file_read_firstline);
 
 use base qw(PVE::Storage::Plugin);
 
@@ -66,7 +67,13 @@ my sub get_rbd_dev_path {
     my $pve_path = "/dev/rbd-pve/${cluster_id}/${rbd_path}";
     my $path = "/dev/rbd/${rbd_path}";
 
-    return $path if !-e $pve_path && -e $path; # mapped before rbd-pve udev rule existed
+    if (!-e $pve_path && -e $path) {
+	# possibly mapped before rbd-pve rule existed
+	my $real_dev = abs_path($path);
+	my ($rbd_id) = ($real_dev =~ m|/dev/rbd([0-9]+)$|);
+	my $dev_cluster_id = file_read_firstline("/sys/devices/rbd/${rbd_id}/cluster_fsid");
+	return $path if $cluster_id eq $dev_cluster_id;
+    }
     return $pve_path;
 }
 
-- 
2.30.2





^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [pve-devel] [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches
  2022-05-23 10:54 [pve-devel] [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches Aaron Lauterer
@ 2022-06-13 13:00 ` Aaron Lauterer
  2022-06-14  8:53 ` [pve-devel] applied: " Fabian Grünbichler
  1 sibling, 0 replies; 3+ messages in thread
From: Aaron Lauterer @ 2022-06-13 13:00 UTC (permalink / raw)
  To: pve-devel

ping?

On 5/23/22 12:54, Aaron Lauterer wrote:
> The changes in cfe46e2d4a97a83f1bbe6ad656e6416399309ba2 git not catch
> all situations.
> In the case of a guest having 2 disk images with the same name on a pool
> with the same name but in two different ceph clusters we still had
> issues when starting it. The first disk got mapped as expected. The
> second disk did not get mapped because we returned the old $path to
> "/dev/rbd/<pool>/<image>" because it already existed from the first
> disk.
> 
> In the case that only the "old" /dev/rbd path exists and we do not have
> the /dev/rbd-pve/<cluster>/... path available, we now check if the
> cluster fsid used by that rbd device matches the one we expect. If it
> does, then we are in the situation that the image has been mapped before
> the new rbd-pve udev rule was introduced. If it does not, then we have
> the situation of an ambiguous mapping in /dev/rbd and return the
> $pve_path.
> 
> Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
> ---
>   PVE/Storage/RBDPlugin.pm | 11 +++++++++--
>   1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
> index 3511914..eeeaf3f 100644
> --- a/PVE/Storage/RBDPlugin.pm
> +++ b/PVE/Storage/RBDPlugin.pm
> @@ -3,6 +3,7 @@ package PVE::Storage::RBDPlugin;
>   use strict;
>   use warnings;
>   
> +use Cwd qw(abs_path);
>   use IO::File;
>   use JSON;
>   use Net::IP;
> @@ -13,7 +14,7 @@ use PVE::JSONSchema qw(get_standard_option);
>   use PVE::ProcFSTools;
>   use PVE::RADOS;
>   use PVE::Storage::Plugin;
> -use PVE::Tools qw(run_command trim);
> +use PVE::Tools qw(run_command trim file_read_firstline);
>   
>   use base qw(PVE::Storage::Plugin);
>   
> @@ -66,7 +67,13 @@ my sub get_rbd_dev_path {
>       my $pve_path = "/dev/rbd-pve/${cluster_id}/${rbd_path}";
>       my $path = "/dev/rbd/${rbd_path}";
>   
> -    return $path if !-e $pve_path && -e $path; # mapped before rbd-pve udev rule existed
> +    if (!-e $pve_path && -e $path) {
> +	# possibly mapped before rbd-pve rule existed
> +	my $real_dev = abs_path($path);
> +	my ($rbd_id) = ($real_dev =~ m|/dev/rbd([0-9]+)$|);
> +	my $dev_cluster_id = file_read_firstline("/sys/devices/rbd/${rbd_id}/cluster_fsid");
> +	return $path if $cluster_id eq $dev_cluster_id;
> +    }
>       return $pve_path;
>   }
>   




^ permalink raw reply	[flat|nested] 3+ messages in thread

* [pve-devel] applied: [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches
  2022-05-23 10:54 [pve-devel] [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches Aaron Lauterer
  2022-06-13 13:00 ` Aaron Lauterer
@ 2022-06-14  8:53 ` Fabian Grünbichler
  1 sibling, 0 replies; 3+ messages in thread
From: Fabian Grünbichler @ 2022-06-14  8:53 UTC (permalink / raw)
  To: Proxmox VE development discussion

On May 23, 2022 12:54 pm, Aaron Lauterer wrote:
> The changes in cfe46e2d4a97a83f1bbe6ad656e6416399309ba2 git not catch
> all situations.
> In the case of a guest having 2 disk images with the same name on a pool
> with the same name but in two different ceph clusters we still had
> issues when starting it. The first disk got mapped as expected. The
> second disk did not get mapped because we returned the old $path to
> "/dev/rbd/<pool>/<image>" because it already existed from the first
> disk.
> 
> In the case that only the "old" /dev/rbd path exists and we do not have
> the /dev/rbd-pve/<cluster>/... path available, we now check if the
> cluster fsid used by that rbd device matches the one we expect. If it
> does, then we are in the situation that the image has been mapped before
> the new rbd-pve udev rule was introduced. If it does not, then we have
> the situation of an ambiguous mapping in /dev/rbd and return the
> $pve_path.
> 
> Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
> ---
>  PVE/Storage/RBDPlugin.pm | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/PVE/Storage/RBDPlugin.pm b/PVE/Storage/RBDPlugin.pm
> index 3511914..eeeaf3f 100644
> --- a/PVE/Storage/RBDPlugin.pm
> +++ b/PVE/Storage/RBDPlugin.pm
> @@ -3,6 +3,7 @@ package PVE::Storage::RBDPlugin;
>  use strict;
>  use warnings;
>  
> +use Cwd qw(abs_path);
>  use IO::File;
>  use JSON;
>  use Net::IP;
> @@ -13,7 +14,7 @@ use PVE::JSONSchema qw(get_standard_option);
>  use PVE::ProcFSTools;
>  use PVE::RADOS;
>  use PVE::Storage::Plugin;
> -use PVE::Tools qw(run_command trim);
> +use PVE::Tools qw(run_command trim file_read_firstline);
>  
>  use base qw(PVE::Storage::Plugin);
>  
> @@ -66,7 +67,13 @@ my sub get_rbd_dev_path {
>      my $pve_path = "/dev/rbd-pve/${cluster_id}/${rbd_path}";
>      my $path = "/dev/rbd/${rbd_path}";
>  
> -    return $path if !-e $pve_path && -e $path; # mapped before rbd-pve udev rule existed
> +    if (!-e $pve_path && -e $path) {
> +	# possibly mapped before rbd-pve rule existed
> +	my $real_dev = abs_path($path);
> +	my ($rbd_id) = ($real_dev =~ m|/dev/rbd([0-9]+)$|);
> +	my $dev_cluster_id = file_read_firstline("/sys/devices/rbd/${rbd_id}/cluster_fsid");
> +	return $path if $cluster_id eq $dev_cluster_id;
> +    }
>      return $pve_path;
>  }
>  
> -- 
> 2.30.2
> 
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 
> 




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-06-14  8:53 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-23 10:54 [pve-devel] [PATCH storage] rbd: get_rbd_dev_path: return /dev/rbd path only if cluster matches Aaron Lauterer
2022-06-13 13:00 ` Aaron Lauterer
2022-06-14  8:53 ` [pve-devel] applied: " Fabian Grünbichler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal