Krzysztof Porebski created AMQNET-610:
-----------------------------------------

             Summary: Race condition during consumer creation and shutdown
                 Key: AMQNET-610
                 URL: https://issues.apache.org/jira/browse/AMQNET-610
             Project: ActiveMQ .Net
          Issue Type: Bug
          Components: AMQP, NMS
            Reporter: Krzysztof Porebski


Working on CI I found a race condition that reveals itself on slower machines 
and may result in losing messages by consumers. 

The race condition is a result of treating the creation of consumer resources 
and starting them as an atomic operation:


{code:java}
public async Task Init()
{
    await Session.Connection.CreateResource(Info);
    await Session.Connection.StartResource(Info);
}
{code}

On slower boxes pending message may be delivered to the provider before above 
code returns:


{code:java}
public IMessageConsumer CreateConsumer(IDestination destination, string 
selector, bool noLocal)
{
    CheckClosed();    NmsMessageConsumer messageConsumer = new 
NmsMessageConsumer(consumerIdGenerator.GenerateId(), this, destination, 
selector, noLocal);
    messageConsumer.Init().ConfigureAwait(false).GetAwaiter().GetResult();
// here may be a race condition    
consumers.TryAdd(messageConsumer.Info.Id, messageConsumer);
    
    return messageConsumer;
}
{code}

If message arrives before `Init` returns (which means before newly created 
consumer is added to the list of available consumers), the message will be 
ignored. 


{code:java}
public void OnInboundMessage(InboundMessageDispatch envelope)
{
    if (consumers.TryGetValue(envelope.ConsumerInfo.Id, out NmsMessageConsumer 
messageConsumer))
    {
        messageConsumer.OnInboundMessage(envelope);
    }
}
{code}
 

 

 



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to