FileReader *log_reader = new FileReader(
log_file, cct->_conf->bluefs_max_prefetch,
- true); // ignore eof
+ {.ignore_eof = true, .buffered = false});
bool seen_recs = false;
int r;
if (!cct->_conf->bluefs_check_for_zeros) {
r = _bdev_read_random(p->bdev, p->offset + x_off, l, out,
- cct->_conf->bluefs_buffered_io);
+ h->buffered);
} else {
r = _read_random_and_check(p->bdev, p->offset + x_off, l, out,
- cct->_conf->bluefs_buffered_io);
+ h->buffered);
}
ceph_assert(r == 0);
off += l;
File::envelope_t flush;
bool envelope_good;
uint64_t file_size = file->fnode.size;
- FileReader *h = new FileReader(file, 4096, true);
+ FileReader *h = new FileReader(file, 4096, {.ignore_eof = true, .buffered = false});
ceph_assert(h);
while(scan_ofs < file->fnode.allocated) {
envelope_good = _read_envelope(h, scan_ofs, env_ofs, &flush);
int r;
// when reading BlueFS log (only happens on startup) use non-buffered io
// it makes it in sync with logic in _flush_range()
- bool use_buffered_io = h->file->fnode.ino == 1 ? false : cct->_conf->bluefs_buffered_io;
if (!cct->_conf->bluefs_check_for_zeros) {
r = _bdev_read(p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
- use_buffered_io);
+ h->buffered);
} else {
r = _read_and_check(
p->bdev, p->offset + x_off, l, &buf->bl, ioc[p->bdev],
- use_buffered_io);
+ h->buffered);
}
logger->inc(l_bluefs_read_disk_count, 1);
logger->inc(l_bluefs_read_disk_bytes, l);
return -ENOENT;
}
File *file = q->second.get();
- if (file->envelope_mode() && !file->envelopes_indexed) {
+ bool envelope = file->envelope_mode();
+ if (envelope && !file->envelopes_indexed) {
_envmode_index_file(file);
}
*h = new FileReader(file, random ? 4096 : cct->_conf->bluefs_max_prefetch,
- file->envelope_mode());
+ {.ignore_eof = envelope,
+ .buffered = envelope ? false : cct->_conf->bluefs_buffered_io});
dout(10) << __func__ << " h " << *h << " on " << file->fnode << dendl;
return 0;
}
}
};
+ struct FileReaderOpts {
+ bool ignore_eof;
+ bool buffered;
+ };
struct FileReader {
MEMPOOL_CLASS_HELPERS();
FileRef file;
FileReaderBuffer buf;
bool ignore_eof; ///< used when reading our log file
+ bool buffered;
ceph::shared_mutex lock {
ceph::make_shared_mutex(std::string(), false, false, false)
};
- FileReader(FileRef f, uint64_t mpf, bool ie)
+ FileReader(FileRef f, uint64_t mpf, const FileReaderOpts opts)
: file(f),
buf(mpf),
- ignore_eof(ie) {
+ ignore_eof(opts.ignore_eof),
+ buffered(opts.buffered) {
++file->num_readers;
}
~FileReader() {