Closed yskopets closed 6 years ago
@yskopets thanks for this.
This happens when the ~RequestInfoWrapper
is called (when the gc kicks in). Need to check the sequence.
It's missing resetting dynamic_metadata_wrapper_
when RequestInfoWrapper
receives onMarkDead
. Thinking about tests now.
@dio Thanks a lot for the quick feedback!
I have another question about correctness of my approach.
As you can see, I'm trying to change response entity inside envoy_on_response
callback.
Since respond()
function is not available for use inside envoy_on_response
, I have to fallback to response_handle:headers():replace(":status", "301")
, which seems very brittle:
Lua
filter indicates that it could possibly workSo, I'm wondering if I'm using Lua
filter the right way.
Do you have any plans to add support for respond()
inside envoy_on_response
? Or is it problematic due to the reasons I'm not seeing ?
I've notice that the issue is also reproducible when function envoy_on_request(request_handle)
calls request_handle:requestInfo():dynamicMetadata()
Repro steps:
Envoy
(google proxy) and add the following Lua
code: http_filters:
- name: envoy.lua
config:
inline_code: |
function envoy_on_request(request_handle)
request_handle:requestInfo():dynamicMetadata()
end
- name: envoy.router
Config:
Here is the minimal Envoy configuration to reproduce the issue:
admin:
access_log_path: /tmp/admin_access.log
address:
socket_address:
protocol: TCP
address: 127.0.0.1
port_value: 9901
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.http_connection_manager
config:
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
host_rewrite: www.google.com
cluster: service_google
http_filters:
- name: envoy.lua
config:
inline_code: |
function envoy_on_request(request_handle)
request_handle:requestInfo():dynamicMetadata()
end
- name: envoy.router
clusters:
- name: service_google
connect_timeout: 0.25s
type: LOGICAL_DNS
# Comment out the following line to test on v6 networks
dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
hosts:
- socket_address:
address: google.com
port_value: 443
tls_context: { sni: www.google.com }
Call Stack:
[2018-08-31 15:53:30.021][8][info][main] source/server/server.cc:202] initializing epoch 0 (hot restart version=10.200.16384.127.options=capacity=16384, num_slots=8209 hash=228984379728933363 size=2654312)
[2018-08-31 15:53:30.021][8][info][main] source/server/server.cc:204] statically linked extensions:
[2018-08-31 15:53:30.021][8][info][main] source/server/server.cc:206] access_loggers: envoy.file_access_log,envoy.http_grpc_access_log
[2018-08-31 15:53:30.021][8][info][main] source/server/server.cc:209] filters.http: envoy.buffer,envoy.cors,envoy.ext_authz,envoy.fault,envoy.filters.http.header_to_metadata,envoy.filters.http.jwt_authn,envoy.filters.http.rbac,envoy.grpc_http1_bridge,envoy.grpc_json_transcoder,envoy.grpc_web,envoy.gzip,envoy.health_check,envoy.http_dynamo_filter,envoy.ip_tagging,envoy.lua,envoy.rate_limit,envoy.router,envoy.squash
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:212] filters.listener: envoy.listener.original_dst,envoy.listener.proxy_protocol,envoy.listener.tls_inspector
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:215] filters.network: envoy.client_ssl_auth,envoy.echo,envoy.ext_authz,envoy.filters.network.rbac,envoy.filters.network.thrift_proxy,envoy.http_connection_manager,envoy.mongo_proxy,envoy.ratelimit,envoy.redis_proxy,envoy.tcp_proxy
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:217] stat_sinks: envoy.dog_statsd,envoy.metrics_service,envoy.stat_sinks.hystrix,envoy.statsd
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:219] tracers: envoy.dynamic.ot,envoy.lightstep,envoy.zipkin
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:222] transport_sockets.downstream: envoy.transport_sockets.capture,raw_buffer,tls
[2018-08-31 15:53:30.022][8][info][main] source/server/server.cc:225] transport_sockets.upstream: envoy.transport_sockets.capture,raw_buffer,tls
[2018-08-31 15:53:30.032][8][info][config] source/server/configuration_impl.cc:50] loading 0 static secret(s)
[2018-08-31 15:53:30.032][8][info][config] source/server/configuration_impl.cc:56] loading 1 cluster(s)
[2018-08-31 15:53:30.034][8][info][config] source/server/configuration_impl.cc:61] loading 1 listener(s)
[2018-08-31 15:53:30.035][8][info][lua] source/extensions/filters/http/lua/lua_filter.cc:449] envoy_on_response() function not found. Lua filter will not hook responses.
[2018-08-31 15:53:30.035][8][info][config] source/server/configuration_impl.cc:95] loading tracing configuration
[2018-08-31 15:53:30.035][8][info][config] source/server/configuration_impl.cc:117] loading stats sink configuration
[2018-08-31 15:53:30.036][8][info][main] source/server/server.cc:446] starting main dispatch loop
[2018-08-31 15:53:30.043][8][info][upstream] source/common/upstream/cluster_manager_impl.cc:134] cm init: all clusters initialized
[2018-08-31 15:53:30.043][8][info][main] source/server/server.cc:415] all clusters initialized. initializing init manager
[2018-08-31 15:53:30.043][8][info][config] source/server/listener_manager_impl.cc:907] all dependencies initialized. starting workers
[2018-08-31 15:53:36.920][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:125] Caught Segmentation fault, suspect faulting address 0x98
[2018-08-31 15:53:36.920][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:94] Backtrace thr<17> obj</usr/local/bin/envoy> (If unsymbolized, use tools/stack_decode.py):
[2018-08-31 15:53:36.923][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #0 0x51eaa4 lua_rawgeti
[2018-08-31 15:53:36.925][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #1 0x52cc02 luaL_unref
[2018-08-31 15:53:36.928][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #2 0x510c8f Envoy::Extensions::HttpFilters::Lua::RequestInfoWrapper::~RequestInfoWrapper()
[2018-08-31 15:53:36.930][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #3 0x510d26 Envoy::Extensions::Filters::Common::Lua::BaseLuaObject<>::registerType()::{lambda()#1}::_FUN()
[2018-08-31 15:53:36.932][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #4 0x530268 lj_BC_FUNCC
[2018-08-31 15:53:36.934][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #5 0x53255b gc_call_finalizer
[2018-08-31 15:53:36.936][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #6 0x532637 gc_finalize
[2018-08-31 15:53:36.938][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #7 0x533356 gc_onestep
[2018-08-31 15:53:36.942][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #8 0x53385b lj_gc_step
[2018-08-31 15:53:36.944][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #9 0x51e838 lua_newuserdata
[2018-08-31 15:53:36.948][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #10 0x5125b6 Envoy::Extensions::HttpFilters::Lua::Filter::doHeaders()
[2018-08-31 15:53:36.950][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #11 0x5128dd Envoy::Extensions::HttpFilters::Lua::Filter::decodeHeaders()
[2018-08-31 15:53:36.952][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #12 0x879de4 Envoy::Http::ConnectionManagerImpl::ActiveStream::decodeHeaders()
[2018-08-31 15:53:36.954][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #13 0x87a5a5 Envoy::Http::ConnectionManagerImpl::ActiveStream::decodeHeaders()
[2018-08-31 15:53:36.956][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #14 0x8ba489 Envoy::Http::Http1::ServerConnectionImpl::onMessageComplete()
[2018-08-31 15:53:36.959][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #15 0x8bde7b Envoy::Http::Http1::ConnectionImpl::onMessageCompleteBase()
[2018-08-31 15:53:36.962][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #16 0x8bdeec Envoy::Http::Http1::ConnectionImpl::{lambda()#7}::_FUN()
[2018-08-31 15:53:36.965][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #17 0x8c03ee http_parser_execute
[2018-08-31 15:53:36.967][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #18 0x8bb3f0 Envoy::Http::Http1::ConnectionImpl::dispatchSlice()
[2018-08-31 15:53:36.970][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #19 0x8bd98a Envoy::Http::Http1::ConnectionImpl::dispatch()
[2018-08-31 15:53:36.972][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #20 0x87833f Envoy::Http::ConnectionManagerImpl::onData()
[2018-08-31 15:53:36.975][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #21 0x6f89e6 Envoy::Network::FilterManagerImpl::onContinueReading()
[2018-08-31 15:53:36.978][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #22 0x6f6ffe Envoy::Network::ConnectionImpl::onReadReady()
[2018-08-31 15:53:36.982][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #23 0x6f77ed Envoy::Network::ConnectionImpl::onFileEvent()
[2018-08-31 15:53:36.984][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #24 0x6f0997 Envoy::Event::FileEventImpl::assignEvents()::{lambda()#1}::_FUN()
[2018-08-31 15:53:36.987][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #25 0xa05f44 event_process_active_single_queue.isra.29
[2018-08-31 15:53:36.990][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #26 0xa0668e event_process_active
[2018-08-31 15:53:36.993][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #27 0xa09417 event_base_loop
[2018-08-31 15:53:36.996][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #28 0x6ec0c5 Envoy::Server::WorkerImpl::threadRoutine()
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:114] thr<17> #29 0xa577ed Envoy::Thread::Thread::Thread()::{lambda()#1}::_FUN()
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:104] thr<17> obj</usr/glibc-compat/lib/libpthread.so.0>
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:117] thr<17> #30 0x7f9304102d2b (unknown)
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:104] thr<17> obj</usr/glibc-compat/lib/libc.so.6>
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:117] thr<17> #31 0x7f9303ab2e3e (unknown)
[2018-08-31 15:53:36.998][17][critical][backtrace] bazel-out/k8-opt/bin/source/server/_virtual_includes/backtrace_lib/server/backtrace.h:121] end backtrace thread 17
@yskopets yes, thanks to you that I can reproduce the issue well. Would you mind building envoy with this patch: https://github.com/envoyproxy/envoy/pull/4312 and see if that fixes yours? (If you have a problem on building envoy from the source you can ping me via slack (@dio at https://envoyslack.cncf.io/) or email). Thanks!
@dio Thanks a lot!
I confirm that your changes fixed my problem.
@yskopets after this patch was your code for redirecting on status code 401 working?
Issue
Envoy
Lua
filter causes a crash when code insidefunction envoy_on_response(response_handle)
callsresponse_handle:requestInfo():dynamicMetadata()
Description:
I'm trying to use
Lua
filter to implement redirect to a Login Page whenever HTTP Status 401 happens.Here is my
Envoy
config (relevant part):and here are Envoy logs:
Repro steps:
Envoy
(google proxy) and add the followingLua
code:Envoy
crashes consistently after 5-10 requests)Config:
Here is the minimal Envoy configuration to reproduce the issue:
Call Stack: