Hi Kit more details on that
since we are talking about dynamic loading, which can’t be done in __init__ function, and even I have a redis locally, but if I use luasocket(support unix domain socket) to connect to it, it will be in he blocking mode, it’s not async, so I wondering if the ts.fetch will support the unix domain socket, which allow me to use the async as well as not as heavy as tcp socket. Hope that make sense ? Thanks, Di Li > On Dec 12, 2016, at 4:53 PM, Di Li <di...@apple.com> wrote: > > Hi Kit, > > Does ts.fetch support unix domain socket ? or only http > > > Thanks, > Di Li > > >> On Dec 12, 2016, at 9:25 AM, Di Li <di...@apple.com> wrote: >> >> Hi Kit, >> >> Thanks for the advise, I will do some benchmark with redis and maybe write a >> small GO application to fill our end, I think the stats way probably not >> made for such thing >> >> Thanks for the help >> >> Thanks, >> Di Li >> >> >> >> >>> On Dec 9, 2016, at 3:52 PM, Shu Kit Chan <chanshu...@gmail.com >>> <mailto:chanshu...@gmail.com>> wrote: >>> >>> I honestly don't know if your model can support million lines. I guess >>> you just have to stress test to make sure. >>> >>> For the redis way, I find that to be fine for some modest work load >>> (e.g. 5K rps) . But beyond that, you just need to stress test that and >>> perhaps need to tune it or use other similar solutions. The takeaway >>> is that you need a scalable fast store for your lookups and that you >>> can occasionally update these lookups. >>> >>> Thanks. >>> >>> Kit >>> >>> On Fri, Dec 9, 2016 at 3:38 PM, Di Li <di...@apple.com >>> <mailto:di...@apple.com>> wrote: >>>> Hi Kit, >>>> >>>> Thanks for the suggestion, do you think it will be a problem to use the >>>> ts.stats way to maintain a key value pair, I don’t need that to be >>>> persistent, as long as it can be shared between requests. >>>> >>>> For example, if I just want to do a access control and use the src_ip + >>>> domain as key , and I don’t have to do the action for the values >>>> >>>> 1.1.1.1_youtube.com = 1 >>>> 2.2.2.2_google.com = 1 >>>> … >>>> … >>>> >>>> do you think this model will work for support millions lines like this ? I >>>> check the code a little bit, eventually it use the hash, I don’t think it >>>> will cause a issue as the rule grows. >>>> >>>> I like the idea for a local redis way, but if I have to call the local >>>> redis >>>> for every single request, it probably won’t scale ? >>>> >>>> Thanks, >>>> Di Li >>>> >>>> >>>> >>>> >>>> >>>> On Dec 9, 2016, at 3:20 PM, Shu Kit Chan <chanshu...@gmail.com >>>> <mailto:chanshu...@gmail.com>> wrote: >>>> >>>> Yeah. That's right. It won't work the way you intended. >>>> >>>> you probably need an external source of truth as your trigger. e.g. a >>>> local redis store. >>>> So you have some cron to keep checking some URL and update a key in >>>> the local redis store. >>>> And then you have lua script to check the key in the local redis store >>>> and make decision based on that. >>>> >>>> Thanks. >>>> >>>> On Fri, Dec 9, 2016 at 2:18 PM, Di Li <di...@apple.com >>>> <mailto:di...@apple.com>> wrote: >>>> >>>> looks like so far only thing that’s not request lifetime is that >>>> ts.stat_create and find >>>> >>>> >>>> Thanks, >>>> Di Li >>>> >>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> + SHIELD :: Self-Service Load-Balancer (LB) and Web App Firewall (WAF) >>>> + http://shield.apple.com <http://shield.apple.com/> >>>> + >>>> + SHIELD classes: >>>> + >>>> http://shield.apple.com/FAQ/doku.php?id=start#shield_classes_trainings_tutorials >>>> >>>> <http://shield.apple.com/FAQ/doku.php?id=start#shield_classes_trainings_tutorials> >>>> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>>> >>>> >>>> >>>> On Dec 9, 2016, at 11:21 AM, Di Li <di...@apple.com> wrote: >>>> >>>> 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 >>>> >>>> >>>> >>>> >>>> >>>> >> >