Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 52 additions & 16 deletions src/storage/src/redis_hashes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1161,17 +1161,35 @@ Status Redis::HashesRename(const Slice& key, Redis* new_inst, const Slice& newke
return Status::NotFound();
}
// copy a new hash with newkey
auto batch = Batch::CreateBatch(this);
ParsedHashesMetaValue parsed_hashes_meta_value(&meta_value);
statistic = parsed_hashes_meta_value.Count();
s = new_inst->GetDB()->Put(default_write_options_, handles_[kMetaCF], base_meta_newkey.Encode(), meta_value);
new_inst->UpdateSpecificKeyStatistics(DataType::kHashes, newkey.ToString(), statistic);
std::vector<FieldValue> fvs;
uint64_t version = parsed_hashes_meta_value.Version();
HashesDataKey hashes_data_key(key, version, "");
Slice prefix = hashes_data_key.EncodeSeekKey();
KeyStatisticsDurationGuard guard(this, DataType::kHashes, key.ToString());
auto iter = db_->NewIterator(default_read_options_, handles_[kHashesDataCF]);
for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix); iter->Next()) {
ParsedHashesDataKey parsed_hashes_data_key(iter->key());
ParsedBaseDataValue parsed_internal_value(iter->value());
fvs.push_back({parsed_hashes_data_key.field().ToString(), parsed_internal_value.UserValue().ToString()});
}
delete iter;

for (const auto& fv : fvs) {
HashesDataKey new_hashes_data_key(newkey, version, fv.field);
BaseDataValue internal_value(fv.value);
batch->Put(kHashesDataCF, new_hashes_data_key.Encode(), internal_value.Encode());

HashesDataKey old_hashes_data_key(key, version, fv.field);
batch->Delete(kHashesDataCF, old_hashes_data_key.Encode());
}
batch->Put(kMetaCF, base_meta_newkey.Encode(), meta_value);

// HashesDel key
parsed_hashes_meta_value.InitialMetaValue();
s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
UpdateSpecificKeyStatistics(DataType::kHashes, key.ToString(), statistic);
batch->Delete(kMetaCF, base_meta_key.Encode());

return s;
return batch->Commit();
}

Status Redis::HashesRenamenx(const Slice& key, Redis* new_inst, const Slice& newkey) {
Expand All @@ -1194,7 +1212,7 @@ Status Redis::HashesRenamenx(const Slice& key, Redis* new_inst, const Slice& new
if (IsStale(meta_value)) {
return Status::NotFound();
}
ParsedHashesMetaValue parsed_hashes_meta_value(&meta_value);

// check if newkey exists.
std::string new_meta_value;
s = new_inst->GetDB()->Get(default_read_options_, handles_[kMetaCF], base_meta_newkey.Encode(), &new_meta_value);
Expand All @@ -1203,18 +1221,36 @@ Status Redis::HashesRenamenx(const Slice& key, Redis* new_inst, const Slice& new
return Status::Corruption(); // newkey already exists.
}
}
ParsedHashesMetaValue parsed_hashes_new_meta_value(&new_meta_value);
// copy a new hash with newkey
statistic = parsed_hashes_meta_value.Count();
s = new_inst->GetDB()->Put(default_write_options_, handles_[kMetaCF], base_meta_newkey.Encode(), meta_value);
new_inst->UpdateSpecificKeyStatistics(DataType::kHashes, newkey.ToString(), statistic);
auto batch = Batch::CreateBatch(this);
ParsedHashesMetaValue parsed_hashes_meta_value(&meta_value);
std::vector<FieldValue> fvs;
uint64_t version = parsed_hashes_meta_value.Version();
HashesDataKey hashes_data_key(key, version, "");
Slice prefix = hashes_data_key.EncodeSeekKey();
KeyStatisticsDurationGuard guard(this, DataType::kHashes, key.ToString());
auto iter = db_->NewIterator(default_read_options_, handles_[kHashesDataCF]);
for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix); iter->Next()) {
ParsedHashesDataKey parsed_hashes_data_key(iter->key());
ParsedBaseDataValue parsed_internal_value(iter->value());
fvs.push_back({parsed_hashes_data_key.field().ToString(), parsed_internal_value.UserValue().ToString()});
}
delete iter;

for (const auto& fv : fvs) {
HashesDataKey new_hashes_data_key(newkey, version, fv.field);
BaseDataValue internal_value(fv.value);
batch->Put(kHashesDataCF, new_hashes_data_key.Encode(), internal_value.Encode());

HashesDataKey old_hashes_data_key(key, version, fv.field);
batch->Delete(kHashesDataCF, old_hashes_data_key.Encode());
}
batch->Put(kMetaCF, base_meta_newkey.Encode(), meta_value);

// HashesDel key
parsed_hashes_meta_value.InitialMetaValue();
s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
UpdateSpecificKeyStatistics(DataType::kHashes, key.ToString(), statistic);
batch->Delete(kMetaCF, base_meta_key.Encode());

return s;
return batch->Commit();
}

void Redis::ScanHashes() {
Expand Down