max_dirty(max_dirty), target_dirty(target_dirty),
max_size(max_bytes), max_objects(max_objects),
max_dirty_age(ceph::make_timespan(max_dirty_age)),
- block_writes_upfront(block_writes_upfront),
+ cfg_block_writes_upfront(block_writes_upfront),
trace_endpoint("ObjectCacher"),
flush_set_callback(flush_callback),
flush_set_callback_arg(flush_callback_arg),
}
int ObjectCacher::writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace,
- ZTracer::Trace *parent_trace)
+ ZTracer::Trace *parent_trace,
+ bool block_writes_upfront)
{
ceph_assert(ceph_mutex_is_locked(lock));
ceph::real_time now = ceph::real_clock::now();
}
}
- int r = _wait_for_write(wr, bytes_written, oset, &trace, onfreespace);
+ int r = _wait_for_write(wr, bytes_written, oset, &trace, onfreespace,
+ block_writes_upfront);
delete wr;
finish_contexts(cct, wait_for_reads, 0);
// blocking wait for write.
int ObjectCacher::_wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset,
- ZTracer::Trace *trace, Context *onfreespace)
+ ZTracer::Trace *trace, Context *onfreespace,
+ bool block_writes_upfront)
{
ceph_assert(ceph_mutex_is_locked(lock));
ceph_assert(trace != nullptr);
uint64_t max_dirty, target_dirty, max_size, max_objects;
ceph::timespan max_dirty_age;
- bool block_writes_upfront;
+ bool cfg_block_writes_upfront;
ZTracer::Endpoint trace_endpoint;
void retry_waiting_reads();
public:
+ bool CFG_block_writes_upfront(void) { return cfg_block_writes_upfront; }
void bh_read_finish(int64_t poolid, sobject_t oid, ceph_tid_t tid,
loff_t offset, uint64_t length,
ceph::buffer::list &bl, int r,
int readx(OSDRead *rd, ObjectSet *oset, Context *onfinish,
ZTracer::Trace *parent_trace = nullptr);
int writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace,
- ZTracer::Trace *parent_trace = nullptr);
+ ZTracer::Trace *parent_trace,
+ bool block_writes_upfront);
+ int writex(OSDWrite *wr, ObjectSet *oset, Context *onfreespace,
+ ZTracer::Trace *parent_trace = nullptr) {
+ return writex(wr, oset, onfreespace, parent_trace, cfg_block_writes_upfront);
+ }
bool is_cached(ObjectSet *oset, std::vector<ObjectExtent>& extents,
snapid_t snapid);
private:
// write blocking
int _wait_for_write(OSDWrite *wr, uint64_t len, ObjectSet *oset,
- ZTracer::Trace *trace, Context *onfreespace);
+ ZTracer::Trace *trace, Context *onfreespace,
+ bool block_writes_upfront);
void _maybe_wait_for_writeback(uint64_t len, ZTracer::Trace *trace);
bool _flush_set_finish(C_GatherBuilder *gather, Context *onfinish);
int file_write(ObjectSet *oset, file_layout_t *layout,
const SnapContext& snapc, loff_t offset, uint64_t len,
- ceph::buffer::list& bl, ceph::real_time mtime, int flags) {
+ ceph::buffer::list& bl, ceph::real_time mtime, int flags,
+ Context *onfreespace, bool block_writes_upfront) {
OSDWrite *wr = prepare_write(snapc, bl, mtime, flags, 0);
Striper::file_to_extents(cct, oset->ino, layout, offset, len,
oset->truncate_size, wr->extents);
- return writex(wr, oset, nullptr);
+ return writex(wr, oset, onfreespace, nullptr, block_writes_upfront);
}
bool file_flush(ObjectSet *oset, file_layout_t *layout,