blob: 45fce32c0a82ed33560a7c86c3df5f3ef8835da1 [file]
#
# 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('debug');
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 bpm = require("apisix.utils.batch-processor-manager")
bpm.set_check_stale_interval(1)
_EOC_
$block->set_value("extra_init_by_lua", $extra_init_by_lua);
});
run_tests;
__DATA__
=== TEST 1: should drop entries when max_pending_entries is exceeded
--- extra_yaml_config
plugins:
- http-logger
--- config
location /t {
content_by_lua_block {
local http = require "resty.http"
local httpc = http.new()
local data = {
{
input = {
plugins = {
["http-logger"] = {
uri = "http://127.0.0.1:1234/http-logger/test",
batch_max_size = 1,
timeout = 1,
max_retry_count = 10
}
},
upstream = {
nodes = {
["127.0.0.1:1980"] = 1
},
type = "roundrobin"
},
uri = "/hello",
},
},
}
local t = require("lib.test_admin").test
-- Set plugin metadata
local metadata = {
log_format = {
host = "$host",
["@timestamp"] = "$time_iso8601",
client_ip = "$remote_addr"
},
max_pending_entries = 1
}
local code, body = t('/apisix/admin/plugin_metadata/http-logger', ngx.HTTP_PUT, metadata)
if code >= 300 then
ngx.status = code
ngx.say(body)
return
end
-- Create route
local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, data[1].input)
if code >= 300 then
ngx.status = code
ngx.say(body)
return
end
local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/hello"
httpc:request_uri(uri, {
method = "GET",
keepalive_timeout = 1,
keepalive_pool = 1,
})
httpc:request_uri(uri, {
method = "GET",
keepalive_timeout = 1,
keepalive_pool = 1,
})
httpc:request_uri(uri, {
method = "GET",
keepalive_timeout = 1,
keepalive_pool = 1,
})
ngx.sleep(2)
}
}
--- error_log
max pending entries limit exceeded. discarding entry
--- timeout: 5
=== TEST 2: max_pending_entries should not block new requests after stale cleanup
--- config
location /t {
content_by_lua_block {
local http = require "resty.http"
local httpc = http.new()
local t = require("lib.test_admin").test
-- Set plugin metadata with max_pending_entries
local metadata = {
log_format = {
host = "$host",
["@timestamp"] = "$time_iso8601",
client_ip = "$remote_addr"
},
max_pending_entries = 2
}
local code, body = t('/apisix/admin/plugin_metadata/http-logger', ngx.HTTP_PUT, metadata)
if code >= 300 then
ngx.status = code
ngx.say(body)
return
end
-- Create route with batch_max_size=1 so entries are processed immediately
local route = {
plugins = {
["http-logger"] = {
uri = "http://127.0.0.1:1982/hello",
batch_max_size = 1,
inactive_timeout = 1
}
},
upstream = {
nodes = {
["127.0.0.1:1982"] = 1
},
type = "roundrobin"
},
uri = "/hello",
}
local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, route)
if code >= 300 then
ngx.status = code
ngx.say(body)
return
end
-- Phase 1: Send requests to generate processed_entries in the buffer
local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/hello"
for i = 1, 2 do
httpc:request_uri(uri, { method = "GET" })
end
-- Wait for entries to be processed and stale cleanup to remove the buffer
-- stale interval is set to 1s, so 2.5s should be enough
ngx.sleep(2.5)
-- Phase 2: Send new requests after stale cleanup
-- These should NOT be blocked by max_pending_entries
for i = 1, 2 do
local res, err = httpc:request_uri(uri, { method = "GET" })
if not res then
ngx.say("request failed: ", err)
return
end
end
ngx.sleep(2)
ngx.say("passed")
}
}
--- response_body
passed
--- error_log
removing batch processor stale object
--- no_error_log
max pending entries limit exceeded. discarding entry
--- timeout: 10