dovecot-2.2: fts-solr: Fixed support for multiple Solr hosts whe...

dovecot at dovecot.org dovecot at dovecot.org
Sat Oct 26 19:00:03 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/26355654c314
changeset: 16886:26355654c314
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Oct 26 18:59:52 2013 +0300
description:
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.

diffstat:

 src/plugins/fts-solr/fts-backend-solr-old.c |  29 +++++++++++++++---------
 src/plugins/fts-solr/fts-backend-solr.c     |  34 ++++++++++++++++++----------
 src/plugins/fts-solr/fts-solr-plugin.c      |   7 +++--
 src/plugins/fts-solr/fts-solr-plugin.h      |   3 +-
 src/plugins/fts-solr/solr-connection.c      |  32 ++++++++++++--------------
 5 files changed, 61 insertions(+), 44 deletions(-)

diffs (truncated from 379 to 300 lines):

diff -r 519b15c7618a -r 26355654c314 src/plugins/fts-solr/fts-backend-solr-old.c
--- a/src/plugins/fts-solr/fts-backend-solr-old.c	Sat Oct 26 18:59:03 2013 +0300
+++ b/src/plugins/fts-solr/fts-backend-solr-old.c	Sat Oct 26 18:59:52 2013 +0300
@@ -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 @@
 		*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 @@
 	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 @@
 {
 	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 @@
 	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 @@
 {
 	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 @@
 		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 @@
 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 @@
 	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 @@
 	}
 	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 -r 519b15c7618a -r 26355654c314 src/plugins/fts-solr/fts-backend-solr.c
--- a/src/plugins/fts-solr/fts-backend-solr.c	Sat Oct 26 18:59:03 2013 +0300
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Sat Oct 26 18:59:52 2013 +0300
@@ -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 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 @@
 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 @@
 		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 @@
 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 @@
 {
 	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_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 @@
 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 @@
 		       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 @@
 	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 @@
 		  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 @@
 	}
 	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 -r 519b15c7618a -r 26355654c314 src/plugins/fts-solr/fts-solr-plugin.c
--- a/src/plugins/fts-solr/fts-solr-plugin.c	Sat Oct 26 18:59:03 2013 +0300
+++ b/src/plugins/fts-solr/fts-solr-plugin.c	Sat Oct 26 18:59:52 2013 +0300
@@ -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 @@
 	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 -r 519b15c7618a -r 26355654c314 src/plugins/fts-solr/fts-solr-plugin.h
--- a/src/plugins/fts-solr/fts-solr-plugin.h	Sat Oct 26 18:59:03 2013 +0300
+++ b/src/plugins/fts-solr/fts-solr-plugin.h	Sat Oct 26 18:59:52 2013 +0300
@@ -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 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 -r 519b15c7618a -r 26355654c314 src/plugins/fts-solr/solr-connection.c
--- a/src/plugins/fts-solr/solr-connection.c	Sat Oct 26 18:59:03 2013 +0300
+++ b/src/plugins/fts-solr/solr-connection.c	Sat Oct 26 18:59:52 2013 +0300
@@ -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 @@


More information about the dovecot-cvs mailing list