On May 4, 2014, at 5:58 PM, kic...@apache.org wrote:

> 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 <kic...@apache.org>
> Authored: Sun May 4 17:58:47 2014 -0700
> Committer: Kit Chan <kic...@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;

These can be static.

> 
> +TSCont global_contp;

This can be static.

> +
> 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;

OK, so here you are hooking TS_HTTP_TXN_START_HOOK on every request as a 
side-effect of simply loading the plugin.

> +  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);

And then you set up a TS_HTTP_TXN_CLOSE_HOOK so that you can nuke the Lua stat 
you just allocated.

> +
> +  TSContDataSet(global_contp, http_ctx);

How is it OK to reset the continuation data on a global continuation on each 
request? Other requests that are in flight are going to get their lua_State 
switched out from under them. What prevent multiple threads knocking on the 
same lua_State?

> +  TSMutexUnlock(main_ctx->mutexp);
> +
> +  TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE);
> +  return 0;
> +}
> +
> +static int
> +globalHookHandler(TSCont contp, TSEvent event, void *edata) {

The guts of this could be largely implemented by ts_lua_http_cont_handler() 
AFAICT.

> +  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);

Missing lua_pop.

>       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;

What is lua_function_exists doing  here? I can't tell what makes 
TS_HTTP_READ_REQUEST_HDR_HOOK special ...

> +      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);
> }
> 

Reply via email to