#!/usr/bin/env python """ Loop writing/reading the first 4k of image argv[1] in pool rbd, after acquiring exclusive lock named argv[2]. When an exception happens, split off the last number in the exception 'args' string and use it as the process exit code, if it's convertible to a number. Designed to run against a blacklist operation and verify the ESHUTDOWN expected from the image operation. Note: this cannot be run with writeback caching on, currently, as writeback errors cause reads be marked dirty rather than error, and even if they were marked as errored, ObjectCacher would retry them rather than note them as errored. """ import rados, rbd, sys with rados.Rados(conffile='') as r: with r.open_ioctx('rbd') as ioctx: try: with rbd.Image(ioctx, sys.argv[1]) as image: image.lock_exclusive(sys.argv[2]) while True: image.write(b'A' * 4096, 0) r = image.read(0, 4096) except rbd.ConnectionShutdown: # it so happens that the errno here is 108, but # anything recognizable would do exit(108)