|
5 | 5 | import itertools |
6 | 6 | import posixpath |
7 | 7 | from collections.abc import AsyncIterator |
8 | | -from typing import ( |
9 | | - Any, |
10 | | - Dict, |
11 | | - Generator, |
12 | | - List, |
13 | | - Mapping, |
14 | | - Optional, |
15 | | - Sequence, |
16 | | - Union, |
17 | | -) |
| 8 | +from typing import Any, Dict, Generator, List, Mapping, Optional, Sequence, Union |
18 | 9 |
|
19 | 10 | import ydb |
20 | 11 | import ydb.aio |
|
29 | 20 | OperationalError, |
30 | 21 | ProgrammingError, |
31 | 22 | ) |
| 23 | +from .tracing import maybe_get_current_trace_id |
32 | 24 |
|
33 | 25 |
|
34 | 26 | def get_column_type(type_obj: Any) -> str: |
@@ -87,35 +79,40 @@ def __init__( |
87 | 79 | driver: Union[ydb.Driver, ydb.aio.Driver], |
88 | 80 | session_pool: Union[ydb.SessionPool, ydb.aio.SessionPool], |
89 | 81 | tx_mode: ydb.AbstractTransactionModeBuilder, |
| 82 | + request_settings: ydb.BaseRequestSettings, |
90 | 83 | tx_context: Optional[ydb.BaseTxContext] = None, |
91 | 84 | use_scan_query: bool = False, |
92 | 85 | table_path_prefix: str = "", |
93 | 86 | ): |
94 | 87 | self.driver = driver |
95 | 88 | self.session_pool = session_pool |
96 | 89 | self.tx_mode = tx_mode |
| 90 | + self.request_settings = request_settings |
97 | 91 | self.tx_context = tx_context |
98 | 92 | self.use_scan_query = use_scan_query |
| 93 | + self.root_directory = table_path_prefix |
99 | 94 | self.description = None |
100 | 95 | self.arraysize = 1 |
101 | 96 | self.rows = None |
102 | 97 | self._rows_prefetched = None |
103 | | - self.root_directory = table_path_prefix |
104 | 98 |
|
105 | 99 | @_handle_ydb_errors |
106 | 100 | def describe_table(self, abs_table_path: str) -> ydb.TableDescription: |
107 | | - return self._retry_operation_in_pool(self._describe_table, abs_table_path) |
| 101 | + settings = self._get_request_settings() |
| 102 | + return self._retry_operation_in_pool(self._describe_table, abs_table_path, settings) |
108 | 103 |
|
109 | 104 | def check_exists(self, abs_table_path: str) -> bool: |
| 105 | + settings = self._get_request_settings() |
110 | 106 | try: |
111 | | - self._retry_operation_in_pool(self._describe_path, abs_table_path) |
| 107 | + self._retry_operation_in_pool(self._describe_path, abs_table_path, settings) |
112 | 108 | return True |
113 | 109 | except ydb.SchemeError: |
114 | 110 | return False |
115 | 111 |
|
116 | 112 | @_handle_ydb_errors |
117 | 113 | def get_table_names(self, abs_dir_path: str) -> List[str]: |
118 | | - directory: ydb.Directory = self._retry_operation_in_pool(self._list_directory, abs_dir_path) |
| 114 | + settings = self._get_request_settings() |
| 115 | + directory: ydb.Directory = self._retry_operation_in_pool(self._list_directory, abs_dir_path, settings) |
119 | 116 | result = [] |
120 | 117 | for child in directory.children: |
121 | 118 | child_abs_path = posixpath.join(abs_dir_path, child.name) |
@@ -180,79 +177,95 @@ def _make_data_query( |
180 | 177 | def _execute_scan_query( |
181 | 178 | self, query: Union[ydb.DataQuery, str], parameters: Optional[Mapping[str, Any]] = None |
182 | 179 | ) -> Generator[ydb.convert.ResultSet, None, None]: |
| 180 | + settings = self._get_request_settings() |
183 | 181 | prepared_query = query |
184 | 182 | if isinstance(query, str) and parameters: |
185 | | - prepared_query: ydb.DataQuery = self._retry_operation_in_pool(self._prepare, query) |
| 183 | + prepared_query: ydb.DataQuery = self._retry_operation_in_pool(self._prepare, query, settings) |
186 | 184 |
|
187 | 185 | if isinstance(query, str): |
188 | 186 | scan_query = ydb.ScanQuery(query, None) |
189 | 187 | else: |
190 | 188 | scan_query = ydb.ScanQuery(prepared_query.yql_text, prepared_query.parameters_types) |
191 | 189 |
|
192 | | - return self._execute_scan_query_in_driver(scan_query, parameters) |
| 190 | + return self._execute_scan_query_in_driver(scan_query, parameters, settings) |
193 | 191 |
|
194 | 192 | @_handle_ydb_errors |
195 | 193 | def _execute_dml( |
196 | 194 | self, query: Union[ydb.DataQuery, str], parameters: Optional[Mapping[str, Any]] = None |
197 | 195 | ) -> ydb.convert.ResultSets: |
| 196 | + settings = self._get_request_settings() |
198 | 197 | prepared_query = query |
199 | 198 | if isinstance(query, str) and parameters: |
200 | 199 | if self.tx_context: |
201 | | - prepared_query = self._run_operation_in_session(self._prepare, query) |
| 200 | + prepared_query = self._run_operation_in_session(self._prepare, query, settings) |
202 | 201 | else: |
203 | | - prepared_query = self._retry_operation_in_pool(self._prepare, query) |
| 202 | + prepared_query = self._retry_operation_in_pool(self._prepare, query, settings) |
204 | 203 |
|
205 | 204 | if self.tx_context: |
206 | | - return self._run_operation_in_tx(self._execute_in_tx, prepared_query, parameters) |
| 205 | + return self._run_operation_in_tx(self._execute_in_tx, prepared_query, parameters, settings) |
207 | 206 |
|
208 | | - return self._retry_operation_in_pool(self._execute_in_session, self.tx_mode, prepared_query, parameters) |
| 207 | + return self._retry_operation_in_pool( |
| 208 | + self._execute_in_session, self.tx_mode, prepared_query, parameters, settings |
| 209 | + ) |
209 | 210 |
|
210 | 211 | @_handle_ydb_errors |
211 | 212 | def _execute_ddl(self, query: str) -> ydb.convert.ResultSets: |
212 | | - return self._retry_operation_in_pool(self._execute_scheme, query) |
| 213 | + settings = self._get_request_settings() |
| 214 | + return self._retry_operation_in_pool(self._execute_scheme, query, settings) |
213 | 215 |
|
214 | 216 | @staticmethod |
215 | | - def _execute_scheme(session: ydb.Session, query: str) -> ydb.convert.ResultSets: |
216 | | - return session.execute_scheme(query) |
| 217 | + def _execute_scheme( |
| 218 | + session: ydb.Session, |
| 219 | + query: str, |
| 220 | + settings: ydb.BaseRequestSettings, |
| 221 | + ) -> ydb.convert.ResultSets: |
| 222 | + return session.execute_scheme(query, settings) |
217 | 223 |
|
218 | 224 | @staticmethod |
219 | | - def _describe_table(session: ydb.Session, abs_table_path: str) -> ydb.TableDescription: |
220 | | - return session.describe_table(abs_table_path) |
| 225 | + def _describe_table( |
| 226 | + session: ydb.Session, abs_table_path: str, settings: ydb.BaseRequestSettings |
| 227 | + ) -> ydb.TableDescription: |
| 228 | + return session.describe_table(abs_table_path, settings) |
221 | 229 |
|
222 | 230 | @staticmethod |
223 | | - def _describe_path(session: ydb.Session, table_path: str) -> ydb.SchemeEntry: |
224 | | - return session._driver.scheme_client.describe_path(table_path) |
| 231 | + def _describe_path(session: ydb.Session, table_path: str, settings: ydb.BaseRequestSettings) -> ydb.SchemeEntry: |
| 232 | + return session._driver.scheme_client.describe_path(table_path, settings) |
225 | 233 |
|
226 | 234 | @staticmethod |
227 | | - def _list_directory(session: ydb.Session, abs_dir_path: str) -> ydb.Directory: |
228 | | - return session._driver.scheme_client.list_directory(abs_dir_path) |
| 235 | + def _list_directory(session: ydb.Session, abs_dir_path: str, settings: ydb.BaseRequestSettings) -> ydb.Directory: |
| 236 | + return session._driver.scheme_client.list_directory(abs_dir_path, settings) |
229 | 237 |
|
230 | 238 | @staticmethod |
231 | | - def _prepare(session: ydb.Session, query: str) -> ydb.DataQuery: |
232 | | - return session.prepare(query) |
| 239 | + def _prepare(session: ydb.Session, query: str, settings: ydb.BaseRequestSettings) -> ydb.DataQuery: |
| 240 | + return session.prepare(query, settings) |
233 | 241 |
|
234 | 242 | @staticmethod |
235 | 243 | def _execute_in_tx( |
236 | | - tx_context: ydb.TxContext, prepared_query: ydb.DataQuery, parameters: Optional[Mapping[str, Any]] |
| 244 | + tx_context: ydb.TxContext, |
| 245 | + prepared_query: ydb.DataQuery, |
| 246 | + parameters: Optional[Mapping[str, Any]], |
| 247 | + settings: ydb.BaseRequestSettings, |
237 | 248 | ) -> ydb.convert.ResultSets: |
238 | | - return tx_context.execute(prepared_query, parameters, commit_tx=False) |
| 249 | + return tx_context.execute(prepared_query, parameters, commit_tx=False, settings=settings) |
239 | 250 |
|
240 | 251 | @staticmethod |
241 | 252 | def _execute_in_session( |
242 | 253 | session: ydb.Session, |
243 | 254 | tx_mode: ydb.AbstractTransactionModeBuilder, |
244 | 255 | prepared_query: ydb.DataQuery, |
245 | 256 | parameters: Optional[Mapping[str, Any]], |
| 257 | + settings: ydb.BaseRequestSettings, |
246 | 258 | ) -> ydb.convert.ResultSets: |
247 | | - return session.transaction(tx_mode).execute(prepared_query, parameters, commit_tx=True) |
| 259 | + return session.transaction(tx_mode).execute(prepared_query, parameters, commit_tx=True, settings=settings) |
248 | 260 |
|
249 | 261 | def _execute_scan_query_in_driver( |
250 | 262 | self, |
251 | 263 | scan_query: ydb.ScanQuery, |
252 | 264 | parameters: Optional[Mapping[str, Any]], |
| 265 | + settings: ydb.BaseRequestSettings, |
253 | 266 | ) -> Generator[ydb.convert.ResultSet, None, None]: |
254 | 267 | chunk: ydb.ScanQueryResult |
255 | | - for chunk in self.driver.table_client.scan_query(scan_query, parameters): |
| 268 | + for chunk in self.driver.table_client.scan_query(scan_query, parameters, settings): |
256 | 269 | yield chunk.result_set |
257 | 270 |
|
258 | 271 | def _run_operation_in_tx(self, callee: collections.abc.Callable, *args, **kwargs): |
@@ -325,52 +338,85 @@ def close(self): |
325 | 338 | def rowcount(self): |
326 | 339 | return len(self._ensure_prefetched()) |
327 | 340 |
|
| 341 | + def _get_request_settings(self) -> ydb.BaseRequestSettings: |
| 342 | + settings = self.request_settings.make_copy() |
| 343 | + |
| 344 | + if self.request_settings.trace_id is None: |
| 345 | + settings = settings.with_trace_id(maybe_get_current_trace_id()) |
| 346 | + |
| 347 | + return settings |
| 348 | + |
328 | 349 |
|
329 | 350 | class AsyncCursor(Cursor): |
330 | 351 | _await = staticmethod(util.await_only) |
331 | 352 |
|
332 | 353 | @staticmethod |
333 | | - async def _describe_table(session: ydb.aio.table.Session, abs_table_path: str) -> ydb.TableDescription: |
334 | | - return await session.describe_table(abs_table_path) |
| 354 | + async def _describe_table( |
| 355 | + session: ydb.aio.table.Session, |
| 356 | + abs_table_path: str, |
| 357 | + settings: ydb.BaseRequestSettings, |
| 358 | + ) -> ydb.TableDescription: |
| 359 | + return await session.describe_table(abs_table_path, settings) |
335 | 360 |
|
336 | 361 | @staticmethod |
337 | | - async def _describe_path(session: ydb.aio.table.Session, abs_table_path: str) -> ydb.SchemeEntry: |
338 | | - return await session._driver.scheme_client.describe_path(abs_table_path) |
| 362 | + async def _describe_path( |
| 363 | + session: ydb.aio.table.Session, |
| 364 | + abs_table_path: str, |
| 365 | + settings: ydb.BaseRequestSettings, |
| 366 | + ) -> ydb.SchemeEntry: |
| 367 | + return await session._driver.scheme_client.describe_path(abs_table_path, settings) |
339 | 368 |
|
340 | 369 | @staticmethod |
341 | | - async def _list_directory(session: ydb.aio.table.Session, abs_dir_path: str) -> ydb.Directory: |
342 | | - return await session._driver.scheme_client.list_directory(abs_dir_path) |
| 370 | + async def _list_directory( |
| 371 | + session: ydb.aio.table.Session, |
| 372 | + abs_dir_path: str, |
| 373 | + settings: ydb.BaseRequestSettings, |
| 374 | + ) -> ydb.Directory: |
| 375 | + return await session._driver.scheme_client.list_directory(abs_dir_path, settings) |
343 | 376 |
|
344 | 377 | @staticmethod |
345 | | - async def _execute_scheme(session: ydb.aio.table.Session, query: str) -> ydb.convert.ResultSets: |
346 | | - return await session.execute_scheme(query) |
| 378 | + async def _execute_scheme( |
| 379 | + session: ydb.aio.table.Session, |
| 380 | + query: str, |
| 381 | + settings: ydb.BaseRequestSettings, |
| 382 | + ) -> ydb.convert.ResultSets: |
| 383 | + return await session.execute_scheme(query, settings) |
347 | 384 |
|
348 | 385 | @staticmethod |
349 | | - async def _prepare(session: ydb.aio.table.Session, query: str) -> ydb.DataQuery: |
350 | | - return await session.prepare(query) |
| 386 | + async def _prepare( |
| 387 | + session: ydb.aio.table.Session, |
| 388 | + query: str, |
| 389 | + settings: ydb.BaseRequestSettings, |
| 390 | + ) -> ydb.DataQuery: |
| 391 | + return await session.prepare(query, settings) |
351 | 392 |
|
352 | 393 | @staticmethod |
353 | 394 | async def _execute_in_tx( |
354 | | - tx_context: ydb.aio.table.TxContext, prepared_query: ydb.DataQuery, parameters: Optional[Mapping[str, Any]] |
| 395 | + tx_context: ydb.aio.table.TxContext, |
| 396 | + prepared_query: ydb.DataQuery, |
| 397 | + parameters: Optional[Mapping[str, Any]], |
| 398 | + settings: ydb.BaseRequestSettings, |
355 | 399 | ) -> ydb.convert.ResultSets: |
356 | | - return await tx_context.execute(prepared_query, parameters, commit_tx=False) |
| 400 | + return await tx_context.execute(prepared_query, parameters, commit_tx=False, settings=settings) |
357 | 401 |
|
358 | 402 | @staticmethod |
359 | 403 | async def _execute_in_session( |
360 | 404 | session: ydb.aio.table.Session, |
361 | 405 | tx_mode: ydb.AbstractTransactionModeBuilder, |
362 | 406 | prepared_query: ydb.DataQuery, |
363 | 407 | parameters: Optional[Mapping[str, Any]], |
| 408 | + settings: ydb.BaseRequestSettings, |
364 | 409 | ) -> ydb.convert.ResultSets: |
365 | | - return await session.transaction(tx_mode).execute(prepared_query, parameters, commit_tx=True) |
| 410 | + return await session.transaction(tx_mode).execute(prepared_query, parameters, commit_tx=True, settings=settings) |
366 | 411 |
|
367 | 412 | def _execute_scan_query_in_driver( |
368 | 413 | self, |
369 | 414 | scan_query: ydb.ScanQuery, |
370 | 415 | parameters: Optional[Mapping[str, Any]], |
| 416 | + settings: ydb.BaseRequestSettings, |
371 | 417 | ) -> Generator[ydb.convert.ResultSet, None, None]: |
372 | 418 | iterator: AsyncIterator[ydb.ScanQueryResult] = self._await( |
373 | | - self.driver.table_client.scan_query(scan_query, parameters) |
| 419 | + self.driver.table_client.scan_query(scan_query, parameters, settings) |
374 | 420 | ) |
375 | 421 | while True: |
376 | 422 | try: |
|
0 commit comments