diff src/doveadm/dsync/dsync-brain.c @ 18371:b900b50085fc

dsync: Use storage's mail_error to choose the doveadm exit code. Instead of always assuming that all errors are EX_TEMPFAIL.
author Timo Sirainen <tss@iki.fi>
date Thu, 19 Mar 2015 00:41:19 +0200
parents b4dbe64c0032
children 3fc9658c9712
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-brain.c	Thu Mar 19 00:38:01 2015 +0200
+++ b/src/doveadm/dsync/dsync-brain.c	Thu Mar 19 00:41:19 2015 +0200
@@ -288,7 +288,7 @@
 	}
 }
 
-int dsync_brain_deinit(struct dsync_brain **_brain)
+int dsync_brain_deinit(struct dsync_brain **_brain, enum mail_error *error_r)
 {
 	struct dsync_brain *brain = *_brain;
 	int ret;
@@ -338,6 +338,9 @@
 
 	ret = brain->failed ? -1 : 0;
 	mail_user_unref(&brain->user);
+
+	*error_r = !brain->failed ? 0 :
+		(brain->mail_error == 0 ? MAIL_ERROR_TEMP : brain->mail_error);
 	pool_unref(&brain->pool);
 	return ret;
 }
@@ -558,18 +561,25 @@
 static bool dsync_brain_finish(struct dsync_brain *brain)
 {
 	const char *error;
+	enum mail_error mail_error;
+	enum dsync_ibc_recv_ret ret;
 
 	if (!brain->master_brain) {
 		dsync_ibc_send_finish(brain->ibc,
-				      brain->failed ? "dsync failed" : NULL);
+				      brain->failed ? "dsync failed" : NULL,
+				      brain->mail_error);
 		brain->state = DSYNC_STATE_DONE;
 		return TRUE;
 	} 
-	if (dsync_ibc_recv_finish(brain->ibc, &error) == DSYNC_IBC_RECV_RET_TRYAGAIN)
+	ret = dsync_ibc_recv_finish(brain->ibc, &error, &mail_error);
+	if (ret == DSYNC_IBC_RECV_RET_TRYAGAIN)
 		return FALSE;
 	if (error != NULL) {
 		i_error("Remote dsync failed: %s", error);
 		brain->failed = TRUE;
+		if (mail_error != 0 &&
+		    (brain->mail_error == 0 || brain->mail_error == MAIL_ERROR_TEMP))
+			brain->mail_error = mail_error;
 	}
 	brain->state = DSYNC_STATE_DONE;
 	return TRUE;