mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-19 06:39:13 +00:00
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:
+14
-9
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user