diff --git a/bin/pt-summary b/bin/pt-summary index 68662a0c..55f61006 100755 --- a/bin/pt-summary +++ b/bin/pt-summary @@ -792,6 +792,7 @@ setup_commands () { CMD_LSB_RELEASE="$( _which lsb_release 2>/dev/null )" CMD_ETHTOOL="$( _which ethtool 2>/dev/null )" CMD_GETCONF="$( _which getconf 2>/dev/null )" + CMD_FIO_STATUS="$( _which fio-status 2>/dev/null )" } collect_system_data () { local PTFUNCNAME=collect_system_data; @@ -859,12 +860,67 @@ collect_system_data () { local PTFUNCNAME=collect_system_data; fi fi + fio_status_minus_a "$data_dir/fusion-io_card" + for file in $data_dir/*; do [ "$file" = "vmstat" ] && continue [ ! -s "$file" ] && rm "$file" done } +fio_status_minus_a () { + local file="$1" + local full_output="${file}_original_output" + [ -z "$CMD_FIO_STATUS" ] && return; + $CMD_FIO_STATUS -a > "$full_output" + + cat <<'EOP' > "$PT_TMPDIR/fio_status_format.pl" + my $tmp_adapter; + while (<>) { + if ( /Fusion-io driver version:\s*(.+)/ ) { + print "driver_version $1" + } + next unless /^Adapter:(.+)/; + $tmp_adapter = $1; + last; + } + + $/ = "\nAdapter: "; + $_ = $tmp_adapter . "\n" . scalar(<>); + my @adapters; + do { + my ($adapter, $adapter_general) = /\s*(.+)\s*\n\s*(.+)/m; + $adapter =~ tr/ /:/; + $adapter .= "::" . scalar(@adapters); # To differentiate two adapters with the same name + push @adapters, $adapter; + my ($connected_modules) = /Connected ioDimm modules?:\s*\n(.+?\n)\n/smg; + my @connected_modules = $connected_modules =~ /\s+([^:]+):.+\n/g; + + print "${adapter}_general $adapter_general"; + print "${adapter}_modules @connected_modules"; + + for my $module (@connected_modules) { + my ($attached, $general, $firmware, $media_status) = / + ^ \s* $module \s+ (Attached[^\n]+) \n + \s+ ([^\n]+) \n # All the second line + .+? (Firmware\s+[^\n]+) \n + .+? (Media \s+ status:[^\n]+) + /xsm; + print "${adapter}_${module}_attached_as $attached"; + print "${adapter}_${module}_general $general"; + print "${adapter}_${module}_firmware $firmware"; + print "${adapter}_${module}_media_status $media_status"; + } + } while <>; + + print "adapters @adapters\n"; + + exit; +EOP + + perl -wln "$PT_TMPDIR/fio_status_format.pl" "$full_output" > "$file" +} + linux_exclusive_collection () { local PTFUNCNAME=linux_exclusive_collection; local data_dir="$1" @@ -1997,6 +2053,28 @@ parse_uptime () { ' "$file" } +report_fio_minus_a () { + local file="$1" + + name_val "fio Driver" "$(get_var driver_version "$file")" + + local adapters="$( get_var "adapters" "$file" )" + for adapter in $( echo $adapters | awk '{for (i=1; i<=NF; i++) print $i;}' ); do + name_val "$(echo "$adapter" | sed 's/:/ /' | sed 's/::[0-9]*$//')" "$(get_var "${adapter}_general" "$file")" + + local modules="$(get_var "${adapter}_modules" "$file")" + for module in $( echo $modules | awk '{for (i=1; i<=NF; i++) print $i;}' ); do + local name_val_len_orig=$NAME_VAL_LEN; + local NAME_VAL_LEN=16 + name_val "$module" "$(get_var "${adapter}_${module}_attached_as" "$file")" + name_val "" "$(get_var "${adapter}_${module}_general" "$file")" + name_val "" "$(get_var "${adapter}_${module}_firmware" "$file")" + name_val "" "$(get_var "${adapter}_${module}_media_status" "$file")" + local NAME_VAL_LEN=$name_val_len_orig; + done + done +} + report_system_summary () { local PTFUNCNAME=report_system_summary; local data_dir="$1" @@ -2040,6 +2118,11 @@ report_system_summary () { local PTFUNCNAME=report_system_summary; section_Memory "$platform" "$data_dir" + if [ -s "$data_dir/fusion-io_card" ]; then + section "Fusion-io Card" + report_fio_minus_a "$data_dir/fusion-io_card" + fi + if [ -s "$data_dir/mounted_fs" ]; then section "Mounted Filesystems" parse_filesystems "$data_dir/mounted_fs" "${platform}"