[ 
https://issues.apache.org/jira/browse/THRIFT-5460?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17408639#comment-17408639
 ] 

Qu Pingzhe commented on THRIFT-5460:
------------------------------------

I have a simple fix, but I think it is not good.
{code:java}
  void TNonblockingServer::TConnection::checkIdleBufferMemLimit(size_t 
readLimit, size_t writeLimit) {
    if (readLimit > 0 && readBufferSize_ > readLimit) {
      free(readBuffer_);
      readBuffer_ = NULL;
      readBufferSize_ = 0;
    }
+   // largestWriteBufferSize_ now is 0
+   // writeBufferSize_ now is 100M
+   // outputTransport_ has 100M memory
+   if (writeBufferSize_ > largestWriteBufferSize_) {
+       largestWriteBufferSize_ = writeBufferSize_;
+   }
    if (writeLimit > 0 && largestWriteBufferSize_ > writeLimit) {
      // just start over
      
outputTransport_->resetBuffer(static_cast<uint32_t>(server_->getWriteBufferDefaultSize()));
      largestWriteBufferSize_ = 0;
    }
  }
{code}

> TConnection not resetBuffer in outputTransport when socket write failed
> -----------------------------------------------------------------------
>
>                 Key: THRIFT-5460
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5460
>             Project: Thrift
>          Issue Type: Improvement
>          Components: C++ - Library
>    Affects Versions: 0.13.0
>            Reporter: Qu Pingzhe
>            Priority: Minor
>         Attachments: oom-activity.png
>
>
> I am not sure if it is a bug. And may affect versions long ago.
>  * My Server is cpp.TNonblockingServer
>  * Return 100M data in one rpc
>  # client send rpc to server
>  # server recevie by thread0, then write 100M data to socket
>  # client read timeout, then retry and use another socket
>  # server recevie by thread1, then write new 100M data to new socket
>  #  ...
>  # every thread has 100M data, then server is killed by OOM
>  
> {code:java}
> void TNonblockingServer::TConnection::checkIdleBufferMemLimit(size_t 
> readLimit, size_t writeLimit) {
>   if (readLimit > 0 && readBufferSize_ > readLimit) {
>     free(readBuffer_);
>     readBuffer_ = nullptr;
>     readBufferSize_ = 0;
>   }  if (writeLimit > 0 && largestWriteBufferSize_ > writeLimit) { // this 
> line
>     // just start over
>     
> outputTransport_->resetBuffer(static_cast<uint32_t>(server_->getWriteBufferDefaultSize()));
>     largestWriteBufferSize_ = 0;
>   }
> }{code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to