diff options
author | Sage Weil <sage@inktank.com> | 2013-09-16 22:51:29 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-09-17 06:27:35 -0700 |
commit | 7f1e521879e46cc77c773441a9a5731832c267ca (patch) | |
tree | 07333bb46e81036f48dd7debd3bc18db21a75b25 | |
parent | 996bb9b2998c39d2fbc838e4854f40f69617af22 (diff) | |
download | ceph-7f1e521879e46cc77c773441a9a5731832c267ca.tar.gz |
client: add migrate helper
-rw-r--r-- | src/client/Client.cc | 51 | ||||
-rw-r--r-- | src/client/Client.h | 3 |
2 files changed, 54 insertions, 0 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index f4b7871b64f..f48862d9ca1 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5666,6 +5666,57 @@ void Client::unlock_fh_pos(Fh *f) f->pos_locked = false; } +int Client::migration_inline_data(Inode *in) +{ + ObjectOperation ops; + bufferlist inline_version_bl; + ::encode(in->inline_version, inline_version_bl); + ops.cmpxattr("inline_version", + CEPH_OSD_CMPXATTR_OP_GT, + CEPH_OSD_CMPXATTR_MODE_U64, + CEPH_OSD_OP_FLAG_NOENTOK, + inline_version_bl); + bufferlist inline_data = in->inline_data; + ops.write(0, inline_data, in->truncate_size, in->truncate_seq); + ops.setxattr("inline_version", inline_version_bl); + + char oid_buf[32]; + snprintf(oid_buf, sizeof(oid_buf), "%llx.00000000", (long long unsigned)in->ino); + object_t oid = oid_buf; + + Mutex flock("Client::migration_inline_data flock"); + Cond cond; + bool done = false; + int ret; + Context *oncommit = new C_SafeCond(&flock, &cond, &done, &ret); + + objecter->mutate(oid, + OSDMap::file_to_object_locator(in->layout), + ops, + in->snaprealm->get_snap_context(), + ceph_clock_now(cct), + 0, + NULL, + oncommit); + + client_lock.Unlock(); + flock.Lock(); + while (!done) + cond.Wait(flock); + flock.Unlock(); + client_lock.Lock(); + + if (ret >= 0 || ret == -ECANCELED) { + in->inline_data.clear(); + in->inline_version = CEPH_INLINE_DISABLED; + mark_caps_dirty(in, CEPH_CAP_FILE_WR); + check_caps(in, false); + + ret = 0; + } + + return ret; +} // diff --git a/src/client/Client.h b/src/client/Client.h index 94002d1ece4..5fc05f46d7a 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -420,6 +420,9 @@ protected: void handle_lease(MClientLease *m); + // inline data + int migration_inline_data(Inode *in); + // file caps void check_cap_issue(Inode *in, Cap *cap, unsigned issued); void add_update_cap(Inode *in, MetaSession *session, uint64_t cap_id, |