annotate src/indexer/indexer-client.c @ 13199:8dcb7c7f66d5

doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing. The idea is that if a user hasn't opened the mailbox for a long time (or ever), there's not much point in wasting time on doing indexing.
author Timo Sirainen <tss@iki.fi>
date Wed, 10 Aug 2011 14:17:54 +0300
parents af8c5e56d098
children ad429a8311f4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "llist.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "istream.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "ostream.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "strescape.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "master-service.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "indexer-queue.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "indexer-client.h"
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdlib.h>
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <unistd.h>
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #define MAX_INBUF_SIZE (1024*64)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #define INDEXER_CLIENT_PROTOCOL_MAJOR_VERSION 1
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #define INDEXER_CLIENT_PROTOCOL_MINOR_VERSION 0
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct indexer_client {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct indexer_client *prev, *next;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 int refcount;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct indexer_queue *queue;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 int fd;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 struct istream *input;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 struct ostream *output;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 struct io *io;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 unsigned int version_received:1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 unsigned int handshaked:1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 unsigned int destroyed:1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 };
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct indexer_client_request {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 struct indexer_client *client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 unsigned int tag;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 };
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct indexer_client *clients = NULL;
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
42 static unsigned int clients_count = 0;
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 static void indexer_client_destroy(struct indexer_client *client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 static void indexer_client_ref(struct indexer_client *client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 static void indexer_client_unref(struct indexer_client *client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 static const char *const*
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 indexer_client_next_line(struct indexer_client *client)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 const char *line;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 char **args;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 unsigned int i;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 line = i_stream_next_line(client->input);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 if (line == NULL)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 return NULL;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 args = p_strsplit(pool_datastack_create(), line, "\t");
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 for (i = 0; args[i] != NULL; i++)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 args[i] = str_tabunescape(args[i]);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 return (void *)args;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 static int
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 indexer_client_request_queue(struct indexer_client *client, bool append,
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 const char *const *args, const char **error_r)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 struct indexer_client_request *ctx = NULL;
13199
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
70 unsigned int tag, max_recent_msgs;
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
13199
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
72 if (str_array_length(args) < 3) {
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 *error_r = "Wrong parameter count";
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 return -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (str_to_uint(args[0], &tag) < 0) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 *error_r = "Invalid tag";
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 return -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
13199
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
80 if (args[3] == NULL)
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
81 max_recent_msgs = 0;
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
82 else if (str_to_uint(args[3], &max_recent_msgs) < 0) {
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
83 *error_r = "Invalid max_recent_msgs";
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
84 return -1;
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
85 }
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 if (tag != 0) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 ctx = i_new(struct indexer_client_request, 1);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 ctx->client = client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 ctx->tag = tag;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 indexer_client_ref(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
13199
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
94 indexer_queue_append(client->queue, append, args[1], args[2],
8dcb7c7f66d5 doveadm index: Added -n parameter to specify max number of recent msgs to perform indexing.
Timo Sirainen <tss@iki.fi>
parents: 13192
diff changeset
95 max_recent_msgs, ctx);
13095
268f76a75e51 indexer: Send OK reply to client with the given tag.
Timo Sirainen <tss@iki.fi>
parents: 13084
diff changeset
96 o_stream_send_str(client->output, t_strdup_printf("%u\tOK\n", tag));
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 return 0;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 static int
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 indexer_client_request(struct indexer_client *client,
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 const char *const *args, const char **error_r)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 const char *cmd = args[0];
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 args++;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 if (strcmp(cmd, "APPEND") == 0)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 return indexer_client_request_queue(client, TRUE, args, error_r);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 else if (strcmp(cmd, "PREPEND") == 0)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 return indexer_client_request_queue(client, FALSE, args, error_r);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 else {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 *error_r = t_strconcat("Unknown command: ", cmd, NULL);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 return -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 static void indexer_client_input(void *context)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 struct indexer_client *client = context;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 const char *line, *const *args, *error;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 switch (i_stream_read(client->input)) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 case -2:
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 i_error("BUG: Client connection sent too much data");
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 indexer_client_destroy(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 case -1:
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 indexer_client_destroy(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 if (!client->version_received) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if ((line = i_stream_next_line(client->input)) == NULL)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 if (!version_string_verify(line, "indexer",
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 INDEXER_CLIENT_PROTOCOL_MAJOR_VERSION)) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 i_error("Client not compatible with this server "
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 "(mixed old and new binaries?)");
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 indexer_client_destroy(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 client->version_received = TRUE;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 while ((args = indexer_client_next_line(client)) != NULL) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 if (args[0] != NULL) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 if (indexer_client_request(client, args, &error) < 0) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 i_error("Client input error: %s", error);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 indexer_client_destroy(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 break;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 void indexer_client_status_callback(int percentage, void *context)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 struct indexer_client_request *ctx = context;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 T_BEGIN {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 o_stream_send_str(ctx->client->output,
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 t_strdup_printf("%u\t%d\n", ctx->tag, percentage));
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 } T_END;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 if (percentage < 0 || percentage == 100) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 indexer_client_unref(ctx->client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 i_free(ctx);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 struct indexer_client *
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 indexer_client_create(int fd, struct indexer_queue *queue)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 struct indexer_client *client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 client = i_new(struct indexer_client, 1);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 client->refcount = 1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 client->queue = queue;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 client->fd = fd;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 client->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 client->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 client->io = io_add(fd, IO_READ, indexer_client_input, client);
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
184
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 DLLIST_PREPEND(&clients, client);
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
186 clients_count++;
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
187 indexer_refresh_proctitle();
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 return client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 static void indexer_client_destroy(struct indexer_client *client)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 if (client->destroyed)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 client->destroyed = TRUE;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 DLLIST_REMOVE(&clients, client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 io_remove(&client->io);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 i_stream_close(client->input);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 o_stream_close(client->output);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 if (close(client->fd) < 0)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 i_error("close(client) failed: %m");
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 client->fd = -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 indexer_client_unref(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
207 clients_count--;
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 master_service_client_connection_destroyed(master_service);
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
209 indexer_refresh_proctitle();
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 static void indexer_client_ref(struct indexer_client *client)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 i_assert(client->refcount > 0);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 client->refcount++;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 static void indexer_client_unref(struct indexer_client *client)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 i_assert(client->refcount > 0);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 if (--client->refcount > 0)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 i_stream_destroy(&client->input);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 o_stream_destroy(&client->output);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 i_free(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
230 unsigned int indexer_clients_get_count(void)
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
231 {
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
232 return clients_count;
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
233 }
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
234
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 void indexer_clients_destroy_all(void)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 while (clients != NULL)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 indexer_client_destroy(clients);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }