-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)
#ifndef INDEXER_H
#define INDEXER_H
+#include "fts-indexer-status.h"
+
struct indexer_request;
/* percentage: -1 = failed, 0..99 = indexing in progress, 100 = done */
#include "mail-storage-service.h"
#include "mail-search-build.h"
#include "master-connection.h"
+#include "indexer.h"
#include <unistd.h>
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);
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;
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) {
{
struct master_connection *conn =
container_of(_conn, struct master_connection, conn);
- const char *str;
unsigned int max_recent_msgs;
int ret;
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;
}
{
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) {
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)
--- /dev/null
+#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