.I "-a, --all"
Print labels for local and foreign devices.
.TP
+.I "-F, --filesys NAME"
+Print labels for file system NAME.
+.TP
.I "-s, --sanity"
Sanity check config on this node.
If any expected local or foreign devices are not present, print an error.
.TP
.I "CMD [ARGS...]"
Run one instance of \fICMD [ARGS]\fR for each label in parallel.
-Only the local labels are used by default, but foreign or all labels
-may be selected by adding the \fI--foreign\fR or \fI--all\fR options.
+Only the local labels are used by default, but foreign, all, or file system
+labels may be selected by adding the \fI--foreign\fR, \fI--all\fR, or
+\fI--filesys\fR options.
The following substitutions are made:
%f=fsname, %d=device, %j=journal, %i=index, %I=hex-index, %t=type, %l=label,
%n=nid, %N=failnid, %m=mgsnid. On failure of any child processes, \fBldev\fR will
-l, --local Print labels for local devices.
-f, --foreign Print labels for foreign devices.
-a, --all Print labels for local and foreign devices.
+ -F, --filesys NAME Print labels for file system NAME.
-s, --sanity Sanity check config on this node.
-d, --device LABEL Print storage device of LABEL.
-j, --journal LABEL Print journal device of LABEL if it exists.
CMD [ARGS] ... Run CMD in parallel for each device substituting:
%f=fsname %d=device %i=dec-index %n=main-nid %l=label
%t=srvtype %j=journal %I=hex-index %N=fail-nid %m=mgs-nid
- May be used in combination with -l, -f, -a options.
+ May be used in combination with -l, -f, -a, -F options.
EOF
my %eparse = (
query_raidtab () if $conf{raidtab};
query_type () if $conf{type};
query_zpool () if $conf{zpool};
+query_filesys () if $conf{fsname};
exit(0);
$conf{sanity} = 0;
$conf{execcmd} = "";
$conf{journal} = "";
+ $conf{fsname} = "";
my $rc = GetOptions (
"help|h!" => \$help,
"raidtab|r=s" => \$conf{raidtab},
"type|t=s" => \$conf{type},
"zpool|z=s" => \$conf{zpool},
+ "filesys|F=s" => \$conf{fsname},
);
usage() if $help || !$rc;
log_fatal ("cannot read config file\n") if (! -r $conf{config});
+ my $filters = 0;
+ $filters++ if ($conf{local});
+ $filters++ if ($conf{foreign});
+ $filters++ if ($conf{all});
+ $filters++ if ($conf{fsname});
+ log_fatal ("Only one of -l, -f, -a, or -F may be used.\n") if ($filters > 1);
+
if (@ARGV) {
$conf{execcmd} = " " . join " ", @ARGV;
}
my %label2hostname = ();
my @local_labels = ();
my @foreign_labels = ();
+ my @fs_labels = ();
open (CONF, "< $conf{config}") or log_fatal ("$conf{config}: $!\n");
} elsif ($foreign eq $conf{hostname}) {
push @foreign_labels, $label;
}
+
+ if ($conf{fsname} and $filesys eq $conf{fsname}) {
+ push @fs_labels, $label;
+ }
}
close CONF;
@{$conf{local_labels}} = @local_labels;
@{$conf{foreign_labels}} = @foreign_labels;
+ @{$conf{fs_labels}} = @fs_labels;
%{$conf{l2f}} = %l2f;
%{$conf{label2dev}} = %label2dev;
%{$conf{label2local}} = %label2local;
map { print "$_\n"; } @{$conf{foreign_labels}};
}
+sub query_filesys
+{
+ map { print "$_\n"; } @{$conf{fs_labels}};
+}
+
sub query_all
{
query_local ();
$failnid = $host2nid{$l2f{$conf{hostname}}};
}
- if ($conf{foreign} and !$conf{local} and !$conf{all}) {
+ if ($conf{foreign}) {
@labels = @{$conf{foreign_labels}};
- } elsif (!$conf{foreign} and !$conf{all}) {
- @labels = @{$conf{local_labels}};
- } else {
+ } elsif ($conf{all}) {
@labels = (@{$conf{local_labels}}, @{$conf{foreign_labels}});
+ } elsif ($conf{fsname}) {
+ @labels = (@labels, @{$conf{fs_labels}});
+ } else {
+ @labels = @{$conf{local_labels}};
}
+
foreach (@labels) {
/(\w+)-(OST|MDT|MGT|MGS)([0-9a-fA-F]{4})/;
printf "%s\t-\t%s-MGS0000\t%s\n" \
$mgs_HOST \
$FSNAME \
- $(mgsdevname) >> $ldevconfpath
+ $(mgsdevname) > $ldevconfpath
local mdsfo_host=$mdsfailover_HOST;
if [ -z "$mdsfo_host" ]; then
$num \
$(ostdevname $num) >> $ldevconfpath
done
+
+ echo "----- $ldevconfpath -----"
+ cat $ldevconfpath
+ echo "--- END $ldevconfpath ---"
+
}
generate_nids() {
# looks like we only have the MGS nid available to us
# so just echo that to a file
local nidspath=$1
- touch $nidspath
- echo -e "${mgs_HOST}\t${MGSNID}" >> $nidspath
+ echo -e "${mgs_HOST}\t${MGSNID}" > $nidspath
+
+ echo "----- $nidspath -----"
+ cat $nidspath
+ echo "--- END $nidspath ---"
+}
+
+compare_ldev_output() {
+ ldev_output=$1
+ expected_output=$2
+
+ sort $expected_output -o $expected_output
+ sort $ldev_output -o $ldev_output
+
+ echo "-- START OF LDEV OUTPUT --"
+ cat $ldev_output
+ echo "--- END OF LDEV OUTPUT ---"
+
+ echo "-- START OF EXPECTED OUTPUT --"
+ cat $expected_output
+ echo "--- END OF EXPECTED OUTPUT ---"
+
+ diff $expected_output $ldev_output
+ return $?
}
test_92() {
+ if [ -z "$LDEV" ]; then
+ error "ldev is missing!"
+ fi
+
local LDEVCONFPATH=$TMP/ldev.conf
local NIDSPATH=$TMP/nids
generate_ldev_conf $LDEVCONFPATH
generate_nids $NIDSPATH
- echo "----- ldev.conf -----"
- cat $LDEVCONFPATH
- echo "--- END ldev.conf ---"
-
- echo "----- /etc/nids -----"
- cat $NIDSPATH
- echo "--- END /etc/nids ---"
-
- # ldev can be in our build tree and if we aren't in a
- # build tree, use 'which' to try and find it
- local LDEV=$LUSTRE/scripts/ldev
- [ ! -f "$LDEV" ] && local LDEV=$(which ldev 2> /dev/null)
-
- echo "ldev path is $LDEV"
-
- if [ ! -f "$LDEV" ]; then
- rm $LDEVCONFPATH $NIDSPATH
- error "failed to find ldev!"
- fi
-
# echo the mgs nid and compare it to environment variable MGSNID
# also, ldev.conf and nids is a server side thing, use the OSS
# hostname
local output
- output=$(perl $LDEV -c $LDEVCONFPATH -H \
- $ost_HOST -n $NIDSPATH echo %m)
+ output=$($LDEV -c $LDEVCONFPATH -H $ost_HOST -n $NIDSPATH echo %m)
echo "-- START OF LDEV OUTPUT --"
echo -e "$output"
}
run_test 93 "register mulitple MDT at the same time"
+test_94() {
+ if [ -z "$LDEV" ]; then
+ error "ldev is missing!"
+ fi
+
+ local LDEVCONFPATH=$TMP/ldev.conf
+ local NIDSPATH=$TMP/nids
+
+ generate_ldev_conf $LDEVCONFPATH
+ generate_nids $NIDSPATH
+
+ local LDEV_OUTPUT=$TMP/ldev-output.txt
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -F $FSNAME > $LDEV_OUTPUT
+
+ # ldev failed, error
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH $LDEV_OUTPUT
+ error "ldev failed to execute!"
+ fi
+
+ # expected output
+ local EXPECTED_OUTPUT=$TMP/ldev-expected.txt
+
+ printf "%s-MGS0000\n" $FSNAME > $EXPECTED_OUTPUT
+
+ for num in $(seq $MDSCOUNT); do
+ printf "%s-MDT%04d\n" $FSNAME $num >> $EXPECTED_OUTPUT
+ done
+
+ for num in $(seq $OSTCOUNT); do
+ printf "%s-OST%04d\n" $FSNAME $num >> $EXPECTED_OUTPUT
+ done
+
+ compare_ldev_output $LDEV_OUTPUT $EXPECTED_OUTPUT
+
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH $EXPECTED_OUTPUT $LDEV_OUTPUT
+ error "ldev failed to produce the correct hostlist!"
+ fi
+
+ rm $LDEVCONFPATH $NIDSPATH $EXPECTED_OUTPUT $LDEV_OUTPUT
+}
+run_test 94 "ldev outputs correct labels for file system name query"
+
+test_95() {
+ if [ -z "$LDEV" ]; then
+ error "ldev is missing!"
+ fi
+
+ local LDEVCONFPATH=$TMP/ldev.conf
+ local NIDSPATH=$TMP/nids
+
+ generate_ldev_conf $LDEVCONFPATH
+ generate_nids $NIDSPATH
+
+ # SUCCESS CASES
+ # file sys filter
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -F $FSNAME &>/dev/null
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -F failed!"
+ fi
+
+ # local filter
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -l &>/dev/null
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -l failed!"
+ fi
+
+ # foreign filter
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -f &>/dev/null
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -f failed!"
+ fi
+
+ # all filter
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -a &>/dev/null
+ if [ $? -ne 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -a failed!"
+ fi
+
+ # FAILURE CASES
+ # all & file sys
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -a -F $FSNAME &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -a and -F incorrectly succeeded"
+ fi
+
+ # all & foreign
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -a -f &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -a and -f incorrectly succeeded"
+ fi
+
+ # all & local
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -a -l &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -a and -l incorrectly succeeded"
+ fi
+
+ # foreign & local
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -f -l &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -f and -l incorrectly succeeded"
+ fi
+
+ # file sys & local
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -F $FSNAME -l &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -F and -l incorrectly succeeded"
+ fi
+
+ # file sys & foreign
+ $LDEV -c $LDEVCONFPATH -n $NIDSPATH -F $FSNAME -f &>/dev/null
+ if [ $? -eq 0 ]; then
+ rm $LDEVCONFPATH $NIDSPATH
+ error "ldev label filtering w/ -F and -f incorrectly succeeded"
+ fi
+
+ rm $LDEVCONFPATH $NIDSPATH
+}
+run_test 95 "ldev should only allow one label filter"
+
if ! combined_mgs_mds ; then
stop mgs
fi