[ 
https://issues.apache.org/jira/browse/THRIFT-4245?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

pirDOL updated THRIFT-4245:
---------------------------
    Description: 
https://github.com/apache/thrift/blob/master/lib/go/thrift/framed_transport.go#L143
if p.transport.Write fails, p.buf will not be truncated, which leads to thrift 
client's memory increasing forever. 

Is it more reasonable to truncate p.buf when write to transport fails?

{code:none}
func (p *TFramedTransport) Flush() error {
        size := p.buf.Len()
        buf := p.buffer[:4]
        binary.BigEndian.PutUint32(buf, uint32(size))
        _, err := p.transport.Write(buf)
        if err != nil {
                return NewTTransportExceptionFromError(err)
        }
        if size > 0 {
                if n, err := p.buf.WriteTo(p.transport); err != nil {
                        print("Error while flushing write buffer of size ", 
size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n")
                        return NewTTransportExceptionFromError(err)
                }
        }
        err = p.transport.Flush()
        return NewTTransportExceptionFromError(err)
}
{code}


  was:
https://github.com/apache/thrift/blob/master/lib/go/thrift/framed_transport.go#L143
if p.transport.Write fails, p.buf will not be truncated, which leads to thrift 
client's memory increasing forever. 

Is it more reasonable to truncate p.buf when write to transport fails?

{code:golang}
func (p *TFramedTransport) Flush() error {
        size := p.buf.Len()
        buf := p.buffer[:4]
        binary.BigEndian.PutUint32(buf, uint32(size))
        _, err := p.transport.Write(buf)
        if err != nil {
                return NewTTransportExceptionFromError(err)
        }
        if size > 0 {
                if n, err := p.buf.WriteTo(p.transport); err != nil {
                        print("Error while flushing write buffer of size ", 
size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n")
                        return NewTTransportExceptionFromError(err)
                }
        }
        err = p.transport.Flush()
        return NewTTransportExceptionFromError(err)
}
{code}



> Golang TFramedTransport's writeBuffer increases if writes to transport failed
> -----------------------------------------------------------------------------
>
>                 Key: THRIFT-4245
>                 URL: https://issues.apache.org/jira/browse/THRIFT-4245
>             Project: Thrift
>          Issue Type: Bug
>            Reporter: pirDOL
>
> https://github.com/apache/thrift/blob/master/lib/go/thrift/framed_transport.go#L143
> if p.transport.Write fails, p.buf will not be truncated, which leads to 
> thrift client's memory increasing forever. 
> Is it more reasonable to truncate p.buf when write to transport fails?
> {code:none}
> func (p *TFramedTransport) Flush() error {
>       size := p.buf.Len()
>       buf := p.buffer[:4]
>       binary.BigEndian.PutUint32(buf, uint32(size))
>       _, err := p.transport.Write(buf)
>       if err != nil {
>               return NewTTransportExceptionFromError(err)
>       }
>       if size > 0 {
>               if n, err := p.buf.WriteTo(p.transport); err != nil {
>                       print("Error while flushing write buffer of size ", 
> size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n")
>                       return NewTTransportExceptionFromError(err)
>               }
>       }
>       err = p.transport.Flush()
>       return NewTTransportExceptionFromError(err)
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to