Quoting David Carter ([EMAIL PROTECTED]): > On Thu, 17 May 2007, Ken Murchison wrote: > > >Here is an untested patch which SHOULD allow the client to abort the > >UPLOAD, with the server successfully accepting the messages transmitted > >up to the abort. > > > >Thoughts? > > I believe that there is a problem with this patch. Sorry that its taken > this long for me to look at it properly. > > A single mailbox event can cover multiple messages, particularly if > sync_client is catching up from a backlog of transactions. Imagine the > second message in a sequence disappearing under sync_client's feet. > > 1) The first message will be replicated correctly. > > 2) The second message will be discarded, which is probably correctly. > > 3) The third (and any subsequent) messages will also be discarded. > > The replica will remain out of sync until the next event on that mailbox. > I think that it is important for sync_client to retry immediately.
Agreed. > Here is a patch against 2.3 CVS. This patch also causes the client and > server to resynchronise from an incomplete UPLOAD command by throwing a > syntax error at the server end. I'm uncomfortable about just dropping off > part way through an UPLOAD and pretending that everything is fine. I finally got time to test this patch and this is what I get with my test case for a single message disappering out from under the sync_client. This particular mailbox is a testbox that gets a number of deliveries directly to folders from our outbound SMTP servers and inbound MX servers. That's what all the APPENDs are about. sync_client[4093]: IOERROR: opening message file 27988 of user.xx_xxxx^com.Sent: No such file or directory sync_client[4093]: UPLOAD received BAD response: Syntax error in Append at item 1: Invalid flags or missing message: sync_client[4093]: Promoting: APPEND user.xx_xxxx^com.Sent -> MAILBOX user.xx_xxxx^com.Sent sync_client[4093]: APPEND user.xx_xxxx^com.^AAA sync_client[4093]: SELECT received response: sync_client[4093]: Promoting: APPEND user.xx_xxxx^com.^AAA -> MAILBOX user.xx_xxxx^com.^AAA sync_client[4093]: APPEND user.xx_xxxx^com.BK sync_client[4093]: Promoting: APPEND user.xx_xxxx^com.BK -> MAILBOX user.xx_xxxx^com.BK sync_client[4093]: APPEND user.xx_xxxx^com.A A sync_client[4093]: Promoting: APPEND user.xx_xxxx^com.A A -> MAILBOX user.xx_xxxx^com.A A sync_client[4093]: APPEND user.xx_xxxx^com.Trash sync_client[4093]: Promoting: APPEND user.xx_xxxx^com.Trash -> MAILBOX user.xx_xxxx^com.Trash sync_client[4093]: APPEND user.xx_xxxx^com sync_client[4093]: Promoting: APPEND user.xx_xxxx^com -> MAILBOX user.xx_xxxx^com sync_client[4093]: SEEN xx_xxxx^com user.xx_xxxx^com.Sent sync_client[4093]: MAILBOX user.xx_xxxx^com.Sent sync_client[4093]: MAILBOX user.xx_xxxx^com.^AAA sync_client[4093]: MAILBOX user.xx_xxxx^com.BK sync_client[4093]: MAILBOX user.xx_xxxx^com.A A sync_client[4093]: MAILBOX user.xx_xxxx^com.Trash sync_client[4093]: MAILBOX user.xx_xxxx^com sync_client[4093]: SELECT received response: sync_client[4093]: CREATE received ** response: 7dcec8343f7f0817 user.xx_xxxx^com.Sent "xx_xxxx.com lrswipkxtecda xxxx lrswipkxtea " 279 87 1 sync_client[4093]: MAILBOXES: Invalid unsolicited response type 1 from server: 010400463ca07d20b8000003 sync_client[4093]: Discarding: 3978 01020044f07eb823c1000000 () sync_client[4093]: Discarding: 3979 01020044f07eb823f4000000 () .... sync_client[4093]: Discarding: 244418 010400463ca07d1743000002 () sync_client[4093]: Discarding: 244575 010400463ca07d1f22000003 () sync_client[4093]: Discarding: Mailboxes finished sync_client[4093]: sync_eatlines_unsolicited(): resynchronised okay sync_client[4093]: MAILBOXES received NO response: Create user.xx_xxxx^com.Sent failed: Mailbox already exists sync_client[4093]: UNLOCK received ** response: 080a358a44ce0fb8 user.xx_xxxx^com.^AAA "xx_xxxx.com lrswipkxtecda xxxx_xxxxxxxx.com lrswi pcda xxxx lrswipkxtea " 244197 1 sync_client[4093]: Error in do_sync(): bailing out! My simple test is adding a sleep(10) in upload_message_work() and logging that we are sleeping. I cause a new message to be appended to the Sent folder. When I see the sleeping log entry I delete the message that was just appended. I applied this patch to my code by line by line inspection of my code and 2.3.8. I can't run stock 2.3.X code unless I set up another sandbox server. Maybe I can do that next week. Maybe I'm still missing something in 2.3.8 that is not in my code but I sure don't see it. > -- > David Carter Email: [EMAIL PROTECTED] > University Computing Service, Phone: (01223) 334502 > New Museums Site, Pembroke Street, Fax: (01223) 334679 > Cambridge UK. CB2 3QH. > Index: imap/sync_client.c > =================================================================== > RCS file: /cvs/src/cyrus/imap/sync_client.c,v > retrieving revision 1.11 > diff -u -r1.11 sync_client.c > --- imap/sync_client.c 18 May 2007 13:24:39 -0000 1.11 > +++ imap/sync_client.c 2 Jul 2007 16:49:55 -0000 > @@ -1132,7 +1132,6 @@ > prot_printf(toserver, " COPY"); > need_body = 0; > } else { > - sync_msgid_add(msgid_onserver, &record->uuid); > prot_printf(toserver, " PARSED"); > need_body = 1; > } > @@ -1177,9 +1176,9 @@ > if (r) { > syslog(LOG_ERR, "IOERROR: opening message file %lu of %s: %m", > record->uid, mailbox->name); > - sync_msgid_remove(msgid_onserver, &record->uuid); > return(IMAP_IOERROR); > } > + sync_msgid_add(msgid_onserver, &record->uuid); > > prot_printf(toserver, " %lu %lu %lu {%lu+}\r\n", > record->header_size, record->content_lines, > @@ -1259,6 +1258,10 @@ > prot_printf(toserver, "\r\n"); > prot_flush(toserver); > > + if (r) { > + sync_parse_code("UPLOAD", fromserver, SYNC_PARSE_EAT_OKLINE, NULL); > + return(r); > + } > r = sync_parse_code("UPLOAD", fromserver, SYNC_PARSE_NOEAT_OKLINE, NULL); > if (r) return(r); > > @@ -1331,6 +1334,10 @@ > prot_printf(toserver, "\r\n"); > prot_flush(toserver); > > + if (r) { > + sync_parse_code("UPLOAD", fromserver, SYNC_PARSE_EAT_OKLINE, NULL); > + return(r); > + } > r = sync_parse_code("UPLOAD", fromserver, SYNC_PARSE_NOEAT_OKLINE, NULL); > if (r) return(r); > > Index: imap/sync_server.c > =================================================================== > RCS file: /cvs/src/cyrus/imap/sync_server.c,v > retrieving revision 1.6 > diff -u -r1.6 sync_server.c > --- imap/sync_server.c 30 May 2007 15:04:12 -0000 1.6 > +++ imap/sync_server.c 2 Jul 2007 16:49:55 -0000 > @@ -1870,7 +1870,7 @@ > switch (msg_type) { > case MSG_SIMPLE: > if (c != ' ') { > - err = "Invalid flags"; > + err = "Invalid flags or missing message"; > goto parse_err; > } > > @@ -1897,9 +1897,8 @@ > break; > case MSG_PARSED: > if (c != ' ') { > - /* Missing message - UPLOAD short-circuited by client */ > - sync_upload_list_remove(upload_list, item); > - goto done; > + err = "Invalid flags or missing message"; > + goto parse_err; > } > > message = sync_message_add(message_list, &item->uuid);