I just did a quick test with counter = counter + 1 , and seems that global lua 
table has the same lifetime as the request.

is there any way I can store data beyond the request lifetime ?



Thanks,
Di Li




> On Dec 9, 2016, at 10:23 AM, Di Li <di...@apple.com> wrote:
> 
> Hey Kit,
> 
> 
> Thanks for taking time to respond my emails, I still have some confusions, 
> hopefully you can help me understand more about those pieces.
> 
> The background here is we are trying to do a forward proxy, the reason I was 
> thinking about using ts.schedule is that it can keep get the latest our 
> control data from a external end point like whatever NOSQL family solution 
> via ts.fetch, so that we don’t have to depends on the __init__ function with 
> which we have to restart the traffic server to get latest data. The __init__ 
> function can be used to serve the first fetch of data, this is what in my 
> mind at beginning.
> 
> Looks like the pieces I missed here is a shared_lua_dict part, that other lua 
> script won’t be able to access whatever that scheduler fetched.
> 
> Now I’m thinking a different path to make this happen, maybe not ideal, but 
> maybe gonna work, what if I have a do_global_read_request (we are forward 
> proxy, we don’t have remap rules) and checks where the a request being 
> called, and where I can match our control fetch, and then that will fetch the 
> data from a external point that has our control data and update the GLOBAL 
> variable, which will be used in the same script.
> 
> ============================
> 
> local control_data = {}
> 
> function __init__()
>  -- do whatever the logic to fetch a external endpoint, and update lua table 
> control_data,
>  -- maybe use luasocket to do that
> end
> 
> 
> 
> function control_request()
> 
>  local url_host = ts.client_request.get_url_host()
> 
>  if url_host == '127.0.0.1' then
>    -- for example this is our local cron call to update the control_data 
> table, could match with IP or whatever make sense.
>    -- ts.fetch our endpoint to get control_data
> 
>    local res = ts.fetch(url, {method = 'GET', header=hdr})
>    if res.status == 200 then
>      -- parse result, and update the contorl_data
>    end
> 
>  else
>    -- this is client normal call, check if our control_data has logic on it, 
> for example simple allow or not
>    if control_data[url_host] == 'allow' then
>      return 0
>    else
>      -- this is not allow 
>      ts.http.set_resp(403)
>      return 0
>  end
>  return 0
> end
> 
> 
> function do_global_read_request()
>   ts.hook(TS_LUA_HOOK_READ_REQUEST_HDR, control_request)
>   return 0
> end
> ===============================
> 
> If I understand this correctly, the init will only be called once at traffic 
> server start up, and then all the rest request will go through 
> do_global_read_request logic (we are forward proxy).
> 
> two questions here:
> 
> 1. with this work flow, after init, I will have a control_data table, and if 
> I update it by local calls from 127.0.0.1 and update that control_data table, 
> does the following requests check the control_data with new data or still the 
> initialized data by init ?
> 
> 2. ts.fetch’s context is after_do_remap, you mentioned that yesterday, I 
> don’t have the do_remap(), but do_global_read_request(), I call the fetch 
> inside a Hook, I should be OK ?
> 
> 
> 
> Thanks,
> Di Li
> 
> 
> 
> 
>> On Dec 8, 2016, at 4:27 PM, Shu Kit Chan <chanshu...@gmail.com> wrote:
>> 
>> 1) No. you don't need to do anything in txn close hook.
>> 
>> 2) See the example in the documentation. I think we can definitely
>> improve the text a bit. What it means is that you need to add a hook
>> inside do_remap and ts.schedule() can only be called inside that hook
>> function.
>> It is similar to
>> https://docs.trafficserver.apache.org/en/latest/developer-guide/api/functions/TSContSchedule.en.html
>> However, inside ts_lua we only support net and task.
>> 
>> 3) There is an example (the second one) close to the beginning of the
>> doc - 
>> https://docs.trafficserver.apache.org/en/latest/admin-guide/plugins/ts_lua.en.html
>> 
>> 4) we don't have this for now. Suggestions/patches are welcome.
>> 
>> IMHO, you don't need to use ts.schedule() . You can directly use
>> luasocket inside __init__ function since this is run inside
>> TSPluginInit(). You can use global variable to store the results you
>> want similar to the __init__ example in the document .
>> However, pls be aware that we instantiate multiple lua state and thus
>> we run __init__ for each of those state so it may result in a slow
>> startup time for you. See jira -
>> https://issues.apache.org/jira/browse/TS-4994 for a patch for this.
>> 
>> Thanks. Let me know if i can provide any more help.
>> 
>> Kit
>> 
>> 
>> 
>> On Thu, Dec 8, 2016 at 3:52 PM, Di Li <di...@apple.com> wrote:
>>> Hey Guys,
>>> 
>>> Several questions about the ts-lua , just start to use it, so some question
>>> may seem very simple
>>> 
>>> 1. question about  log part “[globalHookHandler] has txn hook -> adding txn
>>> close hook handler to release resources”
>>> 
>>> for example I’m using the following code, and the debug log shows above log
>>> , do I need to do anything to handle a txt close hook to release the
>>> resource, or I should just ignore the log
>>> 
>>> 
>>> function do_some_work()
>>> - - do some logic
>>> return 0
>>> end
>>> 
>>> 
>>> function do_global_read_request()
>>>  ts.debug('this is do_global_read_request')
>>>  ts.hook(TS_LUA_HOOK_READ_REQUEST_HDR, do_some_work)
>>>  return 0
>>> end
>>> 
>>> 
>>> 2. question for ts.schedule
>>> 
>>> what does “after do_remap” means, is that after hook TS_HTTP_POST_REMAP_HOOK
>>> ?
>>> what are the types in “ THREAD_TYPE” other than the one in the example
>>> "TS_LUA_THREAD_POOL_NET”, and what’s the different between those types.
>>> 
>>> 
>>> ts.schedule
>>> syntax: ts.schedule(THREAD_TYPE, sec, FUNCTION, param1?, param2?, ...)
>>> context: after do_remap
>>> 
>>> 
>>> 3. init function being called when traffic_server starts
>>> 
>>> is there a init function being called when traffic_server starts, like the
>>> following in nginx
>>> 
>>> https://github.com/openresty/lua-nginx-module#init_worker_by_lua
>>> 
>>> 
>>> 4. Global shared lua dict
>>> 
>>> is there a global shared lua dict, that will not has the lift time as
>>> ts.ctx, something like lua_shared_dict in nginx ?
>>> 
>>> 
>>> What I’m trying to do here is that when traffic server starts up, it will
>>> try to call a init script, which will init a scheduler to fetch a url either
>>> internal or external and get that response store to a shared_lua_dict as
>>> key/value pairs, and later on each of the request comes to the ATS will try
>>> to check the key/values use that shared_lua_dict. With that in mind, I need
>>> to understand those 4 questions above.
>>> 
>>> 
>>> 
>>> Thanks,
>>> Di Li
>>> 
>>> 
> 

Reply via email to