bullmq 5.1.3 → 5.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/classes/scripts.js +1 -0
- package/dist/cjs/classes/scripts.js.map +1 -1
- package/dist/cjs/commands/addStandardJob-7.lua +4 -8
- package/dist/cjs/commands/changeDelay-3.lua +1 -0
- package/dist/cjs/commands/changePriority-6.lua +0 -1
- package/dist/cjs/commands/includes/addBaseMarkerIfNeeded.lua +9 -0
- package/dist/cjs/commands/includes/addDelayMarkerIfNeeded.lua +3 -1
- package/dist/cjs/commands/includes/addJobInTargetList.lua +11 -0
- package/dist/cjs/commands/includes/addJobWithPriority.lua +5 -3
- package/dist/cjs/commands/includes/moveParentToWaitIfNeeded.lua +6 -4
- package/dist/cjs/commands/includes/promoteDelayedJobs.lua +2 -4
- package/dist/cjs/commands/moveJobsToWait-7.lua +2 -3
- package/dist/cjs/commands/moveStalledJobsToWait-9.lua +150 -0
- package/dist/cjs/commands/moveToFinished-14.lua +1 -0
- package/dist/cjs/commands/pause-7.lua +1 -0
- package/dist/cjs/commands/promote-8.lua +2 -2
- package/dist/cjs/commands/retryJob-10.lua +1 -0
- package/dist/cjs/scripts/addDelayedJob-6.js +21 -7
- package/dist/cjs/scripts/addDelayedJob-6.js.map +1 -1
- package/dist/cjs/scripts/addParentJob-4.js +25 -11
- package/dist/cjs/scripts/addParentJob-4.js.map +1 -1
- package/dist/cjs/scripts/addPrioritizedJob-7.js +21 -7
- package/dist/cjs/scripts/addPrioritizedJob-7.js.map +1 -1
- package/dist/cjs/scripts/addStandardJob-7.js +46 -36
- package/dist/cjs/scripts/addStandardJob-7.js.map +1 -1
- package/dist/cjs/scripts/changeDelay-3.js +1 -0
- package/dist/cjs/scripts/changeDelay-3.js.map +1 -1
- package/dist/cjs/scripts/changePriority-6.js +10 -14
- package/dist/cjs/scripts/changePriority-6.js.map +1 -1
- package/dist/cjs/scripts/index.js +1 -1
- package/dist/cjs/scripts/moveJobsToWait-7.js +9 -3
- package/dist/cjs/scripts/moveJobsToWait-7.js.map +1 -1
- package/dist/cjs/scripts/{moveStalledJobsToWait-8.js → moveStalledJobsToWait-9.js} +109 -106
- package/dist/cjs/scripts/{moveStalledJobsToWait-8.js.map → moveStalledJobsToWait-9.js.map} +1 -1
- package/dist/cjs/scripts/moveToActive-11.js +19 -7
- package/dist/cjs/scripts/moveToActive-11.js.map +1 -1
- package/dist/cjs/scripts/moveToDelayed-7.js +1 -1
- package/dist/cjs/scripts/moveToFinished-14.js +32 -21
- package/dist/cjs/scripts/moveToFinished-14.js.map +1 -1
- package/dist/cjs/scripts/pause-7.js +2 -1
- package/dist/cjs/scripts/pause-7.js.map +1 -1
- package/dist/cjs/scripts/promote-8.js +19 -5
- package/dist/cjs/scripts/promote-8.js.map +1 -1
- package/dist/cjs/scripts/retryJob-10.js +20 -7
- package/dist/cjs/scripts/retryJob-10.js.map +1 -1
- package/dist/cjs/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/esm/classes/scripts.js +1 -0
- package/dist/esm/classes/scripts.js.map +1 -1
- package/dist/esm/commands/addStandardJob-7.lua +4 -8
- package/dist/esm/commands/changeDelay-3.lua +1 -0
- package/dist/esm/commands/changePriority-6.lua +0 -1
- package/dist/esm/commands/includes/addBaseMarkerIfNeeded.lua +9 -0
- package/dist/esm/commands/includes/addDelayMarkerIfNeeded.lua +3 -1
- package/dist/esm/commands/includes/addJobInTargetList.lua +11 -0
- package/dist/esm/commands/includes/addJobWithPriority.lua +5 -3
- package/dist/esm/commands/includes/moveParentToWaitIfNeeded.lua +6 -4
- package/dist/esm/commands/includes/promoteDelayedJobs.lua +2 -4
- package/dist/esm/commands/moveJobsToWait-7.lua +2 -3
- package/dist/esm/commands/moveStalledJobsToWait-9.lua +150 -0
- package/dist/esm/commands/moveToFinished-14.lua +1 -0
- package/dist/esm/commands/pause-7.lua +1 -0
- package/dist/esm/commands/promote-8.lua +2 -2
- package/dist/esm/commands/retryJob-10.lua +1 -0
- package/dist/esm/scripts/addDelayedJob-6.js +21 -7
- package/dist/esm/scripts/addDelayedJob-6.js.map +1 -1
- package/dist/esm/scripts/addParentJob-4.js +25 -11
- package/dist/esm/scripts/addParentJob-4.js.map +1 -1
- package/dist/esm/scripts/addPrioritizedJob-7.js +21 -7
- package/dist/esm/scripts/addPrioritizedJob-7.js.map +1 -1
- package/dist/esm/scripts/addStandardJob-7.js +46 -36
- package/dist/esm/scripts/addStandardJob-7.js.map +1 -1
- package/dist/esm/scripts/changeDelay-3.js +1 -0
- package/dist/esm/scripts/changeDelay-3.js.map +1 -1
- package/dist/esm/scripts/changePriority-6.js +10 -14
- package/dist/esm/scripts/changePriority-6.js.map +1 -1
- package/dist/esm/scripts/index.d.ts +1 -1
- package/dist/esm/scripts/index.js +1 -1
- package/dist/esm/scripts/moveJobsToWait-7.js +9 -3
- package/dist/esm/scripts/moveJobsToWait-7.js.map +1 -1
- package/dist/esm/scripts/{moveStalledJobsToWait-8.js → moveStalledJobsToWait-9.js} +109 -106
- package/dist/esm/scripts/{moveStalledJobsToWait-8.js.map → moveStalledJobsToWait-9.js.map} +1 -1
- package/dist/esm/scripts/moveToActive-11.js +19 -7
- package/dist/esm/scripts/moveToActive-11.js.map +1 -1
- package/dist/esm/scripts/moveToDelayed-7.js +1 -1
- package/dist/esm/scripts/moveToFinished-14.js +32 -21
- package/dist/esm/scripts/moveToFinished-14.js.map +1 -1
- package/dist/esm/scripts/pause-7.js +2 -1
- package/dist/esm/scripts/pause-7.js.map +1 -1
- package/dist/esm/scripts/promote-8.js +19 -5
- package/dist/esm/scripts/promote-8.js.map +1 -1
- package/dist/esm/scripts/retryJob-10.js +20 -7
- package/dist/esm/scripts/retryJob-10.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/cjs/commands/includes/checkStalledJobs.lua +0 -139
- package/dist/cjs/commands/moveStalledJobsToWait-8.lua +0 -24
- package/dist/esm/commands/includes/checkStalledJobs.lua +0 -139
- package/dist/esm/commands/moveStalledJobsToWait-8.lua +0 -24
- /package/dist/esm/scripts/{moveStalledJobsToWait-8.d.ts → moveStalledJobsToWait-9.d.ts} +0 -0
@@ -1,139 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Move stalled jobs to wait.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
stalledKey 'stalled' (SET)
|
6
|
-
waitKey 'wait', (LIST)
|
7
|
-
activeKey 'active', (LIST)
|
8
|
-
failedKey 'failed', (ZSET)
|
9
|
-
stalledCheckKey 'stalled-check', (KEY)
|
10
|
-
metaKey 'meta', (KEY)
|
11
|
-
pausedKey 'paused', (LIST)
|
12
|
-
eventStreamKey 'event stream' (STREAM)
|
13
|
-
|
14
|
-
maxStalledJobCount Max stalled job count
|
15
|
-
queueKeyPrefix queue.toKey('')
|
16
|
-
timestamp timestamp
|
17
|
-
maxCheckTime max check time
|
18
|
-
|
19
|
-
Events:
|
20
|
-
'stalled' with stalled job id.
|
21
|
-
]]
|
22
|
-
local rcall = redis.call
|
23
|
-
|
24
|
-
-- Includes
|
25
|
-
--- @include "batches"
|
26
|
-
--- @include "getTargetQueueList"
|
27
|
-
--- @include "removeJob"
|
28
|
-
--- @include "removeJobsByMaxAge"
|
29
|
-
--- @include "removeJobsByMaxCount"
|
30
|
-
--- @include "trimEvents"
|
31
|
-
|
32
|
-
-- Check if we need to check for stalled jobs now.
|
33
|
-
|
34
|
-
local function checkStalledJobs(stalledKey, waitKey, activeKey, failedKey,
|
35
|
-
stalledCheckKey, metaKey, pausedKey,
|
36
|
-
eventStreamKey, maxStalledJobCount,
|
37
|
-
queueKeyPrefix, timestamp, maxCheckTime)
|
38
|
-
if rcall("EXISTS", stalledCheckKey) == 1 then return {{}, {}} end
|
39
|
-
|
40
|
-
rcall("SET", stalledCheckKey, timestamp, "PX", maxCheckTime)
|
41
|
-
|
42
|
-
-- Trim events before emiting them to avoid trimming events emitted in this script
|
43
|
-
trimEvents(metaKey, eventStreamKey)
|
44
|
-
|
45
|
-
-- Move all stalled jobs to wait
|
46
|
-
local stalling = rcall('SMEMBERS', stalledKey)
|
47
|
-
local stalled = {}
|
48
|
-
local failed = {}
|
49
|
-
if (#stalling > 0) then
|
50
|
-
rcall('DEL', stalledKey)
|
51
|
-
|
52
|
-
local MAX_STALLED_JOB_COUNT = tonumber(maxStalledJobCount)
|
53
|
-
|
54
|
-
-- Remove from active list
|
55
|
-
for i, jobId in ipairs(stalling) do
|
56
|
-
-- Markers in waitlist DEPRECATED in v5: Remove in v6.
|
57
|
-
if string.sub(jobId, 1, 2) == "0:" then
|
58
|
-
-- If the jobId is a delay marker ID we just remove it.
|
59
|
-
rcall("LREM", activeKey, 1, jobId)
|
60
|
-
else
|
61
|
-
local jobKey = queueKeyPrefix .. jobId
|
62
|
-
|
63
|
-
-- Check that the lock is also missing, then we can handle this job as really stalled.
|
64
|
-
if (rcall("EXISTS", jobKey .. ":lock") == 0) then
|
65
|
-
-- Remove from the active queue.
|
66
|
-
local removed = rcall("LREM", activeKey, 1, jobId)
|
67
|
-
|
68
|
-
if (removed > 0) then
|
69
|
-
-- If this job has been stalled too many times, such as if it crashes the worker, then fail it.
|
70
|
-
local stalledCount =
|
71
|
-
rcall("HINCRBY", jobKey, "stalledCounter", 1)
|
72
|
-
if (stalledCount > MAX_STALLED_JOB_COUNT) then
|
73
|
-
local rawOpts = rcall("HGET", jobKey, "opts")
|
74
|
-
local opts = cjson.decode(rawOpts)
|
75
|
-
local removeOnFailType = type(opts["removeOnFail"])
|
76
|
-
rcall("ZADD", failedKey, timestamp, jobId)
|
77
|
-
local failedReason =
|
78
|
-
"job stalled more than allowable limit"
|
79
|
-
rcall("HMSET", jobKey, "failedReason", failedReason,
|
80
|
-
"finishedOn", timestamp)
|
81
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
82
|
-
"failed", "jobId", jobId, 'prev', 'active',
|
83
|
-
'failedReason', failedReason)
|
84
|
-
|
85
|
-
if removeOnFailType == "number" then
|
86
|
-
removeJobsByMaxCount(opts["removeOnFail"],
|
87
|
-
failedKey, queueKeyPrefix)
|
88
|
-
elseif removeOnFailType == "boolean" then
|
89
|
-
if opts["removeOnFail"] then
|
90
|
-
removeJob(jobId, false, queueKeyPrefix)
|
91
|
-
rcall("ZREM", failedKey, jobId)
|
92
|
-
end
|
93
|
-
elseif removeOnFailType ~= "nil" then
|
94
|
-
local maxAge = opts["removeOnFail"]["age"]
|
95
|
-
local maxCount = opts["removeOnFail"]["count"]
|
96
|
-
|
97
|
-
if maxAge ~= nil then
|
98
|
-
removeJobsByMaxAge(timestamp, maxAge,
|
99
|
-
failedKey, queueKeyPrefix)
|
100
|
-
end
|
101
|
-
|
102
|
-
if maxCount ~= nil and maxCount > 0 then
|
103
|
-
removeJobsByMaxCount(maxCount, failedKey,
|
104
|
-
queueKeyPrefix)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
table.insert(failed, jobId)
|
109
|
-
else
|
110
|
-
local target =
|
111
|
-
getTargetQueueList(metaKey, waitKey, pausedKey)
|
112
|
-
|
113
|
-
-- Move the job back to the wait queue, to immediately be picked up by a waiting worker.
|
114
|
-
rcall("RPUSH", target, jobId)
|
115
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
116
|
-
"waiting", "jobId", jobId, 'prev', 'active')
|
117
|
-
|
118
|
-
-- Emit the stalled event
|
119
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
120
|
-
"stalled", "jobId", jobId)
|
121
|
-
table.insert(stalled, jobId)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
-- Mark potentially stalled jobs
|
130
|
-
local active = rcall('LRANGE', activeKey, 0, -1)
|
131
|
-
|
132
|
-
if (#active > 0) then
|
133
|
-
for from, to in batches(#active, 7000) do
|
134
|
-
rcall('SADD', stalledKey, unpack(active, from, to))
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
return {failed, stalled}
|
139
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Move stalled jobs to wait.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
KEYS[1] 'stalled' (SET)
|
6
|
-
KEYS[2] 'wait', (LIST)
|
7
|
-
KEYS[3] 'active', (LIST)
|
8
|
-
KEYS[4] 'failed', (ZSET)
|
9
|
-
KEYS[5] 'stalled-check', (KEY)
|
10
|
-
KEYS[6] 'meta', (KEY)
|
11
|
-
KEYS[7] 'paused', (LIST)
|
12
|
-
KEYS[8] 'event stream' (STREAM)
|
13
|
-
|
14
|
-
ARGV[1] Max stalled job count
|
15
|
-
ARGV[2] queue.toKey('')
|
16
|
-
ARGV[3] timestamp
|
17
|
-
ARGV[4] max check time
|
18
|
-
|
19
|
-
Events:
|
20
|
-
'stalled' with stalled job id.
|
21
|
-
]] -- Includes
|
22
|
-
--- @include "includes/checkStalledJobs"
|
23
|
-
return checkStalledJobs(KEYS[1], KEYS[2], KEYS[3], KEYS[4], KEYS[5], KEYS[6],
|
24
|
-
KEYS[7], KEYS[8], ARGV[1], ARGV[2], ARGV[3], ARGV[4])
|
@@ -1,139 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Move stalled jobs to wait.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
stalledKey 'stalled' (SET)
|
6
|
-
waitKey 'wait', (LIST)
|
7
|
-
activeKey 'active', (LIST)
|
8
|
-
failedKey 'failed', (ZSET)
|
9
|
-
stalledCheckKey 'stalled-check', (KEY)
|
10
|
-
metaKey 'meta', (KEY)
|
11
|
-
pausedKey 'paused', (LIST)
|
12
|
-
eventStreamKey 'event stream' (STREAM)
|
13
|
-
|
14
|
-
maxStalledJobCount Max stalled job count
|
15
|
-
queueKeyPrefix queue.toKey('')
|
16
|
-
timestamp timestamp
|
17
|
-
maxCheckTime max check time
|
18
|
-
|
19
|
-
Events:
|
20
|
-
'stalled' with stalled job id.
|
21
|
-
]]
|
22
|
-
local rcall = redis.call
|
23
|
-
|
24
|
-
-- Includes
|
25
|
-
--- @include "batches"
|
26
|
-
--- @include "getTargetQueueList"
|
27
|
-
--- @include "removeJob"
|
28
|
-
--- @include "removeJobsByMaxAge"
|
29
|
-
--- @include "removeJobsByMaxCount"
|
30
|
-
--- @include "trimEvents"
|
31
|
-
|
32
|
-
-- Check if we need to check for stalled jobs now.
|
33
|
-
|
34
|
-
local function checkStalledJobs(stalledKey, waitKey, activeKey, failedKey,
|
35
|
-
stalledCheckKey, metaKey, pausedKey,
|
36
|
-
eventStreamKey, maxStalledJobCount,
|
37
|
-
queueKeyPrefix, timestamp, maxCheckTime)
|
38
|
-
if rcall("EXISTS", stalledCheckKey) == 1 then return {{}, {}} end
|
39
|
-
|
40
|
-
rcall("SET", stalledCheckKey, timestamp, "PX", maxCheckTime)
|
41
|
-
|
42
|
-
-- Trim events before emiting them to avoid trimming events emitted in this script
|
43
|
-
trimEvents(metaKey, eventStreamKey)
|
44
|
-
|
45
|
-
-- Move all stalled jobs to wait
|
46
|
-
local stalling = rcall('SMEMBERS', stalledKey)
|
47
|
-
local stalled = {}
|
48
|
-
local failed = {}
|
49
|
-
if (#stalling > 0) then
|
50
|
-
rcall('DEL', stalledKey)
|
51
|
-
|
52
|
-
local MAX_STALLED_JOB_COUNT = tonumber(maxStalledJobCount)
|
53
|
-
|
54
|
-
-- Remove from active list
|
55
|
-
for i, jobId in ipairs(stalling) do
|
56
|
-
-- Markers in waitlist DEPRECATED in v5: Remove in v6.
|
57
|
-
if string.sub(jobId, 1, 2) == "0:" then
|
58
|
-
-- If the jobId is a delay marker ID we just remove it.
|
59
|
-
rcall("LREM", activeKey, 1, jobId)
|
60
|
-
else
|
61
|
-
local jobKey = queueKeyPrefix .. jobId
|
62
|
-
|
63
|
-
-- Check that the lock is also missing, then we can handle this job as really stalled.
|
64
|
-
if (rcall("EXISTS", jobKey .. ":lock") == 0) then
|
65
|
-
-- Remove from the active queue.
|
66
|
-
local removed = rcall("LREM", activeKey, 1, jobId)
|
67
|
-
|
68
|
-
if (removed > 0) then
|
69
|
-
-- If this job has been stalled too many times, such as if it crashes the worker, then fail it.
|
70
|
-
local stalledCount =
|
71
|
-
rcall("HINCRBY", jobKey, "stalledCounter", 1)
|
72
|
-
if (stalledCount > MAX_STALLED_JOB_COUNT) then
|
73
|
-
local rawOpts = rcall("HGET", jobKey, "opts")
|
74
|
-
local opts = cjson.decode(rawOpts)
|
75
|
-
local removeOnFailType = type(opts["removeOnFail"])
|
76
|
-
rcall("ZADD", failedKey, timestamp, jobId)
|
77
|
-
local failedReason =
|
78
|
-
"job stalled more than allowable limit"
|
79
|
-
rcall("HMSET", jobKey, "failedReason", failedReason,
|
80
|
-
"finishedOn", timestamp)
|
81
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
82
|
-
"failed", "jobId", jobId, 'prev', 'active',
|
83
|
-
'failedReason', failedReason)
|
84
|
-
|
85
|
-
if removeOnFailType == "number" then
|
86
|
-
removeJobsByMaxCount(opts["removeOnFail"],
|
87
|
-
failedKey, queueKeyPrefix)
|
88
|
-
elseif removeOnFailType == "boolean" then
|
89
|
-
if opts["removeOnFail"] then
|
90
|
-
removeJob(jobId, false, queueKeyPrefix)
|
91
|
-
rcall("ZREM", failedKey, jobId)
|
92
|
-
end
|
93
|
-
elseif removeOnFailType ~= "nil" then
|
94
|
-
local maxAge = opts["removeOnFail"]["age"]
|
95
|
-
local maxCount = opts["removeOnFail"]["count"]
|
96
|
-
|
97
|
-
if maxAge ~= nil then
|
98
|
-
removeJobsByMaxAge(timestamp, maxAge,
|
99
|
-
failedKey, queueKeyPrefix)
|
100
|
-
end
|
101
|
-
|
102
|
-
if maxCount ~= nil and maxCount > 0 then
|
103
|
-
removeJobsByMaxCount(maxCount, failedKey,
|
104
|
-
queueKeyPrefix)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
table.insert(failed, jobId)
|
109
|
-
else
|
110
|
-
local target =
|
111
|
-
getTargetQueueList(metaKey, waitKey, pausedKey)
|
112
|
-
|
113
|
-
-- Move the job back to the wait queue, to immediately be picked up by a waiting worker.
|
114
|
-
rcall("RPUSH", target, jobId)
|
115
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
116
|
-
"waiting", "jobId", jobId, 'prev', 'active')
|
117
|
-
|
118
|
-
-- Emit the stalled event
|
119
|
-
rcall("XADD", eventStreamKey, "*", "event",
|
120
|
-
"stalled", "jobId", jobId)
|
121
|
-
table.insert(stalled, jobId)
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
-- Mark potentially stalled jobs
|
130
|
-
local active = rcall('LRANGE', activeKey, 0, -1)
|
131
|
-
|
132
|
-
if (#active > 0) then
|
133
|
-
for from, to in batches(#active, 7000) do
|
134
|
-
rcall('SADD', stalledKey, unpack(active, from, to))
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
return {failed, stalled}
|
139
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
--[[
|
2
|
-
Move stalled jobs to wait.
|
3
|
-
|
4
|
-
Input:
|
5
|
-
KEYS[1] 'stalled' (SET)
|
6
|
-
KEYS[2] 'wait', (LIST)
|
7
|
-
KEYS[3] 'active', (LIST)
|
8
|
-
KEYS[4] 'failed', (ZSET)
|
9
|
-
KEYS[5] 'stalled-check', (KEY)
|
10
|
-
KEYS[6] 'meta', (KEY)
|
11
|
-
KEYS[7] 'paused', (LIST)
|
12
|
-
KEYS[8] 'event stream' (STREAM)
|
13
|
-
|
14
|
-
ARGV[1] Max stalled job count
|
15
|
-
ARGV[2] queue.toKey('')
|
16
|
-
ARGV[3] timestamp
|
17
|
-
ARGV[4] max check time
|
18
|
-
|
19
|
-
Events:
|
20
|
-
'stalled' with stalled job id.
|
21
|
-
]] -- Includes
|
22
|
-
--- @include "includes/checkStalledJobs"
|
23
|
-
return checkStalledJobs(KEYS[1], KEYS[2], KEYS[3], KEYS[4], KEYS[5], KEYS[6],
|
24
|
-
KEYS[7], KEYS[8], ARGV[1], ARGV[2], ARGV[3], ARGV[4])
|
File without changes
|