trafficserver-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kic...@apache.org
Subject git commit: TS-2555: updates to share lua context across hook invocations and only add global hooks if corresponding lua functions exist
Date Mon, 05 May 2014 00:58:55 GMT
Repository: trafficserver
Updated Branches:
  refs/heads/master ea7849384 -> 5b1535e39


TS-2555: updates to share lua context across hook invocations and only add global hooks if
corresponding lua functions exist


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

Branch: refs/heads/master
Commit: 5b1535e399aa450eeb1c75e43c2398042036c363
Parents: ea78493
Author: Kit Chan <kichan@apache.org>
Authored: Sun May 4 17:58:47 2014 -0700
Committer: Kit Chan <kichan@apache.org>
Committed: Sun May 4 17:58:47 2014 -0700

----------------------------------------------------------------------
 plugins/experimental/ts_lua/ts_lua.c | 111 +++++++++++++++++++++++-------
 1 file changed, 86 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/5b1535e3/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 32cb58c..6c72a98 100644
--- a/plugins/experimental/ts_lua/ts_lua.c
+++ b/plugins/experimental/ts_lua/ts_lua.c
@@ -31,6 +31,8 @@ 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;
 
+TSCont global_contp;
+
 TSReturnCode
 TSRemapInit(TSRemapInterface *api_info, char * errbuf ATS_UNUSED , int errbuf_size ATS_UNUSED
)
 {
@@ -147,14 +149,11 @@ TSRemapDoRemap(void* ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
     return ret;
 }
 
-static int
-globalHookHandler(TSCont contp, TSEvent event, void *edata) {
+static int 
+transactionStartHookHandler(TSCont contp, TSEvent event, void *edata) {
   TSHttpTxn txnp = (TSHttpTxn) edata;
 
-  int ret = 0;
   int64_t req_id;
-
-  lua_State *l;
   TSCont txn_contp;
 
   ts_lua_main_ctx     *main_ctx;
@@ -165,12 +164,36 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
   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) {
+  TSHttpTxn txnp = (TSHttpTxn) edata;
+
+  int ret = 0;
+
+  lua_State *l;
+
+  ts_lua_http_ctx     *http_ctx = (ts_lua_http_ctx *) TSContDataGet(contp);
+
   TSMBuffer bufp;
   TSMLoc hdr_loc;
   TSMLoc url_loc;
@@ -184,11 +207,10 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
   }
 
   if(!http_ctx->client_request_hdrp) {
-    TSMutexUnlock(main_ctx->mutexp);
     TSHttpTxnReenable(txnp,TS_EVENT_HTTP_CONTINUE);
     return 0;
   }
- 
+
   l = http_ctx->lua;
 
   switch (event) {
@@ -213,22 +235,16 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
     break;
 
   default:
-    TSMutexUnlock(main_ctx->mutexp);
     TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
     return 0;
     break;
   }
 
   if (lua_type(l, -1) != LUA_TFUNCTION) {
-      TSMutexUnlock(main_ctx->mutexp);
       TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
       return 0;
   }
 
-  txn_contp = TSContCreate(ts_lua_http_cont_handler, NULL);
-  TSContDataSet(txn_contp, http_ctx);
-  http_ctx->main_contp = txn_contp;
-
   if (lua_pcall(l, 0, 1, 0) != 0) {
       fprintf(stderr, "lua_pcall failed: %s\n", lua_tostring(l, -1));
   }
@@ -236,10 +252,6 @@ globalHookHandler(TSCont contp, TSEvent event, void *edata) {
   ret = lua_tointeger(l, -1);
   lua_pop(l, 1);
 
-  TSHttpTxnHookAdd(txnp, TS_HTTP_TXN_CLOSE_HOOK, txn_contp);
-
-  TSMutexUnlock(main_ctx->mutexp);
-
   TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
   return ret;
 }
@@ -283,17 +295,66 @@ TSPluginInit(int argc, const char *argv[]) {
       return;
     }
 
-    TSCont global_contp = TSContCreate(globalHookHandler, NULL);
+    TSCont txn_start_contp = TSContCreate(transactionStartHookHandler, NULL);
+    if (!txn_start_contp) {
+      TSError("[%s] could not create transaction start continuation", __FUNCTION__ );
+      return;
+    }
+    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;
     }
-    TSContDataSet(global_contp, conf);
 
-    TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, global_contp);
-    TSHttpHookAdd(TS_HTTP_SEND_REQUEST_HDR_HOOK, global_contp);
-    TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, global_contp);
-    TSHttpHookAdd(TS_HTTP_SEND_RESPONSE_HDR_HOOK, global_contp);
-    TSHttpHookAdd(TS_HTTP_CACHE_LOOKUP_COMPLETE_HOOK, global_contp);
- 
+    //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);
 }


Mime
View raw message