baidu / tera

An Internet-Scale Database.
BSD 3-Clause "New" or "Revised" License
1.89k stars 437 forks source link

SDK发送一个任务给服务器成功后,过了一定时间SDK内部超时管理器认为任务超时,返回错误码给teracli,teracli析构了TableImpl,但是这时服务器把先前的任务又返回了,但是TableImpl已经析构了,就会崩溃是吗? #1321

Closed Lambert-zw closed 6 years ago

Lambert-zw commented 6 years ago

SDK发送一个(put/get)任务给服务器成功后,过了一定时间SDK内部超时管理器认为任务超时,返回错误码给teracli,teracli析构了TableImpl,但是这时服务器把先前的任务又返回了,但是TableImpl已经析构了,就会崩溃是吗?如果会崩溃的话,有什么办法可以避免吗 ? 谢谢。

datonli commented 6 years ago

@NightStarSoul 这个问题我们内部在修了,出core原因是在TableImpl析构之后还有关联的rpc回调未返回,回调发生时会出core。这个问题预计会在github的下下个版本修复。 暂时的避免办法是:给你们程序中调用TableImpl发送请求的地方,增加简单的计数ref,发请求前ref+1,在请求callback中ref-1,只有在ref==0时才允许析构TableImpl和ClientImpl。 感谢反馈!

Lambert-zw commented 6 years ago

嗯 , 好的。感谢, 我们临时这么修改下 。 但是这种改法是保证服务器端没有问题的情况下。假如服务器端的一个异步协议的处理是一个死循环,就是一直不调用 Done方法。这样客户端也跟着卡住了,不像原先可以通过客户端的超时管理来进行处理。 感谢提供解决方案。 希望这个开源项目,越做越好。

datonli commented 6 years ago

服务器端有服务器端的超时处理,不会影响。这个出core的问题是由于sdk 回调调用时tableimpl 资源被析构导致的,临时改法即便最糟糕的等待ref归零时间也是超时时间。

Night notifications@github.com于2018年3月20日 周二09:41写道:

嗯 , 好的。感谢, 我们临时这么修改下 。 但是这种改法是保证服务器端没有问题的情况下。假如服务器端的一个异步协议的处理是一个死循环,就是一直不调用 Done方法。这样客户端也跟着卡住了,不像原先可以通过客户端的超时管理来进行处理。 感谢提供解决方案。 希望这个开源项目,越做越好。

— You are receiving this because you commented.

Reply to this email directly, view it on GitHub https://github.com/baidu/tera/issues/1321#issuecomment-374443305, or mute the thread https://github.com/notifications/unsubscribe-auth/AGdN4-v-R04koNGUgEdLZms5yk5hp7atks5tgF4tgaJpZM4Su27h .

--

With best regards, Datong Li

Lambert-zw commented 6 years ago

好的 ,感谢,了解了 。

datonli commented 6 years ago

新版本已更新,问题已修复