E.g. indexer-worker was always using only the first user's Solr host.
struct solr_fts_backend {
struct fts_backend backend;
+ struct solr_connection *solr_conn;
char *id_username, *id_namespace;
struct mail_namespace *default_ns;
};
*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);
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) {
{
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;
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);
{
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;
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;
}
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;
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);
}
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;
struct solr_fts_backend {
struct fts_backend backend;
+ struct solr_connection *solr_conn;
};
struct solr_fts_field {
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)
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;
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) {
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>");
}
{
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;
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;
}
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);
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;
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);
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;
}
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;
#include "lib.h"
#include "array.h"
+#include "http-client.h"
#include "mail-user.h"
#include "mail-storage-hooks.h"
#include "solr-connection.h"
#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);
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);
}
#define FTS_SOLR_PLUGIN_H
#include "module-context.h"
+#include "mail-user.h"
#include "fts-api-private.h"
#define FTS_SOLR_USER_CONTEXT(obj) \
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);
#include "istream.h"
#include "http-url.h"
#include "http-client.h"
+#include "fts-solr-plugin.h"
#include "solr-connection.h"
#include <expat.h>
};
struct solr_connection {
- struct http_client *http_client;
-
XML_Parser xml_parser;
char *http_host;
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) {
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);
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);
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;
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);
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;
}