for (const auto& f : *c->inputs(0)) {
c->edit()->DeleteFile(c->level(), f->fd.GetNumber());
}
- versions_->SetIOStatus(IOStatus::OK());
status = versions_->LogAndApply(c->column_family_data(),
*c->mutable_cf_options(), c->edit(),
&mutex_, directories_.GetDbDir());
}
}
- versions_->SetIOStatus(IOStatus::OK());
status = versions_->LogAndApply(c->column_family_data(),
*c->mutable_cf_options(), c->edit(),
&mutex_, directories_.GetDbDir());
}
#endif // NDEBUG
- uint64_t new_manifest_file_size = 0;
- Status s;
- IOStatus io_s;
-
assert(pending_manifest_file_number_ == 0);
if (!descriptor_log_ ||
manifest_file_size_ > db_options_->max_manifest_file_size) {
}
}
+ uint64_t new_manifest_file_size = 0;
+ Status s;
+ IOStatus io_s;
{
FileOptions opt_file_opts = fs_->OptimizeForManifestWrite(file_options_);
mu->Unlock();
std::string descriptor_fname =
DescriptorFileName(dbname_, pending_manifest_file_number_);
std::unique_ptr<FSWritableFile> descriptor_file;
- s = NewWritableFile(fs_, descriptor_fname, &descriptor_file,
- opt_file_opts);
- if (s.ok()) {
+ io_s = NewWritableFile(fs_, descriptor_fname, &descriptor_file,
+ opt_file_opts);
+ if (io_s.ok()) {
descriptor_file->SetPreallocationBlockSize(
db_options_->manifest_preallocation_size);
nullptr, db_options_->listeners));
descriptor_log_.reset(
new log::Writer(std::move(file_writer), 0, false));
- s = WriteCurrentStateToManifest(curr_state, descriptor_log_.get());
+ s = WriteCurrentStateToManifest(curr_state, descriptor_log_.get(),
+ io_s);
+ } else {
+ s = io_s;
}
}
#endif /* !NDEBUG */
io_s = descriptor_log_->AddRecord(record);
if (!io_s.ok()) {
- io_status_ = io_s;
s = io_s;
break;
}
"VersionSet::ProcessManifestWrites:AfterSyncManifest", &io_s);
}
if (!io_s.ok()) {
- io_status_ = io_s;
s = io_s;
ROCKS_LOG_ERROR(db_options_->info_log, "MANIFEST write %s\n",
s.ToString().c_str());
- } else if (io_status_.IsIOError()) {
- io_status_ = io_s;
}
}
io_s = SetCurrentFile(fs_, dbname_, pending_manifest_file_number_,
db_directory);
if (!io_s.ok()) {
- io_status_ = io_s;
s = io_s;
- } else if (io_status_.IsIOError()) {
- io_status_ = io_s;
}
TEST_SYNC_POINT("VersionSet::ProcessManifestWrites:AfterNewManifest");
}
mu->Lock();
}
+ if (!io_s.ok()) {
+ if (io_status_.ok()) {
+ io_status_ = io_s;
+ }
+ } else if (!io_status_.ok()) {
+ io_status_ = io_s;
+ }
+
// Append the old manifest file to the obsolete_manifest_ list to be deleted
// by PurgeObsoleteFiles later.
if (s.ok() && new_descriptor_log) {
Status VersionSet::WriteCurrentStateToManifest(
const std::unordered_map<uint32_t, MutableCFState>& curr_state,
- log::Writer* log) {
+ log::Writer* log, IOStatus& io_s) {
// TODO: Break up into multiple records to reduce memory usage on recovery?
// WARNING: This method doesn't hold a mutex!!
// LogAndApply. Column family manipulations can only happen within LogAndApply
// (the same single thread), so we're safe to iterate.
+ assert(io_s.ok());
if (db_options_->write_dbid_to_manifest) {
VersionEdit edit_for_db_id;
assert(!db_id_.empty());
return Status::Corruption("Unable to Encode VersionEdit:" +
edit_for_db_id.DebugString(true));
}
- IOStatus io_s = log->AddRecord(db_id_record);
+ io_s = log->AddRecord(db_id_record);
if (!io_s.ok()) {
- io_status_ = io_s;
- return std::move(io_s);
+ return io_s;
}
}
return Status::Corruption(
"Unable to Encode VersionEdit:" + edit.DebugString(true));
}
- IOStatus io_s = log->AddRecord(record);
+ io_s = log->AddRecord(record);
if (!io_s.ok()) {
- io_status_ = io_s;
- return std::move(io_s);
+ return io_s;
}
}
return Status::Corruption(
"Unable to Encode VersionEdit:" + edit.DebugString(true));
}
- IOStatus io_s = log->AddRecord(record);
+ io_s = log->AddRecord(record);
if (!io_s.ok()) {
- io_status_ = io_s;
- return std::move(io_s);
+ return io_s;
}
}
}
static uint64_t GetTotalSstFilesSize(Version* dummy_versions);
// Get the IO Status returned by written Manifest.
- IOStatus io_status() const { return io_status_; }
-
- // Set the IO Status to OK. Called before Manifest write if needed.
- void SetIOStatus(const IOStatus& s) { io_status_ = s; }
+ const IOStatus& io_status() const { return io_status_; }
protected:
using VersionBuilderMap =
// Save current contents to *log
Status WriteCurrentStateToManifest(
const std::unordered_map<uint32_t, MutableCFState>& curr_state,
- log::Writer* log);
+ log::Writer* log, IOStatus& io_s);
void AppendVersion(ColumnFamilyData* column_family_data, Version* v);