]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librgw: finish write transactions in rgw_close path
authorMatt Benjamin <mbenjamin@redhat.com>
Wed, 16 Dec 2015 15:56:24 +0000 (10:56 -0500)
committerMatt Benjamin <mbenjamin@redhat.com>
Fri, 12 Feb 2016 17:06:48 +0000 (12:06 -0500)
Signed-off-by: Matt Benjamin <mbenjamin@redhat.com>
src/rgw/rgw_file.cc
src/rgw/rgw_file.h

index 0b3464cdcf9740ed6791536c22b7c9f66835d1ba..577dae12e1ae669232f5f21ece879315ab62062e 100644 (file)
@@ -132,6 +132,30 @@ int RGWFileHandle::write(uint64_t off, size_t len, size_t *bytes_written,
   return rc;
 } /* RGWFileHandle::write */
 
+int RGWFileHandle::close()
+{
+  lock_guard guard(mtx);
+
+  int rc = 0;
+  file* f = get<file>(&variant_type);
+  if (! f->write_req) {
+    rc = librgw.get_fe()->finish_req(f->write_req);
+    if (! rc) {
+      rc = f->write_req->get_ret();
+      if (! rc) {
+       /* update stats */
+       set_size(f->write_req->bytes_written);
+       // XXX mtime
+      }
+    }
+    delete f->write_req;
+    f->write_req = nullptr;
+  }
+
+  flags &= ~FLAG_OPEN;
+  return rc;
+} /* RGWFileHandle::close */
+
 RGWFileHandle::file::~file()
 {
   delete write_req;
@@ -140,7 +164,8 @@ RGWFileHandle::file::~file()
 int RGWWriteRequest::exec_start() {
   struct req_state* s = get_state();
 
-  need_calc_md5 = (obj_manifest == NULL);
+  // XXX check this
+  need_calc_md5 = (dlo_manifest == NULL) && (slo_info == NULL);
 
   perfcounter->inc(l_rgw_put);
   op_ret = -EINVAL;
@@ -673,12 +698,12 @@ int rgw_close(struct rgw_fs *rgw_fs,
              struct rgw_file_handle *fh, uint32_t flags)
 {
   RGWFileHandle* rgw_fh = get_rgwfh(fh);
-  rgw_fh->close(/* XXX */);
+  int rc = rgw_fh->close(/* XXX */);
 
   if (flags & RGW_CLOSE_FLAG_RELE)
     rgw_fh->rele();
 
-  return 0;
+  return rc;
 }
 
 int rgw_readdir(struct rgw_fs *rgw_fs,
@@ -767,8 +792,6 @@ int rgw_write(struct rgw_fs *rgw_fs,
              struct rgw_file_handle *fh, uint64_t offset,
              size_t length, size_t *bytes_written, void *buffer)
 {
-  CephContext* cct = static_cast<CephContext*>(rgw_fs->rgw);
-  RGWLibFS *fs = static_cast<RGWLibFS*>(rgw_fs->fs_private);
   RGWFileHandle* rgw_fh = get_rgwfh(fh);
 
   if (! rgw_fh->is_file())
index 8ddc0f3dbf1a7fc16201c0ff099456efa8e98aaf..d6f6fec050c36e2e787ee39507e682ac02880a85 100644 (file)
@@ -363,11 +363,7 @@ namespace rgw {
 
     int write(uint64_t off, size_t len, size_t *nbytes, void *buffer);
     int write_finish();
-
-    void close() {
-      lock_guard guard(mtx);
-      flags &= ~FLAG_OPEN;
-    }
+    int close();
 
     void open_for_create() {
       lock_guard guard(mtx);