From 434c02cdfa3da35bd86f49a9ce345baef137e702 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Dziepak?= Date: Wed, 13 Jan 2016 10:04:42 +0100 Subject: [PATCH] commitlog: keep track of schema versions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Each segment chunk should contain column mappings for all schema versions used by the mutations it contains. In order to avoid duplication db::commitlog::segment remembers all schema versions already written in current chunk. Signed-off-by: Paweł Dziepak --- db/commitlog/commitlog.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/db/commitlog/commitlog.cc b/db/commitlog/commitlog.cc index c30e7033e4..7055235336 100644 --- a/db/commitlog/commitlog.cc +++ b/db/commitlog/commitlog.cc @@ -342,6 +342,8 @@ class db::commitlog::segment: public enable_lw_shared_from_this { time_point _sync_time; seastar::gate _gate; + std::unordered_set _known_schema_versions; + friend std::ostream& operator<<(std::ostream&, const segment&); friend class segment_manager; public: @@ -383,6 +385,16 @@ public: } } + bool is_schema_version_known(schema_ptr s) { + return _known_schema_versions.count(s->version()); + } + void add_schema_version(schema_ptr s) { + _known_schema_versions.emplace(s->version()); + } + void forget_schema_versions() { + _known_schema_versions.clear(); + } + bool must_sync() { if (_segment_manager->cfg.mode == sync_mode::BATCH) { return true; @@ -545,6 +557,8 @@ public: out.write(uint32_t(_file_pos)); out.write(crc.checksum()); + forget_schema_versions(); + // acquire read lock return _dwrite.read_lock().then([this, size, off, buf = std::move(buf), me]() mutable { auto written = make_lw_shared(0);