From: Marco Bettini Date: Wed, 17 May 2023 08:01:33 +0000 (+0000) Subject: indexer: Provide progress updates in messages counts rather than just percentage... X-Git-Tag: 2.4.0~2731 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abb674cb5999db4242aeaa848bfc4775811981dd;p=thirdparty%2Fdovecot%2Fcore.git indexer: Provide progress updates in messages counts rather than just percentage (indexer side) --- diff --git a/src/indexer/Makefile.am b/src/indexer/Makefile.am index 22d2843275..5dd02c96b9 100644 --- a/src/indexer/Makefile.am +++ b/src/indexer/Makefile.am @@ -10,6 +10,7 @@ AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib-mail \ -I$(top_srcdir)/src/lib-index \ -I$(top_srcdir)/src/lib-storage \ + -I$(top_srcdir)/src/lib-fts \ -DPKG_RUNDIR=\""$(rundir)"\" \ $(BINARY_CFLAGS) diff --git a/src/indexer/indexer.h b/src/indexer/indexer.h index 2234f2db70..17234e50f5 100644 --- a/src/indexer/indexer.h +++ b/src/indexer/indexer.h @@ -1,6 +1,8 @@ #ifndef INDEXER_H #define INDEXER_H +#include "fts-indexer-status.h" + struct indexer_request; /* percentage: -1 = failed, 0..99 = indexing in progress, 100 = done */ diff --git a/src/indexer/master-connection.c b/src/indexer/master-connection.c index 829986e1d9..53c8a4571b 100644 --- a/src/indexer/master-connection.c +++ b/src/indexer/master-connection.c @@ -15,6 +15,7 @@ #include "mail-storage-service.h" #include "mail-search-build.h" #include "master-connection.h" +#include "indexer.h" #include @@ -77,7 +78,6 @@ index_mailbox_precache(struct master_connection *conn, struct mailbox *box) struct mail *mail; struct mailbox_metadata metadata; uint32_t seq, first_uid = 0, last_uid = 0; - char percentage_str[2+1+1]; int ret = 0; struct event *index_event = event_create(box->event); event_add_category(index_event, &event_category_indexer_worker); @@ -114,7 +114,7 @@ index_mailbox_precache(struct master_connection *conn, struct mailbox *box) unsigned int counter = 0; unsigned int percentage_sent = 0; - unsigned int max = status.messages + 1 - seq; + unsigned int goal = status.messages + 1 - seq; while (mailbox_search_next(ctx, &mail)) { if (first_uid == 0) first_uid = mail->uid; @@ -129,19 +129,17 @@ index_mailbox_precache(struct master_connection *conn, struct mailbox *box) ret = -1; break; } - unsigned int percentage = (++counter * 100) / max; + unsigned int percentage = (++counter * 100) / goal; if (percentage_sent < percentage) { percentage_sent = percentage; - if (percentage < 100) { - if (i_snprintf(percentage_str, - sizeof(percentage_str), "%u\n", - percentage) < 0) - i_unreached(); - o_stream_nsend_str(conn->conn.output, - percentage_str); - } + if (percentage < 100) T_BEGIN { + const char *update = t_strdup_printf( + "%d\t%u\t%u\n", INDEXER_STATE_PROCESSING, + counter, goal); + o_stream_nsend_str(conn->conn.output, update); + } T_END; indexer_worker_refresh_proctitle(username, box_vname, - counter, max); + counter, goal); } } if (mailbox_search_deinit(&ctx) < 0) { @@ -314,7 +312,6 @@ master_connection_input_args(struct connection *_conn, const char *const *args) { struct master_connection *conn = container_of(_conn, struct master_connection, conn); - const char *str; unsigned int max_recent_msgs; int ret; @@ -333,7 +330,8 @@ master_connection_input_args(struct connection *_conn, const char *const *args) ret = master_connection_cmd_index(conn, username, mailbox, session_id, max_recent_msgs, what); - str = ret < 0 ? "-1\n" : "100\n"; + const char *str = t_strdup_printf("%d\n", + ret < 0 ? INDEXER_STATE_FAILED: INDEXER_STATE_COMPLETED); o_stream_nsend_str(conn->conn.output, str); return ret; } diff --git a/src/indexer/worker-connection.c b/src/indexer/worker-connection.c index b77ab05c5e..6566edd8eb 100644 --- a/src/indexer/worker-connection.c +++ b/src/indexer/worker-connection.c @@ -96,17 +96,42 @@ worker_connection_input_args(struct connection *conn, const char *const *args) { struct worker_connection *worker = container_of(conn, struct worker_connection, conn); - int percentage; + unsigned int progress = 0, total = 0; + int state; int ret = 1; - if (str_to_int(args[0], &percentage) < 0 || - percentage < -1 || percentage > 100) { - e_error(conn->event, "Worker sent invalid progress '%s'", args[0]); + if (str_to_int(args[0], &state) < 0 || + state < INDEXER_STATE_FAILED || state > INDEXER_STATE_COMPLETED) { + e_error(conn->event, "Worker sent invalid state '%s'", args[0]); return -1; } - if (percentage < 0) + if (state == INDEXER_STATE_FAILED) ret = -1; + else if (args[1] != NULL && args[2] != NULL) { + if (str_to_uint32(args[1], &progress) < 0) { + e_error(conn->event, "Worker sent invalid progress '%s'", args[1]); + return -1; + } + + if (str_to_uint32(args[2], &total) < 0) { + e_error(conn->event, "Worker sent invalid total '%s'", args[2]); + return -1; + } + } + + unsigned int percentage; + switch (state) { + case INDEXER_STATE_FAILED: + percentage = -1; + break; + case INDEXER_STATE_COMPLETED: + percentage = 100; + break; + case INDEXER_STATE_PROCESSING: + percentage = total == 0 ? 0 : progress * 100 / total; + break; + } worker_connection_call_callback(worker, percentage); if (worker->request == NULL) { diff --git a/src/lib-fts/Makefile.am b/src/lib-fts/Makefile.am index bf89a49dfe..6ddc35b2ca 100644 --- a/src/lib-fts/Makefile.am +++ b/src/lib-fts/Makefile.am @@ -105,7 +105,8 @@ headers = \ fts-tokenizer.h \ fts-tokenizer-common.h \ fts-tokenizer-private.h \ - fts-tokenizer-generic-private.h + fts-tokenizer-generic-private.h \ + fts-indexer-status.h pkginc_libdir=$(pkgincludedir) pkginc_lib_HEADERS = $(headers) diff --git a/src/lib-fts/fts-indexer-status.h b/src/lib-fts/fts-indexer-status.h new file mode 100644 index 0000000000..5c4d6c7ad7 --- /dev/null +++ b/src/lib-fts/fts-indexer-status.h @@ -0,0 +1,16 @@ +#ifndef FTS_INDEXER_STATUS_H +#define FTS_INDEXER_STATUS_H + +enum indexer_state { + INDEXER_STATE_PROCESSING = 0, + INDEXER_STATE_COMPLETED = 1, + INDEXER_STATE_FAILED = -1, +}; + +struct indexer_status { + enum indexer_state state; + unsigned int progress; + unsigned int total; +}; + +#endif