Viewing: obd_devs.py

#!/usr/bin/env python

"""
Copyright (c) 2015-2019 Cray Inc. All Rights Reserved.
Utility to display obd_devices
"""

from pykdump.API import *
import argparse

from crashlib.input import toint
import lustrelib as ll
import rpc_stats as rs

description_short = "Displays the contents of global 'obd_devs'"

SEP_SIZE = 152
def print_separator(count):
    s=""
    for idx in range(count):
        s += "="
    print(s)

def print_header():
    print("%-19s %-22s \t%-22s %-19s %-19s %-12s %-10s %-7s %-10s" % \
         ("obd_device",
          "obd_name",
          "ip_address",
          "client_obd",
          "obd_import",
          "imp_state",
          "ish_time",
          "index",
          "conn_cnt"))
    print_separator(SEP_SIZE)

IMP_STATE = {
        1:  "CLOSED",
        2:  "NEW",
        3:  "DISCON",
        4:  "CONNECTING",
        5:  "REPLAY",
        6:  "REPLAY_LOCKS",
        7:  "REPLAY_WAIT",
        8:  "RECOVER",
        9:  "FULL",
       10:  "EVICTED",
       11:  "IDLE"
}


def print_one_device(obd, stats_flag):
    try:
        nid = ll.obd2nidstr(obd)
    except Exception as e:
        try:
            print("0x%-17x %-22s" % (Addr(obd), ll.obd2str(obd)))
        except Exception as e:
            return 1
        return 0

    impstate = "--"
    ish_time = 0
    index=-1
    connect_cnt = 0
    inflight=0
    if obd.u.cli.cl_import:
        impstate = IMP_STATE.get(obd.u.cli.cl_import.imp_state)
        index = obd.u.cli.cl_import.imp_state_hist_idx - 1
        if index > 0 and index < 16:
            ish_time = obd.u.cli.cl_import.imp_state_hist[index].ish_time
        inflight = obd.u.cli.cl_import.imp_inflight.counter
        connect_cnt = obd.u.cli.cl_import.imp_conn_cnt

    print("0x%-17x %-22s\t%-22s\t 0x%-17x 0x%-17x %-10s %-10d %5d %5d" % \
          (Addr(obd),
          ll.obd2str(obd),
          nid,
          Addr(obd.u.cli),
          Addr(obd.u.cli.cl_import),
          impstate,
          ish_time,
          index,
          connect_cnt))
    if stats_flag:
        print(rs.osc_rpc_stats_seq_show(Addr(obd.u.cli)))
        print_separator(SEP_SIZE)
    return 0

def print_devices(devices, stats_flag):
    print_header()
    for obd in devices:
        if Addr(obd) == 0:
            break
        print_one_device(obd, stats_flag)
    print_separator(SEP_SIZE)

def obd_devs(args):
    if args.obd_device:
        devices = [readSU('struct obd_device', args.obd_device)]
    else:
        devices = readSymbol('obd_devs')
    print_devices(devices, args.stats_flag)

if __name__ == "__main__":
    description = "Displays the contents of global 'obd_devs'"
    parser = argparse.ArgumentParser(description=description)
    parser.add_argument("obd_device", nargs="?", default = [], type=toint,
        help = "print obd_device at argument address")
    parser.add_argument("-r", dest="stats_flag", action="count",
        help = "print the rpc_stats sequence for each client_obd")
    args = parser.parse_args()
    obd_devs(args)