"trace!" => \$trace,
"silent!" => \$silent,
"rpctrace!" => \$rpctrace,
+ "lmvtrace!" => \$lmvtrace,
"nodlm!" => \$nodlm,
+ "dlm_ns=s" => \$dlm_ns,
"noclass!" => \$noclass,
- "nonet!" => \$nonet);
-
-print "pid: $pid, nodlm $nodlm nonet $nonet trace $trace\n";
-
-
-$subsys->{UNDEFINED} = 0;
-$subsys->{MDC} = 1;
-$subsys->{MDS} = 2;
-$subsys->{OSC} = 3;
-$subsys->{OST} = 4;
-$subsys->{CLASS} = 5;
-$subsys->{OBDFS} = 6;
-$subsys->{LLITE} = 7;
-$subsys->{RPC} = 8;
-$subsys->{EXT2OBD} = 9;
-$subsys->{PORTALS} = 10;
-$subsys->{SOCKNAL} = 11;
-$subsys->{QSWNAL} = 12;
-$subsys->{PINGER} = 13;
-$subsys->{FILTER} = 14;
-$subsys->{TRACE} = 15; # obdtrace, not to be confused with D_TRACE */
-$subsys->{ECHO} = 16;
-$subsys->{LDLM} = 17;
-$subsys->{LOV} = 18;
-$subsys->{GMNAL} = 19;
-$subsys->{PTLROUTER} = 20;
+ "nonet!" => \$nonet,
+ "extract_start=s" => \$extract_start,
+ "extract_end=s" => \$extract_end);
+
+$subsys->{UNDEFINED} = 1 << 0;
+$subsys->{MDC} = 1 << 1;
+$subsys->{MDS} = 1 << 2;
+$subsys->{OSC} = 1 << 3;
+$subsys->{OST} = 1 << 4;
+$subsys->{CLASS} = 1 << 5;
+$subsys->{LOG} = 1 << 6;
+$subsys->{LLITE} = 1 << 7;
+$subsys->{RPC} = 1 << 8;
+$subsys->{MGMT} = 1 << 9;
+$subsys->{PORTALS} = 1 << 10;
+$subsys->{SOCKNAL} = 1 << 11;
+$subsys->{QSWNAL} = 1 << 12;
+$subsys->{PINGER} = 1 << 13;
+$subsys->{FILTER} = 1 << 14;
+$subsys->{PTLBD} = 1 << 15;
+$subsys->{ECHO} = 1 << 16;
+$subsys->{LDLM} = 1 << 17;
+$subsys->{LOV} = 1 << 18;
+$subsys->{GMNAL} = 1 << 19;
+$subsys->{PTLROUTER} = 1 << 20;
+$subsys->{COBD} = 1 << 21;
+$subsys->{OPENIBNAL} = 1 << 22;
+$subsys->{SM} = 1 << 23;
+$subsys->{ASOBD} = 1 << 24;
+$subsys->{LMV} = 1 << 25;
+$subsys->{CMOBD} = 1 << 26;
$masks->{TRACE} = 1 << 0; # /* ENTRY/EXIT markers */
$masks->{ERROR} = 1 << 17; # /* CERROR} = ...) == CDEBUG} = D_ERROR, ...) */
$masks->{EMERG} = 1 << 18; # /* CEMERG} = ...) == CDEBUG} = D_EMERG, ...) */
$masks->{HA} = 1 << 19; # /* recovery and failover */
-$masks->{RPCTRACE} = 1 << 19; # /* recovery and failover */
+$masks->{RPCTRACE} = 1 << 20; # /* recovery and failover */
sub extractpid
{
- $_ = shift;
+ $line = shift;
+# print "$_\n";
+ if ($line =~ m/(\d+):(\d+):(\d+):(\d+\.\d+):(\d+):(\d+):.*$/) {
+ return $6;
+ }
+}
+
+sub extracthostpid
+{
+ $line = shift;
+# print "$_\n";
+ if ($line =~ m/(\d+):(\d+):(\d+):(\d+\.\d+):(\d+):(\d+):(\d+):.*$/) {
+ return $7;
+ }
+}
+sub extractsubsys
+{
+ $line = shift;
# print "$_\n";
- /\(\) ([0-9]*)\+[0-9]*\):/;
- return $1;
+ if ($line =~ m/(\d+):(\d+):(\d+):(\d+\.\d+):(\d+):(\d+):(\d+):.*$/) {
+ return hex($1);
+ }
+}
+
+sub extractmask
+{
+ $line = shift;
+# print "$_\n";
+ if ($line =~ m/(\d+):(\d+):(\d+):(\d+\.\d+):(\d+):(\d+):(\d+):.*$/) {
+ return hex($2);
+ }
+}
+
+sub entering_rpc
+{
+ $_ = shift;
+ $entering_rpc = /Handling RPC/;
+ if($entering_rpc) {
+ $oldpid=$pid;
+ $pid = extractpid($_);
+ $leaving_rpc = 0;
+ }
+}
+
+sub leaving_rpc
+{
+ $_ = shift;
+ $leaving_rpc = /Handled RPC/;
+ if($leaving_rpc) {
+ $pid = $oldpid;
+ $entering_rpc = 0;
+ }
}
sub entering
sub setcolor
{
my $linemask = shift;
+ my $line = shift;
if ($linemask == $masks->{TRACE}) {
- print color("yellow on_black");
+ if(leaving($line)){
+ print color("yellow on_black");
+ } else {
+ print color("green on_black");
+ }
}
if ($linemask == $masks->{DLMTRACE}) {
print color("magenta on_black");
}
}
-while (<STDIN>) {
+sub usage
+{
+ print "Usage : llanalyze LOGFILE\n";
+ exit;
+}
+
+if ($ARGV[0]) {
+ if(!open(LOG, "<$ARGV[0]")){
+ print "Cannot open $ARGV[0]\n";
+ exit;
+ }
+} else {
+ usage();
+}
+$width = 0;
+if ($ARGV[1]) {
+ $width = $ARGV[1];
+}
+
+print "nodlm $nodlm, nonet $nonet, trace $trace lmvtrace $lmvtrace\n";
+print "pid: $pid, dlm_ns: $dlm_ns\n";
+print "extract_start: $extract_start\n";
+print "extract_end: $extract_end\n";
+while (<LOG>) {
+ if ($extract_start && $extract_start != LLANAYZE_FOUND) {
+ next if (index($_, $extract_start, 0) == -1);
+ $extract_start = LLANAYZE_FOUND;
+ }
+
+ if ($extract_end) {
+ next if ($extract_end == LLANAYZE_FOUND);
+ if (index($_, $extract_end, 0) != -1) {
+ $extract_end = LLANAYZE_FOUND;
+ }
+ }
+
$linepid = extractpid($_);
- $linemask = getmask($_);
- $linesubsys = getsubsys($_);
-# printf "---> mask %x subsys %x\n", $linemask, $linesubsys;
+ $linehpid = extracthostpid($_);
+ $linesubsys = extractsubsys($_);
+ $linemask = extractmask($_);
if (leaving($_)) {
chop $prefix->{$linepid};
study_lock($_);
}
- if ( !$pid || $linepid == $pid) {
- next if ($rpctrace && $linemask != $masks->{RPCTRACE});
+ if ( !$pid || $linepid == $pid || $linehpid == $pid) {
+ next if (!$entering_rpc && $rpctrace && $linemask != $masks->{RPCTRACE});
next if ($trace && $linemask != $masks->{TRACE});
-
-
next if ($nodlm &&
( $linesubsys == $subsys->{LDLM}));
+ next if ($lmvtrace &&
+ ( $linesubsys != $subsys->{LMV}));
+ next if ($dlm_ns &&
+ ( $linesubsys != $subsys->{LDLM}));
+ next if (($found_dlm_ns = index( $_, $dlm_ns, 0)) == -1);
next if ($noclass &&
( $linesubsys == $subsys->{CLASS}));
-
next if ($nonet &&
( $linesubsys == $subsys->{RPC} ||
$linesubsys == $subsys->{NET} ||
$linesubsys == $subsys->{PORTALS} ||
$linesubsys == $subsys->{SOCKNAL} ||
$linesubsys == $subsys->{QSWNAL} ||
+ $linesubsys == $subsys->{OPENIBNAL} ||
$linesubsys == $subsys->{GMNAL}));
-
+ if(!$entering_rpc) {entering_rpc($_);}
+ if(!$leaving_rpc) {leaving_rpc($_);}
# printf "sub/mask: %s - %s\n", getsubsys($_), getmask($_);
- if (!$silent) {
- setcolor($linemask);
- printf("%s%s", $prefix->{$linepid}, $_);
+ if (!$silent) {
+ setcolor($linemask, $_);
+ my $string = $prefix->{$linepid}.$_;
+ if($width){
+ $string = substr($string, 0, $width)."\n";
+ }
+ printf("%s", $string);
print color("reset");
}
# last if $count++ > 100;