Skip to content

Memory leak in Receive methods #53

@zemlya25

Description

@zemlya25

Hi, @matrober-uk

I've realized that current implementation of Receive* methods cause memory leakage. It can't be detected with pprof because of CGO
500mb on 100k received message
Little investigation below, Can prepare PR

func (consumer ConsumerImpl) receiveInternal(gmo *ibmmq.MQGMO)
returns TextMessageImpl/BytesMessageImpl with thisMessageHandle *ibmmq.MQMessageHandle

// Include the message properties in the msgHandle gmo.Options |= ibmmq.MQGMO_PROPERTIES_IN_HANDLE cmho := ibmmq.NewMQCMHO() **thisMsgHandle, _ := consumer.ctx.qMgr.CrtMH(cmho)** gmo.MsgHandle = thisMsgHandle ... msg = &TextMessageImpl{ bodyStr: msgBodyStr, MessageImpl: MessageImpl{ mqmd: getmqmd, **msgHandle: &thisMsgHandle,** }, }

and it should be closed/deleted with msgHandle.DltMH(ibmmq.NewMQDMHO()) after message has been processed

`// Delete message handler
func (msg *MessageImpl) CleanMH() jms20subset.JMSException {
if msg.msgHandle == nil {
return jms20subset.CreateJMSException("EmptyMessageHandler", "EmptyMessageHandler", nil)
}

if err := msg.msgHandle.DltMH(ibmmq.NewMQDMHO()); err != nil {
	return jms20subset.CreateJMSException("UnexpectedDeleteMessageHandlerError", "UnexpectedDeleteMessageHandlerError", err)
}

return nil

}
`

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions