initial code repo
[stor4nfv.git] / src / ceph / src / test / librbd / rbdrw.py
diff --git a/src/ceph/src/test/librbd/rbdrw.py b/src/ceph/src/test/librbd/rbdrw.py
new file mode 100644 (file)
index 0000000..8dbbda2
--- /dev/null
@@ -0,0 +1,30 @@
+#!/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)