This is an automated email from the ASF dual-hosted git repository. shuyangw pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/apisix.git
The following commit(s) were added to refs/heads/master by this push: new 74cc5c3 feat(control-api): add a way to trigger gc (#4472) 74cc5c3 is described below commit 74cc5c3420aaa102274370b70ac5ee2e31876591 Author: 罗泽轩 <spacewander...@gmail.com> AuthorDate: Thu Jun 24 09:45:00 2021 +0800 feat(control-api): add a way to trigger gc (#4472) Signed-off-by: spacewander <spacewander...@gmail.com> --- apisix/control/v1.lua | 16 ++++++++++- docs/en/latest/control-api.md | 7 +++++ t/control/gc.t | 66 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/apisix/control/v1.lua b/apisix/control/v1.lua index 7ad9e05..7ec5f47 100644 --- a/apisix/control/v1.lua +++ b/apisix/control/v1.lua @@ -20,6 +20,7 @@ local get_routes = require("apisix.router").http_routes local get_services = require("apisix.http.service").services local upstream_mod = require("apisix.upstream") local get_upstreams = upstream_mod.upstreams +local collectgarbage = collectgarbage local ipairs = ipairs local str_format = string.format local ngx_var = ngx.var @@ -154,6 +155,13 @@ function _M.get_health_checker() end +function _M.trigger_gc() + -- TODO: find a way to trigger GC in the stream subsystem + collectgarbage() + return 200 +end + + return { -- /v1/schema { @@ -172,5 +180,11 @@ return { methods = {"GET"}, uris = {"/healthcheck/*"}, handler = _M.get_health_checker, - } + }, + -- /v1/gc + { + methods = {"POST"}, + uris = {"/gc"}, + handler = _M.trigger_gc, + }, } diff --git a/docs/en/latest/control-api.md b/docs/en/latest/control-api.md index d346163..41243a7 100644 --- a/docs/en/latest/control-api.md +++ b/docs/en/latest/control-api.md @@ -191,3 +191,10 @@ For example, `GET /v1/healthcheck/upstreams/1` returns: "src_type": "upstreams" } ``` + +### POST /v1/gc + +Introduced since `v2.8`. + +Trigger a full GC in the http subsystem. +Note that when you enable stream proxy, APISIX will run another Lua VM for the stream subsystem. It won't trigger a full GC in this Lua VM . diff --git a/t/control/gc.t b/t/control/gc.t new file mode 100644 index 0000000..bafb574 --- /dev/null +++ b/t/control/gc.t @@ -0,0 +1,66 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +use t::APISIX 'no_plan'; + +repeat_each(1); +no_long_string(); +no_root_location(); + +add_block_preprocessor(sub { + my ($block) = @_; + + if (!$block->request) { + $block->set_value("request", "GET /t"); + } + + if (!$block->no_error_log) { + $block->set_value("no_error_log", "[error]\n[alert]"); + } +}); + +run_tests; + +__DATA__ + +=== TEST 1: trigger full gc +--- config + location /t { + content_by_lua_block { + local t = require("lib.test_admin") + local before = collectgarbage("count") + do + local tab = {} + for i = 1, 10000 do + tab[i] = {"a", 1} + end + end + local after_alloc = collectgarbage("count") + local code = t.test('/v1/gc', + ngx.HTTP_POST + ) + local after_gc = collectgarbage("count") + if code == 200 then + if after_alloc - after_gc > 0.9 * (after_alloc - before) then + ngx.say("ok") + else + ngx.say(before, " ", after_alloc, " ", after_gc) + end + end + } + } +--- response_body +ok