Skip to content

Commit dfdb385

Browse files
committed
support recycle expired in compact
1 parent f0fe717 commit dfdb385

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

src/storage/compact_filter.cc

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "db_util.h"
2929
#include "time_util.h"
3030
#include "types/redis_bitmap.h"
31+
#include "types/redis_hash.h"
3132

3233
namespace engine {
3334

@@ -131,7 +132,9 @@ bool SubKeyFilter::Filter(int level, const Slice &key, const Slice &value, std::
131132
return false;
132133
}
133134

134-
return IsMetadataExpired(ikey, metadata) || (metadata.Type() == kRedisBitmap && redis::Bitmap::IsEmptySegment(value));
135+
return IsMetadataExpired(ikey, metadata) ||
136+
(metadata.Type() == kRedisBitmap && redis::Bitmap::IsEmptySegment(value)) ||
137+
(metadata.Type() == kRedisHash && redis::Hash::IsExpiredField(metadata, value));
135138
}
136139

137140
} // namespace engine

src/types/redis_hash.cc

+10
Original file line numberDiff line numberDiff line change
@@ -636,6 +636,16 @@ rocksdb::Status Hash::TTLFields(const Slice &user_key, const std::vector<Slice>
636636
return rocksdb::Status::OK();
637637
}
638638

639+
bool Hash::IsExpiredField(Metadata &metadata, const Slice &value) {
640+
if (!(static_cast<HashMetadata*>(&metadata))->IsEncodedFieldExpire()) {
641+
return false;
642+
}
643+
uint64_t expire = 0;
644+
rocksdb::Slice data(value);
645+
GetFixed64(&data, &expire);
646+
return expire != 0 && expire < util::GetTimeStampMS();
647+
}
648+
639649
rocksdb::Status Hash::decodeFieldValue(const HashMetadata &metadata, std::string *value, uint64_t &expire) {
640650
if (!metadata.IsEncodedFieldExpire()) {
641651
return rocksdb::Status::OK();

src/types/redis_hash.h

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class Hash : public SubKeyScanner {
6868
rocksdb::Status ExpireFields(const Slice &user_key, uint64_t expire_ms, const std::vector<Slice> &fields,
6969
HashFieldExpireType type, bool is_persist, std::vector<int8_t> *ret);
7070
rocksdb::Status TTLFields(const Slice &user_key, const std::vector<Slice> &fields, std::vector<int64_t> *ret);
71+
static bool IsExpiredField(Metadata &metadata, const Slice &value);
7172

7273
private:
7374
rocksdb::Status GetMetadata(Database::GetOptions get_options, const Slice &ns_key, HashMetadata *metadata);

0 commit comments

Comments
 (0)