]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-solr: Error handling fixes.
authorTimo Sirainen <tss@iki.fi>
Sun, 13 Jul 2008 11:40:03 +0000 (14:40 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 13 Jul 2008 11:40:03 +0000 (14:40 +0300)
--HG--
branch : HEAD

src/plugins/fts-solr/fts-backend-solr.c
src/plugins/fts-solr/solr-connection.c
src/plugins/fts-solr/solr-connection.h

index 7454a012a42afcc953a390e6b1fc74a049c33bed..8f7406f4d177314a40f6ff0426e5f76c28e128c7 100644 (file)
@@ -190,7 +190,7 @@ fts_backend_solr_build_deinit(struct fts_backend_build_context *_ctx)
                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,
index 41a392654dd304501d02ca1c88504df5fda7c005..e0dd2591c91514f1d78cbf1d590e0343cdc9b35c 100644 (file)
@@ -49,6 +49,7 @@ struct solr_connection {
        XML_Parser xml_parser;
 
        char *url;
+       char *http_failure;
 
        unsigned int debug:1;
        unsigned int posting:1;
@@ -61,7 +62,7 @@ solr_conn_init_settings(struct solr_connection *conn, const char *str)
        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 @@ curl_input_func(void *data, size_t element_size, size_t nmemb, void *context)
        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 @@ struct solr_connection *solr_connection_init(const char *settings)
        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 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
        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 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
                        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 @@ solr_connection_post_begin(struct solr_connection *conn)
        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 @@ void solr_connection_post_more(struct solr_connection_post *post,
        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 @@ int solr_connection_end(struct solr_connection_post *post)
 
        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 @@ int solr_connection_post(struct solr_connection *conn, const char *cmd)
        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);
 }
index 5d83dc7054dd13a4a1461ca232e9ca9cd38a2441..049fbb98835a5059679bc971a4be46e0540abacb 100644 (file)
@@ -17,6 +17,6 @@ struct solr_connection_post *
 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