3
3
import logging
4
4
import dataclasses
5
5
from random import randint
6
- from typing import Callable , Tuple
6
+ from typing import Callable , Tuple , Union
7
7
from ratelimiter import RateLimiter
8
8
9
9
import threading
36
36
37
37
@dataclasses .dataclass
38
38
class RequestParams :
39
- pool : ydb .SessionPool
39
+ pool : Union [ ydb .SessionPool , ydb . QuerySessionPool ]
40
40
query : str
41
41
params : dict
42
42
metrics : Metrics
@@ -56,7 +56,7 @@ def transaction(session):
56
56
57
57
result = session .transaction ().execute (
58
58
params .query ,
59
- params .params ,
59
+ parameters = params .params ,
60
60
commit_tx = True ,
61
61
settings = params .request_settings ,
62
62
)
@@ -135,6 +135,61 @@ def run_read_jobs(args, driver, tb_name, max_id, metrics):
135
135
return futures
136
136
137
137
138
+ def run_reads_query (driver , query , max_id , metrics , limiter , runtime , timeout ):
139
+ start_time = time .time ()
140
+
141
+ logger .info ("Start read workload" )
142
+
143
+ request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
144
+ retry_setting = ydb .RetrySettings (
145
+ idempotent = True ,
146
+ max_session_acquire_timeout = timeout ,
147
+ )
148
+
149
+ with ydb .QuerySessionPool (driver ) as pool :
150
+ logger .info ("Session pool for read requests created" )
151
+
152
+ while time .time () - start_time < runtime :
153
+ params = {"$object_id" : randint (1 , max_id )}
154
+ with limiter :
155
+
156
+ def check_result (result ):
157
+ res = next (result )
158
+ assert res [0 ].rows [0 ]
159
+
160
+ params = RequestParams (
161
+ pool = pool ,
162
+ query = query ,
163
+ params = params ,
164
+ metrics = metrics ,
165
+ labels = (JOB_READ_LABEL ,),
166
+ request_settings = request_settings ,
167
+ retry_settings = retry_setting ,
168
+ check_result_cb = check_result ,
169
+ )
170
+ execute_query (params )
171
+
172
+ logger .info ("Stop read workload" )
173
+
174
+
175
+ def run_read_jobs_query (args , driver , tb_name , max_id , metrics ):
176
+ logger .info ("Start read jobs for query service" )
177
+
178
+ read_q = READ_QUERY_TEMPLATE .format (tb_name )
179
+
180
+ read_limiter = RateLimiter (max_calls = args .read_rps , period = 1 )
181
+ futures = []
182
+ for _ in range (args .read_threads ):
183
+ future = threading .Thread (
184
+ name = "slo_run_read" ,
185
+ target = run_reads_query ,
186
+ args = (driver , read_q , max_id , metrics , read_limiter , args .time , args .read_timeout / 1000 ),
187
+ )
188
+ future .start ()
189
+ futures .append (future )
190
+ return futures
191
+
192
+
138
193
def run_writes (driver , query , row_generator , metrics , limiter , runtime , timeout ):
139
194
start_time = time .time ()
140
195
@@ -157,6 +212,11 @@ def run_writes(driver, query, row_generator, metrics, limiter, runtime, timeout)
157
212
"$payload_double" : row .payload_double ,
158
213
"$payload_timestamp" : row .payload_timestamp ,
159
214
}
215
+
216
+ def check_result (result ):
217
+ with result :
218
+ pass
219
+
160
220
with limiter :
161
221
params = RequestParams (
162
222
pool = pool ,
@@ -166,6 +226,7 @@ def run_writes(driver, query, row_generator, metrics, limiter, runtime, timeout)
166
226
labels = (JOB_WRITE_LABEL ,),
167
227
request_settings = request_settings ,
168
228
retry_settings = retry_setting ,
229
+ check_result_cb = check_result ,
169
230
)
170
231
execute_query (params )
171
232
@@ -194,6 +255,63 @@ def run_write_jobs(args, driver, tb_name, max_id, metrics):
194
255
return futures
195
256
196
257
258
+ def run_writes_query (driver , query , row_generator , metrics , limiter , runtime , timeout ):
259
+ start_time = time .time ()
260
+
261
+ logger .info ("Start write workload" )
262
+
263
+ request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
264
+ retry_setting = ydb .RetrySettings (
265
+ idempotent = True ,
266
+ max_session_acquire_timeout = timeout ,
267
+ )
268
+
269
+ with ydb .QuerySessionPool (driver ) as pool :
270
+ logger .info ("Session pool for read requests created" )
271
+
272
+ while time .time () - start_time < runtime :
273
+ row = row_generator .get ()
274
+ params = {
275
+ "$object_id" : (row .object_id , ydb .PrimitiveType .Int64 ),
276
+ "$payload_str" : (row .payload_str , ydb .PrimitiveType .Utf8 ),
277
+ "$payload_double" : (row .payload_double , ydb .PrimitiveType .Double ),
278
+ "$payload_timestamp" : (row .payload_timestamp , ydb .PrimitiveType .Timestamp ),
279
+ }
280
+ with limiter :
281
+ params = RequestParams (
282
+ pool = pool ,
283
+ query = query ,
284
+ params = params ,
285
+ metrics = metrics ,
286
+ labels = (JOB_WRITE_LABEL ,),
287
+ request_settings = request_settings ,
288
+ retry_settings = retry_setting ,
289
+ )
290
+ execute_query (params )
291
+
292
+ logger .info ("Stop write workload" )
293
+
294
+
295
+ def run_write_jobs_query (args , driver , tb_name , max_id , metrics ):
296
+ logger .info ("Start write jobs for query service" )
297
+
298
+ write_q = WRITE_QUERY_TEMPLATE .format (tb_name )
299
+
300
+ write_limiter = RateLimiter (max_calls = args .write_rps , period = 1 )
301
+ row_generator = RowGenerator (max_id )
302
+
303
+ futures = []
304
+ for _ in range (args .write_threads ):
305
+ future = threading .Thread (
306
+ name = "slo_run_write" ,
307
+ target = run_writes_query ,
308
+ args = (driver , write_q , row_generator , metrics , write_limiter , args .time , args .write_timeout / 1000 ),
309
+ )
310
+ future .start ()
311
+ futures .append (future )
312
+ return futures
313
+
314
+
197
315
def push_metric (limiter , runtime , metrics ):
198
316
start_time = time .time ()
199
317
logger .info ("Start push metrics" )
0 commit comments