#!/usr/bin/env python3
"""
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 blocklist 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)
