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