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

shreemaan-abhishek 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 eb20eb2c8 fix(limit-conn): isolate counter per workflow action via 
_vid key (#13591)
eb20eb2c8 is described below

commit eb20eb2c8da4051bc084e0c3ebb11fb1833f50bf
Author: Shreemaan Abhishek <[email protected]>
AuthorDate: Wed Jun 24 17:17:28 2026 +0800

    fix(limit-conn): isolate counter per workflow action via _vid key (#13591)
---
 apisix/plugins/limit-conn/init.lua |   5 ++
 t/plugin/workflow3.t               | 126 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 128 insertions(+), 3 deletions(-)

diff --git a/apisix/plugins/limit-conn/init.lua 
b/apisix/plugins/limit-conn/init.lua
index 0d45bd290..b0cbafe81 100644
--- a/apisix/plugins/limit-conn/init.lua
+++ b/apisix/plugins/limit-conn/init.lua
@@ -191,6 +191,11 @@ local function run_limit_conn(conf, rule, ctx)
     end
 
     key = key .. ctx.conf_type .. ctx.conf_version
+    if conf._vid then
+        -- conf has _vid means it's from workflow plugin, add _vid to the key
+        -- so that the counter is unique per action.
+        key = key .. ':' .. conf._vid
+    end
     core.log.info("limit key: ", key)
 
     local delay, err = lim:incoming(key, true)
diff --git a/t/plugin/workflow3.t b/t/plugin/workflow3.t
index 70a0aca71..e993381af 100644
--- a/t/plugin/workflow3.t
+++ b/t/plugin/workflow3.t
@@ -59,6 +59,36 @@ add_block_preprocessor(sub {
             end
         }
     }
+
+
+    location /access_root_dir2 {
+        content_by_lua_block {
+            local httpc = require "resty.http"
+            local hc = httpc:new()
+
+            local res, err = 
hc:request_uri('http://127.0.0.1:$port/limit_conn2')
+            if res then
+                ngx.exit(res.status)
+            end
+        }
+    }
+
+    location /test_concurrency2 {
+        content_by_lua_block {
+            local reqs = {}
+            for i = 1, 10 do
+                if i % 2 == 0 then
+                  reqs[i] = { "/access_root_dir" }
+                else
+                  reqs[i] = { "/access_root_dir2" }
+                end
+            end
+            local resps = { ngx.location.capture_multi(reqs) }
+            for i, resp in ipairs(resps) do
+                ngx.say(resp.status)
+            end
+        }
+    }
 _EOC_
 
     $block->set_value("config", $config);
@@ -145,7 +175,97 @@ GET /test_concurrency
 
 
 
-=== TEST 3: set up workflow with limit-conn in global rule, and a route with 
cors
+=== TEST 3: two limit-conn configurations
+--- config
+    location /t {
+        content_by_lua_block {
+            local json = require("toolkit.json")
+            local t = require("lib.test_admin").test
+            local data = {
+                uri = "/*",
+                plugins = {
+                    workflow = {
+                        rules = {
+                            {
+                                case = {
+                                    {"uri", "==", "/limit_conn"}
+                                },
+                                actions = {
+                                    {
+                                        "limit-conn",
+                                        {
+                                          conn = 2,
+                                          burst = 1,
+                                          default_conn_delay = 0.1,
+                                          rejected_code = 503,
+                                          key = "remote_addr"
+                                        }
+                                    }
+                                }
+                            },
+                            {
+                                case = {
+                                    {"uri", "==", "/limit_conn2"}
+                                },
+                                actions = {
+                                    {
+                                        "limit-conn",
+                                        {
+                                          conn = 2,
+                                          burst = 1,
+                                          default_conn_delay = 0.1,
+                                          rejected_code = 503,
+                                          key = "remote_addr"
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                },
+                upstream = {
+                    nodes = {
+                        ["127.0.0.1:1980"] = 1
+                    },
+                    type = "roundrobin"
+                }
+            }
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 json.encode(data)
+            )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+
+            ngx.say(body)
+        }
+    }
+--- response_body
+passed
+
+
+
+=== TEST 4: exceeding the burst
+--- request
+GET /test_concurrency2
+--- timeout: 10s
+--- response_body
+404
+200
+404
+200
+404
+200
+503
+503
+503
+503
+
+
+
+=== TEST 5: set up workflow with limit-conn in global rule, and a route with 
cors
 --- config
     location /t {
         content_by_lua_block {
@@ -213,7 +333,7 @@ passed
 
 
 
-=== TEST 4: OPTIONS preflight finished by cors in rewrite phase, workflow log 
phase should not fail
+=== TEST 6: OPTIONS preflight finished by cors in rewrite phase, workflow log 
phase should not fail
 --- request
 OPTIONS /hello
 --- more_headers
@@ -225,7 +345,7 @@ _workflow_cache
 
 
 
-=== TEST 5: clean up
+=== TEST 7: clean up
 --- config
     location /t {
         content_by_lua_block {

Reply via email to