ifcparse: skip flush+compact for read-only RocksDB on destruction

Read-only handles reject Flush/CompactRange, so the destructor's status
assertion always fired on shutdown when the streamer's sidecar was
opened with read_only=true. Track the flag and skip the write path; also
guard against a null db when the initial open failed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Dion Moult
2026-05-07 10:16:15 +10:00
parent f07afda09c
commit 0bb6df6a6b
2 changed files with 16 additions and 9 deletions
+14 -9
View File
@@ -467,6 +467,7 @@ ifcopenshell::impl::rocks_db_file_storage::rocks_db_file_storage(const std::stri
// @todo by_identity is probably not correct here, this mapping is Name -> Identity, so Fn should have access to full pair? // @todo by_identity is probably not correct here, this mapping is Name -> Identity, so Fn should have access to full pair?
// , byidentity_(&byid_, [this](size_t v) { return assert_existance(v, by_identity); }, [](ifcopenshell::IfcBaseClass* v) { return v->identity(); }) // , byidentity_(&byid_, [this](size_t v) { return assert_existance(v, by_identity); }, [](ifcopenshell::IfcBaseClass* v) { return v->identity(); })
{ {
read_only_ = readonly;
#ifdef IFOPSH_WITH_ROCKSDB #ifdef IFOPSH_WITH_ROCKSDB
wopts.disableWAL = true; wopts.disableWAL = true;
#endif #endif
@@ -475,18 +476,22 @@ ifcopenshell::impl::rocks_db_file_storage::rocks_db_file_storage(const std::stri
ifcopenshell::impl::rocks_db_file_storage::~rocks_db_file_storage() ifcopenshell::impl::rocks_db_file_storage::~rocks_db_file_storage()
{ {
#ifdef IFOPSH_WITH_ROCKSDB #ifdef IFOPSH_WITH_ROCKSDB
rocksdb::FlushOptions flush_options; if (db != nullptr) {
flush_options.allow_write_stall = true; if (!read_only_) {
flush_options.wait = true; // Wait until flush completes. rocksdb::FlushOptions flush_options;
rocksdb::Status s = db->Flush(flush_options); flush_options.allow_write_stall = true;
flush_options.wait = true; // Wait until flush completes.
rocksdb::Status s = db->Flush(flush_options);
// compact entire db // compact entire db
db->CompactRange(rocksdb::CompactRangeOptions{}, nullptr, nullptr); db->CompactRange(rocksdb::CompactRangeOptions{}, nullptr, nullptr);
assert(s.ok()); assert(s.ok());
}
db->Close(); db->Close();
delete db; delete db;
}
#endif #endif
} }
+2
View File
@@ -390,6 +390,8 @@ namespace ifcopenshell {
typedef rocksdb_map_adapter<inverse_attr_record, std::vector<uint32_t>> entities_by_ref_t; typedef rocksdb_map_adapter<inverse_attr_record, std::vector<uint32_t>> entities_by_ref_t;
entities_by_ref_t byref_excl_; entities_by_ref_t byref_excl_;
bool read_only_ = false;
// @todo naming // @todo naming
rocks_db_file_storage(const std::string& path, ifcopenshell::file* owner_file, bool read_only = false); rocks_db_file_storage(const std::string& path, ifcopenshell::file* owner_file, bool read_only = false);
~rocks_db_file_storage(); ~rocks_db_file_storage();