33import logging
44import dataclasses
55from random import randint
6- from typing import Callable , Tuple
6+ from typing import Callable , Tuple , Union
77from ratelimiter import RateLimiter
88
99import threading
3131);
3232"""
3333
34+
3435logger = logging .getLogger (__name__ )
3536
3637
3738@dataclasses .dataclass
3839class RequestParams :
39- pool : ydb .SessionPool
40+ pool : Union [ ydb .SessionPool , ydb . QuerySessionPool ]
4041 query : str
4142 params : dict
4243 metrics : Metrics
@@ -56,7 +57,7 @@ def transaction(session):
5657
5758 result = session .transaction ().execute (
5859 params .query ,
59- params .params ,
60+ parameters = params .params ,
6061 commit_tx = True ,
6162 settings = params .request_settings ,
6263 )
@@ -82,7 +83,7 @@ def transaction(session):
8283def run_reads (driver , query , max_id , metrics , limiter , runtime , timeout ):
8384 start_time = time .time ()
8485
85- logger .info ("Start read workload" )
86+ logger .info ("Start read workload over table service " )
8687
8788 request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
8889 retry_setting = ydb .RetrySettings (
@@ -116,7 +117,7 @@ def check_result(result):
116117
117118
118119def run_read_jobs (args , driver , tb_name , max_id , metrics ):
119- logger .info ("Start read jobs" )
120+ logger .info ("Start read jobs over table service " )
120121
121122 session = ydb .retry_operation_sync (lambda : driver .table_client .session ().create ())
122123 read_q = session .prepare (READ_QUERY_TEMPLATE .format (tb_name ))
@@ -135,10 +136,65 @@ def run_read_jobs(args, driver, tb_name, max_id, metrics):
135136 return futures
136137
137138
139+ def run_reads_query (driver , query , max_id , metrics , limiter , runtime , timeout ):
140+ start_time = time .time ()
141+
142+ logger .info ("Start read workload over query service" )
143+
144+ request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
145+ retry_setting = ydb .RetrySettings (
146+ idempotent = True ,
147+ max_session_acquire_timeout = timeout ,
148+ )
149+
150+ with ydb .QuerySessionPool (driver ) as pool :
151+ logger .info ("Session pool for read requests created" )
152+
153+ while time .time () - start_time < runtime :
154+ params = {"$object_id" : (randint (1 , max_id ), ydb .PrimitiveType .Uint64 )}
155+ with limiter :
156+
157+ def check_result (result ):
158+ res = next (result )
159+ assert res .rows [0 ]
160+
161+ params = RequestParams (
162+ pool = pool ,
163+ query = query ,
164+ params = params ,
165+ metrics = metrics ,
166+ labels = (JOB_READ_LABEL ,),
167+ request_settings = request_settings ,
168+ retry_settings = retry_setting ,
169+ check_result_cb = check_result ,
170+ )
171+ execute_query (params )
172+
173+ logger .info ("Stop read workload" )
174+
175+
176+ def run_read_jobs_query (args , driver , tb_name , max_id , metrics ):
177+ logger .info ("Start read jobs over query service" )
178+
179+ read_q = READ_QUERY_TEMPLATE .format (tb_name )
180+
181+ read_limiter = RateLimiter (max_calls = args .read_rps , period = 1 )
182+ futures = []
183+ for _ in range (args .read_threads ):
184+ future = threading .Thread (
185+ name = "slo_run_read" ,
186+ target = run_reads_query ,
187+ args = (driver , read_q , max_id , metrics , read_limiter , args .time , args .read_timeout / 1000 ),
188+ )
189+ future .start ()
190+ futures .append (future )
191+ return futures
192+
193+
138194def run_writes (driver , query , row_generator , metrics , limiter , runtime , timeout ):
139195 start_time = time .time ()
140196
141- logger .info ("Start write workload" )
197+ logger .info ("Start write workload over table service " )
142198
143199 request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
144200 retry_setting = ydb .RetrySettings (
@@ -157,6 +213,7 @@ def run_writes(driver, query, row_generator, metrics, limiter, runtime, timeout)
157213 "$payload_double" : row .payload_double ,
158214 "$payload_timestamp" : row .payload_timestamp ,
159215 }
216+
160217 with limiter :
161218 params = RequestParams (
162219 pool = pool ,
@@ -173,7 +230,7 @@ def run_writes(driver, query, row_generator, metrics, limiter, runtime, timeout)
173230
174231
175232def run_write_jobs (args , driver , tb_name , max_id , metrics ):
176- logger .info ("Start write jobs" )
233+ logger .info ("Start write jobs over table service " )
177234
178235 session = ydb .retry_operation_sync (lambda : driver .table_client .session ().create ())
179236 write_q = session .prepare (WRITE_QUERY_TEMPLATE .format (tb_name ))
@@ -194,6 +251,70 @@ def run_write_jobs(args, driver, tb_name, max_id, metrics):
194251 return futures
195252
196253
254+ def run_writes_query (driver , query , row_generator , metrics , limiter , runtime , timeout ):
255+ start_time = time .time ()
256+
257+ logger .info ("Start write workload over query service" )
258+
259+ request_settings = ydb .BaseRequestSettings ().with_timeout (timeout )
260+ retry_setting = ydb .RetrySettings (
261+ idempotent = True ,
262+ max_session_acquire_timeout = timeout ,
263+ )
264+
265+ with ydb .QuerySessionPool (driver ) as pool :
266+ logger .info ("Session pool for read requests created" )
267+
268+ while time .time () - start_time < runtime :
269+ row = row_generator .get ()
270+ params = {
271+ "$object_id" : (row .object_id , ydb .PrimitiveType .Uint64 ),
272+ "$payload_str" : (row .payload_str , ydb .PrimitiveType .Utf8 ),
273+ "$payload_double" : (row .payload_double , ydb .PrimitiveType .Double ),
274+ "$payload_timestamp" : (row .payload_timestamp , ydb .PrimitiveType .Timestamp ),
275+ }
276+
277+ def check_result (result ):
278+ # we have to close stream by reading it till the end
279+ with result :
280+ pass
281+
282+ with limiter :
283+ params = RequestParams (
284+ pool = pool ,
285+ query = query ,
286+ params = params ,
287+ metrics = metrics ,
288+ labels = (JOB_WRITE_LABEL ,),
289+ request_settings = request_settings ,
290+ retry_settings = retry_setting ,
291+ check_result_cb = check_result ,
292+ )
293+ execute_query (params )
294+
295+ logger .info ("Stop write workload" )
296+
297+
298+ def run_write_jobs_query (args , driver , tb_name , max_id , metrics ):
299+ logger .info ("Start write jobs for query service" )
300+
301+ write_q = WRITE_QUERY_TEMPLATE .format (tb_name )
302+
303+ write_limiter = RateLimiter (max_calls = args .write_rps , period = 1 )
304+ row_generator = RowGenerator (max_id )
305+
306+ futures = []
307+ for _ in range (args .write_threads ):
308+ future = threading .Thread (
309+ name = "slo_run_write" ,
310+ target = run_writes_query ,
311+ args = (driver , write_q , row_generator , metrics , write_limiter , args .time , args .write_timeout / 1000 ),
312+ )
313+ future .start ()
314+ futures .append (future )
315+ return futures
316+
317+
197318def push_metric (limiter , runtime , metrics ):
198319 start_time = time .time ()
199320 logger .info ("Start push metrics" )
0 commit comments