We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Yes
在 pika/src/storage/src/redis_sets.cc 下,有一些命令没有对 RocksDB 的状态返回值做判断,包括 SRemCmd, SUnionCmd, SInterCmd, SDiffCmd,以SRem命令举例,这里的 s_ 是 RocksDB 的状态返回值,我们应该对这个进行判断。
pika/src/storage/src/redis_sets.cc
SRemCmd
SUnionCmd
SInterCmd
SDiffCmd
SRem
s_
void SRemCmd::Do(std::shared_ptr<Slot> slot) { s_ = slot->db()->SRem(key_, members_, &deleted_); res_.AppendInteger(deleted_); } void SUnionCmd::Do(std::shared_ptr<Slot> slot) { std::vector<std::string> members; slot->db()->SUnion(keys_, &members); res_.AppendArrayLenUint64(members.size()); for (const auto& member : members) { res_.AppendStringLenUint64(member.size()); res_.AppendContent(member); } } void SInterCmd::Do(std::shared_ptr<Slot> slot) { std::vector<std::string> members; slot->db()->SInter(keys_, &members); res_.AppendArrayLenUint64(members.size()); for (const auto& member : members) { res_.AppendStringLenUint64(member.size()); res_.AppendContent(member); } } void SDiffCmd::Do(std::shared_ptr<Slot> slot) { std::vector<std::string> members; slot->db()->SDiff(keys_, &members); res_.AppendArrayLenUint64(members.size()); for (const auto& member : members) { res_.AppendStringLenUint64(member.size()); res_.AppendContent(member); } }
可以参照在 pika/src/storage/src/redis_zets.cc 下的 ZRem命令代码,这里对 s_ 的返回值进行了判断
pika/src/storage/src/redis_zets.cc
ZRem
void ZRemCmd::Do(std::shared_ptr<Slot> slot) { int32_t count = 0; s_ = slot->db()->ZRem(key_, members_, &count); if (s.ok() || s.IsNotFound()) { AddSlotKey("z", key_, slot); res_.AppendInteger(count); } else { res_.SetRes(CmdRes::kErrOther, s.ToString()); } }
至于状态值怎么判断,我们可以查看一下 stroage 的代码,pika/src/storage/src/redis_sets.cc下,我们以SRem命令举例
stroage
rocksdb::Status RedisSets::SRem(const Slice& key, const std::vector<std::string>& members, int32_t* ret) { *ret = 0; rocksdb::WriteBatch batch; ScopeRecordLock l(lock_mgr_, key); int32_t version = 0; uint32_t statistic = 0; std::string meta_value; rocksdb::Status s = db_->Get(default_read_options_, handles_[0], key, &meta_value); if (s.ok()) { ParsedSetsMetaValue parsed_sets_meta_value(&meta_value); if (parsed_sets_meta_value.IsStale()) { return rocksdb::Status::NotFound("stale"); } else if (parsed_sets_meta_value.count() == 0) { return rocksdb::Status::NotFound(); } else { int32_t cnt = 0; std::string member_value; version = parsed_sets_meta_value.version(); for (const auto& member : members) { SetsMemberKey sets_member_key(key, version, member); s = db_->Get(default_read_options_, handles_[1], sets_member_key.Encode(), &member_value); if (s.ok()) { cnt++; statistic++; batch.Delete(handles_[1], sets_member_key.Encode()); } else if (s.IsNotFound()) { } else { return s; } } *ret = cnt; if (!parsed_sets_meta_value.CheckModifyCount(-cnt)){ return Status::InvalidArgument("set size overflow"); } parsed_sets_meta_value.ModifyCount(-cnt); batch.Put(handles_[0], key, meta_value); } } else if (s.IsNotFound()) { *ret = 0; return rocksdb::Status::NotFound(); } else { return s; // 对于返回状态不OK的值我们应该及时打印出报错 } s = db_->Write(default_write_options_, &batch); UpdateSpecificKeyStatistics(key.ToString(), statistic); return s; }
The text was updated successfully, but these errors were encountered:
我来我来
Sorry, something went wrong.
No branches or pull requests
Is this a regression?
Yes
Description
在
pika/src/storage/src/redis_sets.cc
下,有一些命令没有对 RocksDB 的状态返回值做判断,包括SRemCmd
,SUnionCmd
,SInterCmd
,SDiffCmd
,以SRem
命令举例,这里的s_
是 RocksDB 的状态返回值,我们应该对这个进行判断。可以参照在
pika/src/storage/src/redis_zets.cc
下的ZRem
命令代码,这里对s_
的返回值进行了判断至于状态值怎么判断,我们可以查看一下
stroage
的代码,pika/src/storage/src/redis_sets.cc
下,我们以SRem
命令举例The text was updated successfully, but these errors were encountered: