#include "master-service-settings.h"
#include "master-connection.h"
-static struct master_connection *master_conn;
static struct mail_storage_service_ctx *storage_service;
static void client_connected(struct master_service_connection *conn)
master_service_run(master_service, client_connected);
if (master_conn != NULL)
- master_connection_destroy(&master_conn);
+ master_connection_destroy();
mail_storage_service_deinit(&storage_service);
master_service_deinit(&master_service);
return 0;
#define INDEXER_WORKER_HANDSHAKE "VERSION\tindexer-worker-master\t1\t0\n%u\n"
#define INDEXER_MASTER_NAME "indexer-master-worker"
+struct master_connection *master_conn;
+
struct master_connection {
struct mail_storage_service_ctx *storage_service;
int ret;
if (i_stream_read(conn->input) < 0) {
- master_service_stop(master_service);
+ master_connection_destroy();
return;
}
INDEXER_PROTOCOL_MAJOR_VERSION)) {
i_error("Indexer master not compatible with this master "
"(mixed old and new binaries?)");
- master_service_stop(master_service);
+ master_connection_destroy();
return;
}
conn->version_received = TRUE;
ret = master_connection_input_line(conn, line);
} T_END;
if (ret < 0) {
- master_service_stop(master_service);
+ master_connection_destroy();
break;
}
}
return conn;
}
-void master_connection_destroy(struct master_connection **_conn)
+void master_connection_destroy(void)
{
- struct master_connection *conn = *_conn;
+ struct master_connection *conn = master_conn;
- *_conn = NULL;
+ master_conn = NULL;
io_remove(&conn->io);
i_stream_destroy(&conn->input);
#ifndef MASTER_CONNECTION_H
#define MASTER_CONNECTION_H
+extern struct master_connection *master_conn;
+
struct master_connection *
master_connection_create(int fd, struct mail_storage_service_ctx *storage_service);
-void master_connection_destroy(struct master_connection **conn);
+void master_connection_destroy(void);
#endif
{
void *const *contextp, *context;
int percentage;
+ /* return -1 -> error
+ 0 -> request completed (100%)
+ 1 -> request continues (<100%)
+ */
+ int ret = 1;
if (aqueue_count(conn->request_queue) == 0) {
i_error("Input from worker without pending requests: %s", line);
aqueue_delete_tail(conn->request_queue);
if (aqueue_count(conn->request_queue) == 0)
i_free_and_null(conn->request_username);
+ if (percentage < 0)
+ ret = -1;
+ else
+ ret = 0;
}
conn->callback(percentage, context);
- return 0;
+ return ret;
}
static void worker_connection_input(struct worker_connection *conn)
}
while ((line = i_stream_next_line(conn->input)) != NULL) {
- if (worker_connection_input_line(conn, line) < 0) {
+ if (worker_connection_input_line(conn, line) <= 0) {
worker_connection_disconnect(conn);
break;
}