OPTION(bluefs_min_flush_size, OPT_U64, 524288) // ignore flush until its this big
OPTION(bluefs_compact_log_sync, OPT_BOOL, false) // sync or async log compaction?
OPTION(bluefs_buffered_io, OPT_BOOL, false)
+OPTION(bluefs_sync_write, OPT_BOOL, false)
OPTION(bluefs_allocator, OPT_STR, "bitmap") // stupid | bitmap
OPTION(bluefs_preextend_wal_files, OPT_BOOL, false) // this *requires* that rocksdb has recycling enabled
log_writer->file->fnode.size = jump_to;
}
- // drop lock while we wait for io
- list<aio_t> completed_ios;
- _claim_completed_aios(log_writer, &completed_ios);
- l.unlock();
- wait_for_aio(log_writer);
- completed_ios.clear();
- flush_bdev();
- l.lock();
+ _flush_bdev_safely(log_writer);
log_flushing = false;
log_cond.notify_all();
t.append_zero(zlen);
}
}
- bdev[p->bdev]->aio_write(p->offset + x_off, t, h->iocv[p->bdev], buffered);
+ if (cct->_conf->bluefs_sync_write) {
+ bdev[p->bdev]->write(p->offset + x_off, t, buffered);
+ } else {
+ bdev[p->bdev]->aio_write(p->offset + x_off, t, h->iocv[p->bdev], buffered);
+ }
bloff += x_len;
length -= x_len;
++p;
return r;
uint64_t old_dirty_seq = h->file->dirty_seq;
- list<aio_t> completed_ios;
- _claim_completed_aios(h, &completed_ios);
- lock.unlock();
- wait_for_aio(h);
- completed_ios.clear();
- flush_bdev();
- lock.lock();
+ _flush_bdev_safely(h);
if (old_dirty_seq) {
uint64_t s = log_seq;
return 0;
}
+void BlueFS::_flush_bdev_safely(FileWriter *h)
+{
+ if (!cct->_conf->bluefs_sync_write) {
+ list<aio_t> completed_ios;
+ _claim_completed_aios(h, &completed_ios);
+ lock.unlock();
+ wait_for_aio(h);
+ completed_ios.clear();
+ flush_bdev();
+ lock.lock();
+ } else {
+ lock.unlock();
+ flush_bdev();
+ lock.lock();
+ }
+}
+
void BlueFS::flush_bdev()
{
// NOTE: this is safe to call without a lock.
//void _aio_finish(void *priv);
+ void _flush_bdev_safely(FileWriter *h);
void flush_bdev(); // this is safe to call without a lock
int _preallocate(FileRef f, uint64_t off, uint64_t len);