Mercurial > dovecot > core-2.2
annotate src/indexer/worker-pool.c @ 22310:a28f5bfb15fc
fts: Do not attempt to deinitialize backend if it's not set
If FTS backend initialization fails or does not happen,
flist->backend might end up being NULL, and attempt to
deinitialize NULL won't end well.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Wed, 17 May 2017 12:26:42 +0300 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
19552
diff
changeset
|
1 /* Copyright (c) 2011-2017 Dovecot authors, see the included COPYING file */ |
13084
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 "ioloop.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "llist.h" |
13278
fa2425fd9cf4
indexer: Treat worker connections as client connections to avoid early idle-kills.
Timo Sirainen <tss@iki.fi>
parents:
13274
diff
changeset
|
6 #include "master-service.h" |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "worker-connection.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "worker-pool.h" |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #define MAX_WORKER_IDLE_SECS (60*5) |
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 struct worker_connection_list { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 struct worker_connection_list *prev, *next; |
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 struct worker_connection *conn; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 time_t last_use; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 }; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct worker_pool { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 char *socket_path; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 indexer_status_callback_t *callback; |
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 unsigned int connection_count; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct worker_connection_list *busy_list, *idle_list; |
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 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 static void |
13274 | 28 worker_connection_list_free(struct worker_pool *pool, |
29 struct worker_connection_list *list); | |
13084
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 struct worker_pool * |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 worker_pool_init(const char *socket_path, indexer_status_callback_t *callback) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct worker_pool *pool; |
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 pool = i_new(struct worker_pool, 1); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 pool->socket_path = i_strdup(socket_path); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 pool->callback = callback; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 return pool; |
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 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 void worker_pool_deinit(struct worker_pool **_pool) |
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 struct worker_pool *pool = *_pool; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 *_pool = NULL; |
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 while (pool->busy_list != NULL) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 struct worker_connection_list *list = pool->busy_list; |
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 DLLIST_REMOVE(&pool->busy_list, list); |
13274 | 52 worker_connection_list_free(pool, list); |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
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 while (pool->idle_list != NULL) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 struct worker_connection_list *list = pool->idle_list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
13274 | 58 DLLIST_REMOVE(&pool->idle_list, list); |
59 worker_connection_list_free(pool, list); | |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 i_free(pool->socket_path); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 i_free(pool); |
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 |
13235
221d159befec
indexer: Don't die on "idle kill signal" if workers are still busy.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
66 bool worker_pool_have_busy_connections(struct worker_pool *pool) |
221d159befec
indexer: Don't die on "idle kill signal" if workers are still busy.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
67 { |
221d159befec
indexer: Don't die on "idle kill signal" if workers are still busy.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
68 return pool->busy_list != NULL; |
221d159befec
indexer: Don't die on "idle kill signal" if workers are still busy.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
69 } |
221d159befec
indexer: Don't die on "idle kill signal" if workers are still busy.
Timo Sirainen <tss@iki.fi>
parents:
13084
diff
changeset
|
70 |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 static int worker_pool_add_connection(struct worker_pool *pool) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 struct worker_connection *conn; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 struct worker_connection_list *list; |
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 conn = worker_connection_create(pool->socket_path, pool->callback); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 if (worker_connection_connect(conn) < 0) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 worker_connection_destroy(&conn); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 return -1; |
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 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 i_assert(pool->idle_list == NULL); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 list = i_new(struct worker_connection_list, 1); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 list->conn = conn; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 list->last_use = ioloop_time; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 pool->idle_list = list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 pool->connection_count++; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 return 0; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
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 static void |
13274 | 93 worker_connection_list_free(struct worker_pool *pool, |
94 struct worker_connection_list *list) | |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 { |
13274 | 96 i_assert(pool->connection_count > 0); |
97 pool->connection_count--; | |
98 | |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 worker_connection_destroy(&list->conn); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 i_free(list); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 static unsigned int worker_pool_find_max_connections(struct worker_pool *pool) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 struct worker_connection_list *list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 unsigned int limit; |
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 i_assert(pool->idle_list == NULL); |
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 if (pool->busy_list == NULL) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 return 1; |
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 for (list = pool->busy_list; list != NULL; list = list->next) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 if (worker_connection_get_process_limit(list->conn, &limit)) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 return limit; |
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 /* we have at least one connection that has already been created, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 but without having handshaked yet. wait until it's finished. */ |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 return 0; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 bool worker_pool_get_connection(struct worker_pool *pool, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 struct worker_connection **conn_r) |
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 struct worker_connection_list *list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 unsigned int max_connections; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 while (pool->idle_list != NULL && |
13274 | 129 !worker_connection_is_connected(pool->idle_list->conn)) { |
130 list = pool->idle_list; | |
131 DLLIST_REMOVE(&pool->idle_list, list); | |
132 worker_connection_list_free(pool, list); | |
133 } | |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 if (pool->idle_list == NULL) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 max_connections = worker_pool_find_max_connections(pool); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 if (pool->connection_count >= max_connections) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 return FALSE; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 if (worker_pool_add_connection(pool) < 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 return FALSE; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 i_assert(pool->idle_list != NULL); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 list = pool->idle_list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 DLLIST_REMOVE(&pool->idle_list, list); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 DLLIST_PREPEND(&pool->busy_list, list); |
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 *conn_r = list->conn; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 return TRUE; |
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 static void worker_pool_kill_idle_connections(struct worker_pool *pool) |
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 worker_connection_list *list, *next; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 time_t kill_timestamp; |
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 kill_timestamp = ioloop_time - MAX_WORKER_IDLE_SECS; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 for (list = pool->idle_list; list != NULL; list = next) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 next = list->next; |
13274 | 159 if (list->last_use < kill_timestamp) { |
160 DLLIST_REMOVE(&pool->idle_list, list); | |
161 worker_connection_list_free(pool, list); | |
162 } | |
13084
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 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 void worker_pool_release_connection(struct worker_pool *pool, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 struct worker_connection *conn) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 struct worker_connection_list *list; |
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 if (worker_connection_is_busy(conn)) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 /* not finished with all queued requests yet */ |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 return; |
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 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 for (list = pool->busy_list; list != NULL; list = list->next) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 if (list->conn == conn) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 break; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 i_assert(list != NULL); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 DLLIST_REMOVE(&pool->busy_list, list); |
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 if (!worker_connection_is_connected(conn)) |
13274 | 185 worker_connection_list_free(pool, list); |
13084
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 else { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 DLLIST_PREPEND(&pool->idle_list, list); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 list->last_use = ioloop_time; |
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 worker_pool_kill_idle_connections(pool); |
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 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 struct worker_connection * |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 worker_pool_find_username_connection(struct worker_pool *pool, |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 const char *username) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 struct worker_connection_list *list; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 const char *worker_user; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 for (list = pool->busy_list; list != NULL; list = list->next) { |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 worker_user = worker_connection_get_username(list->conn); |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 if (worker_user != NULL && strcmp(worker_user, username) == 0) |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 return list->conn; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 } |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 return NULL; |
0faaceb2f83c
Added "indexer" service, which uses worker processes to perform queued mailbox indexing.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 } |