[Groonga-commit] groonga/groonga at 1db55e8 [master] Support request_timeout parameter

Back to archive index

Kouhei Sutou null+****@clear*****
Sun Apr 3 00:50:22 JST 2016


Kouhei Sutou	2016-04-03 00:50:22 +0900 (Sun, 03 Apr 2016)

  New Revision: 1db55e8bba3fa3d628f53e71e0717447b04c4183
  https://github.com/groonga/groonga/commit/1db55e8bba3fa3d628f53e71e0717447b04c4183

  Message:
    Support request_timeout parameter

  Modified files:
    lib/ctx.c
    lib/grn_ctx_impl.h

  Modified: lib/ctx.c (+35 -0)
===================================================================
--- lib/ctx.c    2016-04-03 00:49:05 +0900 (855d49a)
+++ lib/ctx.c    2016-04-03 00:50:22 +0900 (80404a0)
@@ -620,6 +620,7 @@ grn_ctx_impl_init(grn_ctx *ctx)
   ctx->impl->curr_expr = NULL;
   ctx->impl->qe_next = NULL;
   GRN_TEXT_INIT(&ctx->impl->current_request_id, 0);
+  ctx->impl->current_request_timer_id = NULL;
   ctx->impl->parser = NULL;
 
   GRN_TEXT_INIT(&ctx->impl->output.names, GRN_OBJ_VECTOR);
@@ -1422,11 +1423,13 @@ get_command_version(grn_ctx *ctx, const char *p, const char *pe)
 #define OUTPUT_TYPE         "output_type"
 #define COMMAND_VERSION     "command_version"
 #define REQUEST_ID          "request_id"
+#define REQUEST_TIMEOUT     "request_timeout"
 #define OUTPUT_PRETTY       "output_pretty"
 #define EXPR_MISSING        "expr_missing"
 #define OUTPUT_TYPE_LEN     (sizeof(OUTPUT_TYPE) - 1)
 #define COMMAND_VERSION_LEN (sizeof(COMMAND_VERSION) - 1)
 #define REQUEST_ID_LEN      (sizeof(REQUEST_ID) - 1)
+#define REQUEST_TIMEOUT_LEN (sizeof(REQUEST_TIMEOUT) - 1)
 #define OUTPUT_PRETTY_LEN   (sizeof(OUTPUT_PRETTY) - 1)
 
 #define HTTP_QUERY_PAIR_DELIMITER   "="
@@ -1445,6 +1448,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
   grn_command_version command_version;
   grn_obj buf, *expr, *val;
   grn_obj request_id;
+  double request_timeout = 0.0;
   const char *p = path, *e = path + path_len, *v, *key_end, *filename_end;
 
   command_version = grn_ctx_get_command_version(ctx);
@@ -1482,6 +1486,12 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
           GRN_BULK_REWIND(&request_id);
           p = grn_text_cgidec(ctx, &request_id, p, e,
                               HTTP_QUERY_PAIRS_DELIMITERS);
+        } else if (l == REQUEST_TIMEOUT_LEN &&
+                   !memcmp(v, REQUEST_TIMEOUT, REQUEST_TIMEOUT_LEN)) {
+          GRN_BULK_REWIND(&buf);
+          p = grn_text_cgidec(ctx, &buf, p, e, HTTP_QUERY_PAIRS_DELIMITERS);
+          GRN_TEXT_PUTC(ctx, &buf, '\0');
+          request_timeout = strtod(GRN_TEXT_VALUE(&buf), NULL);
         } else if (l == OUTPUT_PRETTY_LEN &&
                    !memcmp(v, OUTPUT_PRETTY, OUTPUT_PRETTY_LEN)) {
           GRN_BULK_REWIND(&buf);
@@ -1507,6 +1517,13 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len)
         grn_request_canceler_register(ctx,
                                       GRN_TEXT_VALUE(&request_id),
                                       GRN_TEXT_LEN(&request_id));
+        if (request_timeout > 0) {
+          ctx->impl->current_request_timer_id =
+            grn_request_timer_register(ctx,
+                                       GRN_TEXT_VALUE(&request_id),
+                                       GRN_TEXT_LEN(&request_id),
+                                       request_timeout);
+        }
       }
       ctx->impl->curr_expr = expr;
       grn_expr_exec(ctx, expr, 0);
@@ -1540,6 +1557,7 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
   int offset = 0;
   grn_obj buf, *expr = NULL, *val = NULL;
   grn_obj request_id;
+  double request_timeout = 0.0;
   const char *p = str, *e = str + str_len, *v;
   command_version = grn_ctx_get_command_version(ctx);
   GRN_TEXT_INIT(&buf, 0);
@@ -1573,6 +1591,12 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
                    !memcmp(v, REQUEST_ID, REQUEST_ID_LEN)) {
           GRN_BULK_REWIND(&request_id);
           p = grn_text_unesc_tok(ctx, &request_id, p, e, &tok_type);
+        } else if (l == REQUEST_TIMEOUT_LEN &&
+                   !memcmp(v, REQUEST_TIMEOUT, REQUEST_TIMEOUT_LEN)) {
+          GRN_BULK_REWIND(&buf);
+          p = grn_text_unesc_tok(ctx, &buf, p, e, &tok_type);
+          GRN_TEXT_PUTC(ctx, &buf, '\0');
+          request_timeout = strtod(GRN_TEXT_VALUE(&buf), NULL);
         } else if (l == OUTPUT_PRETTY_LEN &&
                    !memcmp(v, OUTPUT_PRETTY, OUTPUT_PRETTY_LEN)) {
           GRN_BULK_REWIND(&buf);
@@ -1610,6 +1634,13 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len)
     grn_request_canceler_register(ctx,
                                   GRN_TEXT_VALUE(&request_id),
                                   GRN_TEXT_LEN(&request_id));
+    if (request_timeout > 0.0) {
+      ctx->impl->current_request_timer_id =
+        grn_request_timer_register(ctx,
+                                   GRN_TEXT_VALUE(&request_id),
+                                   GRN_TEXT_LEN(&request_id),
+                                   request_timeout);
+    }
   }
   ctx->impl->curr_expr = expr;
   if (expr && command_proc_p(expr)) {
@@ -1721,6 +1752,10 @@ grn_ctx_send(grn_ctx *ctx, const char *str, unsigned int str_len, int flags)
       if (ctx->impl->qe_next) {
         ERRCLR(ctx);
       } else {
+        if (ctx->impl->current_request_timer_id) {
+          grn_request_timer_unregister(ctx, ctx->impl->current_request_timer_id);
+          ctx->impl->current_request_timer_id = NULL;
+        }
         if (GRN_TEXT_LEN(&ctx->impl->current_request_id) > 0) {
           grn_obj *request_id = &ctx->impl->current_request_id;
           grn_request_canceler_unregister(ctx,

  Modified: lib/grn_ctx_impl.h (+1 -0)
===================================================================
--- lib/grn_ctx_impl.h    2016-04-03 00:49:05 +0900 (6fc0dc7)
+++ lib/grn_ctx_impl.h    2016-04-03 00:50:22 +0900 (8b76ba1)
@@ -162,6 +162,7 @@ struct _grn_ctx_impl {
   grn_obj *curr_expr;
   grn_obj *qe_next;
   grn_obj current_request_id;
+  void *current_request_timer_id;
   void *parser;
   grn_timeval tv;
 
-------------- next part --------------
HTML����������������������������...
Télécharger 



More information about the Groonga-commit mailing list
Back to archive index