From: Sage Weil Date: Tue, 15 Sep 2009 20:14:01 +0000 (-0700) Subject: uclient: do not do locking for 'atomic' writes X-Git-Tag: v0.15~64 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cca45f3c7bda1f72096d6d9aa0e2538d62cfbfff;p=ceph.git uclient: do not do locking for 'atomic' writes They aren't tested and aren't safe (client may fail; there's no cleanup). --- diff --git a/src/TODO b/src/TODO index 74ec64e25242..f667c97c7231 100644 --- a/src/TODO +++ b/src/TODO @@ -35,8 +35,6 @@ v0.15 - kclient: retry alloc on ENOMEM when reading from connection? - client authentication -- radosgw -- uclient: fix write vs max_size? - mds: put migration vectors in mdsmap @@ -65,8 +63,9 @@ mount.ceph - should look at multiple A records, pass all IPs to kernel rados -- usage accounting - make rest interface superset of s3? + - create/delete snapshots + - list, access snapped version - perl swig wrapper - 'rados call foo.bar'? - merge pgs diff --git a/src/client/Client.cc b/src/client/Client.cc index f670fadb7e3f..bdde2cbefe65 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -4304,24 +4304,23 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf) dout(10) << " snaprealm " << *in->snaprealm << dendl; - if (g_conf.client_oc) { - if (in->caps_issued_mask(CEPH_CAP_FILE_BUFFER)) { - // do buffered write - if (in->cap_refs[CEPH_CAP_FILE_BUFFER] == 0) - get_cap_ref(in, CEPH_CAP_FILE_BUFFER); - - // wait? (this may block!) - objectcacher->wait_for_write(size, client_lock); - - // async, caching, non-blocking. - objectcacher->file_write(in->ino, &in->layout, in->snaprealm->get_snap_context(), - offset, size, bl, g_clock.now(), 0); - } else { + if (g_conf.client_oc && (got & CEPH_CAP_FILE_BUFFER)) { + // do buffered write + if (in->cap_refs[CEPH_CAP_FILE_BUFFER] == 0) + get_cap_ref(in, CEPH_CAP_FILE_BUFFER); + + // wait? (this may block!) + objectcacher->wait_for_write(size, client_lock); + + // async, caching, non-blocking. + objectcacher->file_write(in->ino, &in->layout, in->snaprealm->get_snap_context(), + offset, size, bl, g_clock.now(), 0); + } else { + /* // atomic, synchronous, blocking. objectcacher->file_atomic_sync_write(in->ino, &in->layout, in->snaprealm->get_snap_context(), offset, size, bl, g_clock.now(), 0, client_lock); - } - } else { + */ // simple, non-atomic sync write Mutex flock("Client::_write flock"); Cond cond; @@ -4330,7 +4329,7 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf) Context *onsafe = new C_Client_SyncCommit(this, in); unsafe_sync_write++; - get_cap_ref(in, CEPH_CAP_FILE_BUFFER); + get_cap_ref(in, CEPH_CAP_FILE_BUFFER); // released by onsafe callback filer->write(in->ino, &in->layout, in->snaprealm->get_snap_context(), offset, size, bl, g_clock.now(), 0, onfinish, onsafe);