annotate src/master/dict-process.c @ 9348:3eacb6bbd227 HEAD

Added pop3_save_uidl setting. When UIDLs are sent to client, save them to dovecot-uidlist. This allows changing pop3_uidl_format without messages getting re-downloaded. It's also useful with virtual POP3 INBOX when UIDLs are based on IMAP UIDs that may not be as stable as in non-virtual INBOX.
author Timo Sirainen <tss@iki.fi>
date Mon, 31 Aug 2009 18:53:17 -0400
parents 366a327b028b
children 00cd9aacd03c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8219
diff changeset
1 /* Copyright (c) 2006-2009 Dovecot authors, see the included COPYING file */
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
4 #include "array.h"
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "network.h"
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "fd-close-on-exec.h"
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "env-util.h"
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "log.h"
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
10 #include "child-process.h"
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "dict-process.h"
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <syslog.h>
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <sys/stat.h>
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
3885
b624b687fe13 Create dict-server socket to base_dir.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
17 #define DICT_SERVER_SOCKET_NAME "dict-server"
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
19 struct dict_listener {
3885
b624b687fe13 Create dict-server socket to base_dir.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
20 char *path;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 int fd;
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
22 struct io *io;
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
23
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
24 struct dict_process *processes;
8937
5f96ac54de4d dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents: 8887
diff changeset
25 unsigned int destroyed:1;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 };
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
28 struct dict_process {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
29 struct child_process process;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
30 struct dict_process *next;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
32 struct dict_listener *listener;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
33 struct log_io *log;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
34 };
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
36 static struct dict_listener *dict_listener;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
37
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
38 static int dict_process_create(struct dict_listener *listener)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
40 struct dict_process *process;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct log_io *log;
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
42 const char *executable, *const *dicts;
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
43 unsigned int i, count;
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
44 int log_fd;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 pid_t pid;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
47 process = i_new(struct dict_process, 1);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
48 process->process.type = PROCESS_TYPE_DICT;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
49 process->listener = listener;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
50
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 log_fd = log_create_pipe(&log, 0);
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 if (log_fd < 0)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 pid = -1;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 else {
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 pid = fork();
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 if (pid < 0)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 i_error("fork() failed: %m");
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (pid < 0) {
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 (void)close(log_fd);
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
62 i_free(process);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 return -1;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (pid != 0) {
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 /* master */
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
68 process->next = process->listener->processes;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
69 process->listener->processes = process;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
70
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
71 child_process_add(pid, &process->process);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 log_set_prefix(log, "dict: ");
6542
402d14b5ef8b If child process logged a fatal failure, don't show "returned error 89"
Timo Sirainen <tss@iki.fi>
parents: 6477
diff changeset
73 log_set_pid(log, pid);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 (void)close(log_fd);
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
76 process->log = log;
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
77 log_ref(process->log);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 return 0;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 log_set_prefix(log, "master-dict: ");
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
8881
774b0e8138bd Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents: 8686
diff changeset
82 /* make sure we don't leak syslog fd. try to do it as late as possible,
774b0e8138bd Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents: 8686
diff changeset
83 but also before dup2()s in case syslog fd is one of them. */
774b0e8138bd Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents: 8686
diff changeset
84 closelog();
774b0e8138bd Call closelog() before dup2()ing fds.
Timo Sirainen <tss@iki.fi>
parents: 8686
diff changeset
85
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 /* set stdin and stdout to /dev/null, so anything written into it
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 gets ignored. */
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 if (dup2(null_fd, 0) < 0)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 i_fatal("dup2(stdin) failed: %m");
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 if (dup2(null_fd, 1) < 0)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 i_fatal("dup2(stdout) failed: %m");
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 /* stderr = log, 3 = listener */
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 if (dup2(log_fd, 2) < 0)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 i_fatal("dup2(stderr) failed: %m");
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
96 if (dup2(process->listener->fd, 3) < 0)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 i_fatal("dup2(3) failed: %m");
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 for (i = 0; i <= 3; i++)
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 fd_close_on_exec(i, FALSE);
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
7109
e6823d781317 Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents: 7091
diff changeset
102 child_process_init_env();
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
103 env_put(t_strconcat("DICT_LISTEN_FROM_FD=",
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
104 process->listener->path, NULL));
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
9174
eed86bcc33aa dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents: 9030
diff changeset
106 env_put(t_strconcat("BASE_DIR=", settings_root->defaults->base_dir,
eed86bcc33aa dict proxy: Use base_dir as the default dict-server location.
Timo Sirainen <tss@iki.fi>
parents: 9030
diff changeset
107 NULL));
7481
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
108 if (settings_root->defaults->dict_db_config != NULL) {
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
109 env_put(t_strconcat("DB_CONFIG=",
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
110 settings_root->defaults->dict_db_config,
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
111 NULL));
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
112 }
768231eb84cf Added dict_db_config setting to point to a Berkeley DB config file.
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
113
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
114 dicts = array_get(&settings_root->dicts, &count);
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
115 i_assert((count % 2) == 0);
7109
e6823d781317 Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents: 7091
diff changeset
116 for (i = 0; i < count; i += 2)
e6823d781317 Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents: 7091
diff changeset
117 env_put(t_strdup_printf("DICT_%s=%s", dicts[i], dicts[i+1]));
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
118
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 executable = PKG_LIBEXECDIR"/dict";
7109
e6823d781317 Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents: 7091
diff changeset
120 client_process_exec(executable, "");
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 return -1;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
124 static void dict_listener_unref(struct dict_listener *listener)
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
125 {
8937
5f96ac54de4d dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents: 8887
diff changeset
126 if (listener->processes == NULL && listener->destroyed)
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
127 i_free(listener);
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
128 }
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
129
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
130 static void dict_process_deinit(struct dict_process *process)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 {
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
132 struct dict_listener *listener = process->listener;
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
133 struct dict_process **p;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
134
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
135 for (p = &listener->processes; *p != NULL; p = &(*p)->next) {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
136 if (*p == process) {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
137 *p = process->next;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
138 break;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
139 }
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
140 }
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
141
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
142 if (process->log != NULL)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
143 log_unref(process->log);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
144 i_free(process);
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
145
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
146 dict_listener_unref(listener);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
149 static void dict_listener_input(struct dict_listener *listener)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
151 unsigned int i;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
152 int fd;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
153
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
154 i_assert(listener->processes == NULL);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
155
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
156 for (i = 0; i < settings_root->defaults->dict_process_count; i++) {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
157 if (dict_process_create(listener) < 0)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
158 break;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
159 }
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
160 if (i > 0)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
161 io_remove(&listener->io);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
162 else {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
163 /* failed to create dict process, so just reject this
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
164 connection and try again later */
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
165 fd = net_accept(listener->fd, NULL, NULL);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
166 if (fd >= 0)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
167 (void)close(fd);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
168 }
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
169 }
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
170
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
171 static struct dict_listener *dict_listener_init(const char *path)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
172 {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
173 struct dict_listener *listener;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 mode_t old_umask;
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
176 listener = i_new(struct dict_listener, 1);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
177 listener->path = i_strdup(path);
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
178 old_umask = umask(0);
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
179 listener->fd = net_listen_unix_unlink_stale(path, 128);
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
180 umask(old_umask);
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
181 if (listener->fd == -1) {
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
182 if (errno == EADDRINUSE)
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
183 i_fatal("Socket already exists: %s", path);
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 7561
diff changeset
184 else
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
185 i_fatal("net_listen_unix(%s) failed: %m", path);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
187 fd_close_on_exec(listener->fd, TRUE);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
188 listener->io = io_add(listener->fd, IO_READ,
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
189 dict_listener_input, listener);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
190 return listener;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
193 static void dict_listener_deinit(struct dict_listener *listener)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 {
8937
5f96ac54de4d dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents: 8887
diff changeset
195 listener->destroyed = TRUE;
5f96ac54de4d dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents: 8887
diff changeset
196
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
197 if (listener->io != NULL)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
198 io_remove(&listener->io);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
199 if (close(listener->fd) < 0)
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
200 i_error("close(dict listener) failed: %m");
8887
7ddf32656d8c When shutting down, don't try to restart dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8881
diff changeset
201 listener->fd = -1;
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
8686
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
203 /* don't try to free the dict processes here,
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
204 let dict_process_destroyed() do it to avoid "unknown child exited"
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
205 errors. */
0e9b885bd29e master: When shutting down, avoid dict processes giving "unknown process exited" errors.
Timo Sirainen <tss@iki.fi>
parents: 8682
diff changeset
206 dict_listener_unref(listener);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
209 static void
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
210 dict_process_destroyed(struct child_process *_process,
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
211 pid_t pid ATTR_UNUSED, bool abnormal_exit ATTR_UNUSED)
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
212 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
213 struct dict_process *process = (struct dict_process *)_process;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
214 struct dict_listener *listener = process->listener;
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
215
8887
7ddf32656d8c When shutting down, don't try to restart dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8881
diff changeset
216 if (listener->processes == NULL && listener->fd != -1) {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
217 /* last listener died, create new ones */
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
218 listener->io = io_add(listener->fd, IO_READ,
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
219 dict_listener_input, listener);
6869
5f97bba6df15 Don't crash when dict process exists and we receive SIGHUP.
Timo Sirainen <tss@iki.fi>
parents: 6542
diff changeset
220 }
8937
5f96ac54de4d dict: Fixed crashes when dict process dies.
Timo Sirainen <tss@iki.fi>
parents: 8887
diff changeset
221 dict_process_deinit(process);
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
222 }
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
223
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
224 void dict_processes_init(void)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
226 const char *path;
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7481
diff changeset
227
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
228 path = t_strconcat(settings_root->defaults->base_dir,
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
229 "/"DICT_SERVER_SOCKET_NAME, NULL);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
230 dict_listener = dict_listener_init(path);
5843
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
231
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
232 child_process_set_destroy_callback(PROCESS_TYPE_DICT,
f655c4d4a419 Moved child process handling to child-process.[ch]. The hash table now uses
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
233 dict_process_destroyed);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
236 void dict_processes_deinit(void)
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
238 dict_listener_deinit(dict_listener);
3855
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 }
8ce85fb481aa Forgot to add in last commit.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
241 void dict_processes_kill(void)
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
242 {
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
243 struct dict_process *process;
7561
1a58b18652a6 Avoid using shadow variables. Unfortunately -Wshadow also complains about
Timo Sirainen <tss@iki.fi>
parents: 7481
diff changeset
244
8649
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
245 process = dict_listener->processes;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
246 for (; process != NULL; process = process->next) {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
247 if (process->log != NULL) {
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
248 log_unref(process->log);
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
249 process->log = NULL;
67c08c386702 Added dict_process_count setting for creating multiple dict processes.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
250 }
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
251 }
9030
125862a5b52f dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents: 8937
diff changeset
252 if (dict_listener->io == NULL) {
125862a5b52f dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents: 8937
diff changeset
253 dict_listener->io = io_add(dict_listener->fd, IO_READ,
125862a5b52f dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents: 8937
diff changeset
254 dict_listener_input, dict_listener);
125862a5b52f dict process wasn't restarted after SIGHUP was sent to master.
Timo Sirainen <tss@iki.fi>
parents: 8937
diff changeset
255 }
4393
9928ebb54719 Instead of passing URIs directly to dictionary server, it now accepts only
Timo Sirainen <tss@iki.fi>
parents: 3975
diff changeset
256 }