]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rados: implement Pool.write_full
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 17 Feb 2011 18:47:41 +0000 (10:47 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 17 Feb 2011 18:48:07 +0000 (10:48 -0800)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/pybind/rados.py
src/test/pybind-test.py

index c29187f367cad09b1459b6b2dc4ae5b410d37abe..384f36a3ebf9d76cf97e67cfd9355a738752a421 100755 (executable)
@@ -241,24 +241,37 @@ class Pool(object):
         self.require_pool_open()
         return Object(self, key)
 
-    def write(self, key, string_to_write, offset = 0):
+    def write(self, key, data, offset = 0):
         self.require_pool_open()
-        length = len(string_to_write)
+        length = len(data)
         ret = self.librados.rados_write(self.pool_id, c_char_p(key),
-                    c_size_t(offset), c_char_p(string_to_write),
-                    c_size_t(length))
+                 c_size_t(offset), c_char_p(data),
+                 c_size_t(length))
         if ret == length:
             return ret
         elif ret < 0:
             raise make_ex(ret, "Pool.write(%s): failed to write %s" % \
                 (self.name, key))
         elif ret < length:
-            raise IncompleteWriteError("Wrote only %ld/%ld bytes" % (ret, length))
+            raise IncompleteWriteError("Wrote only %ld out of %ld bytes" % \
+                (ret, length))
         else:
             raise make_ex("Pool.write(%s): logic error: rados_write \
 returned %d, but %d was the maximum number of bytes it could have \
 written." % (self.name, ret, length))
 
+    def write_full(self, key, data, full = False, offset = 0):
+        self.require_pool_open()
+        length = len(data)
+        ret = self.librados.rados_write_full(self.pool_id, c_char_p(key),
+                 c_size_t(offset), c_char_p(data),
+                 c_size_t(length))
+        if ret == 0:
+            return ret
+        else:
+            raise make_ex(ret, "Pool.write(%s): failed to write_full %s" % \
+                (self.name, key))
+
     def read(self, key, offset = 0, length = 8192):
         self.require_pool_open()
         ret_buf = create_string_buffer(length)
index 120a330d6fe2be549c7ff0e2ee605d26191e1e01..d5f9cd72a1c39faac14170960af4a0df2f4fbcbd 100755 (executable)
@@ -32,6 +32,17 @@ except rados.ObjectExists:
 foo3_pool = r.open_pool("foo3")
 foo3_pool.write("abc", "abc")
 foo3_pool.write("def", "def")
+abc_str = foo3_pool.read("abc")
+if (abc_str != "abc"):
+    raise RuntimeError("error reading object abc: expected value abc, \
+got %s" % abc_str)
+# write_full replaces the whole 'def' object
+foo3_pool.write_full("def", "d")
+def_str = foo3_pool.read("def")
+if (def_str != "d"):
+    raise RuntimeError("error reading object def: expected value d, \
+got %s" % def_str)
+
 for obj in foo3_pool.list_objects():
     print str(obj)