rapidity 0.0.8.373200 → 0.0.8.380347

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d3def70e3c5647129987af0c2be0161ec2b848dadbe6cbad46f75b8fea3af67e
4
- data.tar.gz: 01dd8c0f29563020a1b6f6d0aa0e89ff3d809dbe5694ca257b478b32a8005d12
3
+ metadata.gz: 8f38201a590863fbca01ac13557043dd8f29aafebc8bffb510452dc5e0f19065
4
+ data.tar.gz: 57d2f4b611c1c4150676290c207d8d72e7fe649971d93038c8a17334658df2cc
5
5
  SHA512:
6
- metadata.gz: db79ce100ae836e9c992629c23fdb6c163b79e282ec5fbb98bbd60a3709ed85fe0968e61f808f444feb26858fda71a3812e89c429d06215eec2fd050dea045ef
7
- data.tar.gz: 337db88fdb29d7f6a7a0eb5af05cdf1944a962fab384fcdb8ec1a9968029c2fecbde0cbd186223b08b38d6d6e60e1a1371474c466111bf0b8c867f7cb2cace9a
6
+ metadata.gz: 99d114cc8f28ba0c62a30db78cc8b32234f67ff0689ef53e8fc206e72cb89f5c0a70bf29151a873e0b4691286c73ad9ee3a8df4ed6c04de9fffcdb775b239391
7
+ data.tar.gz: 802503b25b8986c5e18c6f4bb69614e8df967ba3ab6de07f925431fc4dc711aeffa0a38db1ba684a7f6023048d3989cc095b2317058973604a551a0fdcb8972a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rapidity (0.0.8.373200)
4
+ rapidity (0.0.8.380347)
5
5
  activesupport
6
6
  connection_pool
7
7
  ostruct
@@ -134,13 +134,23 @@ local function process_all_limits(limit_keys, requested, current_time)
134
134
  end
135
135
 
136
136
  local limits = {}
137
-
138
- -- Фаза 1: Проверка всех лимитов (Read & Validate)
137
+ -- Фаза 1: Изменяем ttl для всех существующих ключей и сохраняем объекты лимитов для существующих
139
138
  for i = 1, #limit_keys do
140
139
  local key = limit_keys[i]
141
140
  local limit = Limit:new(key)
141
+ if limit.exists then
142
+ -- Продлеваем жизнь ключу, чтобы он не удалился, если к нему активно обращаются.
143
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
144
+ redis.call("EXPIRE", limit.key, key_ttl)
145
+ table.insert(limits, limit)
146
+ end
147
+ end
142
148
 
143
- if not limit.exists then
149
+ -- Фаза 2: Проверка всех лимитов (Read & Validate)
150
+ for i = 1, #limit_keys do
151
+ local key = limit_keys[i]
152
+ local limit = limits[i]
153
+ if not limit then
144
154
  return { "result", "false", "retryable", "false", "error", "key_not_found", "key", key }
145
155
  end
146
156
 
@@ -157,20 +167,14 @@ local function process_all_limits(limit_keys, requested, current_time)
157
167
  "key", key
158
168
  }
159
169
  end
160
-
161
- table.insert(limits, limit)
162
170
  end
163
171
 
164
- -- Фаза 2: Применение изменений (Write)
172
+ -- Фаза 3: Применение изменений (Write)
165
173
  -- Выполняется только если всем лимитам хватило токенов
166
174
  for i = 1, #limits do
167
175
  local limit = limits[i]
168
176
  limit:acquire(requested)
169
177
  limit:save()
170
-
171
- -- Продлеваем жизнь ключу, чтобы он не удалился, если к нему активно обращаются.
172
- -- "GT" обновляет TTL только если новый TTL больше текущего.
173
- redis.call("EXPIRE", limit.key, key_ttl, "GT")
174
178
  end
175
179
 
176
180
  return { "result", "true", "keys", limit_keys }
@@ -134,8 +134,9 @@ local function process_all_queues(limit_keys, req_tokens, ttl)
134
134
  limit:acquire(bottleneck_tokens)
135
135
  limit:save()
136
136
 
137
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка)
138
- redis.call("EXPIRE", limit.key, ttl, "GT")
137
+ -- Продлеваем жизнь ключу
138
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
139
+ redis.call("EXPIRE", limit.key, ttl)
139
140
  end
140
141
 
141
142
  -- Возвращаем успешный результат: сколько реально удалось захватить (tokens)
@@ -17,7 +17,7 @@
17
17
  -- 4. Поиск "узкого горлышка" (Bottleneck): Поскольку для успешной операции (в acquire.lua) нужны
18
18
  -- токены из всех переданных лимитов одновременно, общим временем ожидания будет являться
19
19
  -- максимальное время ожидания среди всех проверенных корзин (math.max(unpack(wait_times))).
20
- -- 5. Поддержка TTL: В процессе проверки скрипт продлевает время жизни ключей (EXPIRE ... GT),
20
+ -- 5. Поддержка TTL: В процессе проверки скрипт продлевает время жизни ключей (EXPIRE ...),
21
21
  -- чтобы корзины не удалялись из Redis, пока за ними наблюдают ожидающие
22
22
  -- процессы.
23
23
  -- Обратите внимание: скрипт не изменяет количество токенов (не списывает их), а лишь "смотрит" на состояние.
@@ -132,7 +132,8 @@ local function process_all_limits(limit_keys, needed, time_now)
132
132
  limit:update(time_now)
133
133
 
134
134
  -- Продлеваем жизнь ключу, так как идет активная проверка лимита
135
- redis.call("EXPIRE", limit.key, key_ttl, "GT")
135
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
136
+ redis.call("EXPIRE", limit.key, key_ttl)
136
137
 
137
138
  -- Сохраняем время ожидания для текущего лимита
138
139
  table.insert(wait_times, limit:available_in(needed))
@@ -36,9 +36,10 @@ local function check_queue()
36
36
 
37
37
  local semaphore = tonumber(semaphore_str) or 0
38
38
 
39
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка),
39
+ -- Продлеваем жизнь ключу
40
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
40
41
  -- так как идет активная проверка лимита.
41
- redis.call("EXPIRE", limit_key, key_ttl, "GT")
42
+ redis.call("EXPIRE", limit_key, key_ttl)
42
43
 
43
44
  -- Возвращаем успешный результат и текущее доступное количество мест
44
45
  return {
@@ -6,7 +6,7 @@
6
6
  -- Описание логики работы:
7
7
  -- 1. Скрипт принимает ключ лимита и время его жизни (TTL).
8
8
  -- 2. Если ключ существует, возвращает все его поля (HGETALL).
9
- -- 3. При успешном чтении продлевает время жизни ключа (EXPIRE ... GT),
9
+ -- 3. При успешном чтении продлевает время жизни ключа (EXPIRE ...),
10
10
  -- чтобы предотвратить удаление активно используемых данных.
11
11
  -------------------------------------------------------------------------------
12
12
 
@@ -28,8 +28,9 @@ local function info()
28
28
  return {"result", "false", "error", "key_not_found"}
29
29
  end
30
30
 
31
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка)
32
- redis.call("EXPIRE", limit_key, key_ttl, "GT")
31
+ -- Продлеваем жизнь ключу
32
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
33
+ redis.call("EXPIRE", limit_key, key_ttl)
33
34
 
34
35
  return {"result", "true", "info", {limit_key, data}}
35
36
  end
@@ -14,7 +14,7 @@
14
14
  -- Это критически важно: если мы просто обновляем настройки лимита "на лету",
15
15
  -- мы не должны сбрасывать текущие ограничения и уже списанные пользователями токены.
16
16
  -- 2. Расчет скорости (Rate): Скорость пополнения (rate) предрасчитывается прямо в Lua (max_tokens / interval) и кэшируется в Redis. Это избавляет от необходимости каждый раз высчитывать дроби при проверке (в скрипте acquire.lua).
17
- -- 3. Управление временем жизни (TTL): Назначает ключу время жизни. Если ключ уже существовал, TTL продлевается только в том случае, если новое значение больше текущего (EXPIRE ... GT).
17
+ -- 3. Управление временем жизни (TTL): Назначает ключу время жизни. Если ключ уже существовал, TTL продлевается (EXPIRE ...).
18
18
  -- 4. Возврат данных: Скрипт возвращает имя ключа и все его сохраненные поля (HGETALL). В Ruby эта структура затем используется для сборки (гидратации) объекта Limit.
19
19
  -------------------------------------------------------------------------------
20
20
 
@@ -55,8 +55,9 @@ local function init()
55
55
  "rate", rate
56
56
  )
57
57
 
58
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка)
59
- redis.call("EXPIRE", limit_key, key_ttl, "GT")
58
+ -- Продлеваем жизнь ключу
59
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
60
+ redis.call("EXPIRE", limit_key, key_ttl)
60
61
  else
61
62
  -- Создание нового лимита.
62
63
  -- Корзина инициализируется как полностью заполненная (tokens = max_tokens).
@@ -120,8 +120,9 @@ local function process_all_queues(limit_keys, released_tokens, ttl)
120
120
  end
121
121
  end
122
122
 
123
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка)
124
- redis.call("EXPIRE", limit.key, ttl, "GT")
123
+ -- Продлеваем жизнь ключу
124
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
125
+ redis.call("EXPIRE", limit.key, ttl)
125
126
  end
126
127
 
127
128
  -- Если ни у одного лимита очередь не включена, вернем 0
@@ -51,8 +51,9 @@ local function reset()
51
51
  "last_used", current_time
52
52
  )
53
53
 
54
- -- Продлеваем жизнь ключу (GT - только если новый TTL больше текущего остатка)
55
- redis.call("EXPIRE", limit_key, key_ttl, "GT")
54
+ -- Продлеваем жизнь ключу
55
+ -- раньше был GT, но он только с версии 7 (GT - только если новый TTL больше текущего остатка)
56
+ redis.call("EXPIRE", limit_key, key_ttl)
56
57
 
57
58
  -- Возвращаем успешный результат и обновленные данные
58
59
  return {"result", "true", "info", {limit_key, redis.call("HGETALL", limit_key)}}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapidity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8.373200
4
+ version: 0.0.8.380347
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yurusov Vlad
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-05-06 00:00:00.000000000 Z
12
+ date: 2026-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport