Всем привет.
Натолкнулись на странную проблему в CGP 5.2.19. Пардон за такое длинное письмо. Дано: у нас синхронная постановка в очередь (т.е. Enqueue Asynchronously выключено). И у нас есть helper, который может зависнуть на несколько минут(мы про это знаем, но так бывает). Но потом он просыпается и отвечает ОК. У этого хелпера, соответственно, выставлен большой Time-out.
Вот как выглядит такое входящее к CGP SMTP соединение:
---
<Обычное начало SKIP>
18:08:12.483 5 SMTPI-162105([x.x.x.x]) inp: DATA 18:08:12.483 5 SMTPI-162105([x.x.x.x]) out: 354 Enter mail, end with "." on a line by itself\r\n
<Вот тут хелпер завис на 3 минуты, но потом ответил ОК>
18:11:14.460 2 SMTPI-162105([x.x.x.x]) [251638376] received, 412635 bytes
18:11:14.460 5 SMTPI-162105([x.x.x.x]) out: 250 251638376 message accepted
for delivery\r\n
18:11:14.460 3 SMTPI-162105([x.x.x.x]) read failed. Error Code=connection
closed by peer
<Отвечаем, но отправителя уже нет>
18:11:14.460 4 SMTPI-162105([x.x.x.x]) closing connection
18:11:14.460 4 SMTPI-162105([x.x.x.x]) releasing stream
---
Проблема: в процессе такого ожидания TCP соединение может закрыться или у
отправителя произошёл timeout. Т.е. отправитель уже не видит, что ему
ответили в SMTP диалоге. И следуя RFC-5321:
---
3.8. Terminating Sessions and Connections
...
SMTP clients that experience a connection close, reset, or other
communications failure due to circumstances not under their control
(in violation of the intent of this specification but sometimes
unavoidable) SHOULD, to maintain the robustness of the mail system,
treat the mail transaction as if a 451 response had been received and
act accordingly.
---
Клиентам SMTP, узнавшим о закрытии соединения, сбросе или других
коммуникационных сбоях вследствие неконтролируемых клиентом событий (в
нарушение данной спецификации, иногда неизбежное), для обеспечения
устойчивости почтовой системы следует трактовать почтовую транзакцию, как
при получении отклика 451 и действовать в соответствии с этим.
---
http://www.rfc-archive.org/getrfc.php?rfc=5321
Т.е. клиент будет повторят отправку этого сообщения. И логично было бы предположить, что CGP со своей стороны как сервер, тоже воспримет эту ситуацию как 451 и отвергнет это сообщение, в ожидании повтора от клиента.
Но в логах видна такая ситуация:
---
18:11:14.460 2 QUEUE([251638376]) enqueued 18:11:14.460 2 SMTPI-162105([x.x.x.x]) [251638376] received, 412635 bytes 18:11:14.460 5 SMTPI-162105([x.x.x.x]) out: 250 251638376 message acceptedfor delivery\r\n
Т.е. CGP успешно принял такое сообщение и доставил его. Но клиент этого не знает и повторяет отправку этого же сообщения.
Такое плохое поведение хелпера - это частный случай. Но кажется, что в случае, если клиент "отключился" после DATA, он не узнает что стало с его письмом и повторит отправку. Но CGP это письмо всё же примет и доставит его адресату.
Подскажите, кто не прав и что делать?
=kostik Получено Wed Oct 06 15:14:05 2010
Этот архив был сгенерирован hypermail 2.1.8 : Fri 24 Apr 2015 - 16:17:00 MSK