// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #include "utilities/cassandra/cassandra_compaction_filter.h" #include #include "rocksdb/slice.h" #include "utilities/cassandra/format.h" namespace ROCKSDB_NAMESPACE { namespace cassandra { const char* CassandraCompactionFilter::Name() const { return "CassandraCompactionFilter"; } CompactionFilter::Decision CassandraCompactionFilter::FilterV2( int /*level*/, const Slice& /*key*/, ValueType value_type, const Slice& existing_value, std::string* new_value, std::string* /*skip_until*/) const { bool value_changed = false; RowValue row_value = RowValue::Deserialize( existing_value.data(), existing_value.size()); RowValue compacted = purge_ttl_on_expiration_ ? row_value.RemoveExpiredColumns(&value_changed) : row_value.ConvertExpiredColumnsToTombstones(&value_changed); if (value_type == ValueType::kValue) { compacted = compacted.RemoveTombstones(gc_grace_period_in_seconds_); } if(compacted.Empty()) { return Decision::kRemove; } if (value_changed) { compacted.Serialize(new_value); return Decision::kChangeValue; } return Decision::kKeep; } } // namespace cassandra } // namespace ROCKSDB_NAMESPACE