Viewing: cfs_hnodes.py
#!/usr/bin/env python
"""
Utility to display a Lustre cfs_hash table
Copyright (c) 2019 Cray Inc. All Rights Reserved.
"""
from pykdump.API import *
#from struct import *
import argparse
import os
import lustrelib as ll
from crashlib.input import toint
description_short = "Displays the specified Lustre hash table "
DEPTH = 3
RULER = "........................................"
hash_objects = {
'ldlm_res_hop_object': ['struct ldlm_resource', 'lr_hash'],
'jobid_object': ['struct jobid_to_pid_map', 'jp_hash'],
'lu_obj_hop_object': ['struct lu_object_header', 'loh_hash'],
'uuid_export_object': ['struct obd_export', 'export_uuid_hash'],
'nid_export_object': ['struct obd_export', 'exp_nid_hash'],
'nidstats_object': ['struct nid_stat', 'nid_hash'],
'gen_export_object': ['struct obd_export', 'exp_gen_hash'],
'oqi_object': ['struct osc_quota_info', 'oqi_hash'],
'conn_object': ['struct ptlrpc_connection', 'c_hash']}
def get_hash_object(hs, hnode):
s = addr2sym(hs.hs_ops.hs_object)
if s not in hash_objects:
return ''
obj = hash_objects[s]
obj_addr = Addr(hnode) - member_offset(obj[0], obj[1])
return "%s %x" % (obj[0], obj_addr)
def dump_hnodes(hs, hlist, hnode, depth=0, ruler=RULER):
while(hnode != hlist & hnode):
s = get_hash_object(hs, hnode)
print("%*.*shlist_node 0x%x %s" % (depth, depth, ruler, Addr(hnode), s))
hnode = hnode.next
def dump_hlist(hs, hlist, depth=0, ruler=RULER):
if hlist.first:
hnode = hlist.first
print("%*.*shlist_head 0x%x" % (depth, depth, ruler, Addr(hlist)))
dump_hnodes(hs, hlist, hnode, depth+DEPTH, ruler)
def dump_hash_bucket(hs, bd_bkt, depth=0, ruler=RULER):
print("%*.*scfs_hash_bucket 0x%x" % (depth, depth, ruler, Addr(bd_bkt)))
for bd_offset in range(ll.CFS_HASH_BKT_NHLIST(hs)):
hlist = ll.cfs_hash_hhead(hs, bd_bkt, bd_offset)
if hlist:
dump_hlist(hs, hlist, depth+DEPTH, ruler)
def dump_hash_table(hs):
print("cfs_hash@0x%x" % Addr(hs))
for bd_bkt in ll.cfs_hash_get_buckets(hs):
dump_hash_bucket(hs, bd_bkt, DEPTH, RULER)
if __name__ == "__main__":
description = "Displays the specified Lustre hash table "
parser = argparse.ArgumentParser(description=description)
parser.add_argument("htable", default=False, type=toint,
help="address of a cfs_hash struct")
args = parser.parse_args()
hs = readSU('struct cfs_hash', args.htable)
dump_hash_table(hs)