[ 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)