Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7999:1ceb49f2eb50 HEAD
fts-solr: Error handling fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 13 Jul 2008 14:40:03 +0300 |
parents | c69ccedfaf4a |
children | 61be6a4722c5 |
files | src/plugins/fts-solr/fts-backend-solr.c src/plugins/fts-solr/solr-connection.c src/plugins/fts-solr/solr-connection.h |
diffstat | 3 files changed, 42 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-solr/fts-backend-solr.c Sun Jul 13 14:35:41 2008 +0300 +++ b/src/plugins/fts-solr/fts-backend-solr.c Sun Jul 13 14:40:03 2008 +0300 @@ -190,7 +190,7 @@ str_append(ctx->cmd, "</field></doc></add>"); solr_connection_post_more(ctx->post, str_data(ctx->cmd), str_len(ctx->cmd)); - ret = solr_connection_end(ctx->post); + ret = solr_connection_post_end(ctx->post); /* commit and wait until the documents we just indexed are visible to the following search */ if (solr_connection_post(solr_conn,
--- a/src/plugins/fts-solr/solr-connection.c Sun Jul 13 14:35:41 2008 +0300 +++ b/src/plugins/fts-solr/solr-connection.c Sun Jul 13 14:40:03 2008 +0300 @@ -49,6 +49,7 @@ XML_Parser xml_parser; char *url; + char *http_failure; unsigned int debug:1; unsigned int posting:1; @@ -61,7 +62,7 @@ const char *const *tmp; if (str == NULL) - return; + str = ""; for (tmp = t_strsplit_spaces(str, " "); *tmp != NULL; tmp++) { if (strncmp(*tmp, "url=", 4) == 0) { @@ -125,6 +126,29 @@ return size; } +static size_t +curl_header_func(void *data, size_t element_size, size_t nmemb, void *context) +{ + struct solr_connection *conn = context; + size_t size = element_size * nmemb; + const unsigned char *p; + size_t i; + + if (conn->http_failure != NULL) + return size; + + for (i = 0, p = data; i < size; i++) { + if (p[i] == ' ') { + i++; + break; + } + } + if (i == size || p[i] < '0' || p[i] > '9') + i = 0; + conn->http_failure = i_strndup(p + i, size - i); + return size; +} + struct solr_connection *solr_connection_init(const char *settings) { struct solr_connection *conn; @@ -149,6 +173,8 @@ curl_easy_setopt(conn->curl, CURLOPT_READFUNCTION, curl_output_func); curl_easy_setopt(conn->curl, CURLOPT_WRITEFUNCTION, curl_input_func); curl_easy_setopt(conn->curl, CURLOPT_WRITEDATA, conn); + curl_easy_setopt(conn->curl, CURLOPT_HEADERFUNCTION, curl_header_func); + curl_easy_setopt(conn->curl, CURLOPT_HEADERDATA, conn); conn->headers = curl_slist_append(NULL, "Content-Type: text/xml"); conn->headers_post = curl_slist_append(NULL, "Content-Type: text/xml"); @@ -284,12 +310,14 @@ struct solr_lookup_xml_context solr_lookup_context; string_t *str; CURLcode ret; + long httpret; i_assert(!conn->posting); memset(&solr_lookup_context, 0, sizeof(solr_lookup_context)); solr_lookup_context.uids = uids; + i_free_and_null(conn->http_failure); conn->xml_failed = FALSE; XML_SetElementHandler(conn->xml_parser, solr_lookup_xml_start, solr_lookup_xml_end); @@ -308,6 +336,11 @@ conn->curl_errorbuf); return -1; } + curl_easy_getinfo(conn->curl, CURLINFO_RESPONSE_CODE, &httpret); + if (httpret != 200) { + i_error("fts_solr: Lookup failed: %s", conn->http_failure); + ret = -1; + } return solr_xml_parse(conn, NULL, 0, TRUE); } @@ -324,6 +357,8 @@ i_assert(!conn->posting); conn->posting = TRUE; + i_free_and_null(conn->http_failure); + curl_easy_setopt(conn->curl, CURLOPT_READDATA, post); merr = curl_multi_add_handle(conn->curlm, conn->curl); if (merr != CURLM_OK) { @@ -416,7 +451,7 @@ post->failed = TRUE; } -int solr_connection_end(struct solr_connection_post *post) +int solr_connection_post_end(struct solr_connection_post *post) { struct solr_connection *conn = post->conn; long httpret; @@ -426,9 +461,9 @@ solr_connection_post_more(post, NULL, 0); - curl_easy_getinfo(post->conn->curl, CURLINFO_RESPONSE_CODE, &httpret); + curl_easy_getinfo(conn->curl, CURLINFO_RESPONSE_CODE, &httpret); if (httpret != 200 && ret == 0) { - i_error("fts_solr: Indexing failed with %ld", httpret); + i_error("fts_solr: Indexing failed: %s", conn->http_failure); ret = -1; } @@ -450,5 +485,5 @@ post = solr_connection_post_begin(conn); solr_connection_post_more(post, (const unsigned char *)cmd, strlen(cmd)); - return solr_connection_end(post); + return solr_connection_post_end(post); }
--- a/src/plugins/fts-solr/solr-connection.h Sun Jul 13 14:35:41 2008 +0300 +++ b/src/plugins/fts-solr/solr-connection.h Sun Jul 13 14:40:03 2008 +0300 @@ -17,6 +17,6 @@ solr_connection_post_begin(struct solr_connection *conn); void solr_connection_post_more(struct solr_connection_post *post, const unsigned char *data, size_t size); -int solr_connection_end(struct solr_connection_post *post); +int solr_connection_post_end(struct solr_connection_post *post); #endif