master-connection.c revision ecf44c74416ffa4e7c331e49a1e283be6b1aa668
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen/* Copyright (c) 2011 Dovecot authors, see the included COPYING file */
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen#define INDEXER_WORKER_HANDSHAKE "VERSION\tindexer-worker-master\t1\t0\n%u\n"
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen#define INDEXER_MASTER_NAME "indexer-master-worker"
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen struct mail_storage_service_ctx *storage_service;
0be9d7c58e51c21eb521501e212a8e8ff7593769Timo Sirainenindexer_worker_refresh_proctitle(const char *username, const char *mailbox)
0be9d7c58e51c21eb521501e212a8e8ff7593769Timo Sirainen if (!master_service_settings_get(master_service)->verbose_proctitle)
0be9d7c58e51c21eb521501e212a8e8ff7593769Timo Sirainen process_title_set(t_strdup_printf("[%s %s]", username, mailbox));
7c0e7d96e104a59df7b5aecdc0cbe4f6e304b7c7Timo Sirainenstatic int index_mailbox(struct mail_user *user, const char *mailbox,
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen ns = mail_namespace_find(user->namespaces, mailbox);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen i_error("Namespace not found for mailbox %s: ", mailbox);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen /* FIXME: the current lib-storage API doesn't allow sending
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen "n% competed" notifications */
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_KEEP_RECENT);
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen /* index only if there aren't too many recent messages.
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen don't bother syncing the mailbox, that alone can take a
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen while with large maildirs. */
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen i_error("Opening mailbox %s failed: %s", mailbox,
7c0e7d96e104a59df7b5aecdc0cbe4f6e304b7c7Timo Sirainen mail_storage_get_last_error(mailbox_get_storage(box), NULL));
ecf44c74416ffa4e7c331e49a1e283be6b1aa668Timo Sirainen mailbox_get_open_status(box, STATUS_RECENT, &status);
7c0e7d96e104a59df7b5aecdc0cbe4f6e304b7c7Timo Sirainen if (ret < 0 || status.recent > max_recent_msgs) {
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen if (mailbox_sync(box, MAILBOX_SYNC_FLAG_FULL_READ |
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen errstr = mail_storage_get_last_error(mailbox_get_storage(box),
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainenmaster_connection_input_line(struct master_connection *conn, const char *line)
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen const char *const *args = t_strsplit_tabescaped(line);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen struct mail_storage_service_user *service_user;
7c0e7d96e104a59df7b5aecdc0cbe4f6e304b7c7Timo Sirainen /* <username> <mailbox> <max_recent_msgs> */
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen i_error("Invalid input from master: %s", line);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen if (mail_storage_service_lookup_next(conn->storage_service, &input,
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen i_error("User %s lookup failed: %s", args[0], error);
0be9d7c58e51c21eb521501e212a8e8ff7593769Timo Sirainen indexer_worker_refresh_proctitle(user->username, args[1]);
7c0e7d96e104a59df7b5aecdc0cbe4f6e304b7c7Timo Sirainen ret = index_mailbox(user, args[1], max_recent_msgs);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen mail_storage_service_user_free(&service_user);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen return write_full(conn->fd, str, strlen(str));
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainenstatic void master_connection_input(struct master_connection *conn)
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen if ((line = i_stream_next_line(conn->input)) == NULL)
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen if (!version_string_verify(line, INDEXER_MASTER_NAME,
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen i_error("Indexer master not compatible with this master "
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen "(mixed old and new binaries?)");
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen while ((line = i_stream_next_line(conn->input)) != NULL) {
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen ret = master_connection_input_line(conn, line);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainenmaster_connection_create(int fd, struct mail_storage_service_ctx *storage_service)
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen conn->io = io_add(conn->fd, IO_READ, master_connection_input, conn);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen conn->input = i_stream_create_fd(conn->fd, (size_t)-1, FALSE);
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen handshake = t_strdup_printf(INDEXER_WORKER_HANDSHAKE,
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen master_service_get_process_limit(master_service));
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainen (void)write_full(conn->fd, handshake, strlen(handshake));
d9e404180ff26dbbaea68534a5f176765022b76bTimo Sirainenvoid master_connection_destroy(struct master_connection **_conn)