i_assert(brain->box != NULL);
- if (brain->require_full_resync) {
- brain->mailbox_state.last_uidvalidity = 0;
- brain->require_full_resync = FALSE;
- }
array_append(&brain->remote_mailbox_states, &brain->mailbox_state, 1);
if (brain->box_exporter != NULL) {
const char *errstr;
{
const char *error;
enum mail_error mail_error;
+ bool require_full_resync;
enum dsync_ibc_recv_ret ret;
if (!brain->master_brain) {
dsync_ibc_send_finish(brain->ibc,
brain->failed ? "dsync failed" : NULL,
- brain->mail_error);
+ brain->mail_error,
+ brain->require_full_resync);
brain->state = DSYNC_STATE_DONE;
return TRUE;
}
- ret = dsync_ibc_recv_finish(brain->ibc, &error, &mail_error);
+ ret = dsync_ibc_recv_finish(brain->ibc, &error, &mail_error,
+ &require_full_resync);
if (ret == DSYNC_IBC_RECV_RET_TRYAGAIN)
return FALSE;
if (error != NULL) {
(brain->mail_error == 0 || brain->mail_error == MAIL_ERROR_TEMP))
brain->mail_error = mail_error;
}
+ if (require_full_resync)
+ brain->require_full_resync = TRUE;
brain->state = DSYNC_STATE_DONE;
return TRUE;
}
struct {
const char *error;
enum mail_error mail_error;
+ bool require_full_resync;
} finish;
} u;
};
static void
dsync_ibc_pipe_send_finish(struct dsync_ibc *ibc, const char *error,
- enum mail_error mail_error)
+ enum mail_error mail_error,
+ bool require_full_resync)
{
struct dsync_ibc_pipe *pipe = (struct dsync_ibc_pipe *)ibc;
struct item *item;
item = dsync_ibc_pipe_push_item(pipe->remote, ITEM_FINISH);
item->u.finish.error = p_strdup(item->pool, error);
item->u.finish.mail_error = mail_error;
+ item->u.finish.require_full_resync = require_full_resync;
}
static enum dsync_ibc_recv_ret
dsync_ibc_pipe_recv_finish(struct dsync_ibc *ibc, const char **error_r,
- enum mail_error *mail_error_r)
+ enum mail_error *mail_error_r,
+ bool *require_full_resync_r)
{
struct dsync_ibc_pipe *pipe = (struct dsync_ibc_pipe *)ibc;
struct item *item;
*error_r = item->u.finish.error;
*mail_error_r = item->u.finish.mail_error;
+ *require_full_resync_r = item->u.finish.require_full_resync;
return DSYNC_IBC_RECV_RET_OK;
}
struct dsync_mail **mail_r);
void (*send_finish)(struct dsync_ibc *ibc, const char *error,
- enum mail_error mail_error);
+ enum mail_error mail_error,
+ bool require_full_resync);
enum dsync_ibc_recv_ret
(*recv_finish)(struct dsync_ibc *ibc, const char **error_r,
- enum mail_error *mail_error_r);
+ enum mail_error *mail_error_r,
+ bool *require_full_resync_r);
void (*close_mail_streams)(struct dsync_ibc *ibc);
bool (*is_send_queue_full)(struct dsync_ibc *ibc);
},
{ .name = "finish",
.chr = 'F',
- .optional_keys = "error mail_error",
+ .optional_keys = "error mail_error require_full_resync",
.min_minor_version = DSYNC_PROTOCOL_MINOR_HAVE_FINISH
},
{ .name = "mailbox_cache_field",
static void
dsync_ibc_stream_send_finish(struct dsync_ibc *_ibc, const char *error,
- enum mail_error mail_error)
+ enum mail_error mail_error,
+ bool require_full_resync)
{
struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
struct dsync_serializer_encoder *encoder;
dsync_serializer_encode_add(encoder, "mail_error",
dec2str(mail_error));
}
+ if (require_full_resync)
+ dsync_serializer_encode_add(encoder, "require_full_resync", "");
dsync_serializer_encode_finish(&encoder, str);
dsync_ibc_stream_send_string(ibc, str);
}
static enum dsync_ibc_recv_ret
dsync_ibc_stream_recv_finish(struct dsync_ibc *_ibc, const char **error_r,
- enum mail_error *mail_error_r)
+ enum mail_error *mail_error_r,
+ bool *require_full_resync_r)
{
struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc;
struct dsync_deserializer_decoder *decoder;
*error_r = NULL;
*mail_error_r = 0;
+ *require_full_resync_r = FALSE;
p_clear(ibc->ret_pool);
dsync_ibc_input_error(ibc, decoder, "Invalid mail_error");
return DSYNC_IBC_RECV_RET_TRYAGAIN;
}
+ if (dsync_deserializer_decode_try(decoder, "require_full_resync", &value))
+ *require_full_resync_r = TRUE;
*mail_error_r = i;
ibc->finish_received = TRUE;
}
void dsync_ibc_send_finish(struct dsync_ibc *ibc, const char *error,
- enum mail_error mail_error)
+ enum mail_error mail_error,
+ bool require_full_resync)
{
- ibc->v.send_finish(ibc, error, mail_error);
+ ibc->v.send_finish(ibc, error, mail_error, require_full_resync);
}
enum dsync_ibc_recv_ret
dsync_ibc_recv_finish(struct dsync_ibc *ibc, const char **error_r,
- enum mail_error *mail_error_r)
+ enum mail_error *mail_error_r,
+ bool *require_full_resync_r)
{
- return ibc->v.recv_finish(ibc, error_r, mail_error_r);
+ return ibc->v.recv_finish(ibc, error_r, mail_error_r,
+ require_full_resync_r);
}
void dsync_ibc_close_mail_streams(struct dsync_ibc *ibc)
dsync_ibc_recv_mail(struct dsync_ibc *ibc, struct dsync_mail **mail_r);
void dsync_ibc_send_finish(struct dsync_ibc *ibc, const char *error,
- enum mail_error mail_error);
+ enum mail_error mail_error,
+ bool require_full_resync);
enum dsync_ibc_recv_ret
dsync_ibc_recv_finish(struct dsync_ibc *ibc, const char **error_r,
- enum mail_error *mail_error_r);
+ enum mail_error *mail_error_r,
+ bool *require_full_resync_r);
/* Close any mail input streams that are kept open. This needs to be called
before the mail is attempted to be freed (usually on error conditions). */