]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RGWSimpleRadosReadCR tolerates empty reads 11504/head
authorCasey Bodley <cbodley@redhat.com>
Fri, 14 Oct 2016 15:16:14 +0000 (11:16 -0400)
committerCasey Bodley <cbodley@redhat.com>
Fri, 14 Oct 2016 18:45:50 +0000 (14:45 -0400)
Fixes: http://tracker.ceph.com/issues/17568
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_cr_rados.h

index ee02dd8a33abb5bfdec0877e15cf307d384a2a0b..ad13ccd908974ce4f547572e6773ed5e4132c83b 100644 (file)
@@ -199,7 +199,7 @@ public:
   ~RGWSimpleRadosReadCR() {
     request_cleanup();
   }
-                                                         
+
   void request_cleanup() {
     if (req) {
       req->finish();
@@ -241,9 +241,17 @@ int RGWSimpleRadosReadCR<T>::request_complete()
     if (ret < 0) {
       return ret;
     }
-    bufferlist::iterator iter = bl.begin();
     try {
-      ::decode(*result, iter);
+      bufferlist::iterator iter = bl.begin();
+      if (iter.end()) {
+        // allow successful reads with empty buffers. ReadSyncStatus coroutines
+        // depend on this to be able to read without locking, because the
+        // cls lock from InitSyncStatus will create an empty object if it didnt
+        // exist
+        *result = T();
+      } else {
+        ::decode(*result, iter);
+      }
     } catch (buffer::error& err) {
       return -EIO;
     }