[pve-devel] r5437 - in pve-storage/pve2: . PVE PVE/API2 PVE/API2/Storage
svn-commits at proxmox.com
svn-commits at proxmox.com
Tue Jan 25 11:18:38 CET 2011
Author: dietmar
Date: 2011-01-25 11:18:38 +0100 (Tue, 25 Jan 2011)
New Revision: 5437
Modified:
pve-storage/pve2/ChangeLog
pve-storage/pve2/PVE/API2/Storage.pm
pve-storage/pve2/PVE/API2/Storage/Config.pm
pve-storage/pve2/PVE/API2/Storage/Content.pm
pve-storage/pve2/PVE/API2/Storage/Scan.pm
pve-storage/pve2/PVE/API2/Storage/Status.pm
pve-storage/pve2/PVE/Storage.pm
pve-storage/pve2/pvesm
Log:
use new cfs_read_file/cfs_write_file everywhere, remove stale lock code
Modified: pve-storage/pve2/ChangeLog
===================================================================
--- pve-storage/pve2/ChangeLog 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/ChangeLog 2011-01-25 10:18:38 UTC (rev 5437)
@@ -1,3 +1,8 @@
+2011-01-25 Proxmox Support Team <support at proxmox.com>
+
+ * PVE/Storage.pm: use new cfs_read_file/cfs_write_file everywhere
+ (cluster filesystem support)
+
2010-11-08 Proxmox Support Team <support at proxmox.com>
* PVE/Storage.pm: moved hostname read/write to INotify.pm
Modified: pve-storage/pve2/PVE/API2/Storage/Config.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Config.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/API2/Storage/Config.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -4,7 +4,7 @@
use warnings;
use PVE::SafeSyslog;
-use PVE::INotify qw(read_file write_file);;
+use PVE::Cluster qw(cfs_read_file cfs_write_file);
use PVE::Storage;
use HTTP::Status qw(:constants);
use Storable qw(dclone);
@@ -60,9 +60,9 @@
code => sub {
my ($param) = @_;
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
- my @sids = PVE::Storage::storage_ids ($cfg);
+ my @sids = PVE::Storage::storage_ids($cfg);
my $res = [];
foreach my $storeid (@sids) {
@@ -89,7 +89,7 @@
code => sub {
my ($param) = @_;
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
return &$api_storage_config($cfg, $param->{storage});
}});
@@ -169,7 +169,7 @@
PVE::Storage::lock_storage_config(
sub {
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
if (my $scfg = PVE::Storage::storage_config ($cfg, $storeid, 1)) {
die "storage ID '$storeid' already defined\n";
@@ -196,7 +196,7 @@
PVE::Storage::activate_storage ($cfg, $storeid) if !$opts->{disable};
- write_file('storagecfg', $cfg);
+ cfs_write_file('storage.cfg', $cfg);
}, "create storage failed");
@@ -251,7 +251,7 @@
PVE::Storage::lock_storage_config(
sub {
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
PVE::Storage::assert_if_modified ($cfg, $digest);
@@ -272,7 +272,7 @@
}
}
- write_file('storagecfg', $cfg);
+ cfs_write_file('storage.cfg', $cfg);
}, "update storage failed");
@@ -301,7 +301,7 @@
PVE::Storage::lock_storage_config(
sub {
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
die "can't remove storage - storage is used as base of another storage\n"
if PVE::Storage::storage_is_used ($cfg, $storeid);
@@ -310,7 +310,7 @@
delete ($cfg->{ids}->{$storeid});
- write_file('storagecfg', $cfg);
+ cfs_write_file('storage.cfg', $cfg);
}, "delete storage failed");
Modified: pve-storage/pve2/PVE/API2/Storage/Content.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Content.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/API2/Storage/Content.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -4,7 +4,7 @@
use warnings;
use PVE::SafeSyslog;
-use PVE::INotify qw(read_file);;
+use PVE::Cluster qw(cfs_read_file);
use PVE::Storage;
use PVE::Exception qw(raise_param_exc);
use PVE::RPCEnvironment;
@@ -60,7 +60,7 @@
# fixme: verify $node
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
my $scfg = PVE::Storage::storage_config ($cfg, $storeid);
@@ -158,7 +158,7 @@
$param->{format} = $fmt;
}
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
my $volid = PVE::Storage::vdisk_alloc ($cfg, $storeid, $param->{vmid},
$param->{format},
@@ -218,7 +218,7 @@
my $volid = &$real_volume_id($param->{storage}, $param->{volume});
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
my $path = PVE::Storage::path($cfg, $volid);
my ($size, $format, $used) = PVE::Storage::file_size_info ($path);
@@ -256,7 +256,7 @@
my $volid = &$real_volume_id($param->{storage}, $param->{volume});
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
PVE::Storage::vdisk_free ($cfg, $volid);
@@ -303,7 +303,7 @@
eval { PVE::Storage::parse_volume_id ($param->{source}); };
raise_param_exc({ source => $@}) if $@;
- my $cfg = read_file('storagecfg');
+ my $cfg = cfs_read_file('storage.cfg');
# fixme: execute in background
print "COPY $param->{source} from node $param->{sourceNode} to $volid\n";
@@ -318,7 +318,7 @@
use warnings;
use PVE::SafeSyslog;
-use PVE::INotify qw(read_file);;
+use PVE::Cluster qw(cfs_read_file);
use PVE::Storage;
use PVE::JSONSchema qw(get_standard_option);
@@ -358,7 +358,7 @@
code => sub {
my ($param) = @_;
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
my $node = $param->{node};
Modified: pve-storage/pve2/PVE/API2/Storage/Scan.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Scan.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/API2/Storage/Scan.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -4,7 +4,6 @@
use warnings;
use PVE::SafeSyslog;
-use PVE::INotify qw(read_file);;
use PVE::Storage;
use HTTP::Status qw(:constants);
use PVE::JSONSchema qw(get_standard_option);
Modified: pve-storage/pve2/PVE/API2/Storage/Status.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage/Status.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/API2/Storage/Status.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -3,7 +3,7 @@
use strict;
use warnings;
-use PVE::INotify qw(read_file write_file);;
+use PVE::Cluster qw(cfs_read_file);
use PVE::Storage;
use PVE::RESTHandler;
use PVE::RPCEnvironment;
@@ -43,7 +43,7 @@
# fixme: verify $node
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
# fixme: connect to correct node
@@ -76,7 +76,7 @@
# fixme: verify $node
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file("storage.cfg");
# fixme: connect to correct node
Modified: pve-storage/pve2/PVE/API2/Storage.pm
===================================================================
--- pve-storage/pve2/PVE/API2/Storage.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/API2/Storage.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -5,7 +5,7 @@
use PVE::SafeSyslog;
use PVE::JSONSchema qw(get_standard_option);
-use PVE::INotify qw(read_file write_file);;
+use PVE::Cluster qw(cfs_read_file cfs_write_file);
use PVE::Storage;
use HTTP::Status qw(:constants);
use Storable qw(dclone);
@@ -100,7 +100,7 @@
my $nodes = PVE::Cluster::get_nodelist();
- my $cfg = read_file ("storagecfg");
+ my $cfg = cfs_read_file ("storage.cfg");
my @sids = PVE::Storage::storage_ids ($cfg);
Modified: pve-storage/pve2/PVE/Storage.pm
===================================================================
--- pve-storage/pve2/PVE/Storage.pm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/PVE/Storage.pm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -15,8 +15,8 @@
use Getopt::Long qw(GetOptionsFromArray);
use Socket;
use Digest::SHA1;
-use PVE::Tools qw(run_command lock_file safe_print file_read_firstline trim);
-use PVE::INotify qw(register_file read_file write_file);
+use PVE::Tools qw(run_command file_read_firstline trim);
+use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_write_file cfs_lock_file);
use PVE::Exception qw(raise_param_exc);
use PVE::JSONSchema;
@@ -25,122 +25,11 @@
$ISCSIADM = undef if ! -X $ISCSIADM;
-my $storageconfig = "/etc/pve/storage.cfg";
+# fixme: always_call_parser => 1 ??
+cfs_register_file ('storage.cfg',
+ \&parse_config,
+ \&write_config);
-my $lockfile = "/etc/pve/.lock-storage.cfg";
-
-# we need the cluster configuration for locking operations
-
-register_file ('clustercfg', "/etc/pve/cluster.cfg",
- \&read_cluster_config);
-
-register_file ('storagecfg', "/etc/pve/storage.cfg",
- \&parse_config, \&write_config, undef,
- always_call_parser => 1);
-
-sub read_cluster_config {
- my ($filename, $fh) = @_;
-
- my $line;
-
- my $cinfo;
-
- $cinfo->{nodes} = [];
-
- my $maxcid = 0;
- my $level = 0;
-
- while (defined ($line = <$fh>)) {
- chomp $line;
-
- next if $line =~ m/^\s*$/; # skip empty lines
-
- if ($line =~ m/^maxcid\s+(\d+)\s*$/i) {
- $maxcid = $1 > $maxcid ? $1 : $maxcid;
- next;
- }
-
- if ($line =~ m/^(master|node)\s+(\d+)\s+\{\s*$/i) {
- $level++;
- my ($t, $cid) = (lc $1, $2);
-
- $maxcid = $cid > $maxcid ? $cid : $maxcid;
-
- my $res = {
- role => $t eq 'master' ? 'M' : 'N',
- cid => $cid
- };
-
- while (defined ($line = <$fh>)) {
- chomp $line;
- next if $line =~ m/^\s*$/; # skip empty lines
- if ($line =~ m/^\}\s*$/) {
- $level--;
- last;
- }
-
- if ($line =~ m/^\s*(\S+)\s*:\s*(\S+)\s*$/) {
- my ($n, $v) = (lc $1, $2);
-
- # fixme: do syntax checks
- if ($n eq 'ip') {
- $res->{$n} = $v;
- } elsif ($n eq 'name') {
- $res->{$n} = $v;
- } elsif ($n eq 'hostrsapubkey') {
- $res->{$n} = $v;
- } elsif ($n eq 'rootrsapubkey') {
- $res->{$n} = $v;
- } else {
- die "syntax error in configuration file\n";
- }
- } else {
- die "syntax error in configuration file\n";
- }
- }
-
- die "missing ip address for node '$cid'\n" if !$res->{ip};
- die "missing name for node '$cid'\n" if !$res->{name};
- die "missing host RSA key for node '$cid'\n" if !$res->{hostrsapubkey};
- die "missing user RSA key for node '$cid'\n" if !$res->{rootrsapubkey};
-
- push @{$cinfo->{nodes}}, $res;
-
- if ($res->{role} eq 'M') {
- $cinfo->{master} = $res;
- }
- } else {
- die "syntax error in configuration file\n";
- }
- }
-
- die "syntax error in configuration file\n" if $level;
-
- $cinfo->{maxcid} = $maxcid;
-
- foreach my $ni (@{$cinfo->{nodes}}) {
- $cinfo->{"CID_$ni->{cid}"} = $ni;
- }
-
- my $hostname = read_file('hostname');
-
- $cinfo->{local} = {
- role => '-',
- cid => 0,
- ip => '127.0.0.1',
- name => $hostname,
- };
-
- foreach my $ni (@{$cinfo->{nodes}}) {
- if ($ni->{name} eq $hostname) {
- $cinfo->{local} = $ni;
- last;
- }
- }
-
- return $cinfo;
-}
-
# generic utility function
sub check_iscsi_support {
@@ -254,7 +143,7 @@
my $parent = ( caller(1) )[3];
- lock_file($lockfile, 60, $parent, $code);
+ cfs_lock_file("storage.cfg", 60, $parent, $code);
my $err = $@;
if ($err) {
$errmsg ? die "$errmsg: $err" : die $err;
@@ -516,20 +405,20 @@
}
sub parse_config {
- my ($filename, $fh) = @_;
+ my ($filename, $raw) = @_;
my $ids = {};
my $sha1 = Digest::SHA1->new;
- # returns defaults if !$fh;
-
my $pri = 0;
- while ($fh && defined (my $line = <$fh>)) {
- $sha1->add ($line); # compute digest
- chomp $line;
+ $raw = "" if !defined($raw);
+ while ($raw =~ s/^(.*)\n//) {
+ my $line = $1;
+ $sha1->add ($line); # compute digest
+
next if $line =~ m/^\#/;
next if $line =~ m/^\s*$/;
@@ -549,7 +438,9 @@
$ids->{$storeid}->{priority} = $pri++;
}
- while (defined ($line = <$fh>)) {
+ while ($raw =~ s/^(.*)\n//) {
+ $line = $1;
+
next if $line =~ m/^\#/;
last if $line =~ m/^\s*$/;
@@ -674,154 +565,13 @@
return $settings;
}
-sub fork_command_pipe {
- my ($cmd) = @_;
-
- my $reader = IO::File->new();
- my $writer = IO::File->new();
-
- my $orig_pid = $$;
-
- my $cpid;
-
- eval { $cpid = open2 ($reader, $writer, @$cmd); };
-
- my $err = $@;
-
- # catch exec errors
- if ($orig_pid != $$) {
- logmsg ('err', "can't fork command pipe\n");
- POSIX::_exit (1);
- kill ('KILL', $$);
- }
-
- die $err if $err;
-
- return { writer => $writer, reader => $reader, pid => $cpid };
-}
-
-sub finish_command_pipe {
- my $cmdpipe = shift;
-
- my $writer = $cmdpipe->{writer};
- my $reader = $cmdpipe->{reader};
-
- $writer->close();
- $reader->close();
-
- my $cpid = $cmdpipe->{pid};
-
- kill (15, $cpid) if kill (0, $cpid);
-
- waitpid $cpid, 0;
-}
-
-sub run_with_timeout {
- my ($timeout, $code, @param) = @_;
-
- die "got timeout\n" if $timeout <= 0;
-
- my $prev_alarm;
-
- my $sigcount = 0;
-
- my $res;
-
- eval {
- local $SIG{ALRM} = sub { $sigcount++; die "got timeout\n"; };
- local $SIG{PIPE} = sub { $sigcount++; die "broken pipe\n" };
- local $SIG{__DIE__}; # see SA bug 4631
-
- $prev_alarm = alarm ($timeout);
-
- $res = &$code (@param);
-
- alarm 0; # avoid race conditions
- };
-
- my $err = $@;
-
- alarm ($prev_alarm) if defined ($prev_alarm);
-
- die "unknown error" if $sigcount && !$err; # seems to happen sometimes
-
- die $err if $err;
-
- return $res;
-}
-
sub cluster_lock_storage {
my ($storeid, $shared, $timeout, $func, @param) = @_;
- my $ccfg = read_file('clustercfg');
+ die "cluster lock not implemented";
- my $masterip = $ccfg && $ccfg->{master} ? $ccfg->{master}->{ip} : undef;
-
- if (!$shared || !$masterip) {
- return &$func (@param);
- }
-
- $timeout = 60 if !$timeout;
-
- my $cmdpipe;
- my $got_lock;
-
- my $ret_value;
-
- eval {
-
- my $cmd;
-
- if ($masterip eq $ccfg->{local}->{ip}) {
- $cmd = ['/usr/sbin/pvesm', 'lock', $storeid, $timeout];
- } else {
- $cmd = ['/usr/bin/ssh', '-o', 'BatchMode=yes', $masterip,
- '/usr/sbin/pvesm', 'lock', $storeid, $timeout];
- }
-
- $cmdpipe = fork_command_pipe ($cmd);
-
- my $helo;
- my $reader = $cmdpipe->{reader};
-
- eval { run_with_timeout ($timeout + 5, sub { $helo = <$reader>; }); };
- die "can't lock storage '$storeid' - $@" if $@;
- die "can't lock storage '$storeid' - no reply\n" if !$helo;
- if ($helo !~ m/^lock $storeid: (.*)$/) {
- die "got strange reply from lock ('$helo')\n";
- }
- my $res = $1;
- die "can't aquire lock - $res\n" if $res ne 'success';
-
- $got_lock = 1;
-
- $ret_value = &$func (@param);
-
- };
- my $err = $@;
-
- if ($cmdpipe) {
-
- if ($got_lock) {
- my $writer = $cmdpipe->{writer};
-
- eval {
- run_with_timeout (60, sub {
- print $writer "release\n";
- $writer->flush();
- });
- };
- warn $@ if $@;
- }
- finish_command_pipe ($cmdpipe);
- }
-
- die $err if $err;
-
- return $ret_value;
}
-
sub storage_config {
my ($cfg, $storeid, $noerr) = @_;
@@ -882,8 +632,10 @@
}
sub write_config {
- my ($filename, $fh, $cfg) = @_;
+ my ($filename, $cfg) = @_;
+ my $out = '';
+
my $ids = $cfg->{ids};
my $maxpri = 0;
@@ -924,8 +676,10 @@
}
}
- safe_print($filename, $fh, "$data\n");
+ $out .= "$data\n";
}
+
+ return $out;
}
sub get_image_dir {
Modified: pve-storage/pve2/pvesm
===================================================================
--- pve-storage/pve2/pvesm 2011-01-25 09:16:46 UTC (rev 5436)
+++ pve-storage/pve2/pvesm 2011-01-25 10:18:38 UTC (rev 5437)
@@ -5,7 +5,9 @@
use Fcntl ':flock';
use File::Path;
-use PVE::INotify qw(read_file);
+use PVE::SafeSyslog;
+use PVE::Cluster;
+use PVE::INotify;
use PVE::RPCEnvironment;
use PVE::Storage;
use PVE::API2::Storage::Config;
@@ -20,9 +22,12 @@
$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
+initlog ('pvesm', 'daemon');
+
die "please run as root\n" if $> != 0;
PVE::INotify::inotify_init();
+PVE::Cluster::cfs_update();
my $rpcenv = PVE::RPCEnvironment->init('cli');
@@ -49,7 +54,7 @@
code => sub {
my ($param) = @_;
- my $cfg = read_file('storagecfg');
+ my $cfg = PVE::Cluster::cfs_read_file('storage.cfg');
my $path = PVE::Storage::path ($cfg, $param->{volume});
@@ -189,25 +194,25 @@
}
};
-my $hostname = read_file('hostname');
+my $nodename = PVE::INotify::nodename();
my $cmddef = {
add => [ "PVE::API2::Storage::Config", 'create', ['storage'] ],
set => [ "PVE::API2::Storage::Config", 'update', ['storage'] ],
remove => [ "PVE::API2::Storage::Config", 'delete', ['storage'] ],
status => [ "PVE::API2::Storage::Status", 'index', [],
- { node => $hostname }, $print_status ],
+ { node => $nodename }, $print_status ],
list => [ "PVE::API2::Storage::Content", 'index', ['storage'],
- { node => $hostname }, $print_content ],
+ { node => $nodename }, $print_content ],
alloc => [ "PVE::API2::Storage::Content", 'create', ['storage', 'vmid', 'filename', 'size'],
- { node => $hostname }, sub {
+ { node => $nodename }, sub {
my $volid = shift;
print "sucessfuly created '$volid'\n";
}],
free => [ "PVE::API2::Storage::Content", 'delete', ['volume'],
- { node => $hostname } ],
+ { node => $nodename } ],
scan => [ "PVE::API2::Storage::Scan", 'scan', ['method', 'server'],
- { node => $hostname }, sub {
+ { node => $nodename }, sub {
my $res = shift;
my $maxlen = 0;
More information about the pve-devel
mailing list