3
3
import yatest .common
4
4
import json
5
5
import os
6
+ import re
6
7
from ydb .tests .olap .lib .ydb_cluster import YdbCluster
7
8
from ydb .tests .olap .lib .utils import get_external_param
8
9
from enum import StrEnum
@@ -39,12 +40,13 @@ class WorkloadRunResult:
39
40
def __init__ (self ):
40
41
self .stats : dict [str , dict [str , Any ]] = {}
41
42
self .query_out : Optional [str ] = None
42
- self .stdout : Optional [ str ] = None
43
- self .stderr : Optional [ str ] = None
43
+ self .stdout : str = ''
44
+ self .stderr : str = ''
44
45
self .error_message : str = ''
45
46
self .plans : Optional [list [YdbCliHelper .QueryPlan ]] = None
46
47
self .explain_plan : Optional [YdbCliHelper .QueryPlan ] = None
47
48
self .errors_by_iter : dict [int , str ] = {}
49
+ self .time_by_iter : dict [int , float ] = {}
48
50
self .traceback : Optional [TracebackType ] = None
49
51
50
52
@property
@@ -81,26 +83,26 @@ def _add_error(self, msg: Optional[str]):
81
83
else :
82
84
self .result .error_message = msg
83
85
84
- def _process_returncode (self , returncode , stderr : str ) -> None :
86
+ def _process_returncode (self , returncode ) -> None :
85
87
begin_str = f'{ self .query_num } :'
86
88
end_str = 'Query text:'
87
89
iter_str = 'iteration '
88
- begin_pos = stderr .find (begin_str )
90
+ begin_pos = self . result . stderr .find (begin_str )
89
91
if begin_pos >= 0 :
90
92
while True :
91
- begin_pos = stderr .find (iter_str , begin_pos )
93
+ begin_pos = self . result . stderr .find (iter_str , begin_pos )
92
94
if begin_pos < 0 :
93
95
break
94
96
begin_pos += len (iter_str )
95
- end_pos = stderr .find ('\n ' , begin_pos )
97
+ end_pos = self . result . stderr .find ('\n ' , begin_pos )
96
98
if end_pos < 0 :
97
- iter = int (stderr [begin_pos :])
98
- begin_pos = len (stderr ) - 1
99
+ iter = int (self . result . stderr [begin_pos :])
100
+ begin_pos = len (self . result . stderr ) - 1
99
101
else :
100
- iter = int (stderr [begin_pos :end_pos ])
102
+ iter = int (self . result . stderr [begin_pos :end_pos ])
101
103
begin_pos = end_pos + 1
102
- end_pos = stderr .find (end_str , begin_pos )
103
- msg = (stderr [begin_pos :] if end_pos < 0 else stderr [begin_pos :end_pos ]).strip ()
104
+ end_pos = self . result . stderr .find (end_str , begin_pos )
105
+ msg = (self . result . stderr [begin_pos :] if end_pos < 0 else self . result . stderr [begin_pos :end_pos ]).strip ()
104
106
self .result .errors_by_iter [iter ] = msg
105
107
self ._add_error (f'Iteration { iter } : { msg } ' )
106
108
if returncode != 0 and len (self .result .errors_by_iter ) == 0 :
@@ -167,6 +169,12 @@ def _check_nodes(self):
167
169
node_errors .append (f'Node { node } is down' )
168
170
self ._add_error ('\n ' .join (node_errors ))
169
171
172
+ def _parse_stdout (self ):
173
+ for line in self .result .stdout .splitlines ():
174
+ m = re .search (r'iteration ([0-9]*):\s*ok\s*([\.0-9]*)s' , line )
175
+ if m is not None :
176
+ self .result .time_by_iter [int (m .group (1 ))] = float (m .group (2 ))
177
+
170
178
def _get_cmd (self ) -> list [str ]:
171
179
cmd = YdbCliHelper .get_cli_command () + [
172
180
'-e' , YdbCluster .ydb_endpoint ,
@@ -192,7 +200,8 @@ def _exec_cli(self) -> None:
192
200
process = yatest .common .process .execute (self ._get_cmd (), check_exit_code = False )
193
201
self .result .stdout = process .stdout .decode ('utf-8' , 'replace' )
194
202
self .result .stderr = process .stderr .decode ('utf-8' , 'replace' )
195
- self ._process_returncode (process .returncode , self .result .stderr )
203
+ self ._process_returncode (process .returncode )
204
+ self ._parse_stdout ()
196
205
197
206
def process (self ) -> YdbCliHelper .WorkloadRunResult :
198
207
try :
0 commit comments