CORRECT PATCH Re: sync_client bails when encountering a deleted message

Ken Murchison murch at andrew.cmu.edu
Wed May 16 09:39:07 EDT 2007


John Capo wrote:
> Quoting John Capo (jc at irbs.com):
>> Quoting Ken Murchison (murch at andrew.cmu.edu):
>>> I don't think I was clear.  With my proposal, we're well past "UPDATE".  I'm talking about cutting the command short after "(<flags>)".  No header_size or anything after.
>> I guess I don't understand what you mean.
>>
>> It sure looks to me like cmd_upload() has to detect that the header
>> size it is waiting for will not arrive and recover gracefully rather
>> than sending a BAD that the client sees as the response for its
>> next command.  Patch attached.
> 
> The server needs to push the character back except on EOF, grrrr.

Here's what I was thinking.  We might be able to bump the cache flush 
down to parse_err, but I'm not sure if this is correct/suboptimal for 
SIMPLE.


Index: sync_client.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/sync_client.c,v
retrieving revision 1.10
diff -u -r1.10 sync_client.c
--- sync_client.c       7 May 2007 16:23:21 -0000       1.10
+++ sync_client.c       16 May 2007 13:37:06 -0000
@@ -1177,6 +1177,9 @@
          if (r) {
              syslog(LOG_ERR, "IOERROR: opening message file %lu of %s: %m",
                     record->uid, mailbox->name);
+           prot_printf(toserver,"\r\n");  /* Abort command */
+           prot_flush(toserver);
+           sync_messageid_remove(msgid_onserver, &record->uuid);
              return(IMAP_IOERROR);
          }

Index: sync_server.c
===================================================================
RCS file: /afs/andrew/system/cvs/src/cyrus/imap/sync_server.c,v
retrieving revision 1.4
diff -u -r1.4 sync_server.c
--- sync_server.c       4 Apr 2007 15:22:42 -0000       1.4
+++ sync_server.c       16 May 2007 13:37:06 -0000
@@ -1889,7 +1889,10 @@
              break;
          case MSG_PARSED:
              if (c != ' ') {
-                err = "Invalid flags";
+               /* Make sure cache data flushed to disk before we commit */
+               sync_message_fsync(message_list);
+               sync_message_list_cache_flush(message_list);
+                err = "Invalid flags (UPLOAD aborted?)";
                  goto parse_err;
              }

-- 
Kenneth Murchison
Systems Programmer
Project Cyrus Developer/Maintainer
Carnegie Mellon University


More information about the Cyrus-devel mailing list