Skip to content

Commit 08bf0b5

Browse files
authored
fix: sets rename and renamenx command (#192)
2 parents b139ee4 + a57b162 commit 08bf0b5

File tree

1 file changed

+72
-14
lines changed

1 file changed

+72
-14
lines changed

src/storage/src/redis_sets.cc

Lines changed: 72 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,17 +1261,46 @@ Status Redis::SetsRename(const Slice& key, Redis* new_inst, const Slice& newkey)
12611261
} else if (parsed_sets_meta_value.Count() == 0) {
12621262
return rocksdb::Status::NotFound();
12631263
}
1264+
1265+
// query members
1266+
uint64_t version = 0;
1267+
std::vector<std::string> members;
1268+
version = parsed_sets_meta_value.Version();
1269+
SetsMemberKey sets_member_key(key, version, Slice());
1270+
Slice prefix = sets_member_key.EncodeSeekKey();
1271+
KeyStatisticsDurationGuard guard(this, DataType::kSets, newkey.ToString());
1272+
auto iter = db_->NewIterator(default_read_options_, handles_[kSetsDataCF]);
1273+
for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix); iter->Next()) {
1274+
ParsedSetsMemberKey parsed_sets_member_key(iter->key());
1275+
members.push_back(parsed_sets_member_key.member().ToString());
1276+
}
1277+
delete iter;
1278+
12641279
// copy a new set with newkey
1265-
statistic = parsed_sets_meta_value.Count();
1266-
s = new_inst->GetDB()->Put(default_write_options_, handles_[kMetaCF], base_meta_newkey.Encode(), meta_value);
1267-
new_inst->UpdateSpecificKeyStatistics(DataType::kSets, newkey.ToString(), statistic);
1280+
auto batch = Batch::CreateBatch(this);
1281+
batch->Put(kMetaCF, base_meta_newkey.Encode(), meta_value);
1282+
1283+
// insert newkey datacf
1284+
1285+
for (const auto& member : members) {
1286+
SetsMemberKey new_sets_member_key(newkey, version, member);
1287+
BaseDataValue iter_value(Slice{});
1288+
batch->Put(kSetsDataCF, new_sets_member_key.Encode(), iter_value.Encode());
1289+
}
12681290

12691291
// SetsDel key
1270-
parsed_sets_meta_value.InitialMetaValue();
1271-
s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1272-
UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1292+
// parsed_sets_meta_value.InitialMetaValue();
1293+
// s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1294+
// UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1295+
batch->Delete(kMetaCF, base_meta_key.Encode());
12731296

1274-
return s;
1297+
// SetsDel data
1298+
for (const auto& member : members) {
1299+
SetsMemberKey base_sets_member_key(key, version, member);
1300+
batch->Delete(kSetsDataCF, base_sets_member_key.Encode());
1301+
}
1302+
1303+
return batch->Commit();
12751304
}
12761305

12771306
Status Redis::SetsRenamenx(const Slice& key, Redis* new_inst, const Slice& newkey) {
@@ -1307,16 +1336,45 @@ Status Redis::SetsRenamenx(const Slice& key, Redis* new_inst, const Slice& newke
13071336
}
13081337

13091338
// copy a new set with newkey
1310-
statistic = parsed_sets_meta_value.Count();
1311-
s = new_inst->GetDB()->Put(default_write_options_, handles_[kMetaCF], base_meta_newkey.Encode(), meta_value);
1312-
new_inst->UpdateSpecificKeyStatistics(DataType::kSets, newkey.ToString(), statistic);
1339+
// query members
1340+
uint64_t version = 0;
1341+
std::vector<std::string> members;
1342+
version = parsed_sets_meta_value.Version();
1343+
SetsMemberKey sets_member_key(key, version, Slice());
1344+
Slice prefix = sets_member_key.EncodeSeekKey();
1345+
KeyStatisticsDurationGuard guard(this, DataType::kSets, newkey.ToString());
1346+
auto iter = db_->NewIterator(default_read_options_, handles_[kSetsDataCF]);
1347+
for (iter->Seek(prefix); iter->Valid() && iter->key().starts_with(prefix); iter->Next()) {
1348+
ParsedSetsMemberKey parsed_sets_member_key(iter->key());
1349+
members.push_back(parsed_sets_member_key.member().ToString());
1350+
}
1351+
delete iter;
1352+
1353+
// copy a new set with newkey
1354+
auto batch = Batch::CreateBatch(this);
1355+
batch->Put(kMetaCF, base_meta_newkey.Encode(), meta_value);
1356+
1357+
// insert newkey datacf
1358+
1359+
for (const auto& member : members) {
1360+
SetsMemberKey new_sets_member_key(newkey, version, member);
1361+
BaseDataValue iter_value(Slice{});
1362+
batch->Put(kSetsDataCF, new_sets_member_key.Encode(), iter_value.Encode());
1363+
}
13131364

13141365
// SetsDel key
1315-
parsed_sets_meta_value.InitialMetaValue();
1316-
s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1317-
UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1366+
// parsed_sets_meta_value.InitialMetaValue();
1367+
// s = db_->Put(default_write_options_, handles_[kMetaCF], base_meta_key.Encode(), meta_value);
1368+
// UpdateSpecificKeyStatistics(DataType::kSets, key.ToString(), statistic);
1369+
batch->Delete(kMetaCF, base_meta_key.Encode());
13181370

1319-
return s;
1371+
// SetsDel data
1372+
for (const auto& member : members) {
1373+
SetsMemberKey base_sets_member_key(key, version, member);
1374+
batch->Delete(kSetsDataCF, base_sets_member_key.Encode());
1375+
}
1376+
1377+
return batch->Commit();
13201378
}
13211379

13221380
void Redis::ScanSets() {

0 commit comments

Comments
 (0)