From: Timo Sirainen Date: Sat, 26 Oct 2013 15:59:52 +0000 (+0300) Subject: fts-solr: Fixed support for multiple Solr hosts when same process handles multiple... X-Git-Tag: 2.2.7~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c215ca02d468b0e542523df1ed18e5f2d7e63968;p=thirdparty%2Fdovecot%2Fcore.git fts-solr: Fixed support for multiple Solr hosts when same process handles multiple users. E.g. indexer-worker was always using only the first user's Solr host. --- diff --git a/src/plugins/fts-solr/fts-backend-solr-old.c b/src/plugins/fts-solr/fts-backend-solr-old.c index 1845849da6..988184590f 100644 --- a/src/plugins/fts-solr/fts-backend-solr-old.c +++ b/src/plugins/fts-solr/fts-backend-solr-old.c @@ -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("", 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, ""); - (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, ""); } 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; diff --git a/src/plugins/fts-solr/fts-backend-solr.c b/src/plugins/fts-solr/fts-backend-solr.c index d00f0c99f2..bd07224dee 100644 --- a/src/plugins/fts-solr/fts-backend-solr.c +++ b/src/plugins/fts-solr/fts-backend-solr.c @@ -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, ""); - (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, ""); } @@ -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("", 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, ""); } 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; diff --git a/src/plugins/fts-solr/fts-solr-plugin.c b/src/plugins/fts-solr/fts-solr-plugin.c index f13f9fe964..24120c991f 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.c +++ b/src/plugins/fts-solr/fts-solr-plugin.c @@ -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 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); } diff --git a/src/plugins/fts-solr/fts-solr-plugin.h b/src/plugins/fts-solr/fts-solr-plugin.h index 69ce5e95ed..5af774dc34 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.h +++ b/src/plugins/fts-solr/fts-solr-plugin.h @@ -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); diff --git a/src/plugins/fts-solr/solr-connection.c b/src/plugins/fts-solr/solr-connection.c index 408d8be614..e0ec01625b 100644 --- a/src/plugins/fts-solr/solr-connection.c +++ b/src/plugins/fts-solr/solr-connection.c @@ -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 @@ -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; }