(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:tracing) op: assign_op.Equal rhs: {(/sys/kernel/debug/tracing)} spids: [124] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:flock) op: assign_op.Equal rhs: {(/var/tmp/.ftrace-lock)} spids: [127] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:bufsize_kb) op: assign_op.Equal rhs: {(4096)} spids: [130] ) ] ) (command.CommandList children: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_device) op: assign_op.Equal rhs: {(0)} spids: [133] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:135) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:device) op: assign_op.Equal rhs: (word.Empty) spids: [137] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:138) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_iotype) op: assign_op.Equal rhs: {(0)} spids: [140] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:142) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:iotype) op: assign_op.Equal rhs: (word.Empty) spids: [144] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:145) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_timestamp) op: assign_op.Equal rhs: {(0)} spids: [147] ) ] ) ] ) (command.CommandList children: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_interval) op: assign_op.Equal rhs: {(0)} spids: [150] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:152) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:interval) op: assign_op.Equal rhs: {(1)} spids: [154] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:156) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_count) op: assign_op.Equal rhs: {(0)} spids: [158] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:160) ) (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:count) op: assign_op.Equal rhs: {(0)} spids: [162] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:164) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_queue) op: assign_op.Equal rhs: {(0)} spids: [166] ) ] ) ] ) (C {(trap)} {(SQ (Token id:Id.Lit_Chars val:':' span_id:172))} {(INT)} {(QUIT)} {(TERM)} {(PIPE)} {(HUP)} ) (command.ShFunction name: usage body: (command.BraceGroup children: [ (command.Simple words: [{(cat)}] redirects: [ (redir.HereDoc op: (Token id:Id.Redir_DLessDash val:'<<-' span_id:198) fd: -1 here_begin: {(END)} here_end_span_id: 223 stdin_parts: [ ('USAGE: iolatency [-hQT] [-d device] [-i iotype] [interval [count]]\n') (' -d device # device string (eg, ') (Id.Right_DoubleQuote '"') ('202,1)\n') (" -i iotype # match type (eg, '*R*' for all reads)\n") (' -Q # use queue insert as start time\n') (' -T # timestamp on output\n') (' -h # this usage message\n') (' interval # summary interval, seconds (default 1)\n') (' count # number of summaries\n') (' eg,\n') (' iolatency # summarize latency every second\n') (' iolatency -Q # include block I/O queue time\n') (' iolatency 5 2 # 2 x 5 second summaries\n') (" iolatency -i '*R*' # trace reads\n") (' iolatency -d 202,1 # trace device 202,1 only\n') ('\n') ('See the man page and example file for more info.\n') ] ) (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:201) fd: -1 arg_word: {(2)} ) ] ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:225) ) ] ) ) (command.ShFunction name: warn body: (command.BraceGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [(C {(eval)} {(DQ ($ Id.VSub_At '$@'))})] negated: T ) terminator: (Token id:Id.Op_Semi val:';' span_id:246) ) ] action: [ (command.Simple words: [ {(echo)} { (DQ ('WARNING: command failed ') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:258) ) ($ Id.VSub_At '$@') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:260) ) ) } ] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:253) fd: -1 arg_word: {(2)} ) ] ) ] spids: [237 248] ) ] ) ] ) ) (command.ShFunction name: end body: (command.BraceGroup children: [ (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:282) fd: 2 arg_word: {(/dev/null)} ) ] ) (command.Simple words: [{(echo)} {(DQ ('Ending tracing...'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:292) fd: 2 arg_word: {(/dev/null)} ) ] ) (C {(cd)} {($ Id.VSub_DollarName '$tracing')}) (C {(warn)} {(DQ ('echo 0 > events/block/') ($ Id.VSub_DollarName '$b_start') (/enable))}) (C {(warn)} {(DQ ('echo 0 > events/block/block_rq_complete/enable'))}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.Binary op_id: Id.Arith_DPipe left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_device span_id:321) ) right: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_iotype span_id:325) ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:329) ) ] action: [ (C {(warn)} {(DQ ('echo 0 > events/block/') ($ Id.VSub_DollarName '$b_start') (/filter))} ) (C {(warn)} {(DQ ('echo 0 > events/block/block_rq_complete/filter'))}) ] spids: [317 331] ) ] ) (C {(warn)} {(DQ ('echo > trace'))}) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:wroteflock span_id:362) ) ) (C {(warn)} {(DQ ('rm ') ($ Id.VSub_DollarName '$flock'))}) ] ) ] ) ) (command.ShFunction name: die body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_At '$@'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:388) fd: -1 arg_word: {(2)} ) ] ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:396) arg_word: {(1)} ) ] ) ) (command.ShFunction name: edie body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_At '$@'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:416) fd: -1 arg_word: {(2)} ) ] ) (command.Simple words: [{(exec)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:426) fd: -1 arg_word: {(/dev/null)} ) (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'2>&' span_id:429) fd: 2 arg_word: {(1)} ) ] ) (C {(end)}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:436) arg_word: {(1)} ) ] ) ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:446) cond: [(C {(getopts)} {(d) (Id.Lit_Other ':') (hi) (Id.Lit_Other ':') (QT)} {(opt)})] body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$opt')} arms: [ (case_arm pat_list: [{(d)}] action: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_device) op: assign_op.Equal rhs: {(1)} spids: [471] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:473) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:device) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$OPTARG')} spids: [475] ) ] ) ] spids: [468 469 478 -1] ) (case_arm pat_list: [{(i)}] action: [ (command.Sentence child: (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_iotype) op: assign_op.Equal rhs: {(1)} spids: [484] ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:486) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:iotype) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$OPTARG')} spids: [488] ) ] ) ] spids: [481 482 491 -1] ) (case_arm pat_list: [{(Q)}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_queue) op: assign_op.Equal rhs: {(1)} spids: [497] ) ] ) ] spids: [494 495 500 -1] ) (case_arm pat_list: [{(T)}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_timestamp) op: assign_op.Equal rhs: {(1)} spids: [506] ) ] ) ] spids: [503 504 509 -1] ) (case_arm pat_list: [{(h)} {(Id.Lit_QMark '?')}] action: [(C {(usage)})] spids: [512 515 519 -1] ) ] ) ] ) ) (C {(shift)} { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Minus left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$OPTIND')}) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 1)}) ) ) } ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child:(arith_expr.ArithWord w:{($ Id.VSub_Pound '$#')})) terminator: (Token id:Id.Op_Semi val:';' span_id:547) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_interval) op: assign_op.Equal rhs: {(1)} spids: [552] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:interval) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [556] ) ] ) (C {(shift)}) ] spids: [539 549] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child:(arith_expr.ArithWord w:{($ Id.VSub_Pound '$#')})) terminator: (Token id:Id.Op_Semi val:';' span_id:572) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:opt_count) op: assign_op.Equal rhs: {(1)} spids: [577] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:count) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [581] ) ] ) ] spids: [564 574] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_device span_id:590) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:594) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:major) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Name val:device span_id:601) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{(',*')}) ) } spids: [599] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:minor) op: assign_op.Equal rhs: { (braced_var_sub token: (Token id:Id.VSub_Name val:device span_id:609) suffix_op: (suffix_op.Unary op_id:Id.VOp1_Pound arg_word:{('*,')}) ) } spids: [607] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:dev) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: (arith_expr.Binary op_id: Id.Arith_DLess left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:major span_id:619) ) right: (arith_expr.ArithWord w:{(Id.Lit_Digits 20)}) ) right: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:minor span_id:628) ) ) ) } spids: [615] ) ] ) ] spids: [586 596] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_queue span_id:639) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:643) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:b_start) op: assign_op.Equal rhs: {(block_rq_insert)} spids: [648] ) ] ) ] spids: [635 645] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:b_start) op: assign_op.Equal rhs: {(block_rq_issue)} spids: [654] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (command.DBracket expr:(bool_expr.Unary op_id:Id.BoolUnary_x child:{(/usr/bin/mawk)})) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:awk) op: assign_op.Equal rhs: {(SQ (Token id:Id.Lit_Chars val:'mawk -W interactive' span_id:675))} spids: [673] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:awk) op: assign_op.Equal rhs: {(awk)} spids: [680] ) ] ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (C {(cd)} {($ Id.VSub_DollarName '$tracing')}) (C {(die)} { (DQ ('ERROR: accessing tracing. Root user? Kernel has FTRACE?\n') (' debugfs mounted? (mount -t debugfs debugfs /sys/kernel/debug)') ) } ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.DBracket expr: (bool_expr.Unary op_id:Id.BoolUnary_e child:{($ Id.VSub_DollarName '$flock')}) ) (C {(die)} { (DQ ('ERROR: ftrace may be in use by PID ') (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:718) command_list: (command.CommandList children: [(C {(cat)} {($ Id.VSub_DollarName '$flock')})] ) ) (' ') ($ Id.VSub_DollarName '$flock') ) } ) ] ) (command.AndOr ops: [Id.Op_DPipe] children: [ (command.Simple words: [{(echo)} {($ Id.VSub_Dollar '$$')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:731) fd: -1 arg_word: {($ Id.VSub_DollarName '$flock')} ) ] ) (C {(die)} {(DQ ('ERROR: unable to write ') ($ Id.VSub_DollarName '$flock') (.))}) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:wroteflock) op: assign_op.Equal rhs: {(1)} spids: [745] ) ] ) (C {(warn)} {(DQ ('echo nop > current_tracer'))}) (C {(warn)} {(DQ ('echo ') ($ Id.VSub_DollarName '$bufsize_kb') (' > buffer_size_kb'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filter) op: assign_op.Equal rhs: (word.Empty) spids: [766] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_iotype span_id:772) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:776) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filter) op: assign_op.Equal rhs: { (DQ ('rwbs ~ ') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:784) ) ($ Id.VSub_DollarName '$iotype') (word_part.EscapedLiteral token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:786) ) ) } spids: [781] ) ] ) ] spids: [768 778] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_device span_id:795) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:799) ) ] action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobNEqual left: {(DQ ($ Id.VSub_DollarName '$filter'))} right: {(DQ )} ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filter) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$filter') (' && '))} spids: [819] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filter) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name filter) ('dev == ') ($ Id.VSub_DollarName '$dev'))} spids: [826] ) ] ) ] spids: [791 801] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DParen child: (arith_expr.Binary op_id: Id.Arith_DPipe left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_iotype span_id:841) ) right: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_device span_id:845) ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:849) ) ] action: [ (command.If arms: [ (if_arm cond: [ (command.AndOr ops: [Id.Op_DPipe] children: [ (command.Pipeline children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_DollarName '$filter'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:864) fd: -1 arg_word: {(events/block/) ($ Id.VSub_DollarName '$b_start') (/filter)} ) ] ) ] negated: T ) (command.Pipeline children: [ (command.Simple words: [{(echo)} {(DQ ($ Id.VSub_DollarName '$filter'))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:882) fd: -1 arg_word: {(events/block/block_rq_complete/filter)} ) ] ) ] negated: T ) ] ) ] action: [(C {(edie)} {(DQ ('ERROR: setting -d or -t filter. Exiting.'))})] spids: [854 887] ) ] ) ] spids: [837 851] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.AndOr ops: [Id.Op_DPipe] children: [ (command.Pipeline children: [ (command.Simple words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:909) fd: -1 arg_word: {(events/block/) ($ Id.VSub_DollarName '$b_start') (/enable)} ) ] ) ] negated: T ) (command.Pipeline children: [ (command.Simple words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:925) fd: -1 arg_word: {(events/block/block_rq_complete/enable)} ) ] ) ] negated: T ) ] ) terminator: (Token id:Id.Op_Semi val:';' span_id:928) ) ] action: [(C {(edie)} {(DQ ('ERROR: enabling block I/O tracepoints. Exiting.'))})] spids: [901 930] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:etext) op: assign_op.Equal rhs: (word.Empty) spids: [941] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.DParen child: (arith_expr.Unary op_id: Id.Arith_Bang child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_count span_id:946) ) ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:etext) op: assign_op.Equal rhs: {(DQ (' Ctrl-C to end.'))} spids: [953] ) ] ) ] ) (C {(echo)} { (DQ ('Tracing block I/O. Output every ') ($ Id.VSub_DollarName '$interval') (' seconds.') ($ Id.VSub_DollarName '$etext') ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:offset) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:990) command_list: (command.CommandList children: [ (C {($ Id.VSub_DollarName '$awk')} { (SQ (Token id:Id.Lit_Chars val:'BEGIN { o = 0; }\n' span_id:994) (Token id: Id.Lit_Chars val: '\t$1 == "#" && $2 ~ /TASK/ && NF == 6 { o = 1; }\n' span_id: 995 ) (Token id:Id.Lit_Chars val:'\t$2 ~ /TASK/ { print o; exit }' span_id:996) ) } {(trace)} ) ] ) ) } spids: [989] ) ] ) (C {(warn)} {(DQ ('echo > trace'))}) (command.ShAssignment pairs: [(assign_pair lhs:(sh_lhs_expr.Name name:i) op:assign_op.Equal rhs:{(0)} spids:[1012])] ) (command.Pipeline children: [ (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:1015) cond: [ (command.Sentence child: (command.DParen child: (arith_expr.Binary op_id: Id.Arith_DPipe left: (arith_expr.Unary op_id: Id.Arith_Bang child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_count span_id:1020) ) ) right: (arith_expr.Binary op_id: Id.Arith_Less left: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:i span_id:1025) ) right: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:count span_id:1029) ) ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:1034) ) ] body: (command.DoGroup children: [ (command.DParen child: (arith_expr.UnaryAssign op_id: Id.Node_PostDPlus child: (sh_lhs_expr.Name name:i) ) ) (C {(sleep)} {($ Id.VSub_DollarName '$interval')}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id:Id.BoolUnary_x child:{(snapshot)}) ) terminator: (Token id:Id.Op_Semi val:';' span_id:1067) ) ] action: [ (command.Simple words: [{(echo)} {(1)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:1076) fd: -1 arg_word: {(snapshot)} ) ] ) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:1083) fd: -1 arg_word: {(trace)} ) ] ) (C {(cat)} {(snapshot)}) ] spids: [1058 1069] ) ] else_action: [ (C {(cat)} {(trace)}) (command.Simple words: [{(echo)}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'>' span_id:1103) fd: -1 arg_word: {(trace)} ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.DParen child: (arith_expr.VarRef token: (Token id:Id.Lit_ArithVarLike val:opt_timestamp span_id:1114) ) ) (C {(printf)} {(DQ ('time %(%H:%M:%S)T:') (Id.Lit_Other '\\') (n))} {(-1)}) ] ) (C {(echo)} {(DQ (tick))}) ] ) ) (C {($ Id.VSub_DollarName '$awk')} {(-v)} {(Id.Lit_VarLike 'o=') ($ Id.VSub_DollarName '$offset')} {(-v)} {(Id.Lit_VarLike 'opt_timestamp=') ($ Id.VSub_DollarName '$opt_timestamp')} {(-v)} {(Id.Lit_VarLike 'b_start=') ($ Id.VSub_DollarName '$b_start')} { (SQ (Token id:Id.Lit_Chars val:'\n' span_id:1161) (Token id: Id.Lit_Chars val: '\tfunction star(sval, smax, swidth) {\n' span_id: 1162 ) (Token id:Id.Lit_Chars val:'\t\tstars = ""\n' span_id:1163) (Token id:Id.Lit_Chars val:'\t\tif (smax == 0) return ""\n' span_id:1164) (Token id:Id.Lit_Chars val:'\t\tfor (si = 0; si < (swidth * sval / smax); si++) {\n' span_id:1165) (Token id:Id.Lit_Chars val:'\t\t\tstars = stars "#"\n' span_id:1166) (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:1167) (Token id:Id.Lit_Chars val:'\t\treturn stars\n' span_id:1168) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1169) (Token id:Id.Lit_Chars val:'\n' span_id:1170) (Token id:Id.Lit_Chars val:'\tBEGIN { max_i = 0 }\n' span_id:1171) (Token id:Id.Lit_Chars val:'\n' span_id:1172) (Token id:Id.Lit_Chars val:'\t# common fields\n' span_id:1173) (Token id:Id.Lit_Chars val:'\t$1 != "#" {\n' span_id:1174) (Token id: Id.Lit_Chars val: '\t\ttime = $(3+o); sub(":", "", time)\n' span_id: 1175 ) (Token id:Id.Lit_Chars val:'\t\tdev = $(5+o)\n' span_id:1176) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1177) (Token id:Id.Lit_Chars val:'\n' span_id:1178) (Token id:Id.Lit_Chars val:'\t# block I/O request\n' span_id:1179) (Token id:Id.Lit_Chars val:'\t$1 != "#" && $0 ~ b_start {\n' span_id:1180) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:1181) (Token id: Id.Lit_Chars val: '\t\t# example: (fields1..4+o) 202,1 W 0 () 12862264 + 8 [tar]\n' span_id: 1182 ) (Token id: Id.Lit_Chars val: '\t\t# The cmd field "()" might contain multiple words (hex),\n' span_id: 1183 ) (Token id:Id.Lit_Chars val:'\t\t# hence stepping from the right (NF-3).\n' span_id:1184) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:1185) (Token id:Id.Lit_Chars val:'\t\tloc = $(NF-3)\n' span_id:1186) (Token id:Id.Lit_Chars val:'\t\tstarts[dev, loc] = time\n' span_id:1187) (Token id:Id.Lit_Chars val:'\t\tnext\n' span_id:1188) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1189) (Token id:Id.Lit_Chars val:'\n' span_id:1190) (Token id:Id.Lit_Chars val:'\t# block I/O completion\n' span_id:1191) (Token id: Id.Lit_Chars val: '\t$1 != "#" && $0 ~ /rq_complete/ {\n' span_id: 1192 ) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:1193) (Token id: Id.Lit_Chars val: '\t\t# example: (fields1..4+o) 202,1 W () 12862256 + 8 [0]\n' span_id: 1194 ) (Token id:Id.Lit_Chars val:'\t\t#\n' span_id:1195) (Token id:Id.Lit_Chars val:'\t\tdir = $(6+o)\n' span_id:1196) (Token id:Id.Lit_Chars val:'\t\tloc = $(NF-3)\n' span_id:1197) (Token id:Id.Lit_Chars val:'\n' span_id:1198) (Token id:Id.Lit_Chars val:'\t\tif (starts[dev, loc] > 0) {\n' span_id:1199) (Token id: Id.Lit_Chars val: '\t\t\tlatency_ms = 1000 * (time - starts[dev, loc])\n' span_id: 1200 ) (Token id:Id.Lit_Chars val:'\t\t\ti = 0\n' span_id:1201) (Token id: Id.Lit_Chars val: '\t\t\tfor (ms = 1; latency_ms > ms; ms *= 2) { i++ }\n' span_id: 1202 ) (Token id:Id.Lit_Chars val:'\t\t\thist[i]++\n' span_id:1203) (Token id:Id.Lit_Chars val:'\t\t\tif (i > max_i)\n' span_id:1204) (Token id:Id.Lit_Chars val:'\t\t\t\tmax_i = i\n' span_id:1205) (Token id: Id.Lit_Chars val: '\t\t\tdelete starts[dev, loc]\n' span_id: 1206 ) (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:1207) (Token id:Id.Lit_Chars val:'\t\tnext\n' span_id:1208) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1209) (Token id:Id.Lit_Chars val:'\n' span_id:1210) (Token id:Id.Lit_Chars val:'\t# timestamp\n' span_id:1211) (Token id:Id.Lit_Chars val:'\t$1 == "time" {\n' span_id:1212) (Token id:Id.Lit_Chars val:'\t\tlasttime = $2\n' span_id:1213) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1214) (Token id:Id.Lit_Chars val:'\n' span_id:1215) (Token id:Id.Lit_Chars val:'\t# print summary\n' span_id:1216) (Token id:Id.Lit_Chars val:'\t$1 == "tick" {\n' span_id:1217) (Token id:Id.Lit_Chars val:'\t\tprint ""\n' span_id:1218) (Token id:Id.Lit_Chars val:'\t\tif (opt_timestamp)\n' span_id:1219) (Token id:Id.Lit_Chars val:'\t\t\tprint lasttime\n' span_id:1220) (Token id:Id.Lit_Chars val:'\n' span_id:1221) (Token id:Id.Lit_Chars val:'\t\t# find max value\n' span_id:1222) (Token id:Id.Lit_Chars val:'\t\tmax_v = 0\n' span_id:1223) (Token id: Id.Lit_Chars val: '\t\tfor (i = 0; i <= max_i; i++) {\n' span_id: 1224 ) (Token id:Id.Lit_Chars val:'\t\t\tif (hist[i] > max_v)\n' span_id:1225) (Token id:Id.Lit_Chars val:'\t\t\t\tmax_v = hist[i]\n' span_id:1226) (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:1227) (Token id:Id.Lit_Chars val:'\n' span_id:1228) (Token id:Id.Lit_Chars val:'\t\t# print histogram\n' span_id:1229) (Token id: Id.Lit_Chars val: '\t\tprintf "%8s .. %-8s: %-8s |%-38s|\\n", ">=(ms)", "<(ms)",\n' span_id: 1230 ) (Token id:Id.Lit_Chars val:'\t\t "I/O", "Distribution"\n' span_id:1231) (Token id:Id.Lit_Chars val:'\t\tms = 1\n' span_id:1232) (Token id:Id.Lit_Chars val:'\t\tfrom = 0\n' span_id:1233) (Token id: Id.Lit_Chars val: '\t\tfor (i = 0; i <= max_i; i++) {\n' span_id: 1234 ) (Token id:Id.Lit_Chars val:'\t\t\tprintf "%8d -> %-8d: %-8d |%-38s|\\n", from, ms,\n' span_id:1235) (Token id: Id.Lit_Chars val: '\t\t\t hist[i], star(hist[i], max_v, 38)\n' span_id: 1236 ) (Token id:Id.Lit_Chars val:'\t\t\tfrom = ms\n' span_id:1237) (Token id:Id.Lit_Chars val:'\t\t\tms *= 2\n' span_id:1238) (Token id:Id.Lit_Chars val:'\t\t}\n' span_id:1239) (Token id:Id.Lit_Chars val:'\t\tfflush()\n' span_id:1240) (Token id:Id.Lit_Chars val:'\t\tdelete hist\n' span_id:1241) (Token id: Id.Lit_Chars val: '\t\tdelete starts\t# invalid if events missed between snapshots\n' span_id: 1242 ) (Token id:Id.Lit_Chars val:'\t\tmax_i = 0\n' span_id:1243) (Token id:Id.Lit_Chars val:'\t}\n' span_id:1244) (Token id:Id.Lit_Chars val:'\n' span_id:1245) (Token id: Id.Lit_Chars val: '\t$0 ~ /LOST.*EVENTS/ { print "WARNING: " $0 > "/dev/stderr" }\n' span_id: 1246 ) ) } ) ] negated: F ) (C {(end)}) ] )