struct dsync_mailbox_attribute *cur_attr;
char value_output_last;
+ enum item_type last_recv_item, last_sent_item;
+ unsigned int last_recv_item_eol:1;
+ unsigned int last_sent_item_eol:1;
+
unsigned int version_received:1;
unsigned int handshake_received:1;
unsigned int has_pending_data:1;
static void dsync_ibc_stream_timeout(struct dsync_ibc_stream *ibc)
{
- i_error("dsync(%s): I/O has stalled, no activity for %u seconds",
- ibc->name, ibc->timeout_secs);
+ i_error("dsync(%s): I/O has stalled, no activity for %u seconds "
+ "(last sent=%s%s, last recv=%s%s)",
+ ibc->name, ibc->timeout_secs,
+ items[ibc->last_sent_item].name,
+ ibc->last_sent_item_eol ? " (EOL)" : "",
+ items[ibc->last_recv_item].name,
+ ibc->last_recv_item_eol ? " (EOL)" : "");
ibc->ibc.timeout = TRUE;
dsync_ibc_stream_stop(ibc);
}
if (dsync_ibc_check_missing_deserializers(ibc) < 0)
return FALSE;
ibc->handshake_received = TRUE;
+ ibc->last_recv_item = ITEM_HANDSHAKE;
return FALSE;
}
return DSYNC_IBC_RECV_RET_TRYAGAIN;
} while (!dsync_ibc_stream_handshake(ibc, line));
+ ibc->last_recv_item = item;
+ ibc->last_recv_item_eol = FALSE;
+
if (strcmp(line, END_OF_LIST_LINE) == 0) {
/* end of this list */
+ ibc->last_recv_item_eol = TRUE;
return DSYNC_IBC_RECV_RET_FINISHED;
}
if (line[0] == items[ITEM_DONE].chr) {
return DSYNC_IBC_RECV_RET_OK;
}
+static struct dsync_serializer_encoder *
+dsync_ibc_send_encode_begin(struct dsync_ibc_stream *ibc, enum item_type item)
+{
+ ibc->last_sent_item = item;
+ ibc->last_sent_item_eol = FALSE;
+ return dsync_serializer_encode_begin(ibc->serializers[item]);
+}
+
static void
dsync_ibc_stream_send_handshake(struct dsync_ibc *_ibc,
const struct dsync_ibc_settings *set)
char sync_type[2];
str_append_c(str, items[ITEM_HANDSHAKE].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_HANDSHAKE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_HANDSHAKE);
dsync_serializer_encode_add(encoder, "hostname", set->hostname);
if (set->sync_ns_prefixes != NULL) {
dsync_serializer_encode_add(encoder, "sync_ns_prefix",
break;
}
+ ibc->last_sent_item_eol = TRUE;
o_stream_nsend_str(ibc->output, END_OF_LIST_LINE"\n");
}
string_t *str = t_str_new(128);
str_append_c(str, items[ITEM_MAILBOX_STATE].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_STATE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAILBOX_STATE);
dsync_serializer_encode_add(encoder, "mailbox_guid",
guid_128_to_string(state->mailbox_guid));
dsync_serializer_encode_add(encoder, "last_uidvalidity",
}
str_truncate(namestr, str_len(namestr)-1);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_TREE_NODE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAILBOX_TREE_NODE);
dsync_serializer_encode_add(encoder, "name", str_c(namestr));
switch (node->existence) {
case DSYNC_MAILBOX_NODE_NONEXISTENT:
str = t_str_new(128);
str_append_c(str, items[ITEM_MAILBOX_DELETE].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_DELETE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAILBOX_DELETE);
sep[0] = hierarchy_sep; sep[1] = '\0';
dsync_serializer_encode_add(encoder, "hierarchy_sep", sep);
const char *value;
str_append_c(str, items[ITEM_MAILBOX].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAILBOX);
dsync_serializer_encode_add(encoder, "mailbox_guid",
guid_128_to_string(dsync_box->mailbox_guid));
return;
str_append_c(str, items[ITEM_MAILBOX_ATTRIBUTE].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAILBOX_ATTRIBUTE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAILBOX_ATTRIBUTE);
type[0] = type[1] = '\0';
switch (attr->type) {
char type[2];
str_append_c(str, items[ITEM_MAIL_CHANGE].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL_CHANGE]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAIL_CHANGE);
type[0] = type[1] = '\0';
switch (change->type) {
string_t *str = t_str_new(128);
str_append_c(str, items[ITEM_MAIL_REQUEST].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL_REQUEST]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAIL_REQUEST);
if (request->guid != NULL)
dsync_serializer_encode_add(encoder, "guid", request->guid);
if (request->uid != 0) {
i_assert(ibc->value_output == NULL);
str_append_c(str, items[ITEM_MAIL].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_MAIL]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_MAIL);
if (mail->guid != NULL)
dsync_serializer_encode_add(encoder, "guid", mail->guid);
if (mail->uid != 0)
string_t *str = t_str_new(128);
str_append_c(str, items[ITEM_FINISH].chr);
- encoder = dsync_serializer_encode_begin(ibc->serializers[ITEM_FINISH]);
+ encoder = dsync_ibc_send_encode_begin(ibc, ITEM_FINISH);
if (error != NULL)
dsync_serializer_encode_add(encoder, "error", error);
if (mail_error != 0) {