The worst scenario: everything stuck and not accepting new mail:
I already described how it happens to have the ougoing spool locked and every outgoing thread waiting to obtain the lock.
Now I experienced something worse and I think I got why:
I have 10 spool threads, 10 smtp workers.
I have 9 email in the spool to be remotly delivered.
9 of the 10 spool threads lock the 9 emails from the spool and start waiting to lock the outgoing repository.
The 10th spool threads start an infinite loop over the accept of the main spool because it find 9 mails, but it can't lock them because are being processed by the other threads, so it keeps an infinite lock over the main spool.(this happen because the loadPendingMessages take more than 1 second maybe because the server is already stressing the db with the outgoing thread looping into the accpet)
The first 10 incoming smtp connections will stuck trying to acquire the lock on the main spool to store the messages and you are under DOS.
I clearly remember user reports in the mailing list in the past months/years reporting similar scenario and maybe we finally found the problem.
So this bug also affect the main spool even if it is more rare because mails in the main spool are always acceptable if they are not locked and this happens only when all the available messages are locked and the accept query takes more than 1 second: but it happens because I saw it and I have the thread dump if anyone want to look at it.