]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-solr: Fixed support for multiple Solr hosts when same process handles multiple...
authorTimo Sirainen <tss@iki.fi>
Sat, 26 Oct 2013 15:59:52 +0000 (18:59 +0300)
committerTimo Sirainen <tss@iki.fi>
Sat, 26 Oct 2013 15:59:52 +0000 (18:59 +0300)
E.g. indexer-worker was always using only the first user's Solr host.

src/plugins/fts-solr/fts-backend-solr-old.c
src/plugins/fts-solr/fts-backend-solr.c
src/plugins/fts-solr/fts-solr-plugin.c
src/plugins/fts-solr/fts-solr-plugin.h
src/plugins/fts-solr/solr-connection.c

index 1845849da6bada068bfebad7cb3fd899e7d34af9..988184590f07a88d0fd107aea115c5cb4155c788 100644 (file)
@@ -22,6 +22,7 @@
 
 struct solr_fts_backend {
        struct fts_backend backend;
+       struct solr_connection *solr_conn;
        char *id_username, *id_namespace;
        struct mail_namespace *default_ns;
 };
@@ -235,11 +236,9 @@ fts_backend_solr_init(struct fts_backend *_backend, const char **error_r)
                *error_r = "Invalid fts_solr setting";
                return -1;
        }
-       if (solr_conn == NULL) {
-               if (solr_connection_init(fuser->set.url, fuser->set.debug,
-                                        &solr_conn, error_r) < 0)
-                       return -1;
-       }
+       if (solr_connection_init(fuser->set.url, fuser->set.debug,
+                                &backend->solr_conn, error_r) < 0)
+               return -1;
 
        str = solr_escape_id_str(_backend->ns->user->username);
        backend->id_username = i_strdup(str);
@@ -315,7 +314,7 @@ fts_backend_solr_get_last_uid_fallback(struct solr_fts_backend *backend,
        solr_quote_http(str, ns->user->username);
 
        pool = pool_alloconly_create("solr last uid lookup", 1024);
-       if (solr_connection_select(solr_conn, str_c(str),
+       if (solr_connection_select(backend->solr_conn, str_c(str),
                                   pool, &results) < 0)
                ret = -1;
        else if (results[0] == NULL) {
@@ -442,6 +441,8 @@ fts_backend_solr_update_deinit(struct fts_backend_update_context *_ctx)
 {
        struct solr_fts_backend_update_context *ctx =
                (struct solr_fts_backend_update_context *)_ctx;
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)_ctx->backend;
        const char *str;
        int ret;
 
@@ -452,7 +453,7 @@ fts_backend_solr_update_deinit(struct fts_backend_update_context *_ctx)
        str = t_strdup_printf("<commit waitFlush=\"false\" "
                              "waitSearcher=\"%s\"/>",
                              ctx->documents_added ? "true" : "false");
-       if (solr_connection_post(solr_conn, str) < 0)
+       if (solr_connection_post(backend->solr_conn, str) < 0)
                ret = -1;
 
        str_free(&ctx->cmd);
@@ -494,6 +495,8 @@ fts_backend_solr_update_expunge(struct fts_backend_update_context *_ctx,
 {
        struct solr_fts_backend_update_context *ctx =
                (struct solr_fts_backend_update_context *)_ctx;
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)_ctx->backend;
 
        T_BEGIN {
                string_t *cmd;
@@ -503,7 +506,7 @@ fts_backend_solr_update_expunge(struct fts_backend_update_context *_ctx,
                xml_encode_id(ctx, cmd, uid);
                str_append(cmd, "</id></delete>");
 
-               (void)solr_connection_post(solr_conn, str_c(cmd));
+               (void)solr_connection_post(backend->solr_conn, str_c(cmd));
        } T_END;
 }
 
@@ -511,10 +514,13 @@ static void
 fts_backend_solr_uid_changed(struct solr_fts_backend_update_context *ctx,
                             uint32_t uid)
 {
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)ctx->ctx.backend;
+
        if (ctx->post == NULL) {
                i_assert(ctx->prev_uid == 0);
 
-               ctx->post = solr_connection_post_begin(solr_conn);
+               ctx->post = solr_connection_post_begin(backend->solr_conn);
                str_append(ctx->cmd, "<add>");
        } else {
                ctx->headers_open = FALSE;
@@ -695,7 +701,8 @@ fts_backend_solr_lookup(struct fts_backend *_backend, struct mailbox *box,
        solr_add_ns_query_http(str, backend, ns);
 
        pool = pool_alloconly_create("fts solr search", 1024);
-       ret = solr_connection_select(solr_conn, str_c(str), pool, &results);
+       ret = solr_connection_select(backend->solr_conn, str_c(str),
+                                    pool, &results);
        if (ret == 0 && results[0] != NULL) {
                array_append_array(&result->definite_uids, &results[0]->uids);
                array_append_array(&result->scores, &results[0]->scores);
@@ -761,7 +768,7 @@ solr_search_multi(struct solr_fts_backend *backend, string_t *str,
        }
        str_append_c(str, ')');
 
-       if (solr_connection_select(solr_conn, str_c(str),
+       if (solr_connection_select(backend->solr_conn, str_c(str),
                                   result->pool, &solr_results) < 0) {
                hash_table_destroy(&mailboxes);
                return -1;
index d00f0c99f229c60b89ac83fb8da3f7ef36d4406b..bd07224dee7857ee7cbee0341a9fe1df53dd7f1b 100644 (file)
@@ -28,6 +28,7 @@
 
 struct solr_fts_backend {
        struct fts_backend backend;
+       struct solr_connection *solr_conn;
 };
 
 struct solr_fts_field {
@@ -157,18 +158,15 @@ static struct fts_backend *fts_backend_solr_alloc(void)
 static int
 fts_backend_solr_init(struct fts_backend *_backend, const char **error_r)
 {
+       struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
        struct fts_solr_user *fuser = FTS_SOLR_USER_CONTEXT(_backend->ns->user);
 
        if (fuser == NULL) {
                *error_r = "Invalid fts_solr setting";
                return -1;
        }
-       if (solr_conn == NULL) {
-               if (solr_connection_init(fuser->set.url, fuser->set.debug,
-                                        &solr_conn, error_r) < 0)
-                       return -1;
-       }
-       return 0;
+       return solr_connection_init(fuser->set.url, fuser->set.debug,
+                                   &backend->solr_conn, error_r);
 }
 
 static void fts_backend_solr_deinit(struct fts_backend *_backend)
@@ -182,6 +180,7 @@ static int
 get_last_uid_fallback(struct fts_backend *_backend, struct mailbox *box,
                      uint32_t *last_uid_r)
 {
+       struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
        const struct seq_range *uidvals;
        const char *box_guid;
        unsigned int count;
@@ -203,7 +202,7 @@ get_last_uid_fallback(struct fts_backend *_backend, struct mailbox *box,
                str_append(str, "%22%22");
 
        pool = pool_alloconly_create("solr last uid lookup", 1024);
-       if (solr_connection_select(solr_conn, str_c(str),
+       if (solr_connection_select(backend->solr_conn, str_c(str),
                                   pool, &results) < 0)
                ret = -1;
        else if (results[0] == NULL) {
@@ -338,8 +337,11 @@ fts_backed_solr_build_commit(struct solr_fts_backend_update_context *ctx)
 static void
 fts_backend_solr_expunge_flush(struct solr_fts_backend_update_context *ctx)
 {
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)ctx->ctx.backend;
+
        str_append(ctx->cmd_expunge, "</delete>");
-       (void)solr_connection_post(solr_conn, str_c(ctx->cmd_expunge));
+       (void)solr_connection_post(backend->solr_conn, str_c(ctx->cmd_expunge));
        str_truncate(ctx->cmd_expunge, 0);
        str_append(ctx->cmd_expunge, "<delete>");
 }
@@ -349,6 +351,8 @@ fts_backend_solr_update_deinit(struct fts_backend_update_context *_ctx)
 {
        struct solr_fts_backend_update_context *ctx =
                (struct solr_fts_backend_update_context *)_ctx;
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)_ctx->backend;
        struct solr_fts_field *field;
        const char *str;
        int ret = _ctx->failed ? -1 : 0;
@@ -363,7 +367,7 @@ fts_backend_solr_update_deinit(struct fts_backend_update_context *_ctx)
                        fts_backend_solr_expunge_flush(ctx);
                str = t_strdup_printf("<commit softCommit=\"true\" waitSearcher=\"%s\"/>",
                                      ctx->documents_added ? "true" : "false");
-               if (solr_connection_post(solr_conn, str) < 0)
+               if (solr_connection_post(backend->solr_conn, str) < 0)
                        ret = -1;
        }
 
@@ -444,11 +448,14 @@ static void
 fts_backend_solr_uid_changed(struct solr_fts_backend_update_context *ctx,
                             uint32_t uid)
 {
+       struct solr_fts_backend *backend =
+               (struct solr_fts_backend *)ctx->ctx.backend;
+
        if (ctx->post == NULL) {
                i_assert(ctx->prev_uid == 0);
 
                ctx->cmd = str_new(default_pool, SOLR_CMDBUF_SIZE);
-               ctx->post = solr_connection_post_begin(solr_conn);
+               ctx->post = solr_connection_post_begin(backend->solr_conn);
                str_append(ctx->cmd, "<add>");
        } else {
                fts_backend_solr_doc_close(ctx);
@@ -751,6 +758,7 @@ static int solr_search(struct fts_backend *_backend, string_t *str,
                       const char *box_guid, ARRAY_TYPE(seq_range) *uids_r,
                       ARRAY_TYPE(fts_score_map) *scores_r)
 {
+       struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
        pool_t pool = pool_alloconly_create("fts solr search", 1024);
        struct solr_result **results;
        int ret;
@@ -763,7 +771,8 @@ static int solr_search(struct fts_backend *_backend, string_t *str,
        else
                str_append(str, "%22%22");
 
-       ret = solr_connection_select(solr_conn, str_c(str), pool, &results);
+       ret = solr_connection_select(backend->solr_conn, str_c(str),
+                                    pool, &results);
        if (ret == 0 && results[0] != NULL) {
                array_append_array(uids_r, &results[0]->uids);
                array_append_array(scores_r, &results[0]->scores);
@@ -811,6 +820,7 @@ solr_search_multi(struct fts_backend *_backend, string_t *str,
                  struct mailbox *const boxes[],
                  struct fts_multi_result *result)
 {
+       struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
        struct solr_result **solr_results;
        struct fts_result *fts_result;
        ARRAY(struct fts_result) fts_results;
@@ -842,7 +852,7 @@ solr_search_multi(struct fts_backend *_backend, string_t *str,
        }
        str_append_c(str, ')');
 
-       if (solr_connection_select(solr_conn, str_c(str),
+       if (solr_connection_select(backend->solr_conn, str_c(str),
                                   result->pool, &solr_results) < 0) {
                hash_table_destroy(&mailboxes);
                return -1;
index f13f9fe964a376267760eec14fc6f8756274044f..24120c991f1cd05dffde06f6961555ef6c20d91f 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "http-client.h"
 #include "mail-user.h"
 #include "mail-storage-hooks.h"
 #include "solr-connection.h"
@@ -10,7 +11,7 @@
 #include <stdlib.h>
 
 const char *fts_solr_plugin_version = DOVECOT_ABI_VERSION;
-struct solr_connection *solr_conn = NULL;
+struct http_client *solr_http_client = NULL;
 
 struct fts_solr_user_module fts_solr_user_module =
        MODULE_CONTEXT_INIT(&mail_user_module_register);
@@ -84,8 +85,8 @@ void fts_solr_plugin_deinit(void)
        fts_backend_unregister(fts_backend_solr.name);
        fts_backend_unregister(fts_backend_solr_old.name);
        mail_storage_hooks_remove(&fts_solr_mail_storage_hooks);
-       if (solr_conn != NULL)
-               solr_connection_deinit(solr_conn);
+       if (solr_http_client != NULL)
+               http_client_deinit(&solr_http_client);
 
 }
 
index 69ce5e95ed9f842214bb49df80579471bd3f8fc1..5af774dc346f7b4bd903404aa21d5405c15aa809 100644 (file)
@@ -2,6 +2,7 @@
 #define FTS_SOLR_PLUGIN_H
 
 #include "module-context.h"
+#include "mail-user.h"
 #include "fts-api-private.h"
 
 #define FTS_SOLR_USER_CONTEXT(obj) \
@@ -21,7 +22,7 @@ extern const char *fts_solr_plugin_dependencies[];
 extern struct fts_backend fts_backend_solr;
 extern struct fts_backend fts_backend_solr_old;
 extern MODULE_CONTEXT_DEFINE(fts_solr_user_module, &mail_user_module_register);
-extern struct solr_connection *solr_conn;
+extern struct http_client *solr_http_client;
 
 void fts_solr_plugin_init(struct module *module);
 void fts_solr_plugin_deinit(void);
index 408d8be614fd07b17939b59bbfd4926de0d44888..e0ec01625b63b1c74608b39bc98bfeefd6af6551 100644 (file)
@@ -9,6 +9,7 @@
 #include "istream.h"
 #include "http-url.h"
 #include "http-client.h"
+#include "fts-solr-plugin.h"
 #include "solr-connection.h"
 
 #include <expat.h>
@@ -54,8 +55,6 @@ struct solr_connection_post {
 };
 
 struct solr_connection {
-       struct http_client *http_client;
-
        XML_Parser xml_parser;
 
        char *http_host;
@@ -121,16 +120,16 @@ int solr_connection_init(const char *url, bool debug,
        conn->http_ssl = http_url->have_ssl;
        conn->debug = debug;
 
-       memset(&http_set, 0, sizeof(http_set));
-       http_set.debug = TRUE;
-       http_set.max_idle_time_msecs = 5*1000;
-       http_set.max_parallel_connections = 1;
-       http_set.max_pipelined_requests = 1;
-       http_set.max_redirects = 1;
-       http_set.max_attempts = 3;
-       http_set.debug = conn->debug;
-
-       conn->http_client = http_client_init(&http_set);
+       if (solr_http_client == NULL) {
+               memset(&http_set, 0, sizeof(http_set));
+               http_set.max_idle_time_msecs = 5*1000;
+               http_set.max_parallel_connections = 1;
+               http_set.max_pipelined_requests = 1;
+               http_set.max_redirects = 1;
+               http_set.max_attempts = 3;
+               http_set.debug = debug;
+               solr_http_client = http_client_init(&http_set);
+       }
 
        conn->xml_parser = XML_ParserCreate("UTF-8");
        if (conn->xml_parser == NULL) {
@@ -143,7 +142,6 @@ int solr_connection_init(const char *url, bool debug,
 
 void solr_connection_deinit(struct solr_connection *conn)
 {
-       http_client_deinit(&conn->http_client);
        XML_ParserFree(conn->xml_parser);
        i_free(conn->http_host);
        i_free(conn->http_base_url);
@@ -423,7 +421,7 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
 
        url = t_strconcat(conn->http_base_url, "select?", query, NULL);
 
-       http_req = http_client_request(conn->http_client, "GET",
+       http_req = http_client_request(solr_http_client, "GET",
                                       conn->http_host, url,
                                       solr_connection_select_response, conn);
        http_client_request_set_port(http_req, conn->http_port);
@@ -432,7 +430,7 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
        http_client_request_submit(http_req);
 
        conn->request_status = 0;
-       http_client_wait(conn->http_client);
+       http_client_wait(solr_http_client);
 
        if (conn->request_status < 0)
                return -1;
@@ -471,7 +469,7 @@ solr_connection_post_request(struct solr_connection *conn)
 
        url = t_strconcat(conn->http_base_url, "update", NULL);
 
-       http_req = http_client_request(conn->http_client, "POST",
+       http_req = http_client_request(solr_http_client, "POST",
                                       conn->http_host, url,
                                       solr_connection_update_response, conn);
        http_client_request_set_port(http_req, conn->http_port);
@@ -547,7 +545,7 @@ int solr_connection_post(struct solr_connection *conn, const char *cmd)
        XML_ParserReset(conn->xml_parser, "UTF-8");
 
        conn->request_status = 0;
-       http_client_wait(conn->http_client);
+       http_client_wait(solr_http_client);
 
        return conn->request_status;
 }