summaryrefslogtreecommitdiff
path: root/src/osdc
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2012-05-04 20:31:01 -0700
committerSage Weil <sage@inktank.com>2012-05-04 20:31:01 -0700
commit203a7d67aa0836409f1f393bb40485ddb8b2c8f6 (patch)
tree141949df05e29d994e047c4828772dba1a6fa86c /src/osdc
parentf3043fee3e22600cb4349072287842db129588eb (diff)
downloadceph-203a7d67aa0836409f1f393bb40485ddb8b2c8f6.tar.gz
objectcacher: wait directly from writex()
This gives us access to the original ObjectExtent (useful later), and simplifies the callers. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'src/osdc')
-rw-r--r--src/osdc/ObjectCacher.cc11
-rw-r--r--src/osdc/ObjectCacher.h11
2 files changed, 14 insertions, 8 deletions
diff --git a/src/osdc/ObjectCacher.cc b/src/osdc/ObjectCacher.cc
index 621655f79dc..ea0205add71 100644
--- a/src/osdc/ObjectCacher.cc
+++ b/src/osdc/ObjectCacher.cc
@@ -1048,7 +1048,7 @@ int ObjectCacher::readx(OSDRead *rd, ObjectSet *oset, Context *onfinish)
}
-int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset)
+int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Mutex& wait_on_lock)
{
assert(lock.is_locked());
utime_t now = ceph_clock_now(cct);
@@ -1115,20 +1115,23 @@ int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset)
}
}
+ int r = _wait_for_write(wr, bytes_written, oset, wait_on_lock);
+
delete wr;
//verify_stats();
trim();
- return 0;
+ return r;
}
// blocking wait for write.
-bool ObjectCacher::wait_for_write(uint64_t len, Mutex& lock)
+int ObjectCacher::_wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset, Mutex& lock)
{
int blocked = 0;
const md_config_t *conf = cct->_conf;
utime_t start = ceph_clock_now(cct);
+ int ret = 0;
// wait for writeback?
// - wait for dirty and tx bytes (relative to the max_dirty threshold)
@@ -1160,7 +1163,7 @@ bool ObjectCacher::wait_for_write(uint64_t len, Mutex& lock)
utime_t blocked = ceph_clock_now(cct) - start;
perfcounter->finc(l_objectcacher_write_time_blocked, (double) blocked);
}
- return blocked;
+ return ret;
}
void ObjectCacher::flusher_entry()
diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h
index 85a8cead4b9..07ed0342736 100644
--- a/src/osdc/ObjectCacher.h
+++ b/src/osdc/ObjectCacher.h
@@ -469,12 +469,14 @@ class ObjectCacher {
// non-blocking. async.
int readx(OSDRead *rd, ObjectSet *oset, Context *onfinish);
- int writex(OSDWrite *wr, ObjectSet *oset);
+ int writex(OSDWrite *wr, ObjectSet *oset, Mutex& wait_on_lock);
bool is_cached(ObjectSet *oset, vector<ObjectExtent>& extents, snapid_t snapid);
+private:
// write blocking
- bool wait_for_write(uint64_t len, Mutex& lock);
+ int _wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset, Mutex& lock);
+public:
bool set_is_cached(ObjectSet *oset);
bool set_is_dirty_or_committing(ObjectSet *oset);
@@ -512,10 +514,11 @@ class ObjectCacher {
int file_write(ObjectSet *oset, ceph_file_layout *layout, const SnapContext& snapc,
loff_t offset, uint64_t len,
- bufferlist& bl, utime_t mtime, int flags) {
+ bufferlist& bl, utime_t mtime, int flags,
+ Mutex& wait_on_lock) {
OSDWrite *wr = prepare_write(snapc, bl, mtime, flags);
Filer::file_to_extents(cct, oset->ino, layout, offset, len, wr->extents);
- return writex(wr, oset);
+ return writex(wr, oset, wait_on_lock);
}
};