#!/usr/bin/env python import json import sys def main(): """ Read json output of admin socket command 'objecter_requests' from stdin, and check it for internal consistency and presence of fields. """ read = sys.stdin.read() reqs = json.loads(read) op_types = ['linger_ops', 'ops', 'pool_ops', 'pool_stat_ops', 'statfs_ops', 'command_ops'] assert sorted(reqs.keys()) == sorted(op_types) found_error = check_osd_ops(reqs['ops'] + reqs['linger_ops']) assert not found_error, "ERRORS FOUND!" def check_osd_ops(ops): pg_map = {} locators = {} osds = {} found_error = [False] def add_to_mapping(mapping, key, value, msg): if key in mapping: if mapping[key] != value: print('%s != %s' % (mapping[key], value)) print(msg) found_error[0] = True else: mapping[key] = value for op in ops: add_to_mapping( mapping=pg_map, key=(op['object_id'], op['object_locator']), value=op['pg'], msg='ERROR: two ops for the same object mapped to different pgs', ) add_to_mapping( mapping=locators, key=op['object_id'], value=op['object_locator'], msg='ERROR: requests to the same object had different locators', ) add_to_mapping( mapping=osds, key=op['pg'], value=op['osd'], msg='ERROR: two ops mapped a pg to different osds', ) return found_error[0] if __name__ == '__main__': main()