annotate src/indexer/indexer-client.c @ 13192:af8c5e56d098

indexer: If verbose_proctitle=yes, show how many clients/requests there are.
author Timo Sirainen <tss@iki.fi>
date Tue, 09 Aug 2011 19:42:23 +0300
parents 268f76a75e51
children 8dcb7c7f66d5
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;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 unsigned int tag;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 if (str_array_length(args) != 3) {
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 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 if (tag != 0) {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 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
83 ctx->client = client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 ctx->tag = tag;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 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
86 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 indexer_queue_append(client->queue, append, args[1], args[2], ctx);
13095
268f76a75e51 indexer: Send OK reply to client with the given tag.
Timo Sirainen <tss@iki.fi>
parents: 13084
diff changeset
89 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
90 return 0;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 }
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 static int
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 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
95 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
96 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 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
98
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 args++;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 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
102 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
103 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
104 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
105 else {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 *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
107 return -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 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
112 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 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
114 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
115
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 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
117 case -2:
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 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
119 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
120 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 case -1:
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 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
123 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 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
127 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
128 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 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
131 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
132 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
133 "(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
134 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
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 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
138 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 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
141 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
142 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
143 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
144 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
145 break;
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 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 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
152 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 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
154
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 T_BEGIN {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 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
157 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
158 } T_END;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 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
160 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
161 i_free(ctx);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 struct indexer_client *
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 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
167 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 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
169
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 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
171 client->refcount = 1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 client->queue = queue;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 client->fd = fd;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 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
175 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
176 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
177
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 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
179 clients_count++;
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
180 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
181 return client;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 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
185 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 if (client->destroyed)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 client->destroyed = TRUE;
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 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
191
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 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
193 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
194 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
195 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
196 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
197 client->fd = -1;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 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
199
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
200 clients_count--;
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 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
202 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
203 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 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
206 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 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
208
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 client->refcount++;
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_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
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 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
217 return;
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 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
219 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
220 i_free(client);
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 }
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
13192
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
223 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
224 {
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
225 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
226 }
af8c5e56d098 indexer: If verbose_proctitle=yes, show how many clients/requests there are.
Timo Sirainen <tss@iki.fi>
parents: 13095
diff changeset
227
13084
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 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
229 {
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 while (clients != NULL)
0faaceb2f83c Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 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
232 }