You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by ki...@apache.org on 2014/05/05 21:45:47 UTC

git commit: TS-2555: fix to keep same context for a transaction

Repository: trafficserver
Updated Branches:
  refs/heads/master 24a5ee5dd -> 3f0bb5bf8


TS-2555: fix to keep same context for a transaction


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/3f0bb5bf
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/3f0bb5bf
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/3f0bb5bf

Branch: refs/heads/master
Commit: 3f0bb5bf82e994431245633f67e47c8260425e74
Parents: 24a5ee5
Author: Kit Chan <ki...@apache.org>
Authored: Mon May 5 19:45:30 2014 +0000
Committer: Kit Chan <ki...@apache.org>
Committed: Mon May 5 19:45:30 2014 +0000

----------------------------------------------------------------------
 plugins/experimental/ts_lua/ts_lua.c | 177 ++++++++++++++----------------
 1 file changed, 83 insertions(+), 94 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/3f0bb5bf/plugins/experimental/ts_lua/ts_lua.c
----------------------------------------------------------------------
diff --git a/plugins/experimental/ts_lua/ts_lua.c b/plugins/experimental/ts_lua/ts_lua.c
index 582105a..59b1019 100644
--- a/plugins/experimental/ts_lua/ts_lua.c
+++ b/plugins/experimental/ts_lua/ts_lua.c
@@ -28,10 +28,9 @@
 static volatile int32_t ts_lua_http_next_id = 0;
 static volatile int32_t ts_lua_g_http_next_id = 0;
 
-ts_lua_main_ctx         *ts_lua_main_ctx_array;
-ts_lua_main_ctx         *ts_lua_g_main_ctx_array;
+static ts_lua_main_ctx         *ts_lua_main_ctx_array;
+static ts_lua_main_ctx         *ts_lua_g_main_ctx_array;
 
-TSCont global_contp;
 
 TSReturnCode
 TSRemapInit(TSRemapInterface *api_info, char * errbuf ATS_UNUSED , int errbuf_size ATS_UNUSED )
@@ -149,43 +148,9 @@ TSRemapDoRemap(void* ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
     return ret;
 }
 
-static int 
-transactionStartHookHandler(TSCont contp, TSEvent event ATS_UNUSED, void *edata) {
-  TSHttpTxn txnp = (TSHttpTxn) edata;
-
-  int64_t req_id;
-  TSCont txn_contp;
-
-  ts_lua_main_ctx     *main_ctx;
-  ts_lua_http_ctx     *http_ctx;
-
-  ts_lua_instance_conf *conf = (ts_lua_instance_conf *)TSContDataGet(contp);
-
-  req_id = (int64_t) ts_lua_atomic_increment((&ts_lua_g_http_next_id), 1);
-  main_ctx = &ts_lua_g_main_ctx_array[req_id%TS_LUA_MAX_STATE_COUNT];
-
-  TSDebug(TS_LUA_DEBUG_TAG, "[%s] req_id: %" PRId64, __FUNCTION__, req_id);  
-  TSMutexLock(main_ctx->mutexp);
-
-  http_ctx = ts_lua_create_http_ctx(main_ctx, conf);
-  http_ctx->txnp = txnp;
-  http_ctx->remap = 0;
-
-  txn_contp = TSContCreate(ts_lua_http_cont_handler, NULL);
-  TSContDataSet(txn_contp, http_ctx);
-  http_ctx->main_contp = txn_contp;
-  TSHttpTxnHookAdd(txnp, TS_HTTP_TXN_CLOSE_HOOK, txn_contp);
-
-  TSContDataSet(global_contp, http_ctx);
-
-  TSMutexUnlock(main_ctx->mutexp);
-
-  TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
-  return 0;
-}
-
 static int
-globalHookHandler(TSCont contp, TSEvent event, void *edata) {
+globalHookHandler(TSCont contp, TSEvent event, void *edata) 
+{
   TSHttpTxn txnp = (TSHttpTxn) edata;
 
   int ret = 0;
@@ -242,6 +207,7 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
 
   if (lua_type(l, -1) != LUA_TFUNCTION) {
       TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
+      lua_pop(l, 1);
       return 0;
   }
 
@@ -256,8 +222,85 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
   return ret;
 }
 
+static int 
+transactionStartHookHandler(TSCont contp, TSEvent event ATS_UNUSED, void *edata) 
+{
+  TSHttpTxn txnp = (TSHttpTxn) edata;
+
+  int64_t req_id;
+  TSCont txn_contp;
+  TSCont global_contp;
+
+  ts_lua_main_ctx     *main_ctx;
+  ts_lua_http_ctx     *http_ctx;
+
+  ts_lua_instance_conf *conf = (ts_lua_instance_conf *)TSContDataGet(contp);
+
+  req_id = (int64_t) ts_lua_atomic_increment((&ts_lua_g_http_next_id), 1);
+  main_ctx = &ts_lua_g_main_ctx_array[req_id%TS_LUA_MAX_STATE_COUNT];
+
+  TSDebug(TS_LUA_DEBUG_TAG, "[%s] req_id: %" PRId64, __FUNCTION__, req_id);  
+  TSMutexLock(main_ctx->mutexp);
+
+  http_ctx = ts_lua_create_http_ctx(main_ctx, conf);
+  http_ctx->txnp = txnp;
+  http_ctx->remap = 0;
+
+  txn_contp = TSContCreate(ts_lua_http_cont_handler, NULL);
+  TSContDataSet(txn_contp, http_ctx);
+  http_ctx->main_contp = txn_contp;
+  TSHttpTxnHookAdd(txnp, TS_HTTP_TXN_CLOSE_HOOK, txn_contp);
+
+  global_contp = TSContCreate(globalHookHandler, NULL);
+  TSContDataSet(global_contp, http_ctx);
+
+  //adding hook based on whether the lua global function exists.
+  lua_State *l = http_ctx->lua;
+  
+  lua_getglobal(l, TS_LUA_FUNCTION_G_SEND_REQUEST);
+  if(lua_type(l, -1) == LUA_TFUNCTION) {
+    TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_REQUEST_HDR_HOOK, global_contp);
+    TSDebug(TS_LUA_DEBUG_TAG, "send_request_hdr_hook added");
+  }
+  lua_pop(l, 1);
+
+  lua_getglobal(l, TS_LUA_FUNCTION_G_READ_RESPONSE);
+  if(lua_type(l, -1) == LUA_TFUNCTION) {
+    TSHttpTxnHookAdd(txnp, TS_HTTP_READ_RESPONSE_HDR_HOOK, global_contp);
+    TSDebug(TS_LUA_DEBUG_TAG, "read_response_hdr_hook added");
+  }
+  lua_pop(l, 1);
+  
+  lua_getglobal(l, TS_LUA_FUNCTION_G_SEND_RESPONSE);
+  if(lua_type(l, -1) == LUA_TFUNCTION) {
+    TSHttpTxnHookAdd(txnp, TS_HTTP_SEND_RESPONSE_HDR_HOOK, global_contp);
+    TSDebug(TS_LUA_DEBUG_TAG, "send_response_hdr_hook added");
+  }
+  lua_pop(l, 1);
+
+  lua_getglobal(l, TS_LUA_FUNCTION_G_CACHE_LOOKUP_COMPLETE);
+  if(lua_type(l, -1) == LUA_TFUNCTION) {
+    TSHttpTxnHookAdd(txnp, TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, global_contp);
+    TSDebug(TS_LUA_DEBUG_TAG, "cache_lookup_complete_hook added");
+  }
+  lua_pop(l, 1);
+
+  lua_getglobal(l, TS_LUA_FUNCTION_G_READ_REQUEST);
+  if(lua_type(l, -1) == LUA_TFUNCTION) {
+    TSHttpTxnHookAdd(txnp, TS_HTTP_READ_REQUEST_HDR_HOOK, global_contp);
+    TSDebug(TS_LUA_DEBUG_TAG, "read_request_hdr_hook added");
+  }
+  lua_pop(l, 1);
+
+  TSMutexUnlock(main_ctx->mutexp);
+
+  TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
+  return 0;
+}
+
 void
-TSPluginInit(int argc, const char *argv[]) {
+TSPluginInit(int argc, const char *argv[]) 
+{
     int ret = 0;
     ts_lua_g_main_ctx_array = TSmalloc(sizeof(ts_lua_main_ctx) * TS_LUA_MAX_STATE_COUNT);
     memset(ts_lua_g_main_ctx_array, 0, sizeof(ts_lua_main_ctx) * TS_LUA_MAX_STATE_COUNT);
@@ -303,58 +346,4 @@ TSPluginInit(int argc, const char *argv[]) {
     TSContDataSet(txn_start_contp, conf);
     TSHttpHookAdd(TS_HTTP_TXN_START_HOOK, txn_start_contp);
 
-
-    global_contp = TSContCreate(globalHookHandler, NULL);
-    if (!global_contp) {
-      TSError("[%s] Could not create global continuation", __FUNCTION__);
-      return;
-    }
-
-    //adding hook based on whether the lua global function exists.
-    ts_lua_main_ctx *main_ctx = &ts_lua_g_main_ctx_array[0];
-    ts_lua_http_ctx *http_ctx = ts_lua_create_http_ctx(main_ctx, conf);
-    lua_State *l = http_ctx->lua;
-    int lua_function_exists = 0;
-
-    lua_getglobal(l, TS_LUA_FUNCTION_G_SEND_REQUEST);
-    if(lua_type(l, -1) == LUA_TFUNCTION) {
-      lua_function_exists = 1;
-      TSHttpHookAdd(TS_HTTP_SEND_REQUEST_HDR_HOOK, global_contp);
-      TSDebug(TS_LUA_DEBUG_TAG, "send_request_hdr_hook added");
-    }
-    lua_pop(l, 1);
-
-    lua_getglobal(l, TS_LUA_FUNCTION_G_READ_RESPONSE);
-    if(lua_type(l, -1) == LUA_TFUNCTION) {
-      lua_function_exists = 1;
-      TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, global_contp);
-      TSDebug(TS_LUA_DEBUG_TAG, "read_response_hdr_hook added");
-    }
-    lua_pop(l, 1);
-
-    lua_getglobal(l, TS_LUA_FUNCTION_G_SEND_RESPONSE);
-    if(lua_type(l, -1) == LUA_TFUNCTION) {
-      lua_function_exists = 1;
-      TSHttpHookAdd(TS_HTTP_SEND_RESPONSE_HDR_HOOK, global_contp);
-      TSDebug(TS_LUA_DEBUG_TAG, "send_response_hdr_hook added");
-    }
-    lua_pop(l, 1);
-
-    lua_getglobal(l, TS_LUA_FUNCTION_G_CACHE_LOOKUP_COMPLETE);
-    if(lua_type(l, -1) == LUA_TFUNCTION) {
-      lua_function_exists = 1;
-      TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, global_contp);
-      TSDebug(TS_LUA_DEBUG_TAG, "cache_lookup_complete_hook added");
-    }
-    lua_pop(l, 1);
-
-    lua_getglobal(l, TS_LUA_FUNCTION_G_READ_REQUEST);
-    if((lua_type(l, -1) == LUA_TFUNCTION) || lua_function_exists) {
-      lua_function_exists = 1;
-      TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, global_contp);
-      TSDebug(TS_LUA_DEBUG_TAG, "read_request_hdr_hook added");
-    } 
-    lua_pop(l, 1);
-    
-    ts_lua_destroy_http_ctx(http_ctx);
 }