diff --git a/apisix/upstream.lua b/apisix/upstream.lua index 681ce682..7cef761d 100644 --- a/apisix/upstream.lua +++ b/apisix/upstream.lua @@ -144,7 +144,7 @@ do grpcs = 443, } - function fill_node_info(up_conf, scheme) + function fill_node_info(up_conf, scheme, is_stream) local nodes = up_conf.nodes if up_conf.nodes_ref == nodes then -- filled @@ -153,7 +153,7 @@ do local need_filled = false for _, n in ipairs(nodes) do - if not n.port then + if not is_stream and not n.port then if up_conf.scheme ~= scheme then return nil, "Can't detect upstream's scheme. " .. "You should either specify a port in the node " .. @@ -180,7 +180,7 @@ do if not n.port or not n.priority then filled_nodes[i] = core.table.clone(n) - if not n.port then + if not is_stream and not n.port then filled_nodes[i].port = scheme_to_port[scheme] end @@ -259,12 +259,17 @@ function _M.set_by_route(route, api_ctx) end if not is_http then + local ok, err = fill_node_info(up_conf, nil, true) + if not ok then + return 503, err + end + return end set_upstream_scheme(api_ctx, up_conf) - local ok, err = fill_node_info(up_conf, api_ctx.upstream_scheme) + local ok, err = fill_node_info(up_conf, api_ctx.upstream_scheme, false) if not ok then return 503, err end diff --git a/t/stream-node/priority-balancer.t b/t/stream-node/priority-balancer.t new file mode 100644 index 00000000..e25bdc3f --- /dev/null +++ b/t/stream-node/priority-balancer.t @@ -0,0 +1,158 @@ +# +# 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(2); # repeat each test to ensure after_balance is called correctly +log_level('info'); +no_root_location(); +worker_connections(1024); +no_shuffle(); + +add_block_preprocessor(sub { + my ($block) = @_; + + if ($block->apisix_yaml) { + if (!$block->yaml_config) { + my $yaml_config = <<_EOC_; +apisix: + node_listen: 1984 + config_center: yaml + enable_admin: false +_EOC_ + + $block->set_value("yaml_config", $yaml_config); + } + } + + $block->set_value("stream_enable", 1); + + if (!$block->stream_request) { + $block->set_value("stream_request", "mmm"); + } + + if ((!defined $block->error_log) && (!defined $block->no_error_log)) { + $block->set_value("no_error_log", "[error]"); + } +}); + +run_tests(); + +__DATA__ + +=== TEST 1: sanity +--- apisix_yaml +stream_routes: + - + id: 1 + upstream: + type: least_conn + nodes: + - host: 127.0.0.1 + port: 1979 + weight: 2 + priority: 1 + - host: 127.0.0.2 + port: 1979 + weight: 1 + priority: 1 + - host: 127.0.0.3 + port: 1979 + weight: 2 + priority: 0 + - host: 127.0.0.4 + port: 1979 + weight: 1 + priority: 0 + - host: 127.0.0.1 + port: 1995 + weight: 2 + priority: -1 +#END +--- stream_response +hello world +--- error_log +connect() failed +failed to get server from current priority 1, try next one +failed to get server from current priority 0, try next one +--- grep_error_log eval +qr/proxy request to \S+/ +--- grep_error_log_out +proxy request to 127.0.0.1:1979 +proxy request to 127.0.0.2:1979 +proxy request to 127.0.0.3:1979 +proxy request to 127.0.0.4:1979 +proxy request to 127.0.0.1:1995 + + + +=== TEST 2: default priority is 0 +--- apisix_yaml +stream_routes: + - + id: 1 + upstream: + type: least_conn + nodes: + - host: 127.0.0.1 + port: 1979 + weight: 2 + priority: 1 + - host: 127.0.0.2 + port: 1979 + weight: 1 + priority: 1 + - host: 127.0.0.3 + port: 1979 + weight: 2 + - host: 127.0.0.4 + port: 1979 + weight: 1 + - host: 127.0.0.1 + port: 1995 + weight: 2 + priority: -1 +#END +--- stream_response +hello world +--- error_log +connect() failed +failed to get server from current priority 1, try next one +failed to get server from current priority 0, try next one +--- grep_error_log eval +qr/proxy request to \S+/ +--- grep_error_log_out +proxy request to 127.0.0.1:1979 +proxy request to 127.0.0.2:1979 +proxy request to 127.0.0.3:1979 +proxy request to 127.0.0.4:1979 +proxy request to 127.0.0.1:1995 + + + +=== TEST 3: fix priority for nonarray nodes +--- apisix_yaml +stream_routes: + - + id: 1 + upstream: + type: roundrobin + nodes: + "127.0.0.1:1995": 1 + "127.0.0.2:1995": 1 +#END +--- stream_response +hello world