diff options
author | 2017-07-25 15:18:33 +0800 | |
---|---|---|
committer | 2017-07-25 18:11:59 +0800 | |
commit | 672f3d40be83d9e380fd7be4b674d5e8d5fa36de (patch) | |
tree | 43105e1d5e2ba8e8accea8648e57e1cf87db3f00 /openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy | |
parent | 41d3db15a8e1a0496f9c2a5e15db2998a32bb9bf (diff) |
Divide the MSB source codes into two repos
Change-Id: Ie76d545b214a8ce5191f215350a623e1529983d9
Issue-id: MSB-5
Signed-off-by: HuabingZhao <zhao.huabing@zte.com.cn>
Diffstat (limited to 'openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy')
-rw-r--r-- | openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua new file mode 100644 index 0000000..0a1b8e8 --- /dev/null +++ b/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua @@ -0,0 +1,68 @@ +--[[
+
+ Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE)
+
+ Licensed 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.
+
+--]]
+
+local _M = {}
+_M._VERSION = '1.0.0'
+
+local tbl_util = require('lib.utils.table_util')
+local tbl_isempty = tbl_util.isempty
+local rrcache = require('lib.tools.rr_cache')
+
+function _M.select_backserver(servers,svckey)
+ local length = #servers
+ local index = ngx.ctx.last_peer_index
+
+ if index then
+ --if it is a retry request,use the index in the context as the base
+ index = index%length+1
+ else
+ --if it is a normal request,fetch index from cache as the base
+ index = rrcache.get(svckey) or 0
+ index = index%length+1
+ rrcache.set(svckey,index)
+ end
+ ngx.ctx.last_peer_index = index
+
+ --[[
+ local resty_lock = require "resty.lock"
+ local roundrobin_cache = ngx.shared.rr_cache
+
+ --step1:acquire lock
+ local opts = {["timeout"] = 0.002,["exptime"] = 0.05}--this can be set using the conf file
+ local rrlock = resty_lock:new("rr_locks",opts)
+ local elapsed, err = rrlock:lock(svckey)
+ if not elapsed then
+ --return fail("failed to acquire the lock: ", err)
+ end
+ --step2:lock successfully acquired!incr the index
+ local index, err = roundrobin_cache:get(svckey)
+ if not index then
+ index = 0
+ end
+ index = index%length+1
+
+ --step3:update the shm cache with the new index
+ roundrobin_cache:set(svckey,index)
+
+ --step4:release the lock
+ local ok, err = rrlock:unlock()
+ ]]
+ return servers[index],nil
+end
+
+return _M
\ No newline at end of file |