// async, caching, non-blocking.
objectcacher->file_write(&in->oset, &in->layout, in->snaprealm->get_snap_context(),
- offset, size, bl, ceph_clock_now(cct), 0);
-
- // wait? (this may block!)
- objectcacher->wait_for_write(size, client_lock);
+ offset, size, bl, ceph_clock_now(cct), 0,
+ client_lock);
put_cap_ref(in, CEPH_CAP_FILE_BUFFER);
} else {
wr->extents.push_back(extent);
{
Mutex::Locker l(cache_lock);
- object_cacher->writex(wr, object_set);
- object_cacher->wait_for_write(len, cache_lock);
+ object_cacher->writex(wr, object_set, cache_lock);
}
}
}
-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);
}
}
+ 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)
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()
// 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);
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);
}
};