Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/auth/auth-worker-server.c @ 9008:fc4f65a4ca60 HEAD
virtual: Don't show mailboxes as \Noselect.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 01 May 2009 14:56:52 -0400 |
parents | b9faf4db2a9f |
children | 0827941c0e7c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8560
diff
changeset
|
1 /* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */ |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "common.h" |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
4 #include "ioloop.h" |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
5 #include "array.h" |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
6 #include "aqueue.h" |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "network.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "istream.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "ostream.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "auth-request.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include "auth-worker-client.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include "auth-worker-server.h" |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include <stdlib.h> |
3444 | 15 #include <unistd.h> |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
17 #define AUTH_WORKER_LOOKUP_TIMEOUT_SECS 60 |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
18 #define AUTH_WORKER_MAX_IDLE_SECS (60*30) |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
19 #define AUTH_WORKER_DELAY_WARN_SECS 3 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
20 #define AUTH_WORKER_DELAY_WARN_MIN_INTERVAL_SECS 300 |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 struct auth_worker_request { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 unsigned int id; |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
24 time_t created; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
25 const char *data_str; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct auth_request *auth_request; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 auth_worker_callback_t *callback; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 }; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 struct auth_worker_connection { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 int fd; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct io *io; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct istream *input; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 struct ostream *output; |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
36 struct timeout *to; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 |
8560
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
38 struct auth_worker_request *request; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 unsigned int id_counter; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
8560
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
41 unsigned int shutdown:1; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 }; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
44 static ARRAY_DEFINE(connections, struct auth_worker_connection *) = ARRAY_INIT; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 static unsigned int idle_count; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 static unsigned int auth_workers_max; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
48 static ARRAY_DEFINE(worker_request_array, struct auth_worker_request *); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
49 static struct aqueue *worker_request_queue; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
50 static time_t auth_worker_last_warn; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
51 |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 static char *worker_socket_path; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
54 static void worker_input(struct auth_worker_connection *conn); |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
55 static void auth_worker_destroy(struct auth_worker_connection **conn, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
56 const char *reason, bool restart); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
57 |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
58 static void auth_worker_idle_timeout(struct auth_worker_connection *conn) |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
59 { |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
60 i_assert(conn->request == NULL); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
61 |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
62 if (idle_count > 1) |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
63 auth_worker_destroy(&conn, NULL, FALSE); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
64 else |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
65 timeout_reset(conn->to); |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
66 } |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
68 static void auth_worker_call_timeout(struct auth_worker_connection *conn) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
69 { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
70 i_assert(conn->request != NULL); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
71 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
72 auth_worker_destroy(&conn, "Lookup timed out", TRUE); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
73 } |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
74 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
75 static void auth_worker_request_send(struct auth_worker_connection *conn, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
76 struct auth_worker_request *request) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
77 { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
78 struct const_iovec iov[3]; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
79 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
80 if (ioloop_time - request->created > AUTH_WORKER_DELAY_WARN_SECS && |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
81 ioloop_time - auth_worker_last_warn > |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
82 AUTH_WORKER_DELAY_WARN_MIN_INTERVAL_SECS) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
83 auth_worker_last_warn = ioloop_time; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
84 i_warning("auth workers: Auth request was queued for %d " |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
85 "seconds, %d left in queue", |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
86 (int)(ioloop_time - request->created), |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
87 aqueue_count(worker_request_queue)); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
88 } |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
89 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
90 request->id = ++conn->id_counter; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
91 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
92 iov[0].iov_base = t_strdup_printf("%d\t", request->id); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
93 iov[0].iov_len = strlen(iov[0].iov_base); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
94 iov[1].iov_base = request->data_str; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
95 iov[1].iov_len = strlen(request->data_str); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
96 iov[2].iov_base = "\n"; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
97 iov[2].iov_len = 1; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
98 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
99 o_stream_sendv(conn->output, iov, 3); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
100 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
101 conn->request = request; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
102 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
103 timeout_remove(&conn->to); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
104 conn->to = timeout_add(AUTH_WORKER_LOOKUP_TIMEOUT_SECS * 1000, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
105 auth_worker_call_timeout, conn); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
106 idle_count--; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
107 } |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
108 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
109 static void auth_worker_request_send_next(struct auth_worker_connection *conn) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
110 { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
111 struct auth_worker_request *request, *const *requestp; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
112 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
113 if (aqueue_count(worker_request_queue) == 0) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
114 return; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
115 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
116 requestp = array_idx(&worker_request_array, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
117 aqueue_idx(worker_request_queue, 0)); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
118 request = *requestp; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
119 aqueue_delete_tail(worker_request_queue); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
120 auth_worker_request_send(conn, request); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
121 } |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
122 |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 static struct auth_worker_connection *auth_worker_create(void) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 struct auth_worker_connection *conn; |
3468
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
126 int fd, try; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
128 if (array_count(&connections) >= auth_workers_max) |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 return NULL; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
3468
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
131 for (try = 0;; try++) { |
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
132 fd = net_connect_unix(worker_socket_path); |
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
133 if (fd >= 0) |
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
134 break; |
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
135 |
5347
c9e8eaacef6d
If net_connect_unix() fails, assume also that ECONNREFUSED may be a
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
136 if (errno == EAGAIN || errno == ECONNREFUSED) { |
c9e8eaacef6d
If net_connect_unix() fails, assume also that ECONNREFUSED may be a
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
137 /* we're busy. */ |
3532
4f7427a5be61
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3468
diff
changeset
|
138 } else if (errno == ENOENT) { |
4f7427a5be61
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3468
diff
changeset
|
139 /* master didn't yet create it? */ |
4f7427a5be61
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3468
diff
changeset
|
140 } else { |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 i_fatal("net_connect_unix(%s) failed: %m", |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 worker_socket_path); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 } |
3532
4f7427a5be61
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3468
diff
changeset
|
144 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
145 if (try == 50) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
146 i_error("net_connect_unix(%s) " |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
147 "failed after %d secs: %m", |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
148 worker_socket_path, try/10); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
149 return NULL; |
3468
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
150 } |
3e1d7dffb3a2
If auth worker socket isn't created yet when we try to connect to it, try
Timo Sirainen <tss@iki.fi>
parents:
3444
diff
changeset
|
151 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
152 /* wait and try again */ |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
153 usleep(100000); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 conn = i_new(struct auth_worker_connection, 1); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 conn->fd = fd; |
6162
896cc473c1f0
Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
158 conn->input = i_stream_create_fd(fd, AUTH_WORKER_MAX_LINE_LENGTH, |
896cc473c1f0
Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
159 FALSE); |
6161
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
160 conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 conn->io = io_add(fd, IO_READ, worker_input, conn); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
162 conn->to = timeout_add(AUTH_WORKER_MAX_IDLE_SECS * 1000, |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
163 auth_worker_idle_timeout, conn); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 idle_count++; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
167 array_append(&connections, &conn, 1); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 return conn; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
171 static void auth_worker_destroy(struct auth_worker_connection **_conn, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
172 const char *reason, bool restart) |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 { |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
174 struct auth_worker_connection *conn = *_conn; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 struct auth_worker_connection **connp; |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
176 unsigned int i, count; |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
177 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
178 *_conn = NULL; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
180 connp = array_get_modifiable(&connections, &count); |
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
181 for (i = 0; i < count; i++) { |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 if (connp[i] == conn) { |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
183 array_delete(&connections, i, 1); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 break; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
188 if (conn->request == NULL) |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 idle_count--; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
191 if (conn->request != NULL) T_BEGIN { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
192 struct auth_request *auth_request = conn->request->auth_request; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
194 auth_request_log_error(auth_request, "worker-server", |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
195 "Aborted: %s", reason); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
196 conn->request->callback(auth_request, t_strdup_printf( |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
197 "FAIL\t%d", PASSDB_RESULT_INTERNAL_FAILURE)); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
198 auth_request_unref(&conn->request->auth_request); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
199 } T_END; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3532
diff
changeset
|
201 io_remove(&conn->io); |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3960
diff
changeset
|
202 i_stream_destroy(&conn->input); |
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
3960
diff
changeset
|
203 o_stream_destroy(&conn->output); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
204 timeout_remove(&conn->to); |
3960
aeb424e64f24
Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
205 |
aeb424e64f24
Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
206 if (close(conn->fd) < 0) |
aeb424e64f24
Call io_remove() before closing the fd. It's required by kqueue.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
207 i_error("close(auth worker) failed: %m"); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 i_free(conn); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
210 if (idle_count == 0 && restart) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
211 conn = auth_worker_create(); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
212 if (conn != NULL) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
213 auth_worker_request_send_next(conn); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 static struct auth_worker_connection *auth_worker_find_free(void) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 { |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
219 struct auth_worker_connection **conns; |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
220 unsigned int i, count; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
222 if (idle_count == 0) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
223 return NULL; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
224 |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
225 conns = array_get_modifiable(&connections, &count); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
226 for (i = 0; i < count; i++) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
227 if (conns[i]->request == NULL) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
228 return conns[i]; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
230 i_unreached(); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
231 return NULL; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
234 static void auth_worker_request_handle(struct auth_worker_connection *conn, |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 struct auth_worker_request *request, |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 const char *line) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 { |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
238 conn->request = NULL; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
239 timeout_remove(&conn->to); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
240 conn->to = timeout_add(AUTH_WORKER_MAX_IDLE_SECS * 1000, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
241 auth_worker_idle_timeout, conn); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
242 idle_count++; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
243 |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 request->callback(request->auth_request, line); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3532
diff
changeset
|
245 auth_request_unref(&request->auth_request); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
248 static void worker_input(struct auth_worker_connection *conn) |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 const char *line, *id_str; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 unsigned int id; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 switch (i_stream_read(conn->input)) { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 case 0: |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 return; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 case -1: |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 /* disconnected */ |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
258 auth_worker_destroy(&conn, "Worker process died unexpectedly", |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
259 TRUE); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 return; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 case -2: |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 /* buffer full */ |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 i_error("BUG: Auth worker sent us more than %d bytes", |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 (int)AUTH_WORKER_MAX_LINE_LENGTH); |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
265 auth_worker_destroy(&conn, "Worker is buggy", TRUE); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 return; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 while ((line = i_stream_next_line(conn->input)) != NULL) { |
8560
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
270 if (strcmp(line, "SHUTDOWN") == 0) { |
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
271 conn->shutdown = TRUE; |
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
272 continue; |
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
273 } |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 id_str = line; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 line = strchr(line, '\t'); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 if (line == NULL) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 continue; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
279 id = (unsigned int)strtoul(t_strcut(id_str, '\t'), |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
280 NULL, 10); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
281 if (conn->request != NULL && id == conn->request->id) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
282 auth_worker_request_handle(conn, conn->request, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
283 line + 1); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
284 } else { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
285 if (conn->request != NULL) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
286 i_error("BUG: Worker sent reply with id %u, " |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
287 "expected %u", id, conn->request->id); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
288 } else { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
289 i_error("BUG: Worker sent reply with id %u, " |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
290 "none was expected", id); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
291 } |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
292 auth_worker_destroy(&conn, "Worker is buggy", TRUE); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
293 return; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
294 } |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 } |
6217
06743e1e4c13
Added auth_worker_max_request_count setting.
Timo Sirainen <tss@iki.fi>
parents:
6162
diff
changeset
|
296 |
8560
b6a7bc10c19a
Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents:
8559
diff
changeset
|
297 if (conn->shutdown && conn->request == NULL) |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
298 auth_worker_destroy(&conn, "Max requests limit", TRUE); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
299 else |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
300 auth_worker_request_send_next(conn); |
8310
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
301 } |
2e62e212f8a1
Auth workers: Use one full timeout per worker instead of a waking up every minute.
Timo Sirainen <tss@iki.fi>
parents:
8309
diff
changeset
|
302 |
7388
08d31d752893
Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
303 void auth_worker_call(struct auth_request *auth_request, |
08d31d752893
Use auth-stream API to build all TAB-delimited strings to make sure strings
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
304 struct auth_stream_reply *data, |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 auth_worker_callback_t *callback) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 struct auth_worker_connection *conn; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 struct auth_worker_request *request; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
310 request = p_new(auth_request->pool, struct auth_worker_request, 1); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
311 request->created = ioloop_time; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
312 request->data_str = p_strdup(auth_request->pool, |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
313 auth_stream_reply_export(data)); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 request->auth_request = auth_request; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 request->callback = callback; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 auth_request_ref(auth_request); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
318 if (aqueue_count(worker_request_queue) > 0) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
319 /* requests are already being queued, no chance of |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
320 finding/creating a worker */ |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
321 conn = NULL; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
322 } else { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
323 conn = auth_worker_find_free(); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
324 if (conn == NULL) { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
325 /* no free connections, create a new one */ |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
326 conn = auth_worker_create(); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
327 } |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 } |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
329 if (conn != NULL) |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
330 auth_worker_request_send(conn, request); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
331 else { |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
332 /* reached the limit, queue the request */ |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
333 aqueue_append(worker_request_queue, &request); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 void auth_worker_server_init(void) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 { |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 const char *env; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
341 if (array_is_created(&connections)) { |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 /* already initialized */ |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 return; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 env = getenv("AUTH_WORKER_PATH"); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 if (env == NULL) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 i_fatal("AUTH_WORKER_PATH environment not set"); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 worker_socket_path = i_strdup(env); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 env = getenv("AUTH_WORKER_MAX_COUNT"); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 if (env == NULL) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 i_fatal("AUTH_WORKER_MAX_COUNT environment not set"); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 auth_workers_max = atoi(env); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
356 i_array_init(&worker_request_array, 128); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
357 worker_request_queue = aqueue_init(&worker_request_array.arr); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
358 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
359 i_array_init(&connections, 16); |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
360 (void)auth_worker_create(); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 } |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 void auth_worker_server_deinit(void) |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 { |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
365 struct auth_worker_connection **connp, *conn; |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
367 if (!array_is_created(&connections)) |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 return; |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
370 while (array_count(&connections) > 0) { |
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
371 connp = array_idx_modifiable(&connections, 0); |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
372 conn = *connp; |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
373 auth_worker_destroy(&conn, "Shutting down", FALSE); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 } |
7087
a281705a2360
Converted some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
375 array_free(&connections); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
376 |
8559
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
377 aqueue_deinit(&worker_request_queue); |
b0bc4519332f
Redesigned auth request queuing to auth worker processes.
Timo Sirainen <tss@iki.fi>
parents:
8475
diff
changeset
|
378 array_free(&worker_request_array); |
3168
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 i_free(worker_socket_path); |
62f8366cb89c
Forgot to add for blocking passdb/userdb workers..
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 } |