marsadm: obey .deleted in all globs

This commit is contained in:
Thomas Schoebel-Theuer 2020-03-01 16:38:58 +01:00
parent 96561ba0d3
commit 6ce4cfa723

View File

@ -108,6 +108,22 @@ sub lwarn {
##################################################################
# basic helpers
sub lamport_glob {
my $expr = shift;
my @result =();
my @raw_glob = glob($expr);
foreach my $path (@raw_glob) {
my $val = readlink($path);
next if (defined($val) && $val eq ".deleted");
push @result, $path;
}
return @result;
}
##################################################################
# global variables
my $Id = '$Id$ ';
@ -242,7 +258,7 @@ sub _try_exec {
sub _try_exec_dir {
my ($subdir, $cmd, $args, $abort) = @_;
return unless -d $subdir;
foreach my $sub_path (glob("$subdir/*")) {
foreach my $sub_path (lamport_glob("$subdir/*")) {
next if $sub_path =~ m:~$:;
_try_exec($sub_path, $cmd, $args, $abort);
}
@ -287,10 +303,10 @@ my %all_resources;
my %member_resources;
sub _scan_resources {
foreach my $res (glob("$mars/resource-*/{data,replay,systemd}-*")) {
foreach my $res (lamport_glob("$mars/resource-*/{data,replay,systemd}-*")) {
next unless $res =~ s:^$mars/resource-(.*?)/.*:$1:;
$all_resources{$res} = 1;
if (glob("$mars/resource-$res/{data,replay,systemd}-$host")) {
if (lamport_glob("$mars/resource-$res/{data,replay,systemd}-$host")) {
$member_resources{$res} = 1;
}
}
@ -434,7 +450,7 @@ sub get_template_files {
my $subdir = "$dir/$systemd_subdir";
$subdir = $dir unless -d $subdir;
next unless -d $subdir;
foreach my $template_file (glob("$subdir/*.{$systemd_suffixes}")) {
foreach my $template_file (lamport_glob("$subdir/*.{$systemd_suffixes}")) {
my $template_name = `basename '$template_file'`;
chomp $template_name;
next unless $template_name;
@ -453,7 +469,7 @@ sub get_instance_files {
my ($dir) = @_;
my $glob = "$dir/*.{$systemd_suffixes}";
my %instance_files;
foreach my $instance_file (glob($glob)) {
foreach my $instance_file (lamport_glob($glob)) {
my $instance_name = `basename '$instance_file'`;
chomp $instance_name;
$instance_files{$instance_name} = $instance_file;
@ -466,7 +482,7 @@ my %systemd_files;
sub get_systemd_files {
if (!%systemd_names) {
foreach my $systemd_file (glob("{$systemd_system_dirs}/*.{$systemd_suffixes}")) {
foreach my $systemd_file (lamport_glob("{$systemd_system_dirs}/*.{$systemd_suffixes}")) {
next if $systemd_file =~ m:$systemd_target_dir:;
my $systemd_name = `basename '$systemd_file'`;
chomp $systemd_name;
@ -691,7 +707,7 @@ sub set_systemd_want {
}
}
my $unit_glob = "$mars/resource-$res/systemd-*-unit";
unless (glob($unit_glob)) {
unless (lamport_glob($unit_glob)) {
lwarn "Resource '$res' has no configured systemd units.\n";
lwarn "First configure the resource with marsadm set-systemd-unit.\n";
ldie "Refusing to set systemd-want.\n" unless $force;
@ -705,7 +721,7 @@ sub set_systemd_want {
sub systemd_present {
my ($cmd, $res) = @_;
my $unit_glob = "$mars/resource-$res/systemd-*-unit";
return "" unless glob($unit_glob);
return "" unless lamport_glob($unit_glob);
my $want_path = "$mars/resource-$res/systemd-want";
my $want = get_link($want_path, 2);
return $want;
@ -892,7 +908,7 @@ sub __systemd_generate_all {
my @res_list = get_member_resources();
# Create initial systemd units
foreach my $res (@res_list) {
foreach my $unit_link (glob("$mars/resource-$res/systemd-*-unit")) {
foreach my $unit_link (lamport_glob("$mars/resource-$res/systemd-*-unit")) {
my $target = get_link($unit_link);
$count += make_systemd_unit($cmd, $res, $target);
}
@ -935,7 +951,7 @@ sub __systemd_commit_ops {
}
systemctl("daemon-reload");
# Activate all *.path triggers
for my $unit_path (glob("$systemd_target_dir/*mars*.path")) {
for my $unit_path (lamport_glob("$systemd_target_dir/*mars*.path")) {
my $unit = `basename "$unit_path"`;
chomp $unit;
lprint "==== Activate path watcher '$unit'\n"if $verbose;
@ -974,13 +990,13 @@ sub __systemd_fingerprint {
foreach my $res (@res_list) {
$text .= "$res\n";
my $unit_glob = "$mars/resource-$res/systemd-*-unit";
foreach my $unit_link (glob($unit_glob)) {
foreach my $unit_link (lamport_glob($unit_glob)) {
$text .= get_link($unit_link, 1) . "\n";
}
}
# Fingerprint resulting templates (protect against external modifications)
$text .= "#\n";
foreach my $unit_file (glob($systemd_target_dir)) {
foreach my $unit_file (lamport_glob($systemd_target_dir)) {
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks) = stat($unit_file);
$text .= "$size,$mtime,$unit_file\n";
@ -1270,13 +1286,13 @@ sub get_alive_links {
my $non_participating = shift || 0;
$res = "*" if $res eq "all";
my %cand;
foreach my $path (glob("$mars/ips/ip-$hosts")) {
foreach my $path (lamport_glob("$mars/ips/ip-$hosts")) {
$path =~ m:/ip-(.*):;
my $peer = $1;
$cand{$peer} = 1;
}
my %peers;
foreach my $path (glob("$mars/resource-$res/data-*")) {
foreach my $path (lamport_glob("$mars/resource-$res/data-*")) {
$path =~ m:/data-(.*):;
my $peer = $1;
next unless $peer;
@ -1287,7 +1303,7 @@ sub get_alive_links {
next unless $cand{$peer};
# peer must be participating in the same resources
if (!$non_participating) {
my @other = glob("$mars/resource-$res/data-$peer");
my @other = lamport_glob("$mars/resource-$res/data-$peer");
next unless @other;
# I must be participating in some of the _same_ resources
my $common = 0;
@ -1310,7 +1326,7 @@ sub get_alive_links {
$glob = "$mars/$alive-{" . join(',', keys(%peers)) . "}";
}
my %links;
foreach my $path (glob($glob)) {
foreach my $path (lamport_glob($glob)) {
$path =~ m:/$alive-(.+):;
my $peer = $1;
$links{$peer} = get_link($path, 1);
@ -1564,7 +1580,7 @@ sub check_res {
# DO WHAT I MEAN: try to substitute a device name for a badly given resource name if it is unique
my $count = 0;
my $found;
my @tests = glob("$mars/resource-*/device-$host");
my @tests = lamport_glob("$mars/resource-*/device-$host");
foreach my $test (@tests) {
my $target = get_link($test, 2);
if ($target eq $res) {
@ -1573,7 +1589,7 @@ sub check_res {
}
}
if (!$count) {
@tests = glob("$mars/resource-*/_direct-*-$host");
@tests = lamport_glob("$mars/resource-*/_direct-*-$host");
foreach my $test (@tests) {
my $target = get_link($test, 2);
$target =~ s/^.*,//;
@ -1887,7 +1903,7 @@ sub _get_minmax {
my ($res, $glob, $take_symlink) = @_;
my $min = -1;
my $max = -1;
my @paths = glob($glob) or lwarn "cannot find '$glob'\n";
my @paths = lamport_glob($glob) or lwarn "cannot find '$glob'\n";
foreach my $path (@paths) {
my $nr = $path;
if ($take_symlink) {
@ -1977,7 +1993,7 @@ sub get_amount {
$ok = 1;
} else {
my $glob = sprintf("%s/log-%09d-*", $resdir, $logpos);
foreach $file (glob($glob)) {
foreach $file (lamport_glob($glob)) {
my @tstat = stat($file);
if (@tstat && $tstat[7] > $val) {
@stat = @tstat;
@ -1988,7 +2004,7 @@ sub get_amount {
}
if (!$only_files) {
my $glob = sprintf("%s/version-%09d-*", $resdir, $logpos);
foreach $file (glob($glob)) {
foreach $file (lamport_glob($glob)) {
my $vers_link = get_link($file, 1);
if ($vers_link && $vers_link =~ m;,([0-9]+):;) {
my $nval = $1;
@ -2148,7 +2164,7 @@ sub detect_splitbrain {
return $detected_splits{$res} if defined($detected_splits{$res});
my $basedir = "$mars/resource-$res";
my $ok = 1;
my @list = glob("$mars/resource-$res/replay-*");
my @list = lamport_glob("$mars/resource-$res/replay-*");
my @hosts = map { $_ =~ s:.*/replay-::; $_ } @list;
foreach my $host1 (@hosts) {
foreach my $host2 (@hosts) {
@ -2187,7 +2203,7 @@ sub detect_splitbrain {
}
}
if ($ok) { # check for duplicate logfiles
my @logs = glob("$mars/resource-$res/log-*");
my @logs = lamport_glob("$mars/resource-$res/log-*");
my $oldnr = -1;
foreach my $path (sort alphanum_cmp @logs) {
$path =~ m:/log-([0-9]+):;
@ -2274,7 +2290,7 @@ sub log_purge_res {
my %start_logs;
my $start_count = 0;
my $basedir = "$mars/resource-$res";
foreach my $data (glob("$basedir/{data,replay}-*")) {
foreach my $data (lamport_glob("$basedir/{data,replay}-*")) {
$data =~ m:/(data|replay)-(.+):;
my $peer = $2;
my $replay = "$basedir/replay-$peer";
@ -2290,7 +2306,7 @@ sub log_purge_res {
return;
}
my %logs;
foreach my $file (glob("$basedir/version-*")) {
foreach my $file (lamport_glob("$basedir/version-*")) {
$file =~ m:/(version-([0-9]+)-([^,]+)): or ldie "bad path '$file'\n";
my $cand = $1;
my $nr = $2;
@ -2313,7 +2329,7 @@ sub log_purge_res {
lwarn "deleting foreign object from peer '$from' because you said --force\n" if $from ne $host;
_create_delete($file);
}
foreach my $file (glob("$basedir/log-*")) {
foreach my $file (lamport_glob("$basedir/log-*")) {
$file =~ m:/(log-[0-9]+-(.*)): or ldie "bad path '$file'\n";
my $log = $1;
my $from = $2;
@ -2353,7 +2369,7 @@ sub log_purge_res {
sub err_purge_res {
my ($cmd, $res) = @_;
foreach my $leftlink (glob("$mars/{,resource-$res/}actual-$host/msg-err-*")) {
foreach my $leftlink (lamport_glob("$mars/{,resource-$res/}actual-$host/msg-err-*")) {
lprint " deleting '$leftlink'\n" if $verbose;
_create_delete($leftlink);
}
@ -2371,7 +2387,7 @@ sub try_to_avoid_splitbrain {
return 0;
}
# now try to prevent producing a _new_ split brain situation....
my @host_list = glob("$mars/resource-$res/replay-*");
my @host_list = lamport_glob("$mars/resource-$res/replay-*");
return 0 if scalar(@host_list) < 2;
my ($min, $max) = get_minmax_versions($res);
my $vers_glob = sprintf("$mars/resource-$res/version-%09d-*", $max);
@ -2395,7 +2411,7 @@ sub try_to_avoid_splitbrain {
if ($primary eq "(none)") {
# try to determine the old primary when unique
my $glob_logs = sprintf("$mars/resource-$res/log-%09d-*", $max);
my @candidates = glob($glob_logs);
my @candidates = lamport_glob($glob_logs);
if (scalar(@candidates) == 1) {
my $log_path = pop @candidates;
if ($log_path =~ m:/log-[0-9]+-(.+)$:) {
@ -2440,7 +2456,7 @@ sub try_to_avoid_splitbrain {
}
} else {
# old primary is unknown: we have no chance, other than comparing _all_ versions.
my @versions = glob($vers_glob);
my @versions = lamport_glob($vers_glob);
my $first = get_link(shift @versions);
while (@versions) {
my $next = get_link(shift @versions);
@ -2513,7 +2529,7 @@ sub _get_actual_primary {
my $dev = "/dev/mars/$name";
return $real_host if -b $dev;
# The following old code is CONCEPTUALLY WRONG for split-brain situations (see NOTE above)
my @primary_links = glob("$mars/resource-$res/actual-*/is-primary");
my @primary_links = lamport_glob("$mars/resource-$res/actual-*/is-primary");
my $primary;
foreach my $link (@primary_links) {
if (my $val = get_link($link)) {
@ -2552,7 +2568,7 @@ sub _get_designated_primary {
sub get_peers {
my ($res) = @_;
my @list = glob("$mars/resource-$res/data-*");
my @list = lamport_glob("$mars/resource-$res/data-*");
return map { $_ =~ s:$mars/resource-$res/data-::; $_ } @list;
}
@ -2592,7 +2608,7 @@ sub _get_text {
my ($glob, $regex, $do_print, $get_count) = @_;
my $text = "";
my $count = 0;
foreach my $path (glob($glob)) {
foreach my $path (lamport_glob($glob)) {
open(IN, "<", $path) or next;
while (my $line = <IN>) {
# use regex e.g. for fetching only errors and warnings
@ -2730,7 +2746,7 @@ sub _set_replaylink {
sub lowlevel_ls_host_ips {
my ($cmd) = @_;
for my $path (glob("$mars/ips/ip-*")) {
for my $path (lamport_glob("$mars/ips/ip-*")) {
$path =~ m:/ip-(.*):;
my $peer = $1;
my $ip = get_link($path, 1);
@ -2882,7 +2898,7 @@ sub join_cluster {
ldie "Directory $mars is missing\n" unless -d $mars;
ldie "A valid tree signature '$mars/tree-$host' already exists, thus it appears you are already a cluster member! This cannot be overridden, other by using a freshly created /mars/ filesystem.\n" if -l "$mars/tree-$host";
ldie "A cluster UUD '$mars/uuid' already exists, thus it appears you are already a cluster member! This cannot be overridden, other by using a freshly created /mars/ filesystem.\n" if -l "$mars/uuid";
if (glob("$mars/resource-*") or glob("$mars/ips/*")) {
if (lamport_glob("$mars/resource-*") or lamport_glob("$mars/ips/*")) {
ldie "Sorry, some resources already exist!\nThis is dangerous!\nIf you are sure that no resource clash is possible, re-invoke this command with '--force' option\n" unless $force;
}
ldie "mars module is loaded, please unload first\n" if is_module_loaded();
@ -2890,7 +2906,7 @@ sub join_cluster {
rsync_cmd($peer, "--max-size=1 --update $peer:$mars/ $mars/");
# check uniqness of IPs
my %ips = ();
foreach my $other_ip_path (glob("$mars/ips/*")) {
foreach my $other_ip_path (lamport_glob("$mars/ips/*")) {
my $other_ip = get_link($other_ip_path, 1);
my $other_host = $other_ip_path;
$other_host =~ s:.*/ip-::;
@ -2906,8 +2922,8 @@ sub join_cluster {
sub merge_cluster {
my ($cmd, $peer) = @_;
my $uuid = readlink("$mars/uuid");
my @resources = glob("$mars/resource-*");
my @ip_links = glob("$mars/ips/*");
my @resources = lamport_glob("$mars/resource-*");
my @ip_links = lamport_glob("$mars/ips/*");
if ($cmd =~ m/-list/) {
print "UUID: $uuid\n";
print "IPs:\n";
@ -3002,15 +3018,15 @@ sub leave_cluster {
my ($cmd) = @_;
ldie "mars kernel module is not loaded. This is needed for communication with some other hosts!\n" if !is_module_loaded();
my $check = "/mars/resource-*/data-$host";
ldie "I am member of some resources\n" if glob($check) && !$force;
ldie "I am member of some resources\n" if lamport_glob($check) && !$force;
wait_cluster($cmd) unless $force;
foreach my $path (glob("$mars/actual-*/*-$host")) {
foreach my $path (lamport_glob("$mars/actual-*/*-$host")) {
_create_delete($path);
}
_create_delete("$mars/ips/ip-$host");
finish_links();
wait_cluster($cmd) unless $force;
foreach my $path (glob("$mars/actual-*/*-$host")) {
foreach my $path (lamport_glob("$mars/actual-*/*-$host")) {
_create_delete($path);
}
_create_delete("$mars/todo-global/deleted-$host");
@ -3020,10 +3036,10 @@ sub leave_cluster {
sleep_timeout(3, 1);
}
system("rmmod mars") if $host eq $real_host;
foreach my $path (glob("$mars/{,resource-*/}{todo,actual}-*/*-$host")) {
foreach my $path (lamport_glob("$mars/{,resource-*/}{todo,actual}-*/*-$host")) {
unlink($path);
}
foreach my $path (glob("$mars/{,resource-*/}{todo,actual}-$host")) {
foreach my $path (lamport_glob("$mars/{,resource-*/}{todo,actual}-$host")) {
rmdir($path); # at least try it
}
}
@ -3040,7 +3056,7 @@ sub create_res {
if ($create) {
if (-d $resdir) {
lwarn "resource directory '$res' already exists\n";
my @host_list = glob("$resdir/replay-*");
my @host_list = lamport_glob("$resdir/replay-*");
if (@host_list) {
my $h_list = join(',', map({ $_ =~ s:.*/replay-::; $_; } (@host_list)));
lwarn "DANGER: hosts '$h_list' are already member of resource '$res'.\n";
@ -3102,7 +3118,7 @@ sub create_res {
# For safety, try to get the very newest infos.
# Reason: newer kernel modules will fetch non-member resource infos less frequently.
# Therefore we shift some responsibility for non-member -> member transitions to userspace.
my @peers = map { m:^$mars/ips/ip-(.+):; $1 } glob("$mars/ips/ip-*");
my @peers = map { m:^$mars/ips/ip-(.+):; $1 } lamport_glob("$mars/ips/ip-*");
for (my $retry = 0; $retry < 3; $retry++) {
$primary = _get_designated_primary($res, 1);
last if (defined($primary) && $primary);
@ -3158,7 +3174,7 @@ sub create_res {
# check for uniqeness of $appear
if ($appear) {
foreach my $old_dev (glob("$mars/resource-*/device-$host")) {
foreach my $old_dev (lamport_glob("$mars/resource-*/device-$host")) {
$old_dev =~ m:/resource-([^/]+)/:;
next unless defined($1);
my $old_res = $1;
@ -3173,7 +3189,7 @@ sub create_res {
}
}
# warn if devices are named differently throughout the cluster
foreach my $old_dev (glob("$resdir/device-*")) {
foreach my $old_dev (lamport_glob("$resdir/device-*")) {
my $old_name = get_link($old_dev);
if ($old_name ne $appear) {
$old_dev =~ m:/device-(.+)$:;
@ -3194,7 +3210,7 @@ sub create_res {
my $max_retry = 3;
while ($max_retry-- > 0) {
my @remains = ();
foreach my $remain (glob("$resdir/{log,version}-*-$host")) {
foreach my $remain (lamport_glob("$resdir/{log,version}-*-$host")) {
if (!$create) {
$remain =~ m/-([0-9]+)-$host/;
my $nr = $1;
@ -3301,19 +3317,19 @@ sub split_cluster {
my $ips_backup = "$backup_dir/ips-backup";
system("mkdir -p $ips_backup") and ldie "OOps";
system("cp -a $mars/ips/* $ips_backup/");
foreach my $peer (glob("$ips_backup/ip-*")) {
foreach my $peer (lamport_glob("$ips_backup/ip-*")) {
$peer =~ s:^$ips_backup/ip-::;
ssh_cmd($peer, $ssh_probe);
}
lprint "Creating IP backups...\n";
# create ips backup
foreach my $peer (glob("$ips_backup/ip-*")) {
foreach my $peer (lamport_glob("$ips_backup/ip-*")) {
$peer =~ s:^$ips_backup/ip-::;
next if $peer eq $host;
rsync_cmd($peer, "--max-size=1 --update $peer:$mars/ips/ $ips_backup/", 1);
}
system("cp -a $mars/ips/* $ips_backup/");
my @peers = map { $_ =~ s:^$ips_backup/ip-::; $_ } (glob("$ips_backup/ip-*"));
my @peers = map { $_ =~ s:^$ips_backup/ip-::; $_ } (lamport_glob("$ips_backup/ip-*"));
ldie "Empty peer list\n" unless @peers;
foreach my $peer (@peers) {
next if $peer eq $host;
@ -3377,7 +3393,7 @@ sub leave_res_phase0 {
my ($cmd, $res) = @_;
check_not_primary(@_) unless $force;
my $errors = 0;
foreach my $tmp (glob("$mars/resource-$res/todo-$host/*")) {
foreach my $tmp (lamport_glob("$mars/resource-$res/todo-$host/*")) {
next if $tmp =~ m:/delete:;
my $status = get_link($tmp, 2);
if ($status) {
@ -3385,7 +3401,7 @@ sub leave_res_phase0 {
$errors++;
}
}
foreach my $tmp (glob("$mars/resource-$res/actual-$host/{is-,logfile-}*")) {
foreach my $tmp (lamport_glob("$mars/resource-$res/actual-$host/{is-,logfile-}*")) {
my $status = get_link($tmp);
if ($status) {
lwarn "running status '$tmp' is not off\n";
@ -3412,8 +3428,8 @@ sub leave_res_phase1 {
_create_delete($vstatus) if -l $vstatus;
_create_delete("$mars/resource-$res/device-$host");
_create_delete("$mars/resource-$res/actsize-$host");
foreach my $dir (glob("$mars/resource-$res/*-$host/")) {
foreach my $tmp (glob("${dir}*")) {
foreach my $dir (lamport_glob("$mars/resource-$res/*-$host/")) {
foreach my $tmp (lamport_glob("${dir}*")) {
_create_delete($tmp);
}
_create_delete($dir);
@ -3446,7 +3462,7 @@ sub delete_res {
lprint "resource directory '$basedir' does no longer exist.\n";
return;
}
my @host_list = glob("$basedir/replay-*");
my @host_list = lamport_glob("$basedir/replay-*");
my $cnt = scalar(@host_list);
if ($cnt > 0) {
my $h_list = join(',', map({ $_ =~ s:.*/replay-::;} (@host_list)));
@ -3469,7 +3485,7 @@ sub logrotate_res {
unless ($force) {
return if check_primary($cmd, $res, 0, 1);
}
my @paths = glob("$mars/resource-$res/log-*-$host");
my @paths = lamport_glob("$mars/resource-$res/log-*-$host");
my $last;
if (@paths) {
@paths = sort alphanum_cmp @paths;
@ -3510,14 +3526,14 @@ sub _get_deletable_logfiles {
my ($cmd, $res) = @_;
my $min = -1;
my $max = -1;
my @log_paths = glob("$mars/resource-$res/log-*") or ldie "cannot find any logfiles\n";
my @log_paths = lamport_glob("$mars/resource-$res/log-*") or ldie "cannot find any logfiles\n";
foreach my $path (@log_paths) {
$path =~ m/\/log-([0-9]+)-/;
my $nr = $1;
$min = $nr if ($nr < $min || $min < 0);
$max = $nr if ($nr > $max || $max < 0);
}
my @paths = glob("$mars/resource-$res/replay-*") or ldie "cannot find any replay symlinks\n";
my @paths = lamport_glob("$mars/resource-$res/replay-*") or ldie "cannot find any replay symlinks\n";
foreach my $path (@paths) {
my $target = get_link($path);
$target =~ m/^log-([0-9]+)/;
@ -3534,13 +3550,13 @@ sub _get_delete_nr {
return @{$delete_nrs{$basedir}} if defined($delete_nrs{$basedir});
my $min_nr = 0;
my $max_nr = 0;
foreach my $path (glob("$basedir/deleted-*")) {
foreach my $path (lamport_glob("$basedir/deleted-*")) {
my $link = get_link($path, 1);
$link =~ m/0*([0-9]+)/;
$min_nr = $1 if (defined($1) && ($1 < $min_nr || !$min_nr));
$max_nr = $1 if (defined($1) && $1 > $max_nr);
}
my @deletes = glob("$basedir/delete-*");
my @deletes = lamport_glob("$basedir/delete-*");
foreach my $path (@deletes) {
$path =~ m:/delete-0*([0-9]+):;
$max_nr = $1 if (defined($1) && $1 > $max_nr);
@ -3574,7 +3590,7 @@ my %del_targets;
sub _replace_delete {
my ($basedir, $target) = @_;
if (!$del_dirs{$basedir}) {
foreach my $link (glob("$basedir/delete-*")) {
foreach my $link (lamport_glob("$basedir/delete-*")) {
my $targ = readlink($link);
$del_targets{$targ} = $link;
}
@ -3634,13 +3650,13 @@ sub logdelete_res {
my $start_time = mars_time();
# keep internal backups for 1 week
my $keep_backups = 24 * 7;
foreach my $leftlink (glob("$mars/backup*")) {
foreach my $leftlink (lamport_glob("$mars/backup*")) {
my $stamp = get_link_stamp($leftlink);
next unless $stamp + 3600 * $keep_backups < $start_time;
lprint " unlink '$leftlink'\n" if $verbose;
system("rm -rf $leftlink");
}
foreach my $leftlink (glob("$mars/{,resource-$res/}{,*/}{.tmp,.deleted,delete,work}-*")) {
foreach my $leftlink (lamport_glob("$mars/{,resource-$res/}{,*/}{.tmp,.deleted,delete,work}-*")) {
# remove outdated .deleted-* markers
if ($leftlink =~ m:/.deleted-:) {
my $info = get_link($leftlink, 2);
@ -3652,7 +3668,7 @@ sub logdelete_res {
}
# compute the minimum border
my $border = 0;
foreach my $deleted_link (glob($todo_glob)) {
foreach my $deleted_link (lamport_glob($todo_glob)) {
my $limit = get_link($deleted_link, 2);
next if !$limit || $limit <= 1;
$border = $limit if (!$border || $limit < $border);
@ -3668,7 +3684,7 @@ sub logdelete_res {
lprint " unlink '$leftlink'\n" if $verbose;
unlink($leftlink);
}
foreach my $leftlink (glob("$mars/{,resource-$res/}actual-*/msg-*")) {
foreach my $leftlink (lamport_glob("$mars/{,resource-$res/}actual-*/msg-*")) {
if ($leftlink =~ m:/msg-conncetion-from-:) {
lprint " unlink deprecated '$leftlink'\n" if $verbose;
unlink($leftlink);
@ -3679,7 +3695,7 @@ sub logdelete_res {
lprint " unlink '$leftlink'\n" if $verbose;
unlink($leftlink);
}
my @paths = glob("$mars/resource-$res/log-*") or ldie "cannot find any logfiles\n";
my @paths = lamport_glob("$mars/resource-$res/log-*") or ldie "cannot find any logfiles\n";
@paths = sort alphanum_cmp @paths;
my ($min_deletable, $max_deletable) = _get_deletable_logfiles(@_);
lprint "min deletable logfile number: $min_deletable\n" if $verbose;
@ -3704,7 +3720,7 @@ sub logdelete_res {
_create_delete($first);
}
my @versionlinks = glob("$mars/resource-$res/version-*");
my @versionlinks = lamport_glob("$mars/resource-$res/version-*");
# dont remove versionlinks during split-brain as long as possible
if (scalar(@versionlinks) < $max_deletions / 8 &&
!detect_splitbrain($res, 1)) {
@ -3722,12 +3738,12 @@ sub logdelete_res {
# remove outdated split-cluster remains
my %peers;
foreach my $path (glob("$mars/ips/ip-*")) {
foreach my $path (lamport_glob("$mars/ips/ip-*")) {
$path =~ m:/ip-(.*):;
my $peer = $1;
$peers{$peer} = 1;
}
foreach my $leftlink (glob("$mars/{,resource-$res/}todo-*/deleted-*")) {
foreach my $leftlink (lamport_glob("$mars/{,resource-$res/}todo-*/deleted-*")) {
$leftlink =~ m:/deleted-(.*):;
my $peer = $1;
next if $peers{$peer};
@ -3804,7 +3820,7 @@ sub attach_res_phase2 {
sub fetch_global_res {
my ($cmd, $res) = @_;
my $pause = ($cmd =~ m/disconnect|pause/);
my @paths = glob("$mars/resource-$res/todo-*/");
my @paths = lamport_glob("$mars/resource-$res/todo-*/");
for my $path (@paths) {
_switch($cmd, $res, "$path/connect", !$pause);
}
@ -3821,7 +3837,7 @@ sub pause_sync_global_res {
my ($cmd, $res) = @_;
my $pause = ($cmd =~ m/pause/);
check_sync_startable(@_) if !$pause;
my @paths = glob("$mars/resource-$res/todo-*/");
my @paths = lamport_glob("$mars/resource-$res/todo-*/");
for my $path (@paths) {
_switch($cmd, $res, "$path/sync", !$pause);
}
@ -3838,7 +3854,7 @@ sub pause_sync_local_res {
sub pause_replay_global_res {
my ($cmd, $res) = @_;
my $pause = ($cmd =~ m/pause/);
my @paths = glob("$mars/resource-$res/todo-*/");
my @paths = lamport_glob("$mars/resource-$res/todo-*/");
for my $path (@paths) {
_switch($cmd, $res, "$path/replay", !$pause);
}
@ -3955,7 +3971,7 @@ sub primary_phase0 {
lprint "Allowing handover in cases of sync: ignore_sync=$ignore_sync\n" if $ignore_sync;
check_sync_finished($res, $host, $ignore_sync);
# also check that other secondaries won't loose their sync primary
my @names = glob("$mars/resource-$res/data-*");
my @names = lamport_glob("$mars/resource-$res/data-*");
# for k <= 2 replicas, the previous check must have been sufficient
if (scalar(@names) > 2) {
my $allow_anyway = ($force || $ignore_sync);
@ -4168,7 +4184,7 @@ sub wait_umount_res {
my ($cmd, $res) = @_;
while (1) {
my $sum = 0;
foreach my $path (glob("$mars/resource-$res/actual-$host/open-count")) {
foreach my $path (lamport_glob("$mars/resource-$res/actual-$host/open-count")) {
$sum += get_link($path);
}
last if !$sum;
@ -4216,7 +4232,7 @@ sub invalidate_res_phase3 {
set_link("0", $dst);
finish_links(); # opportunity for errors => don't continue
for my $vers_path (glob("$mars/resource-$res/version-*-$host")) {
for my $vers_path (lamport_glob("$mars/resource-$res/version-*-$host")) {
$vers_path =~ m:/version-([0-9]+):;
my $this_nr = $1;
_create_delete($vers_path) if $this_nr >= $replay_nr;
@ -4287,7 +4303,7 @@ my %resize_new_size;
sub get_possible_size {
my ($cmd, $res) = @_;
my @actsizes = glob("$mars/resource-$res/actsize-*");
my @actsizes = lamport_glob("$mars/resource-$res/actsize-*");
lwarn "resource $res has no actsize-* symlinks\n" unless @actsizes;
my $possible_size = 0;
foreach my $actsize (@actsizes) {
@ -4408,7 +4424,7 @@ sub mars_state_cmd {
if ($primary eq "(none)") {
my $min = 0;
foreach my $path (glob("$mars/resource-$res/log-*")) {
foreach my $path (lamport_glob("$mars/resource-$res/log-*")) {
my $nr = $path;
$nr =~ s:^.*[a-z]+-([0-9]+)(-[^/]*)?$:$1:;
if ($nr > $min) {
@ -4444,7 +4460,7 @@ sub show_cmd {
my ($cmd, $res) = @_;
$res = "*" if !$res || $res eq "all";
my $glob = "$mars/{ips/ip-$host,alive-$host,emergency-$host,rest-space-$host,resource-$res/{device,primary,size,actsize-$host,syncstatus-$host,replay-$host,actual-$host/*,todo-$host/*}}";
foreach my $link (glob($glob)) {
foreach my $link (lamport_glob($glob)) {
next unless -l $link;
my $res = get_link($link);
my $short = $link;
@ -4877,7 +4893,7 @@ sub eval_fn {
# list objects
if (/^(count[-_]?)?cluster[-_]?members$/) {
my $do_count = $1;
my @peers = glob("$mars/ips/ip-*");
my @peers = lamport_glob("$mars/ips/ip-*");
return scalar(@peers) if defined($do_count);
my $list = "";
foreach my $peer (sort alphanum_cmp @peers) {
@ -4888,7 +4904,7 @@ sub eval_fn {
}
if (/^(count[-_]?)?resource[-_]?members$/) {
my $do_count = $1;
my @peers = glob($$env{"resdir"} . "/data-*");
my @peers = lamport_glob($$env{"resdir"} . "/data-*");
return scalar(@peers) if defined($do_count);
my $list = "";
foreach my $peer (sort alphanum_cmp @peers) {
@ -4904,7 +4920,7 @@ sub eval_fn {
$peer = parse_macro($arg1, $env);
$peer = $$env{"host"} unless $peer;
}
my @list = glob("$mars/resource-*/data-$peer");
my @list = lamport_glob("$mars/resource-*/data-$peer");
map { s:^$mars/resource-(.*?)/data-.*:$1:; } @list;
my $list = "";
my $old = "";
@ -4964,7 +4980,7 @@ sub eval_fn {
$glob .= "/actual-" . $$env{"host"} . "/msg-$specific*";
my $result = "";
my $count = 0;
foreach my $msg_path (glob($glob)) {
foreach my $msg_path (lamport_glob($glob)) {
my $val = get_link($msg_path, 1);
if ($shorten) {
# skip uninteresting messages
@ -5260,7 +5276,7 @@ sub eval_fn {
if (/^deletable[-_]?size$/) {
my ($min, $max) = _get_deletable_logfiles($_, $$env{"res"});
my $sum = 0;
foreach my $path (glob("$mars/resource-" . $$env{"res"} . "/log-*")) {
foreach my $path (lamport_glob("$mars/resource-" . $$env{"res"} . "/log-*")) {
$path =~ m/\/log-([0-9]+)-/;
my $nr = $1;
next if $nr < $min or $nr >= $max;
@ -5271,7 +5287,7 @@ sub eval_fn {
}
if (/^occupied[-_]?size$/) {
my $sum = 0;
foreach my $path (glob("$mars/resource-" . $$env{"res"} . "/log-*")) {
foreach my $path (lamport_glob("$mars/resource-" . $$env{"res"} . "/log-*")) {
$path =~ m/\/log-([0-9]+)-/;
my @stat = stat($path);
$sum += $stat[7];
@ -5313,7 +5329,7 @@ sub eval_fn {
$arg1 = parse_macro($arg1, $env);
$arg1 = $$env{"host"} unless $arg1;
my $fetch_glob = $$env{"resdir"} . "/version-*-$arg1";
my @paths = sort alphanum_cmp glob($fetch_glob);
my @paths = sort alphanum_cmp lamport_glob($fetch_glob);
return -1 if !@paths;
my $fetch = pop(@paths);
return get_link_stamp($fetch);
@ -5379,7 +5395,7 @@ sub eval_fn {
my $arg2 = shift;
my $varname = parse_macro($arg2, $env);
my $arg3 = shift;
my @list = glob($paths);
my @list = lamport_glob($paths);
my $result = "";
if ($op eq "get") {
my $delim = parse_macro($arg3, $env);
@ -6166,7 +6182,7 @@ foreach my $new_glob (sort alphanum_cmp keys(%trivial_globs)) {
$glob .= "," if $glob;
$glob .= $new_glob;
}
foreach my $name (glob("{$glob}")) {
foreach my $name (lamport_glob("{$glob}")) {
$view_macros{$name} = "\%primitive-$name\{\%\{1}}";
}
@ -7447,7 +7463,7 @@ sub do_all_res {
my $any_success = 0;
my $any_fail = 0;
my $any_member = 0;
my @total_list = glob("$mars/ips/ip-*");
my @total_list = lamport_glob("$mars/ips/ip-*");
my $total_count = scalar(@total_list);
call_hook(!$force, "all-pre", $cmd, "all", @_) if $do_abort;
foreach $res (@res_list) {