The AMQP port has the limit of maximum open connections. But this limit is not checked correctly. The AMQP port has two methods AmqpPort::canAcceptNewConnection and AmqpPort::incrementConnectionCount.
Suppose that the port has the limit 5 connection and clients open 7 connections at the same time:
- 7 parallel connections is open by IO-threads.
- All threads call the AmqpPort::canAcceptNewConnection method and every thread receive the positive answer because any connection has not been registered yet.
- All threads call the AmqpPort::incrementConnectionCount methods. Hence the connection count is increased to 7 what breaks the limits.
- All 7 connections are accepted in spite of breaking limit.
The every thread can see the intermediate state of the counter when the limit is checked by another thread but the counter has not been incremented yet.
The solution is the combination of the steps 'check' and 'increment' into single atomic operation when every thread has the exclusive access to the counter. The counter can be observed only in two states: 'before check' or 'after incrementation'.