Skip to content
New issue

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

Get()长字符串出错 #40

Open
xiaozhisky1 opened this issue Feb 22, 2024 · 7 comments
Open

Get()长字符串出错 #40

xiaozhisky1 opened this issue Feb 22, 2024 · 7 comments
Labels
bug Something isn't working

Comments

@xiaozhisky1
Copy link

raft调试
这里没有使用跳表,而是将文件数据读取为字符串后进行传输。图片中是服务端的日志,一旦读取完数据进行传输就会提示is not leader,还有很长一段跟上图同样的日志信息,最终客户端等待长时间后会提示栈溢出。但是Put()该文件却能成功执行,不太清楚原因。

Copy link

Message that will be displayed on users' first issue

@578223592 578223592 added the bug Something isn't working label Feb 22, 2024
@578223592
Copy link
Collaborator

578223592 commented Feb 22, 2024

@xiaozhisky1

  1. 如果是小文件的话会复现这个问题吗?
  2. 方便给我最小复现的改动或者你的改动github分支链接吗?

@xiaozhisky1
Copy link
Author

  1. 小文件不会出错
  2. https://github.com/xiaozhisky1/Raft-KVServer/tree/main
    只改了caller.cpp util.cpp kvServer.cpp中的ExecuteGetOpOnKVDB()

@578223592
Copy link
Collaborator

578223592 commented Feb 24, 2024

@xiaozhisky1
还没有经过仔细分析,我的考虑是客户端因为栈崩溃导致了后续无法正确进行。

如果客户端没有栈崩溃,那么结果应该是可以成功的,就和 小文件的表现一样。

我认为你也可以尝试下如下操作,这可能会简化后续分析:
原始分支不改动任何代码的基础的基础上,尝试一次get 和put 很小的字符串(如上面图片),然后用跳表 put和get value很大的string看下是否会有问题(大文件等价于大string)。

感谢反馈,最近两周可能没有时间,后面我会仔细分析一下。

忽略如下内容:


可能的原因:

  • 大文件时候客户端栈崩溃,分析为何崩溃

@xiaozhisky1
Copy link
Author

目前出的推测的原因是:
在服务器端读取大文件时,会占用进程大量的时间从而耽误了心跳,使得当前的learder变成了follower,因此会返回给客户端ErrWrongLeader错误;客户端收到错误会重复发送get请求,但由于此时正在进行选举,因此会打印出大量的is not leader日志,直到新的leader出现并重复上面的过程,最终客户端在收到大量用于回复ErrWrongLeaderde RPC之后栈满了。而PutAppend对数据的保存工作是在线程中执行的,主线程只是负责回复客户端一些简短的错误信息,因此Put大文件没问题。
可能可行的解决方法是:
将对Get操作的处理放到线程中,这样才能不耽误心跳。
(本人菜鸟一枚,还在尝试具体的实现方法)

@xiaozhisky1
Copy link
Author

https://github.com/xiaozhisky1/Raft-KVServer/tree/main
目前基本解决该Bug:主要是将RPC的发送和接收都切分成1024B的单位循环发送和接收,并将对Get的处理以及回调函数放入线程中执行;但对于MB为单位的文件由于读取文件时为了确保一致性采用了互斥锁,因此会耽误心跳,但可以不管那么多把锁注释掉或者增加心跳时长来解决。

@578223592
Copy link
Collaborator

https://github.com/xiaozhisky1/Raft-KVServer/tree/main 目前基本解决该Bug:主要是将RPC的发送和接收都切分成1024B的单位循环发送和接收,并将对Get的处理以及回调函数放入线程中执行;但对于MB为单位的文件由于读取文件时为了确保一致性采用了互斥锁,因此会耽误心跳,但可以不管那么多把锁注释掉或者增加心跳时长来解决。

这两天我看一看

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants