Giter VIP home page Giter VIP logo

Comments (10)

agentzh avatar agentzh commented on August 9, 2024 1

@rshriram I mean something like

header_filter_by_lua_block {
    local my_status = ngx.ctx.my_status
    if my_status and ngx.status == 500 then
        ngx.status = my_status
    end
}

Assuming you have set ngx.ctx.my_status to 503 in your balancer_by_lua* handlers.

Generated response headers (and also bodies) can be overridden in the output filters, that's what output filters are all about :)

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram This is the behavior of the nginx upstream facility and we cannot override that in a 3rd-party module.

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram Having said that, you can override it in header_filter_by_lua*, BTW.

from lua-resty-core.

rshriram avatar rshriram commented on August 9, 2024

@agentzh Thanks for the clarification. To summarize, returning anything other than ngx.error, ngx.ok is not possible in a balancer_by_lua context (I went through the code).

the header_filter_by_lua* -- can it work in balancer_by_lua ? I thought the headers are already generated by the time the request reaches balancer by lua stage. And they can't be overridden. If this works, I would love to use it, as I need to set the host header dynamically based on the choice of upstream instance.

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram You can always use ngx.ctx to communicate your own data between different phase handlers anyway.

from lua-resty-core.

rshriram avatar rshriram commented on August 9, 2024

Would you suggest ngx.var over ngx.ctx, as I thought the latter was costlier.

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram ngx.var is much more expensive and much more limited than ngx.ctx.

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram ngx.ctx is not that costly if you do not invoke it in a hot Lua loop (and you shouldn't do that for any real reasons). You can always measure the overhead yourself BTW. Just don't be over panic.

from lua-resty-core.

rshriram avatar rshriram commented on August 9, 2024

😲 ! I thought it was the other way around.. And ended up using ngx.var as much as possible, while avoiding ngx.ctx .. Based on this https://www.cryptobells.com/openresty-performance-ngx-ctx-vs-ngx-shared-dict/ .. and now I see your response in google groups (https://groups.google.com/forum/#!msg/openresty-en/Yjaiut8Dv0k/Gc1eZWmLEQAJ)

On Sun, May 1, 2016 at 7:12 PM, Rob Kelledy wrote: 
> "The ngx.ctx lookup requires relatively expensive metamethod calls and it is 
> much slower than explicitly passing per-request data along by your own 
> function arguments. So do not abuse this API for saving your own function 
> arguments because it usually has quite some performance impact." 
> 

Don't worry too much about this paragraph. I added this note just for 
people who want to achieve near-C performance with their Lua code :) 

Sigh!

from lua-resty-core.

agentzh avatar agentzh commented on August 9, 2024

@rshriram Better profile with flame graph tools before trying any optimizations. Otherwise you may very well slow things even further :)

No kidding. I've seen such things a lot in real production systems.

from lua-resty-core.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.