This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch release/2.15
in repository https://gitbox.apache.org/repos/asf/apisix.git

commit edc68b5580e07d7bd6ecb56a1e6ccd7b2bece90c
Author: jinhua luo <[email protected]>
AuthorDate: Tue Dec 27 16:52:15 2022 +0800

    fix: define destroy() to close protos (#8557)
    
    Fixes https://github.com/apache/apisix/issues/8519
---
 apisix/plugins/grpc-transcode.lua       |  5 +++
 apisix/plugins/grpc-transcode/proto.lua |  5 +++
 t/plugin/grpc-transcode-reload-bugfix.t | 75 +++++++++++++++++++++++++++++++++
 3 files changed, 85 insertions(+)

diff --git a/apisix/plugins/grpc-transcode.lua 
b/apisix/plugins/grpc-transcode.lua
index 2405d33ec..3875bc096 100644
--- a/apisix/plugins/grpc-transcode.lua
+++ b/apisix/plugins/grpc-transcode.lua
@@ -110,6 +110,11 @@ function _M.init()
 end
 
 
+function _M.destroy()
+    proto.destroy()
+end
+
+
 function _M.check_schema(conf)
     local ok, err = core.schema.check(schema, conf)
     if not ok then
diff --git a/apisix/plugins/grpc-transcode/proto.lua 
b/apisix/plugins/grpc-transcode/proto.lua
index c30c17e71..0186feef4 100644
--- a/apisix/plugins/grpc-transcode/proto.lua
+++ b/apisix/plugins/grpc-transcode/proto.lua
@@ -170,5 +170,10 @@ function _M.init()
     end
 end
 
+function _M.destroy()
+    if protos then
+        protos:close()
+    end
+end
 
 return _M
diff --git a/t/plugin/grpc-transcode-reload-bugfix.t 
b/t/plugin/grpc-transcode-reload-bugfix.t
new file mode 100644
index 000000000..7eee56f16
--- /dev/null
+++ b/t/plugin/grpc-transcode-reload-bugfix.t
@@ -0,0 +1,75 @@
+#
+# 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';
+
+log_level('warn');
+repeat_each(1);
+no_long_string();
+no_root_location();
+
+add_block_preprocessor(sub {
+    my ($block) = @_;
+
+    if (!$block->request) {
+        $block->set_value("request", "GET /t");
+    }
+
+    my $extra_init_by_lua = <<_EOC_;
+    local core = require("apisix.core")
+    local orig_new = core.config.new
+    close_cnt = 0
+    core.config.new = function(key, opts)
+        local obj, err = orig_new(key, opts)
+        if key == "/protos" then
+            local orig_close = obj.close
+            obj.close = function(...)
+                core.log.warn("call config close")
+                close_cnt = close_cnt + 1
+                return orig_close(...)
+            end
+        end
+        return obj, err
+    end
+_EOC_
+
+    $block->set_value("extra_init_by_lua", $extra_init_by_lua);
+});
+
+run_tests;
+
+__DATA__
+
+=== TEST 1: close protos when grpc-transcode plugin reload
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code = t('/apisix/admin/plugins/reload',
+                ngx.HTTP_PUT)
+            if code >= 300 then
+                ngx.status = code
+                return
+            end
+
+            ngx.sleep(2)
+            if close_cnt ~= 1 then
+                ngx.status = 500
+            end
+        }
+    }
+--- error_log
+call config close

Reply via email to