diff options
Diffstat (limited to 'src/test/admin_socket/objecter_requests')
-rwxr-xr-x | src/test/admin_socket/objecter_requests | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/test/admin_socket/objecter_requests b/src/test/admin_socket/objecter_requests new file mode 100755 index 00000000..c2655cdb --- /dev/null +++ b/src/test/admin_socket/objecter_requests @@ -0,0 +1,60 @@ +#!/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() |