fix: cache layer crash and data confusion - #2217
Conversation
|
出现了一个问题, 在我本地用 debug 模式编译的二进制可以通过测试, 使用release模式编译后, zset 类型的测试出错 出现的问题是 从缓存读取的数据 全是0 在这里加log 打印出来的数据是正常的, 再往里会调用到 然后所有 zset 类型的读取缓存, 读到的 怀疑的点 使用release 编译时, 由于 gcc的优化, 导致了写入出错了, 但是 在调用 |
| ////PttlCmd | ||
| std::unique_ptr<Cmd> pttlptr = | ||
| std::make_unique<PttlCmd>(kCmdNamePttl, 2, kCmdFlagsRead | kCmdFlagsSingleSlot | kCmdFlagsKv | kCmdFlagsDoThroughDB | kCmdFlagsReadCache); | ||
| std::make_unique<PttlCmd>(kCmdNamePttl, 2, kCmdFlagsRead | kCmdFlagsSingleSlot | kCmdFlagsKeySpace|kCmdFlagsFast | kCmdFlagsDoThroughDB | kCmdFlagsReadCache); |
There was a problem hiding this comment.
这里为啥要写 kCmdFlagsKeySpace,执行 KeySpace这个命令是非常耗时的,kCmdFlagsFast和slow这俩应该是快慢分离用的吧,当前的代码应该没有用 到
There was a problem hiding this comment.
这个是参考 redis的分类做的, 所有和操作key相关的命令都是keyspace的 比如 del, ttl 等等
kCmdFlagsFast 这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改
There was a problem hiding this comment.
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了这段代码是从ACL分支里复制出来的, 然后做了一点修改
redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
There was a problem hiding this comment.
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
那我们就要为 这个操作 key 的命令单独加一个 分类了, 但是我建议还是 把 操作key的分为 keyspace 这样 ACL里也能和redis保持同步, 因为ACL里有 根据 命令分类划分权限的功能. 以前在 pika里 操作 key的命令 被划分到 kCmdFlagsKv 里, 这样就带来一个问题, 操作key的命令 和 操作 string类型的命令 混在一起了, 没法做权限区分, 在缓存这里也有问题,
如果我再配置里 没有开 string 类型的缓存, 那么 del 命令就不能操作 缓存了, 这样就会带了 缓存 数据 的错误, 我之前测试的时候, 就是因为 string 类型的 缓存没开, 导致 在 使用 del 命令的时候, 没有删除缓存的数据, 造成的buff测试不通过
There was a problem hiding this comment.
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
那我们就要为 这个操作 key 的命令单独加一个 分类了, 但是我建议还是 把 操作key的分为
keyspace这样 ACL里也能和redis保持同步, 因为ACL里有 根据 命令分类划分权限的功能. 以前在 pika里 操作 key的命令 被划分到kCmdFlagsKv里, 这样就带来一个问题, 操作key的命令 和 操作 string类型的命令 混在一起了, 没法做权限区分, 在缓存这里也有问题, 如果我再配置里 没有开 string 类型的缓存, 那么 del 命令就不能操作 缓存了, 这样就会带了 缓存 数据 的错误, 我之前测试的时候, 就是因为 string 类型的 缓存没开, 导致 在 使用del命令的时候, 没有删除缓存的数据, 造成的buff测试不通过
这里我感觉宁可不做这个缓存 或者这个ACL也不能说给pika的性能 带来负担,redis的方案不适合pika的 话我感觉就需要做一下权衡,一味带进去可能keyspace一次 pika遭不住
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
那我们就要为 这个操作 key 的命令单独加一个 分类了, 但是我建议还是 把 操作key的分为
keyspace这样 ACL里也能和redis保持同步, 因为ACL里有 根据 命令分类划分权限的功能. 以前在 pika里 操作 key的命令 被划分到kCmdFlagsKv里, 这样就带来一个问题, 操作key的命令 和 操作 string类型的命令 混在一起了, 没法做权限区分, 在缓存这里也有问题, 如果我再配置里 没有开 string 类型的缓存, 那么 del 命令就不能操作 缓存了, 这样就会带了 缓存 数据 的错误, 我之前测试的时候, 就是因为 string 类型的 缓存没开, 导致 在 使用del命令的时候, 没有删除缓存的数据, 造成的buff测试不通过
那我理解 哪怕不做ACL或者不做这个命令的cache,也不能搞进去把集群性能影响了,适合redis的不一定 pika
There was a problem hiding this comment.
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
那我们就要为 这个操作 key 的命令单独加一个 分类了, 但是我建议还是 把 操作key的分为
keyspace这样 ACL里也能和redis保持同步, 因为ACL里有 根据 命令分类划分权限的功能. 以前在 pika里 操作 key的命令 被划分到kCmdFlagsKv里, 这样就带来一个问题, 操作key的命令 和 操作 string类型的命令 混在一起了, 没法做权限区分, 在缓存这里也有问题, 如果我再配置里 没有开 string 类型的缓存, 那么 del 命令就不能操作 缓存了, 这样就会带了 缓存 数据 的错误, 我之前测试的时候, 就是因为 string 类型的 缓存没开, 导致 在 使用del命令的时候, 没有删除缓存的数据, 造成的buff测试不通过这里我感觉宁可不做这个缓存 或者这个ACL也不能说给pika的性能 带来负担,redis的方案不适合pika的 话我感觉就需要做一下权衡,一味带进去可能keyspace一次 pika遭不住
这个是参考 redis的分类做的, 所有和操作key相关的命令都是
keyspace的 比如del,ttl等等
kCmdFlagsFast这个是用在 ACL里做 快慢 分类的, 因为我不想再重新弄一次 解冲突, 就把 ACL里相关的带到这里了
这段代码是从ACL分支里复制出来的, 然后做了一点修改redis是内存的,查内存没关系,但是pika是磁盘的 ,keyspace意味着查磁盘,这里不能带这个
那我们就要为 这个操作 key 的命令单独加一个 分类了, 但是我建议还是 把 操作key的分为
keyspace这样 ACL里也能和redis保持同步, 因为ACL里有 根据 命令分类划分权限的功能. 以前在 pika里 操作 key的命令 被划分到kCmdFlagsKv里, 这样就带来一个问题, 操作key的命令 和 操作 string类型的命令 混在一起了, 没法做权限区分, 在缓存这里也有问题, 如果我再配置里 没有开 string 类型的缓存, 那么 del 命令就不能操作 缓存了, 这样就会带了 缓存 数据 的错误, 我之前测试的时候, 就是因为 string 类型的 缓存没开, 导致 在 使用del命令的时候, 没有删除缓存的数据, 造成的buff测试不通过那我理解 哪怕不做ACL或者不做这个命令的cache,也不能搞进去把集群性能影响了,适合redis的不一定 pika
我刚看了一下 以前没有 keyspace 这个flag和这个分类 只是在 命令里加一个 flag 应该不会影响到 集群吧
| std::string key; | ||
| std::shared_ptr<Slot> slot; | ||
| net::DispatchThread* dispatchThread{ nullptr }; | ||
| net::DispatchThread* dispatchThread{nullptr}; |
There was a problem hiding this comment.
这个文件我怕后面冲突太多, 没敢format, 我想的是 这个等后面 这几个大的pr合并了, 统一做一次formart吧, 现formart 冲突带代码太多了
| void Initial(const PikaCmdArgsType& argv, const std::string& db_name); | ||
|
|
||
| uint32_t flag() const; | ||
| bool hasFlag(uint32_t flag) const; |
There was a problem hiding this comment.
这个是我加的, 但是现在的写法里都没用, 后面我看一下 是改一下现在的代码 还是 把这两个函数删了
# Conflicts: # include/pika_command.h # src/pika_command.cc
* fix cache layer crash and data confusion * Delete the ACL flag and unused flags * Modify the rediscache cmake parameter
* fix cache layer crash and data confusion * Delete the ACL flag and unused flags * Modify the rediscache cmake parameter
* fix cache layer crash and data confusion * Delete the ACL flag and unused flags * Modify the rediscache cmake parameter




fix:#2216 修复因为flag计算错误,导致的部分命令缓存没有生效问题
修复 zset类型缓存读取错误和空指针崩溃问题