]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix copy
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 20 Jul 2010 00:20:53 +0000 (17:20 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 20 Jul 2010 00:20:53 +0000 (17:20 -0700)
src/rgw/rgw_access.h
src/rgw/rgw_fs.cc
src/rgw/rgw_fs.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_user.cc

index d4862191580935ca6dfc1bb552c8566f65a8338a..ca83088aa345f80d930f94d8767144b8e3238d6c 100644 (file)
@@ -129,9 +129,11 @@ public:
             void **handle,
             struct rgw_err *err) = 0;
 
-  virtual int get_obj(void *handle, std::string& bucket, std::string& oid, 
+  virtual int get_obj(void **handle, std::string& bucket, std::string& oid, 
             char **data, off_t ofs, off_t end) = 0;
 
+  virtual void finish_get_obj(void **handle) = 0;
+
   /**
    * Get the attributes for an object.
    * bucket: name of the bucket holding the object.
index a8a3106f427183bc45b3c4bf265f821d887109d0..609769ab4f0f80a4847aac9067185ef54c36082e 100644 (file)
@@ -281,7 +281,7 @@ int RGWFS::copy_obj(std::string& id, std::string& dest_bucket, std::string& dest
     return ret;
  
   do { 
-    ret = get_obj(handle, src_bucket, src_obj, &data, ofs, end);
+    ret = get_obj(&handle, src_bucket, src_obj, &data, ofs, end);
     if (ret < 0)
       return ret;
     ofs += ret;
@@ -521,14 +521,14 @@ done_err:
   return r;
 }
 
-int RGWFS::get_obj(void *handle, std::string& bucket, std::string& obj, 
+int RGWFS::get_obj(void **handle, std::string& bucket, std::string& obj, 
             char **data, off_t ofs, off_t end)
 {
   uint64_t len;
   bufferlist bl;
   int r = 0;
 
-  GetObjState *state = (GetObjState *)handle;
+  GetObjState *state = *(GetObjState **)handle;
 
   if (end <= 0)
     len = 0;
@@ -567,3 +567,13 @@ int RGWFS::get_obj(void *handle, std::string& bucket, std::string& obj,
   return r;
 }
 
+void RGWFS::finish_get_obj(void **handle)
+{
+  if (*handle) {
+    GetObjState *state = *(GetObjState **)handle;
+    close(state->fd);
+    delete state;
+    *handle = NULL;
+  }
+}
+
index 95cedfbc17fe1c2a157242eb1822337beff479e1..e1f02a217bfd168dd829e6bbcb4264de2dfe82f1 100644 (file)
@@ -51,8 +51,10 @@ public:
             void **handle,
             struct rgw_err *err);
 
- int get_obj(void *handle, std::string& bucket, std::string& obj, 
+ int get_obj(void **handle, std::string& bucket, std::string& obj, 
             char **data, off_t ofs, off_t end);
+
+ void finish_get_obj(void **handle);
 };
 
 #endif
index 4b6696af74b8ab15ef1b8befbe84fd449f340941..e7830a5f5e50bf090838cebde5ef39ca9eb23405 100644 (file)
@@ -148,7 +148,7 @@ void RGWGetObj::execute()
     goto done;
 
   while (ofs <= end) {
-    len = rgwstore->get_obj(handle, s->bucket_str, s->object_str, &data, ofs, end);
+    len = rgwstore->get_obj(&handle, s->bucket_str, s->object_str, &data, ofs, end);
     if (len < 0) {
       ret = len;
       goto done;
@@ -164,6 +164,7 @@ void RGWGetObj::execute()
 done:
   send_response(handle);
   free(data);
+  rgwstore->finish_get_obj(&handle);
 }
 
 int RGWGetObj::init_common()
index 24e54f23e90d6f7c4e2d6e5f3d7b279b74684cac..89c2eac439caa0d3d65290196e5021af4e24a40e 100644 (file)
@@ -376,9 +376,11 @@ int RGWRados::copy_obj(std::string& id, std::string& dest_bucket, std::string& d
 
   ret = put_obj_meta(id, dest_bucket, dest_obj, mtime, attrs);
 
+  finish_get_obj(&handle);
+
   return ret;
 done_err:
-  /* FIXME: need to free handle */
+  finish_get_obj(&handle);
   return r;
 }
 
@@ -521,6 +523,8 @@ int RGWRados::prepare_get_obj(std::string& bucket, std::string& oid,
 
   map<string, bufferlist>::iterator iter;
 
+  *handle = NULL;
+
   GetObjState *state = new GetObjState;
   if (!state)
     return -ENOMEM;
@@ -600,14 +604,14 @@ done_err:
   return r;
 }
 
-int RGWRados::get_obj(void *handle,
+int RGWRados::get_obj(void **handle,
             std::string& bucket, std::string& oid, 
             char **data, off_t ofs, off_t end)
 {
   uint64_t len;
   bufferlist bl;
 
-  GetObjState *state = (GetObjState *)handle;
+  GetObjState *state = *(GetObjState **)handle;
 
   if (end <= 0)
     len = 0;
@@ -629,9 +633,20 @@ int RGWRados::get_obj(void *handle,
   if (r < 0 || !len || ((off_t)(ofs + len - 1) == end)) {
     rados->close_pool(state->pool);
     delete state;
+    *handle = NULL;
   }
 
   return r;
 
 }
 
+void RGWRados::finish_get_obj(void **handle)
+{
+  if (*handle) {
+    GetObjState *state = *(GetObjState **)handle;
+    rados->close_pool(state->pool);
+    delete state;
+    *handle = NULL;
+  }
+}
+
index 3684a91458469525a6bb3f1af11eb75fb81de0e3..88e208085e61fe0348b5207d46db61f193780424 100644 (file)
@@ -79,8 +79,10 @@ public:
             void **handle,
             struct rgw_err *err);
 
-  int get_obj(void *handle, std::string& bucket, std::string& oid, 
+  int get_obj(void **handle, std::string& bucket, std::string& oid, 
             char **data, off_t ofs, off_t end);
+
+  void finish_get_obj(void **handle);
 };
 
 #endif
index 07f68f867e54ab355ac7f0073a4c0621cb8c8c8e..35375a6906763f853d501d557bf3a8a7d2998204 100644 (file)
@@ -27,23 +27,28 @@ int rgw_get_user_info(string user_id, RGWUserInfo& info)
   struct rgw_err err;
   void *handle;
   off_t ofs = 0, end = -1;
+  bufferlist::iterator iter;
 
   ret = rgwstore->prepare_get_obj(ui_bucket, user_id, ofs, &end, NULL, NULL, NULL, NULL, NULL, true, &handle, &err);
   if (ret < 0)
     return ret;
   do {
-    ret = rgwstore->get_obj(handle, ui_bucket, user_id, &data, ofs, end);
+    ret = rgwstore->get_obj(&handle, ui_bucket, user_id, &data, ofs, end);
     if (ret < 0) {
-      return ret;
+      goto done;
     }
     bl.append(data, ret);
     free(data);
     ofs += ret;
   } while (ofs <= end);
 
-  bufferlist::iterator iter = bl.begin();
+
+  iter = bl.begin();
   info.decode(iter); 
-  return 0;
+  ret = 0;
+done:
+  rgwstore->finish_get_obj(&handle);
+  return ret;
 }
 
 /**
@@ -111,24 +116,28 @@ int rgw_get_uid_by_email(string& email, string& user_id)
   RGWUID uid;
   void *handle;
   off_t ofs = 0, end = -1;
+  bufferlist::iterator iter;
 
   ret = rgwstore->prepare_get_obj(ui_email_bucket, email, ofs, &end, NULL, NULL,
                                   NULL, NULL, NULL, true, &handle, &err);
   if (ret < 0)
     return ret;
   do {
-    ret = rgwstore->get_obj(handle, ui_email_bucket, email, &data, ofs, end);
+    ret = rgwstore->get_obj(&handle, ui_email_bucket, email, &data, ofs, end);
     if (ret < 0)
-      return ret;
+      goto done;
     ofs += ret;
     bl.append(data, ret);
     free(data);
   } while (ofs <= end);
 
-  bufferlist::iterator iter = bl.begin();
+  iter = bl.begin();
   uid.decode(iter); 
   user_id = uid.user_id;
-  return 0;
+  ret = 0;
+done:
+  rgwstore->finish_get_obj(&handle);
+  return ret;
 }
 
 /**