Skip to content

Commit 71debfb

Browse files
author
Simon Grondin
committed
Optimizations and fixes for clearing clients
1 parent 582db61 commit 71debfb

18 files changed

+311
-119
lines changed

es5.js

Lines changed: 43 additions & 26 deletions
Large diffs are not rendered by default.

lib/Bottleneck.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ Bottleneck = function () {
671671
Promise: Promise,
672672
timeout: null,
673673
heartbeatInterval: 5000,
674+
clientTimeout: 10000,
674675
clientOptions: {},
675676
clusterNodes: null,
676677
clearDatastore: false,

lib/RedisDatastore.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ RedisDatastore = class RedisDatastore {
4949
}).then(() => {
5050
return this.connection.__addLimiter__(this.instance);
5151
}).then(() => {
52-
return this.runScript("heartbeat", []);
52+
return this.runScript("register_client", [this.instance.queued()]);
5353
}).then(() => {
5454
var base;
5555

@@ -152,13 +152,13 @@ RedisDatastore = class RedisDatastore {
152152
var _this3 = this;
153153

154154
return _asyncToGenerator(function* () {
155-
if (!(name === "init" || name === "heartbeat")) {
155+
if (!(name === "init" || name === "register_client")) {
156156
yield _this3.ready;
157157
}
158158

159159
return new _this3.Promise((resolve, reject) => {
160160
var all_args, arr;
161-
all_args = [Date.now(), _this3.clientId, _this3.instance.queued()].concat(args);
161+
all_args = [Date.now(), _this3.clientId].concat(args);
162162

163163
_this3.instance.Events.trigger("debug", `Calling Redis script: ${name}.lua`, all_args);
164164

@@ -171,12 +171,18 @@ RedisDatastore = class RedisDatastore {
171171
});
172172
return _this3.connection.__scriptFn__(name)(...arr);
173173
}).catch(e => {
174-
if (e.message === "SETTINGS_KEY_NOT_FOUND" && name !== "heartbeat") {
175-
return _this3.runScript("init", _this3.prepareInitSettings(false)).then(() => {
174+
if (e.message === "SETTINGS_KEY_NOT_FOUND") {
175+
if (name === "heartbeat") {
176+
return _this3.Promise.resolve();
177+
} else {
178+
return _this3.runScript("init", _this3.prepareInitSettings(false)).then(() => {
179+
return _this3.runScript(name, args);
180+
});
181+
}
182+
} else if (e.message === "UNKNOWN_CLIENT") {
183+
return _this3.runScript("register_client", [_this3.instance.queued()]).then(() => {
176184
return _this3.runScript(name, args);
177185
});
178-
} else if (name === "heartbeat") {
179-
return _this3.Promise.resolve();
180186
} else {
181187
return _this3.Promise.reject(e);
182188
}
@@ -213,7 +219,8 @@ RedisDatastore = class RedisDatastore {
213219
args = this.prepareObject(Object.assign({}, this.storeOptions, {
214220
id: this.originalId,
215221
version: this.instance.version,
216-
groupTimeout: this.timeout
222+
groupTimeout: this.timeout,
223+
clientTimeout: this.clientTimeout
217224
}));
218225
args.unshift(clear ? 1 : 0, this.instance.version);
219226
return args;

lib/Scripts.js

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ lua = require("./lua.json");
55
headers = {
66
refs: lua["refs.lua"],
77
validate_keys: lua["validate_keys.lua"],
8+
validate_client: lua["validate_client.lua"],
89
refresh_expiration: lua["refresh_expiration.lua"],
910
process_tick: lua["process_tick.lua"],
1011
conditions_check: lua["conditions_check.lua"],
@@ -67,75 +68,81 @@ templates = {
6768
refresh_expiration: false,
6869
code: lua["group_check.lua"]
6970
},
70-
blacklist_client: {
71+
register_client: {
7172
keys: exports.allKeys,
7273
headers: ["validate_keys"],
7374
refresh_expiration: false,
75+
code: lua["register_client.lua"]
76+
},
77+
blacklist_client: {
78+
keys: exports.allKeys,
79+
headers: ["validate_keys", "validate_client"],
80+
refresh_expiration: false,
7481
code: lua["blacklist_client.lua"]
7582
},
7683
heartbeat: {
7784
keys: exports.allKeys,
78-
headers: ["validate_keys", "process_tick"],
85+
headers: ["validate_keys", "validate_client", "process_tick"],
7986
refresh_expiration: false,
8087
code: lua["heartbeat.lua"]
8188
},
8289
update_settings: {
8390
keys: exports.allKeys,
84-
headers: ["validate_keys", "process_tick"],
91+
headers: ["validate_keys", "validate_client", "process_tick"],
8592
refresh_expiration: true,
8693
code: lua["update_settings.lua"]
8794
},
8895
running: {
8996
keys: exports.allKeys,
90-
headers: ["validate_keys", "process_tick"],
97+
headers: ["validate_keys", "validate_client", "process_tick"],
9198
refresh_expiration: false,
9299
code: lua["running.lua"]
93100
},
94101
queued: {
95102
keys: exports.allKeys,
96-
headers: ["validate_keys"],
103+
headers: ["validate_keys", "validate_client"],
97104
refresh_expiration: false,
98105
code: lua["queued.lua"]
99106
},
100107
done: {
101108
keys: exports.allKeys,
102-
headers: ["validate_keys", "process_tick"],
109+
headers: ["validate_keys", "validate_client", "process_tick"],
103110
refresh_expiration: false,
104111
code: lua["done.lua"]
105112
},
106113
check: {
107114
keys: exports.allKeys,
108-
headers: ["validate_keys", "process_tick", "conditions_check"],
115+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
109116
refresh_expiration: false,
110117
code: lua["check.lua"]
111118
},
112119
submit: {
113120
keys: exports.allKeys,
114-
headers: ["validate_keys", "process_tick", "conditions_check"],
121+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
115122
refresh_expiration: true,
116123
code: lua["submit.lua"]
117124
},
118125
register: {
119126
keys: exports.allKeys,
120-
headers: ["validate_keys", "process_tick", "conditions_check"],
127+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"],
121128
refresh_expiration: true,
122129
code: lua["register.lua"]
123130
},
124131
free: {
125132
keys: exports.allKeys,
126-
headers: ["validate_keys", "process_tick"],
133+
headers: ["validate_keys", "validate_client", "process_tick"],
127134
refresh_expiration: true,
128135
code: lua["free.lua"]
129136
},
130137
current_reservoir: {
131138
keys: exports.allKeys,
132-
headers: ["validate_keys", "process_tick"],
139+
headers: ["validate_keys", "validate_client", "process_tick"],
133140
refresh_expiration: false,
134141
code: lua["current_reservoir.lua"]
135142
},
136143
increment_reservoir: {
137144
keys: exports.allKeys,
138-
headers: ["validate_keys", "process_tick"],
145+
headers: ["validate_keys", "validate_client", "process_tick"],
139146
refresh_expiration: true,
140147
code: lua["increment_reservoir.lua"]
141148
}

lib/lua.json

Lines changed: 8 additions & 6 deletions
Large diffs are not rendered by default.

light.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,6 +1364,7 @@
13641364
Promise: Promise,
13651365
timeout: null,
13661366
heartbeatInterval: 5000,
1367+
clientTimeout: 10000,
13671368
clientOptions: {},
13681369
clusterNodes: null,
13691370
clearDatastore: false,

src/Bottleneck.coffee

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class Bottleneck
4141
Promise: Promise
4242
timeout: null
4343
heartbeatInterval: 5000
44+
clientTimeout: 10000
4445
clientOptions: {}
4546
clusterNodes: null
4647
clearDatastore: false

src/RedisDatastore.coffee

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class RedisDatastore
2121
@ready = @connection.ready
2222
.then (@clients) => @runScript "init", @prepareInitSettings @clearDatastore
2323
.then => @connection.__addLimiter__ @instance
24-
.then => @runScript "heartbeat", []
24+
.then => @runScript "register_client", [@instance.queued()]
2525
.then =>
2626
(@heartbeat = setInterval =>
2727
@runScript "heartbeat", []
@@ -72,19 +72,23 @@ class RedisDatastore
7272
@connection.disconnect flush
7373

7474
runScript: (name, args) ->
75-
await @ready unless name == "init" or name == "heartbeat"
75+
await @ready unless name == "init" or name == "register_client"
7676
new @Promise (resolve, reject) =>
77-
all_args = [Date.now(), @clientId, @instance.queued()].concat args
77+
all_args = [Date.now(), @clientId].concat args
7878
@instance.Events.trigger "debug", "Calling Redis script: #{name}.lua", all_args
7979
arr = @connection.__scriptArgs__ name, @originalId, all_args, (err, replies) ->
8080
if err? then return reject err
8181
return resolve replies
8282
@connection.__scriptFn__(name) arr...
8383
.catch (e) =>
84-
if e.message == "SETTINGS_KEY_NOT_FOUND" and name != "heartbeat"
85-
@runScript("init", @prepareInitSettings(false))
84+
if e.message == "SETTINGS_KEY_NOT_FOUND"
85+
if name == "heartbeat" then @Promise.resolve()
86+
else
87+
@runScript("init", @prepareInitSettings(false))
88+
.then => @runScript(name, args)
89+
else if e.message == "UNKNOWN_CLIENT"
90+
@runScript("register_client", [@instance.queued()])
8691
.then => @runScript(name, args)
87-
else if name == "heartbeat" then @Promise.resolve()
8892
else @Promise.reject e
8993

9094
prepareArray: (arr) -> (if x? then x.toString() else "") for x in arr
@@ -96,9 +100,10 @@ class RedisDatastore
96100

97101
prepareInitSettings: (clear) ->
98102
args = @prepareObject Object.assign({}, @storeOptions, {
99-
id: @originalId,
100-
version: @instance.version,
103+
id: @originalId
104+
version: @instance.version
101105
groupTimeout: @timeout
106+
@clientTimeout
102107
})
103108
args.unshift (if clear then 1 else 0), @instance.version
104109
args

src/Scripts.coffee

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ lua = require "./lua.json"
33
headers =
44
refs: lua["refs.lua"]
55
validate_keys: lua["validate_keys.lua"]
6+
validate_client: lua["validate_client.lua"]
67
refresh_expiration: lua["refresh_expiration.lua"]
78
process_tick: lua["process_tick.lua"]
89
conditions_check: lua["conditions_check.lua"]
@@ -68,64 +69,69 @@ templates =
6869
headers: []
6970
refresh_expiration: false
7071
code: lua["group_check.lua"]
71-
blacklist_client:
72+
register_client:
7273
keys: exports.allKeys
7374
headers: ["validate_keys"]
7475
refresh_expiration: false
76+
code: lua["register_client.lua"]
77+
blacklist_client:
78+
keys: exports.allKeys
79+
headers: ["validate_keys", "validate_client"]
80+
refresh_expiration: false
7581
code: lua["blacklist_client.lua"]
7682
heartbeat:
7783
keys: exports.allKeys
78-
headers: ["validate_keys", "process_tick"]
84+
headers: ["validate_keys", "validate_client", "process_tick"]
7985
refresh_expiration: false
8086
code: lua["heartbeat.lua"]
8187
update_settings:
8288
keys: exports.allKeys
83-
headers: ["validate_keys", "process_tick"]
89+
headers: ["validate_keys", "validate_client", "process_tick"]
8490
refresh_expiration: true
8591
code: lua["update_settings.lua"]
8692
running:
8793
keys: exports.allKeys
88-
headers: ["validate_keys", "process_tick"]
94+
headers: ["validate_keys", "validate_client", "process_tick"]
8995
refresh_expiration: false
9096
code: lua["running.lua"]
9197
queued:
9298
keys: exports.allKeys
93-
headers: ["validate_keys"]
99+
headers: ["validate_keys", "validate_client"]
94100
refresh_expiration: false
95101
code: lua["queued.lua"]
96102
done:
97103
keys: exports.allKeys
98-
headers: ["validate_keys", "process_tick"]
104+
headers: ["validate_keys", "validate_client", "process_tick"]
99105
refresh_expiration: false
100106
code: lua["done.lua"]
101107
check:
102108
keys: exports.allKeys
103-
headers: ["validate_keys", "process_tick", "conditions_check"]
109+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
104110
refresh_expiration: false
105111
code: lua["check.lua"]
106112
submit:
107113
keys: exports.allKeys
108-
headers: ["validate_keys", "process_tick", "conditions_check"]
114+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
109115
refresh_expiration: true
110116
code: lua["submit.lua"]
111117
register:
112118
keys: exports.allKeys
113-
headers: ["validate_keys", "process_tick", "conditions_check"]
119+
headers: ["validate_keys", "validate_client", "process_tick", "conditions_check"]
114120
refresh_expiration: true
115121
code: lua["register.lua"]
116122
free:
117123
keys: exports.allKeys
118-
headers: ["validate_keys", "process_tick"]
124+
headers: ["validate_keys", "validate_client", "process_tick"]
119125
refresh_expiration: true
120126
code: lua["free.lua"]
121127
current_reservoir:
122128
keys: exports.allKeys
123-
headers: ["validate_keys", "process_tick"]
129+
headers: ["validate_keys", "validate_client", "process_tick"]
124130
refresh_expiration: false
125131
code: lua["current_reservoir.lua"]
126132
increment_reservoir:
127133
keys: exports.allKeys
128-
headers: ["validate_keys", "process_tick"]
134+
headers: ["validate_keys", "validate_client", "process_tick"]
129135
refresh_expiration: true
130136
code: lua["increment_reservoir.lua"]
131137

src/redis/blacklist_client.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
local blacklist = ARGV[num_static_argv + 1]
22

3-
redis.call('zadd', client_last_seen_key, 0, blacklist)
3+
if redis.call('zscore', client_last_seen_key, blacklist) then
4+
redis.call('zadd', client_last_seen_key, 0, blacklist)
5+
end
6+
47

58
return {}

0 commit comments

Comments
 (0)