Show firebird.log [FOUND messages for interval when this test was running]
Jump to: output_first_mismatch    outcomes_full_history    elapsed_time_chart
Show cross-report outcomes.

Annotation type Annotation details
2 @message
assert   
    WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
    ============ ======= ======= ======================================== ========== ======== ========
    TMP_ECP_FREQ       1       1 NEW                                               0        0 python
    TMP_ECP_FREQ       2       2 NEW                                               0        0 python
    TMP_ECP_FREQ       3       3 NEW                                               0        0 python
    TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
    TMP_ECP_FREQ       4       5 RUN DML                                           0        0 firebird
    TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_FREQ       1       8 BYE                                               0        1 python
    TMP_ECP_FREQ       5       9 NEW                                               0        0 firebird
    TMP_ECP_FREQ       5      10 RUN DML                                           0        0 firebird
    TMP_ECP_FREQ       5      11 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_FREQ       5      12 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_FREQ       4      13 BYE                                               0        0 firebird
    TMP_ECP_FREQ       2      14 BYE                                               0        1 python
    TMP_ECP_FREQ       6      15 NEW                                               0        0 firebird
    TMP_ECP_FREQ       6      16 RUN DML                                           0        0 firebird
    TMP_ECP_FREQ       6      17 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_FREQ       6      18 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_FREQ       6      19 BYE                                               0        0 firebird
  - TMP_ECP_FREQ       3      20 BYE                                               0        0 python
  - TMP_ECP_FREQ       5      21 BYE                                               0        0 firebird
  + TMP_ECP_FREQ       5      20 BYE                                               0        0 firebird
  + TMP_ECP_FREQ       3      21 BYE                                               0        0 python
    TMP_ECP_RARE       1       1 NEW                                               0        0 python
    TMP_ECP_RARE       2       2 NEW                                               0        0 python
    TMP_ECP_RARE       3       3 NEW                                               0        0 python
    TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
    TMP_ECP_RARE       4       5 RUN DML                                           0        0 firebird
    TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
    TMP_ECP_RARE       1       9 BYE                                               0        0 python
    TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
    TMP_ECP_RARE       5      11 RUN DML                                           0        0 firebird
    TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
    TMP_ECP_RARE       2      15 BYE                                               0        0 python
    TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
    TMP_ECP_RARE       6      17 RUN DML                                           0        0 firebird
    TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
    TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
    TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
    TMP_ECP_RARE       3      21 BYE                                               0        0 python

LOG DETAILS:

2025-02-22 09:28:53.396
2025-02-22 09:28:53.401 act = <firebird.qa.plugin.Action object at [hex]>
2025-02-22 09:28:53.406 tmp_user_freq = <firebird.qa.plugin.User object at [hex]>
2025-02-22 09:28:53.410 tmp_user_rare = <firebird.qa.plugin.User object at [hex]>
2025-02-22 09:28:53.415 tmp_cleaner_role = <firebird.qa.plugin.Role object at [hex]>
2025-02-22 09:28:53.420 capsys = <_pytest.capture.CaptureFixture object at [hex]>
2025-02-22 09:28:53.425
2025-02-22 09:28:53.430 @pytest.mark.es_eds
2025-02-22 09:28:53.435 @pytest.mark.version('>=4.0')
2025-02-22 09:28:53.440 def test_1(act: Action, tmp_user_freq: User, tmp_user_rare: User, tmp_cleaner_role: Role, capsys):
2025-02-22 09:28:53.444
2025-02-22 09:28:53.449 # [doc] state of external connections pool could be queried using ...:
2025-02-22 09:28:53.454 # - EXT_CONN_POOL_SIZE			pool size
2025-02-22 09:28:53.459 # - EXT_CONN_POOL_LIFETIME		idle connection lifetime, in seconds
2025-02-22 09:28:53.465 ECP_SIZE, ECP_LIFE = -1, -1
2025-02-22 09:28:53.470 with act.db.connect() as con:
2025-02-22 09:28:53.475 with con.cursor() as cur:
2025-02-22 09:28:53.480 cur.execute("select cast(rdb$get_context('SYSTEM', 'EXT_CONN_POOL_SIZE') as int), cast(rdb$get_context('SYSTEM', 'EXT_CONN_POOL_LIFETIME') as int) from rdb$database")
2025-02-22 09:28:53.485 ECP_SIZE, ECP_LIFE = cur.fetchone()
2025-02-22 09:28:53.490 assert ECP_SIZE > 1;
2025-02-22 09:28:53.495
2025-02-22 09:28:53.499 SERVER_MODE = act.get_server_architecture()
2025-02-22 09:28:53.505 sql_init = f'''
2025-02-22 09:28:53.511 set bail on;
2025-02-22 09:28:53.516 set list on;
2025-02-22 09:28:53.522 set wng off;
2025-02-22 09:28:53.527 alter database set linger to {ECP_LIFE+ADD_DELAY_FOR_RARE+2};
2025-02-22 09:28:53.533 alter role {tmp_cleaner_role.name} set system privileges to MODIFY_EXT_CONN_POOL;
2025-02-22 09:28:53.538 commit;
2025-02-22 09:28:53.543
2025-02-22 09:28:53.548 grant default {tmp_cleaner_role.name} to user {tmp_user_freq.name};
2025-02-22 09:28:53.553 grant default {tmp_cleaner_role.name} to user {tmp_user_rare.name};
2025-02-22 09:28:53.558 commit;
2025-02-22 09:28:53.564
2025-02-22 09:28:53.569 set term ^;
2025-02-22 09:28:53.574 create function fn_get_bin_name() returns varchar(255) as
2025-02-22 09:28:53.579 declare v_bin_name varchar(255);
2025-02-22 09:28:53.585 begin
2025-02-22 09:28:53.590 v_bin_name = rdb$get_context('SYSTEM','CLIENT_PROCESS');
2025-02-22 09:28:53.595
2025-02-22 09:28:53.601 -- ::: NOTE ::: Python binary can have numeric suffixes on Linux:
2025-02-22 09:28:53.606 if (v_bin_name similar to '%((\\python([[:DIGIT:]]+%)?.exe)|(/python([[:DIGIT:]]+%)?))') then
2025-02-22 09:28:53.612 return 'python'; -- '/usr/bin/python3.9' ==> 'python'
2025-02-22 09:28:53.618
2025-02-22 09:28:53.623 if (v_bin_name similar to '%((\\firebird([[:DIGIT:]]+%)?.exe)|(/python([[:DIGIT:]]+%)?))') then
2025-02-22 09:28:53.629 return 'firebird';
2025-02-22 09:28:53.634
2025-02-22 09:28:53.640 -- Extracts file name from full path of client binary process.
2025-02-22 09:28:53.646 -- For Windows: removes extension, in order returning name be the same as on Linux.
2025-02-22 09:28:53.651 -- 'c:\\program files\\firebird30\\firebird.exe' --> 'firebird'
2025-02-22 09:28:53.656 -- '/opt/firebird/bin/firebird'                  --> 'firebird'
2025-02-22 09:28:53.663 -- ::: NOTE ::: backslash must be duplicated when using this DDL in any Python
2025-02-22 09:28:53.670 -- environment otherwise it will be swallowed
2025-02-22 09:28:53.676 return
2025-02-22 09:28:53.681 (
2025-02-22 09:28:53.688 select
2025-02-22 09:28:53.694 --p
2025-02-22 09:28:53.701 --,r
2025-02-22 09:28:53.707 --,ext_pos
2025-02-22 09:28:53.714 --,n
2025-02-22 09:28:53.726 --,x
2025-02-22 09:28:53.734 reverse(left(x,n)) as clnt_bin
2025-02-22 09:28:53.741 -- reverse(x)  as clnt_bin
2025-02-22 09:28:53.748 from
2025-02-22 09:28:53.763 (
2025-02-22 09:28:53.773 select
2025-02-22 09:28:53.781 p
2025-02-22 09:28:53.789 ,reverse(p) r
2025-02-22 09:28:53.797 ,ext_pos
2025-02-22 09:28:53.803 ,substring(reverse(p) from iif( is_win, ext_pos+1, 1) ) x
2025-02-22 09:28:53.814 ,position( '|' in replace(replace(reverse( p ),'\\','|'),'/','|') ) - iif(is_win, ext_pos+1, 1) as n
2025-02-22 09:28:53.827 from (
2025-02-22 09:28:53.839 select
2025-02-22 09:28:53.851 trim(p) as p
2025-02-22 09:28:53.860 ,position( '\\' in p ) > 0 as is_win
2025-02-22 09:28:53.870 ,iif( position( '\\' in p ) > 0, position('.' in reverse(trim(p))), 0) as ext_pos
2025-02-22 09:28:53.877 from (
2025-02-22 09:28:53.884 select rdb$get_context('SYSTEM','CLIENT_PROCESS') as p from rdb$database
2025-02-22 09:28:53.891 )
2025-02-22 09:28:53.896 )
2025-02-22 09:28:53.903 )
2025-02-22 09:28:53.909 );
2025-02-22 09:28:53.916
2025-02-22 09:28:53.923 end
2025-02-22 09:28:53.930 ^
2025-02-22 09:28:53.936 set term ;^
2025-02-22 09:28:53.943
2025-02-22 09:28:53.950
2025-02-22 09:28:53.956 create table ecp_audit(
2025-02-22 09:28:53.963 id smallint generated by default as identity constraint pk_audit primary key
2025-02-22 09:28:53.970 ,srvmode varchar(12) -- 'Super' / 'SuperClassic' / 'Classic'
2025-02-22 09:28:53.977 ,who varchar(12) default current_user -- 'TMP_ECP_FREQ' / 'TMP_ECP_RARE' / 'SYSDBA'
2025-02-22 09:28:53.993 ,evt varchar(40) not null
2025-02-22 09:28:54.007 ,att smallint default current_connection
2025-02-22 09:28:54.020 ,trn smallint default current_transaction
2025-02-22 09:28:54.029 ,dts timestamp default 'now'
2025-02-22 09:28:54.038 ,pool_active_count smallint
2025-02-22 09:28:54.045 ,pool_idle_count smallint
2025-02-22 09:28:54.052 ,clnt_bin varchar(8)
2025-02-22 09:28:54.058 ,aux_info varchar(100)
2025-02-22 09:28:54.064 );
2025-02-22 09:28:54.070
2025-02-22 09:28:54.077 create view v_ecp_audit as
2025-02-22 09:28:54.089 select
2025-02-22 09:28:54.103 who
2025-02-22 09:28:54.118 ,att
2025-02-22 09:28:54.133 ,id
2025-02-22 09:28:54.148 ,evt
2025-02-22 09:28:54.166 ,active_cnt
2025-02-22 09:28:54.179 ,idle_cnt
2025-02-22 09:28:54.190 ,clnt_bin
2025-02-22 09:28:54.199 from (
2025-02-22 09:28:54.207 select
2025-02-22 09:28:54.221 srvmode
2025-02-22 09:28:54.231 ,who
2025-02-22 09:28:54.239 ,cast(dense_rank()over(partition by who order by att) as smallint) as att
2025-02-22 09:28:54.251 ,cast(dense_rank()over(partition by who order by id) as smallint) as id
2025-02-22 09:28:54.267 ,evt
2025-02-22 09:28:54.280 ,trn
2025-02-22 09:28:54.294 ,pool_active_count as active_cnt
2025-02-22 09:28:54.305 ,pool_idle_count as idle_cnt
2025-02-22 09:28:54.314 ,clnt_bin
2025-02-22 09:28:54.321 from ecp_audit
2025-02-22 09:28:54.327 )
2025-02-22 09:28:54.333 order by who, id
2025-02-22 09:28:54.339 ;
2025-02-22 09:28:54.345
2025-02-22 09:28:54.352
2025-02-22 09:28:54.359 grant select,insert on ecp_audit to public;
2025-02-22 09:28:54.366 grant select on v_ecp_audit to public;
2025-02-22 09:28:54.372 commit;
2025-02-22 09:28:54.378
2025-02-22 09:28:54.384 set term ^;
2025-02-22 09:28:54.393 create or alter trigger trg_aud_bi for ecp_audit active before insert sql security definer as
2025-02-22 09:28:54.400 declare v_srvmode varchar(30);
2025-02-22 09:28:54.407 declare p int;
2025-02-22 09:28:54.413 begin
2025-02-22 09:28:54.420 new.srvmode = '{SERVER_MODE}';
2025-02-22 09:28:54.426 new.pool_active_count = rdb$get_context('SYSTEM','EXT_CONN_POOL_ACTIVE_COUNT');
2025-02-22 09:28:54.432 new.pool_idle_count = rdb$get_context('SYSTEM','EXT_CONN_POOL_IDLE_COUNT');
2025-02-22 09:28:54.439 new.clnt_bin = right(fn_get_bin_name(), 8);
2025-02-22 09:28:54.447 -- right(rdb$get_context('SYSTEM','CLIENT_PROCESS'),15);
2025-02-22 09:28:54.459 end
2025-02-22 09:28:54.469 ^
2025-02-22 09:28:54.476
2025-02-22 09:28:54.483 create or alter trigger trg_connect inactive on connect sql security definer as
2025-02-22 09:28:54.490 declare p smallint;
2025-02-22 09:28:54.497 begin
2025-02-22 09:28:54.504 if (current_user <> '{act.db.user}') then
2025-02-22 09:28:54.512 begin
2025-02-22 09:28:54.518
2025-02-22 09:28:54.524 insert into ecp_audit(
2025-02-22 09:28:54.531 evt
2025-02-22 09:28:54.537 ) values (
2025-02-22 09:28:54.544 iif(resetting, 'TAKE FROM POOL: IDLE -> ACTIVE', 'NEW')
2025-02-22 09:28:54.551 );
2025-02-22 09:28:54.558 end
2025-02-22 09:28:54.566 end
2025-02-22 09:28:54.573 ^
2025-02-22 09:28:54.580
2025-02-22 09:28:54.588 create or alter trigger trg_disconnect inactive on disconnect sql security definer as
2025-02-22 09:28:54.596 begin
2025-02-22 09:28:54.604 if (current_user <> '{act.db.user}') then
2025-02-22 09:28:54.612 begin
2025-02-22 09:28:54.620 insert into ecp_audit(
2025-02-22 09:28:54.628 evt
2025-02-22 09:28:54.636 ) values (
2025-02-22 09:28:54.644 iif(resetting, 'MOVE INTO POOL: ACTIVE -> IDLE', 'BYE')
2025-02-22 09:28:54.652 );
2025-02-22 09:28:54.660 end
2025-02-22 09:28:54.668 end
2025-02-22 09:28:54.676 ^
2025-02-22 09:28:54.684 set term ;^
2025-02-22 09:28:54.698 commit;
2025-02-22 09:28:54.710 alter trigger trg_connect active;
2025-02-22 09:28:54.721 alter trigger trg_disconnect active;
2025-02-22 09:28:54.729 commit;
2025-02-22 09:28:54.736 '''
2025-02-22 09:28:54.742
2025-02-22 09:28:54.749 act.expected_stdout = ''
2025-02-22 09:28:54.758 act.isql(switches = ['-q'], input = sql_init, combine_output = True, io_enc = locale.getpreferredencoding())
2025-02-22 09:28:54.764 assert act.clean_stdout == act.clean_expected_stdout
2025-02-22 09:28:54.770 act.reset()
2025-02-22 09:28:54.775
2025-02-22 09:28:54.781 #-----------------------------------------------------
2025-02-22 09:28:54.786
2025-02-22 09:28:54.792 sql_for_run = '''
2025-02-22 09:28:54.801 execute block as
2025-02-22 09:28:54.810 declare c int;
2025-02-22 09:28:54.818 begin
2025-02-22 09:28:54.825 execute statement ( q'{ insert into ecp_audit( evt ) values( 'RUN DML') }' )
2025-02-22 09:28:54.836 on external
2025-02-22 09:28:54.849 'localhost:' || rdb$get_context('SYSTEM','DB_NAME')
2025-02-22 09:28:54.860 with autonomous transaction -- <<< !!! THIS IS MANDATORY IF WE WANT TO USE EXT CONN POOL !!! <<<
2025-02-22 09:28:54.870 as user current_user password '123'
2025-02-22 09:28:54.878 ;
2025-02-22 09:28:54.884 end
2025-02-22 09:28:54.892 '''
2025-02-22 09:28:54.899
2025-02-22 09:28:54.907 for usr in (tmp_user_freq, tmp_user_rare):
2025-02-22 09:28:54.918 conn_list = []
2025-02-22 09:28:54.931 for i in range(0, ITER_LOOP_CNT):
2025-02-22 09:28:54.941 conn_list.append( act.db.connect(user = usr.name, password = usr.password) )
2025-02-22 09:28:54.950
2025-02-22 09:28:54.959 for i,c in enumerate(conn_list):
2025-02-22 09:28:54.966
2025-02-22 09:28:54.975 # ::: NOTE :::
2025-02-22 09:28:54.988 # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2025-02-22 09:28:54.997 # On every iteration DIFFERENT connection is used for run ES/EDS,
2025-02-22 09:28:55.005 # but all of them use the same user/password/role, so apropriate
2025-02-22 09:28:55.012 # item in the ExtConnPool can be used to run this statement.
2025-02-22 09:28:55.019 # But this will be so only for user = 'FREQ' because he does such
2025-02-22 09:28:55.027 # actions 'frequently': each (<ECP_LIFE> - 2) seconds.
2025-02-22 09:28:55.039 # For user 'RARE' new attachment will be created every time when
2025-02-22 09:28:55.047 # he runs ES/EDS because he does that 'rarely' and idle connection
2025-02-22 09:28:55.053 # (from his previous iteration) is removed from ExtConnPool due to
2025-02-22 09:28:55.058 # expiration of ExtConnPoolLifeTime:
2025-02-22 09:28:55.065 # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2025-02-22 09:28:55.075 try:
2025-02-22 09:28:55.083 #c.execute_immediate( sql_for_run )
2025-02-22 09:28:55.090 with c.cursor() as cur:
2025-02-22 09:28:55.099 cur.execute(sql_for_run)
2025-02-22 09:28:55.109
2025-02-22 09:28:55.117 if i < len(conn_list)-1:
2025-02-22 09:28:55.124 time.sleep( 1 if usr == tmp_user_freq else ECP_LIFE + ADD_DELAY_FOR_RARE )
2025-02-22 09:28:55.131 else:
2025-02-22 09:28:55.138 c.execute_immediate( 'ALTER EXTERNAL CONNECTIONS POOL CLEAR ALL' )
2025-02-22 09:28:55.151 finally:
2025-02-22 09:28:55.163 if c:
2025-02-22 09:28:55.173 c.close()
2025-02-22 09:28:55.187
2025-02-22 09:28:55.199 if SERVER_MODE == 'Classic':
2025-02-22 09:28:55.209 act.expected_stdout = """
2025-02-22 09:28:55.216 WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
2025-02-22 09:28:55.222 ============ ======= ======= ======================================== ========== ======== ========
2025-02-22 09:28:55.227 TMP_ECP_FREQ       1       1 NEW                                               0        0 python
2025-02-22 09:28:55.233 TMP_ECP_FREQ       2       2 NEW                                               0        0 python
2025-02-22 09:28:55.238 TMP_ECP_FREQ       3       3 NEW                                               0        0 python
2025-02-22 09:28:55.244 TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:55.250 TMP_ECP_FREQ       4       5 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.255 TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.261 TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.266 TMP_ECP_FREQ       1       8 BYE                                               0        1 python
2025-02-22 09:28:55.273 TMP_ECP_FREQ       5       9 NEW                                               0        0 firebird
2025-02-22 09:28:55.282 TMP_ECP_FREQ       5      10 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.294 TMP_ECP_FREQ       5      11 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.307 TMP_ECP_FREQ       5      12 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.319 TMP_ECP_FREQ       4      13 BYE                                               0        0 firebird
2025-02-22 09:28:55.325 TMP_ECP_FREQ       2      14 BYE                                               0        1 python
2025-02-22 09:28:55.332 TMP_ECP_FREQ       6      15 NEW                                               0        0 firebird
2025-02-22 09:28:55.339 TMP_ECP_FREQ       6      16 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.350 TMP_ECP_FREQ       6      17 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.364 TMP_ECP_FREQ       6      18 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.377 TMP_ECP_FREQ       6      19 BYE                                               0        0 firebird
2025-02-22 09:28:55.386 TMP_ECP_FREQ       3      20 BYE                                               0        0 python
2025-02-22 09:28:55.399 TMP_ECP_FREQ       5      21 BYE                                               0        0 firebird
2025-02-22 09:28:55.414 TMP_ECP_RARE       1       1 NEW                                               0        0 python
2025-02-22 09:28:55.425 TMP_ECP_RARE       2       2 NEW                                               0        0 python
2025-02-22 09:28:55.435 TMP_ECP_RARE       3       3 NEW                                               0        0 python
2025-02-22 09:28:55.449 TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:55.459 TMP_ECP_RARE       4       5 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.476 TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.490 TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.500 TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
2025-02-22 09:28:55.515 TMP_ECP_RARE       1       9 BYE                                               0        0 python
2025-02-22 09:28:55.530 TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
2025-02-22 09:28:55.543 TMP_ECP_RARE       5      11 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.558 TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.572 TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.587 TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
2025-02-22 09:28:55.602 TMP_ECP_RARE       2      15 BYE                                               0        0 python
2025-02-22 09:28:55.617 TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
2025-02-22 09:28:55.629 TMP_ECP_RARE       6      17 RUN DML                                           0        0 firebird
2025-02-22 09:28:55.640 TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:55.653 TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:55.664 TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
2025-02-22 09:28:55.672 TMP_ECP_RARE       3      21 BYE                                               0        0 python
2025-02-22 09:28:55.681 """
2025-02-22 09:28:55.688 else:
2025-02-22 09:28:55.694 act.expected_stdout = """
2025-02-22 09:28:55.701 WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
2025-02-22 09:28:55.715 ============ ======= ======= ======================================== ========== ======== ========
2025-02-22 09:28:55.728 TMP_ECP_FREQ       1       1 NEW                                               0        0 python
2025-02-22 09:28:55.744 TMP_ECP_FREQ       2       2 NEW                                               0        0 python
2025-02-22 09:28:55.758 TMP_ECP_FREQ       3       3 NEW                                               0        0 python
2025-02-22 09:28:55.773 TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:55.788 TMP_ECP_FREQ       4       5 RUN DML                                           1        0 firebird
2025-02-22 09:28:55.800 TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:55.816 TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:55.829 TMP_ECP_FREQ       1       8 BYE                                               0        1 python
2025-02-22 09:28:55.840 TMP_ECP_FREQ       4       9 RUN DML                                           1        0 firebird
2025-02-22 09:28:55.854 TMP_ECP_FREQ       4      10 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:55.865 TMP_ECP_FREQ       4      11 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:55.879 TMP_ECP_FREQ       2      12 BYE                                               0        1 python
2025-02-22 09:28:55.892 TMP_ECP_FREQ       4      13 RUN DML                                           1        0 firebird
2025-02-22 09:28:55.901 TMP_ECP_FREQ       4      14 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:55.911 TMP_ECP_FREQ       4      15 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:55.925 TMP_ECP_FREQ       4      16 BYE                                               0        0 firebird
2025-02-22 09:28:55.937 TMP_ECP_FREQ       3      17 BYE                                               0        0 python
2025-02-22 09:28:55.949 TMP_ECP_RARE       1       1 NEW                                               0        0 python
2025-02-22 09:28:55.960 TMP_ECP_RARE       2       2 NEW                                               0        0 python
2025-02-22 09:28:55.969 TMP_ECP_RARE       3       3 NEW                                               0        0 python
2025-02-22 09:28:55.977 TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:55.985 TMP_ECP_RARE       4       5 RUN DML                                           1        0 firebird
2025-02-22 09:28:55.991 TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:56.000 TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:56.011 TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
2025-02-22 09:28:56.021 TMP_ECP_RARE       1       9 BYE                                               0        0 python
2025-02-22 09:28:56.030 TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
2025-02-22 09:28:56.039 TMP_ECP_RARE       5      11 RUN DML                                           1        0 firebird
2025-02-22 09:28:56.051 TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:56.061 TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:56.069 TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
2025-02-22 09:28:56.077 TMP_ECP_RARE       2      15 BYE                                               0        0 python
2025-02-22 09:28:56.084 TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
2025-02-22 09:28:56.091 TMP_ECP_RARE       6      17 RUN DML                                           1        0 firebird
2025-02-22 09:28:56.100 TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
2025-02-22 09:28:56.114 TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
2025-02-22 09:28:56.129 TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
2025-02-22 09:28:56.140 TMP_ECP_RARE       3      21 BYE                                               0        0 python
2025-02-22 09:28:56.149 """
2025-02-22 09:28:56.164 act.isql(switches = ['-q', '-pag', '999999'], input = 'select who,att,id,evt,active_cnt,idle_cnt,clnt_bin from v_ecp_audit;', combine_output = True, io_enc = locale.getpreferredencoding())
2025-02-22 09:28:56.172 >       assert act.clean_stdout == act.clean_expected_stdout
2025-02-22 09:28:56.178 E       assert
2025-02-22 09:28:56.188 E           WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
2025-02-22 09:28:56.200 E           ============ ======= ======= ======================================== ========== ======== ========
2025-02-22 09:28:56.209 E           TMP_ECP_FREQ       1       1 NEW                                               0        0 python
2025-02-22 09:28:56.218 E           TMP_ECP_FREQ       2       2 NEW                                               0        0 python
2025-02-22 09:28:56.232 E           TMP_ECP_FREQ       3       3 NEW                                               0        0 python
2025-02-22 09:28:56.244 E           TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:56.252 E           TMP_ECP_FREQ       4       5 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.261 E           TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.270 E           TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.284 E           TMP_ECP_FREQ       1       8 BYE                                               0        1 python
2025-02-22 09:28:56.294 E           TMP_ECP_FREQ       5       9 NEW                                               0        0 firebird
2025-02-22 09:28:56.305 E           TMP_ECP_FREQ       5      10 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.314 E           TMP_ECP_FREQ       5      11 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.323 E           TMP_ECP_FREQ       5      12 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.332 E           TMP_ECP_FREQ       4      13 BYE                                               0        0 firebird
2025-02-22 09:28:56.341 E           TMP_ECP_FREQ       2      14 BYE                                               0        1 python
2025-02-22 09:28:56.350 E           TMP_ECP_FREQ       6      15 NEW                                               0        0 firebird
2025-02-22 09:28:56.359 E           TMP_ECP_FREQ       6      16 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.365 E           TMP_ECP_FREQ       6      17 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.377 E           TMP_ECP_FREQ       6      18 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.388 E           TMP_ECP_FREQ       6      19 BYE                                               0        0 firebird
2025-02-22 09:28:56.399 E         - TMP_ECP_FREQ       3      20 BYE                                               0        0 python
2025-02-22 09:28:56.407 E         - TMP_ECP_FREQ       5      21 BYE                                               0        0 firebird
2025-02-22 09:28:56.421 E         + TMP_ECP_FREQ       5      20 BYE                                               0        0 firebird
2025-02-22 09:28:56.435 E         + TMP_ECP_FREQ       3      21 BYE                                               0        0 python
2025-02-22 09:28:56.442 E           TMP_ECP_RARE       1       1 NEW                                               0        0 python
2025-02-22 09:28:56.449 E           TMP_ECP_RARE       2       2 NEW                                               0        0 python
2025-02-22 09:28:56.455 E           TMP_ECP_RARE       3       3 NEW                                               0        0 python
2025-02-22 09:28:56.462 E           TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
2025-02-22 09:28:56.476 E           TMP_ECP_RARE       4       5 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.486 E           TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.492 E           TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.499 E           TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
2025-02-22 09:28:56.507 E           TMP_ECP_RARE       1       9 BYE                                               0        0 python
2025-02-22 09:28:56.517 E           TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
2025-02-22 09:28:56.524 E           TMP_ECP_RARE       5      11 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.533 E           TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.540 E           TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.547 E           TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
2025-02-22 09:28:56.553 E           TMP_ECP_RARE       2      15 BYE                                               0        0 python
2025-02-22 09:28:56.559 E           TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
2025-02-22 09:28:56.565 E           TMP_ECP_RARE       6      17 RUN DML                                           0        0 firebird
2025-02-22 09:28:56.570 E           TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
2025-02-22 09:28:56.575 E           TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
2025-02-22 09:28:56.581 E           TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
2025-02-22 09:28:56.592 E           TMP_ECP_RARE       3      21 BYE                                               0        0 python
2025-02-22 09:28:56.605
2025-02-22 09:28:56.613 tests/functional/session/test_ext_conn_pool_01.py:391: AssertionError
2025-02-22 09:28:56.620 ---------------------------- Captured stdout setup -----------------------------
2025-02-22 09:28:56.628 Creating db: localhost:/var/tmp/qa_2024/test_12115/test.fdb [page_size=None, sql_dialect=None, charset='NONE', user=SYSDBA, password=masterkey]
2025-02-22 09:28:56.643 CREATE user: TMP_ECP_FREQ PLUGIN: Srp
2025-02-22 09:28:56.656 CREATE user: TMP_ECP_RARE PLUGIN: Srp
2025-02-22 09:28:56.671 CREATE role: CLEANER_EXT_POOL
2025-02-22 09:28:56.681 --------------------------- Captured stdout teardown ---------------------------
2025-02-22 09:28:56.695 DROP role: CLEANER_EXT_POOL
2025-02-22 09:28:56.707 DROP user: TMP_ECP_RARE PLUGIN: Srp
2025-02-22 09:28:56.720 DROP user: TMP_ECP_FREQ PLUGIN: Srp
3 #text
act = <firebird.qa.plugin.Action pytest object at [hex]>
tmp_user_freq = <firebird.qa.plugin.User pytest object at [hex]>
tmp_user_rare = <firebird.qa.plugin.User pytest object at [hex]>
tmp_cleaner_role = <firebird.qa.plugin.Role pytest object at [hex]>
capsys = <_pytest.capture.CaptureFixture pytest object at [hex]>

    @pytest.mark.es_eds
    @pytest.mark.version('>=4.0')
    def test_1(act: Action, tmp_user_freq: User, tmp_user_rare: User, tmp_cleaner_role: Role, capsys):
    
        # [doc] state of external connections pool could be queried using ...:
        # - EXT_CONN_POOL_SIZE			pool size
        # - EXT_CONN_POOL_LIFETIME		idle connection lifetime, in seconds
        ECP_SIZE, ECP_LIFE = -1, -1
        with act.db.connect() as con:
            with con.cursor() as cur:
                cur.execute("select cast(rdb$get_context('SYSTEM', 'EXT_CONN_POOL_SIZE') as int), cast(rdb$get_context('SYSTEM', 'EXT_CONN_POOL_LIFETIME') as int) from rdb$database")
                ECP_SIZE, ECP_LIFE = cur.fetchone()
        assert ECP_SIZE > 1;
    
        SERVER_MODE = act.get_server_architecture()
        sql_init = f'''
            set bail on;
            set list on;
            set wng off;
            alter database set linger to {ECP_LIFE+ADD_DELAY_FOR_RARE+2};
            alter role {tmp_cleaner_role.name} set system privileges to MODIFY_EXT_CONN_POOL;
            commit;
    
            grant default {tmp_cleaner_role.name} to user {tmp_user_freq.name};
            grant default {tmp_cleaner_role.name} to user {tmp_user_rare.name};
            commit;
    
            set term ^;
            create function fn_get_bin_name() returns varchar(255) as
                declare v_bin_name varchar(255);
            begin
                v_bin_name = rdb$get_context('SYSTEM','CLIENT_PROCESS');
    
                -- ::: NOTE ::: Python binary can have numeric suffixes on Linux:
                if (v_bin_name similar to '%((\\python([[:DIGIT:]]+%)?.exe)|(/python([[:DIGIT:]]+%)?))') then
                    return 'python'; -- '/usr/bin/python3.9' ==> 'python'
    
                if (v_bin_name similar to '%((\\firebird([[:DIGIT:]]+%)?.exe)|(/python([[:DIGIT:]]+%)?))') then
                    return 'firebird';
    
                -- Extracts file name from full path of client binary process.
                -- For Windows: removes extension, in order returning name be the same as on Linux.
                -- 'c:\\program files\\firebird30\\firebird.exe' --> 'firebird'
                -- '/opt/firebird/bin/firebird'                  --> 'firebird'
                -- ::: NOTE ::: backslash must be duplicated when using this DDL in any Python
                -- environment otherwise it will be swallowed
                return
                (
                    select
                        --p
                        --,r
                        --,ext_pos
                        --,n
                        --,x
                        reverse(left(x,n)) as clnt_bin
                        -- reverse(x)  as clnt_bin
                    from
                    (
                        select
                            p
                            ,reverse(p) r
                            ,ext_pos
                            ,substring(reverse(p) from iif( is_win, ext_pos+1, 1) ) x
                            ,position( '|' in replace(replace(reverse( p ),'\\','|'),'/','|') ) - iif(is_win, ext_pos+1, 1) as n
                        from (
                            select
                                trim(p) as p
                                ,position( '\\' in p ) > 0 as is_win
                                ,iif( position( '\\' in p ) > 0, position('.' in reverse(trim(p))), 0) as ext_pos
                            from (
                                select rdb$get_context('SYSTEM','CLIENT_PROCESS') as p from rdb$database
                            )
                        )
                    )
                );
    
            end
            ^
            set term ;^
    
    
            create table ecp_audit(
                 id smallint generated by default as identity constraint pk_audit primary key
                ,srvmode varchar(12) -- 'Super' / 'SuperClassic' / 'Classic'
                ,who varchar(12) default current_user -- 'TMP_ECP_FREQ' / 'TMP_ECP_RARE' / 'SYSDBA'
                ,evt varchar(40) not null
                ,att smallint default current_connection
                ,trn smallint default current_transaction
                ,dts timestamp default 'now'
                ,pool_active_count smallint
                ,pool_idle_count smallint
                ,clnt_bin varchar(8)
                ,aux_info varchar(100)
            );
    
            create view v_ecp_audit as
            select
                who
               ,att
               ,id
               ,evt
               ,active_cnt
               ,idle_cnt
               ,clnt_bin
            from (
                select
                     srvmode
                    ,who
                    ,cast(dense_rank()over(partition by who order by att) as smallint) as att
                    ,cast(dense_rank()over(partition by who order by id) as smallint) as id
                    ,evt
                    ,trn
                    ,pool_active_count as active_cnt
                    ,pool_idle_count as idle_cnt
                    ,clnt_bin
                from ecp_audit
            )
            order by who, id
            ;
    
    
            grant select,insert on ecp_audit to public;
            grant select on v_ecp_audit to public;
            commit;
    
            set term ^;
            create or alter trigger trg_aud_bi for ecp_audit active before insert sql security definer as
                declare v_srvmode varchar(30);
                declare p int;
            begin
                new.srvmode = '{SERVER_MODE}';
                new.pool_active_count = rdb$get_context('SYSTEM','EXT_CONN_POOL_ACTIVE_COUNT');
                new.pool_idle_count = rdb$get_context('SYSTEM','EXT_CONN_POOL_IDLE_COUNT');
                new.clnt_bin = right(fn_get_bin_name(), 8);
                -- right(rdb$get_context('SYSTEM','CLIENT_PROCESS'),15);
            end
            ^
    
            create or alter trigger trg_connect inactive on connect sql security definer as
                declare p smallint;
            begin
                if (current_user <> '{act.db.user}') then
                begin
    
                    insert into ecp_audit(
                        evt
                    ) values (
                        iif(resetting, 'TAKE FROM POOL: IDLE -> ACTIVE', 'NEW')
                    );
                end
            end
            ^
    
            create or alter trigger trg_disconnect inactive on disconnect sql security definer as
            begin
                if (current_user <> '{act.db.user}') then
                begin
                    insert into ecp_audit(
                        evt
                    ) values (
                        iif(resetting, 'MOVE INTO POOL: ACTIVE -> IDLE', 'BYE')
                    );
                end
            end
            ^
            set term ;^
            commit;
            alter trigger trg_connect active;
            alter trigger trg_disconnect active;
            commit;
        '''
    
        act.expected_stdout = ''
        act.isql(switches = ['-q'], input = sql_init, combine_output = True, io_enc = locale.getpreferredencoding())
        assert act.clean_stdout == act.clean_expected_stdout
        act.reset()
    
        #-----------------------------------------------------
    
        sql_for_run = '''
            execute block as
                declare c int;
            begin
                execute statement ( q'{ insert into ecp_audit( evt ) values( 'RUN DML') }' )
                on external
                   'localhost:' || rdb$get_context('SYSTEM','DB_NAME')
                with autonomous transaction -- <<< !!! THIS IS MANDATORY IF WE WANT TO USE EXT CONN POOL !!! <<<
                as user current_user password '123'
                ;
            end
        '''
    
        for usr in (tmp_user_freq, tmp_user_rare):
            conn_list = []
            for i in range(0, ITER_LOOP_CNT):
                conn_list.append( act.db.connect(user = usr.name, password = usr.password) )
    
            for i,c in enumerate(conn_list):
    
                # ::: NOTE :::
                # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                # On every iteration DIFFERENT connection is used for run ES/EDS,
                # but all of them use the same user/password/role, so apropriate
                # item in the ExtConnPool can be used to run this statement.
                # But this will be so only for user = 'FREQ' because he does such
                # actions 'frequently': each (<ECP_LIFE> - 2) seconds.
                # For user 'RARE' new attachment will be created every time when
                # he runs ES/EDS because he does that 'rarely' and idle connection
                # (from his previous iteration) is removed from ExtConnPool due to
                # expiration of ExtConnPoolLifeTime:
                # ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
                try:
                    #c.execute_immediate( sql_for_run )
                    with c.cursor() as cur:
                        cur.execute(sql_for_run)
    
                    if i < len(conn_list)-1:
                        time.sleep( 1 if usr == tmp_user_freq else ECP_LIFE + ADD_DELAY_FOR_RARE )
                    else:
                        c.execute_immediate( 'ALTER EXTERNAL CONNECTIONS POOL CLEAR ALL' )
                finally:
                    if c:
                        c.close()
    
        if SERVER_MODE == 'Classic':
            act.expected_stdout = """
                WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
                ============ ======= ======= ======================================== ========== ======== ========
                TMP_ECP_FREQ       1       1 NEW                                               0        0 python
                TMP_ECP_FREQ       2       2 NEW                                               0        0 python
                TMP_ECP_FREQ       3       3 NEW                                               0        0 python
                TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
                TMP_ECP_FREQ       4       5 RUN DML                                           0        0 firebird
                TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_FREQ       1       8 BYE                                               0        1 python
                TMP_ECP_FREQ       5       9 NEW                                               0        0 firebird
                TMP_ECP_FREQ       5      10 RUN DML                                           0        0 firebird
                TMP_ECP_FREQ       5      11 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_FREQ       5      12 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_FREQ       4      13 BYE                                               0        0 firebird
                TMP_ECP_FREQ       2      14 BYE                                               0        1 python
                TMP_ECP_FREQ       6      15 NEW                                               0        0 firebird
                TMP_ECP_FREQ       6      16 RUN DML                                           0        0 firebird
                TMP_ECP_FREQ       6      17 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_FREQ       6      18 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_FREQ       6      19 BYE                                               0        0 firebird
                TMP_ECP_FREQ       3      20 BYE                                               0        0 python
                TMP_ECP_FREQ       5      21 BYE                                               0        0 firebird
                TMP_ECP_RARE       1       1 NEW                                               0        0 python
                TMP_ECP_RARE       2       2 NEW                                               0        0 python
                TMP_ECP_RARE       3       3 NEW                                               0        0 python
                TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
                TMP_ECP_RARE       4       5 RUN DML                                           0        0 firebird
                TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
                TMP_ECP_RARE       1       9 BYE                                               0        0 python
                TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
                TMP_ECP_RARE       5      11 RUN DML                                           0        0 firebird
                TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
                TMP_ECP_RARE       2      15 BYE                                               0        0 python
                TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
                TMP_ECP_RARE       6      17 RUN DML                                           0        0 firebird
                TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
                TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
                TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
                TMP_ECP_RARE       3      21 BYE                                               0        0 python
            """
        else:
            act.expected_stdout = """
                WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
                ============ ======= ======= ======================================== ========== ======== ========
                TMP_ECP_FREQ       1       1 NEW                                               0        0 python
                TMP_ECP_FREQ       2       2 NEW                                               0        0 python
                TMP_ECP_FREQ       3       3 NEW                                               0        0 python
                TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
                TMP_ECP_FREQ       4       5 RUN DML                                           1        0 firebird
                TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_FREQ       1       8 BYE                                               0        1 python
                TMP_ECP_FREQ       4       9 RUN DML                                           1        0 firebird
                TMP_ECP_FREQ       4      10 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_FREQ       4      11 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_FREQ       2      12 BYE                                               0        1 python
                TMP_ECP_FREQ       4      13 RUN DML                                           1        0 firebird
                TMP_ECP_FREQ       4      14 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_FREQ       4      15 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_FREQ       4      16 BYE                                               0        0 firebird
                TMP_ECP_FREQ       3      17 BYE                                               0        0 python
                TMP_ECP_RARE       1       1 NEW                                               0        0 python
                TMP_ECP_RARE       2       2 NEW                                               0        0 python
                TMP_ECP_RARE       3       3 NEW                                               0        0 python
                TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
                TMP_ECP_RARE       4       5 RUN DML                                           1        0 firebird
                TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
                TMP_ECP_RARE       1       9 BYE                                               0        0 python
                TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
                TMP_ECP_RARE       5      11 RUN DML                                           1        0 firebird
                TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
                TMP_ECP_RARE       2      15 BYE                                               0        0 python
                TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
                TMP_ECP_RARE       6      17 RUN DML                                           1        0 firebird
                TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    1        0 firebird
                TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    1        0 firebird
                TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
                TMP_ECP_RARE       3      21 BYE                                               0        0 python
            """
        act.isql(switches = ['-q', '-pag', '999999'], input = 'select who,att,id,evt,active_cnt,idle_cnt,clnt_bin from v_ecp_audit;', combine_output = True, io_enc = locale.getpreferredencoding())
>       assert act.clean_stdout == act.clean_expected_stdout
E       assert   
E           WHO              ATT      ID EVT                                      ACTIVE_CNT IDLE_CNT CLNT_BIN
E           ============ ======= ======= ======================================== ========== ======== ========
E           TMP_ECP_FREQ       1       1 NEW                                               0        0 python
E           TMP_ECP_FREQ       2       2 NEW                                               0        0 python
E           TMP_ECP_FREQ       3       3 NEW                                               0        0 python
E           TMP_ECP_FREQ       4       4 NEW                                               0        0 firebird
E           TMP_ECP_FREQ       4       5 RUN DML                                           0        0 firebird
E           TMP_ECP_FREQ       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_FREQ       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_FREQ       1       8 BYE                                               0        1 python
E           TMP_ECP_FREQ       5       9 NEW                                               0        0 firebird
E           TMP_ECP_FREQ       5      10 RUN DML                                           0        0 firebird
E           TMP_ECP_FREQ       5      11 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_FREQ       5      12 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_FREQ       4      13 BYE                                               0        0 firebird
E           TMP_ECP_FREQ       2      14 BYE                                               0        1 python
E           TMP_ECP_FREQ       6      15 NEW                                               0        0 firebird
E           TMP_ECP_FREQ       6      16 RUN DML                                           0        0 firebird
E           TMP_ECP_FREQ       6      17 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_FREQ       6      18 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_FREQ       6      19 BYE                                               0        0 firebird
E         - TMP_ECP_FREQ       3      20 BYE                                               0        0 python
E         - TMP_ECP_FREQ       5      21 BYE                                               0        0 firebird
E         + TMP_ECP_FREQ       5      20 BYE                                               0        0 firebird
E         + TMP_ECP_FREQ       3      21 BYE                                               0        0 python
E           TMP_ECP_RARE       1       1 NEW                                               0        0 python
E           TMP_ECP_RARE       2       2 NEW                                               0        0 python
E           TMP_ECP_RARE       3       3 NEW                                               0        0 python
E           TMP_ECP_RARE       4       4 NEW                                               0        0 firebird
E           TMP_ECP_RARE       4       5 RUN DML                                           0        0 firebird
E           TMP_ECP_RARE       4       6 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_RARE       4       7 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_RARE       4       8 BYE                                               0        0 firebird
E           TMP_ECP_RARE       1       9 BYE                                               0        0 python
E           TMP_ECP_RARE       5      10 NEW                                               0        0 firebird
E           TMP_ECP_RARE       5      11 RUN DML                                           0        0 firebird
E           TMP_ECP_RARE       5      12 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_RARE       5      13 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_RARE       5      14 BYE                                               0        0 firebird
E           TMP_ECP_RARE       2      15 BYE                                               0        0 python
E           TMP_ECP_RARE       6      16 NEW                                               0        0 firebird
E           TMP_ECP_RARE       6      17 RUN DML                                           0        0 firebird
E           TMP_ECP_RARE       6      18 MOVE INTO POOL: ACTIVE -> IDLE                    0        0 firebird
E           TMP_ECP_RARE       6      19 TAKE FROM POOL: IDLE -> ACTIVE                    0        0 firebird
E           TMP_ECP_RARE       6      20 BYE                                               0        0 firebird
E           TMP_ECP_RARE       3      21 BYE                                               0        0 python

tests/functional/session/test_ext_conn_pool_01.py:391: AssertionError
Full history of outcomes and elapsed time, ms:
NN SNAP_INFO CS_outcome SS_outcome CS_run_time SS_run_time CS_run_beg CS_run_end SS_run_beg SS_run_end
1 4.0.6.3215 2025.06.25 6461d P P 29379 27717 2025.06.27 08:11:20.310 2025.06.27 08:11:49.689 2025.06.27 06:50:12.989 2025.06.27 06:50:40.706
2 4.0.6.3214 2025.06.21 e11f6 P P 29251 27770 2025.06.25 08:04:56.955 2025.06.25 08:05:26.206 2025.06.25 06:53:57.823 2025.06.25 06:54:25.593
3 4.0.6.3213 2025.06.14 f015c P P 29413 27586 2025.06.21 07:41:27.405 2025.06.21 07:41:56.818 2025.06.21 06:30:23.880 2025.06.21 06:30:51.466
4 4.0.6.3212 2025.06.11 bc50d P P 29412 27802 2025.06.14 08:50:27.851 2025.06.14 08:50:57.263 2025.06.14 07:28:27.998 2025.06.14 07:28:55.800
5 4.0.6.3208 2025.06.10 19fe3 P P 29758 27898 2025.06.11 07:28:51.653 2025.06.11 07:29:21.411 2025.06.11 06:08:07.397 2025.06.11 06:08:35.295
6 4.0.6.3207 2025.06.07 205ff P P 29882 28032 2025.06.10 07:31:48.505 2025.06.10 07:32:18.387 2025.06.10 06:09:37.743 2025.06.10 06:10:05.775
7 4.0.6.3206 2025.05.22 d7d10 P P 29787 28123 2025.06.06 07:37:33.459 2025.06.06 07:38:03.246 2025.06.06 06:15:24.233 2025.06.06 06:15:52.356
8 4.0.6.3205 2025.05.07 00148 P P 29861 27984 2025.05.21 07:31:59.078 2025.05.21 07:32:28.939 2025.05.21 06:08:47.108 2025.05.21 06:09:15.092
9 4.0.6.3204 2025.05.06 35b85 P P 30028 27945 2025.05.07 07:03:55.302 2025.05.07 07:04:25.330 2025.05.07 05:42:12.726 2025.05.07 05:42:40.671
10 4.0.6.3203 2025.05.05 c2cbd P P 29799 27988 2025.05.06 07:10:15.060 2025.05.06 07:10:44.859 2025.05.06 05:39:05.977 2025.05.06 05:39:33.965
11 4.0.6.3200 2025.04.18 7ef56 P P 29870 27973 2025.05.01 06:51:58.372 2025.05.01 06:52:28.242 2025.05.01 05:30:32.014 2025.05.01 05:30:59.987
12 4.0.6.3199 2025.04.14 33a10 P P 29885 27917 2025.04.18 07:03:00.195 2025.04.18 07:03:30.080 2025.04.18 05:41:05.925 2025.04.18 05:41:33.842
13 4.0.6.3198 2025.04.13 64a7f P P 29563 27979 2025.04.14 06:07:06.682 2025.04.14 06:07:36.245 2025.04.14 04:51:57.545 2025.04.14 04:52:25.524
14 4.0.6.3195 2025.03.28 b9faf P P 29534 27892 2025.04.13 06:05:09.759 2025.04.13 06:05:39.293 2025.04.13 04:40:38.143 2025.04.13 04:41:06.035
15 4.0.6.3194 2025.03.26 912aa P P 29494 27707 2025.03.28 06:36:33.841 2025.03.28 06:37:03.335 2025.03.28 05:17:33.859 2025.03.28 05:18:01.566
16 4.0.6.3193 2025.03.20 80234 P P 29761 28025 2025.03.24 06:55:51.871 2025.03.24 06:56:21.632 2025.03.24 05:32:20.208 2025.03.24 05:32:48.233
17 4.0.6.3192 2025.03.13 2a9da P P 782 508 2025.03.17 03:38:15.110 2025.03.17 03:38:15.892 2025.03.17 02:15:21.147 2025.03.17 02:15:21.655
18 4.0.6.3191 2025.03.10 3d9fd P P 698 489 2025.03.13 06:47:17.256 2025.03.13 06:47:17.954 2025.03.13 05:23:02.645 2025.03.13 05:23:03.134
19 4.0.6.3190 2025.02.25 c9928 P P 702 471 2025.03.09 06:32:56.900 2025.03.09 06:32:57.602 2025.03.09 05:10:10.528 2025.03.09 05:10:10.999
20 4.0.6.3189 2025.02.22 3fb0b P P 662 455 2025.02.25 06:22:26.307 2025.02.25 06:22:26.969 2025.02.25 05:01:20.426 2025.02.25 05:01:20.881
21 4.0.6.3188 2025.02.21 8ee1c F P 716 492 2025.02.22 06:22:29.902 2025.02.22 06:22:30.618 2025.02.22 04:57:55.732 2025.02.22 04:57:56.224
22 4.0.6.3186 2025.02.19 92cb6 P P 668 436 2025.02.20 03:22:25.269 2025.02.20 03:22:25.937 2025.02.20 01:52:35.173 2025.02.20 01:52:35.609
23 4.0.6.3185 2025.02.16 9cac4 F P 1067 406 2025.02.17 00:21:50.733 2025.02.17 00:21:51.800 2025.02.16 22:28:39.674 2025.02.16 22:28:40.080
24 4.0.6.3183 2025.02.04 bf738 P P 630 544 2025.02.14 06:34:55.174 2025.02.14 06:34:55.804 2025.02.14 05:12:13.203 2025.02.14 05:12:13.747
25 4.0.6.3181 2025.02.01 00b64 P P 688 446 2025.02.04 06:38:31.830 2025.02.04 06:38:32.518 2025.02.04 05:15:54.019 2025.02.04 05:15:54.465
26 4.0.6.3180 2025.01.27 2edb8 P P 667 503 2025.01.28 06:38:52.390 2025.01.28 06:38:53.057 2025.01.28 05:06:33.432 2025.01.28 05:06:33.935
27 4.0.6.3179 2025.01.24 008d4 P P 625 471 2025.01.25 06:24:26.143 2025.01.25 06:24:26.768 2025.01.25 05:02:27.423 2025.01.25 05:02:27.894
28 4.0.6.3178 2025.01.20 ec94d P P 738 475 2025.01.24 06:24:04.743 2025.01.24 06:24:05.481 2025.01.24 05:02:05.451 2025.01.24 05:02:05.926
29 4.0.6.3176 2025.01.16 79cc1 P P 639 479 2025.01.20 06:13:28.117 2025.01.20 06:13:28.756 2025.01.20 04:53:19.532 2025.01.20 04:53:20.011
30 4.0.6.3175 2025.01.15 91361 P P 686 476 2025.01.16 06:12:39.416 2025.01.16 06:12:40.102 2025.01.16 04:52:49.205 2025.01.16 04:52:49.681
31 4.0.6.3174 2024.12.23 ffd39 P P 677 456 2025.01.14 06:27:49.382 2025.01.14 06:27:50.059 2025.01.14 04:57:14.252 2025.01.14 04:57:14.708
32 4.0.6.3173 2024.12.19 60b32 P P 536 352 2024.12.21 17:53:01.619 2024.12.21 17:53:02.155 2024.12.21 16:48:36.415 2024.12.21 16:48:36.767
33 4.0.6.3172 2024.12.11 33f5d P P 507 343 2024.12.16 04:46:11.058 2024.12.16 04:46:11.565 2024.12.16 03:41:47.668 2024.12.16 03:41:48.011
34 4.0.6.3171 2024.12.10 ab1d4 P P 507 349 2024.12.11 04:32:31.142 2024.12.11 04:32:31.649 2024.12.11 03:28:18.877 2024.12.11 03:28:19.226
35 4.0.6.3170 2024.12.02 68abd P P 510 377 2024.12.04 04:20:48.612 2024.12.04 04:20:49.122 2024.12.04 03:16:42.837 2024.12.04 03:16:43.214
36 4.0.6.3169 2024.11.28 1673f P P 609 367 2024.11.30 04:44:28.634 2024.11.30 04:44:29.243 2024.11.30 03:30:29.317 2024.11.30 03:30:29.684
37 4.0.6.3168 2024.11.07 f67e2 P P 498 355 2024.11.27 04:18:24.463 2024.11.27 04:18:24.961 2024.11.27 03:07:05.369 2024.11.27 03:07:05.724
38 4.0.6.3167 2024.11.04 c9228 P P 501 335 2024.11.05 05:56:24.618 2024.11.05 05:56:25.119 2024.11.05 04:55:39.989 2024.11.05 04:55:40.324
39 4.0.6.3165 2024.10.23 b0c36 P P 506 381 2024.11.04 06:00:56.682 2024.11.04 06:00:57.188 2024.11.04 04:59:29.061 2024.11.04 04:59:29.442
40 4.0.6.3164 2024.10.17 35344 P P 516 353 2024.10.23 06:15:45.082 2024.10.23 06:15:45.598 2024.10.23 05:12:09.891 2024.10.23 05:12:10.244
41 4.0.6.3163 2024.10.14 2e35e P P 545 334 2024.10.15 06:03:17.406 2024.10.15 06:03:17.951 2024.10.15 05:00:41.973 2024.10.15 05:00:42.307
42 4.0.6.3161 2024.10.05 91502 P P 603 384 2024.10.06 04:07:14.866 2024.10.06 04:07:15.469 2024.10.06 03:00:52.223 2024.10.06 03:00:52.607
43 4.0.6.3159 2024.10.01 85136 P P 926 616 2024.10.02 01:34:25.635 2024.10.02 01:34:26.561 2024.10.02 00:07:10.505 2024.10.02 00:07:11.121
44 4.0.6.3158 2024.09.30 d2c33 P P 550 341 2024.10.01 06:11:23.979 2024.10.01 06:11:24.529 2024.10.01 05:08:38.913 2024.10.01 05:08:39.254
45 4.0.6.3157 2024.09.24 3bb2e P P 592 331 2024.09.30 06:16:57.569 2024.09.30 06:16:58.161 2024.09.30 05:12:03.800 2024.09.30 05:12:04.131
46 4.0.6.3156 2024.09.21 f6416 P P 554 356 2024.09.24 04:22:29.411 2024.09.24 04:22:29.965 2024.09.24 03:17:52.834 2024.09.24 03:17:53.190
47 4.0.6.3155 2024.09.20 1ed0c P P 568 390 2024.09.21 04:17:02.277 2024.09.21 04:17:02.845 2024.09.21 03:12:56.284 2024.09.21 03:12:56.674
48 4.0.6.3151 2024.09.09 1b77f P P 855 506 2024.09.17 06:55:34.370 2024.09.17 06:55:35.225 2024.09.17 05:20:11.720 2024.09.17 05:20:12.226
49 4.0.6.3149 2024.09.04 32ce9 P P 858 590 2024.09.06 07:03:25.726 2024.09.06 07:03:26.584 2024.09.06 05:28:15.655 2024.09.06 05:28:16.245
50 4.0.6.3148 2024.09.02 4be5c P P 775 571 2024.09.04 09:13:01.923 2024.09.04 09:13:02.698 2024.09.04 07:18:43.756 2024.09.04 07:18:44.327
51 4.0.6.3147 2024.08.30 5ffd7 P P 866 789 2024.09.02 08:29:03.685 2024.09.02 08:29:04.551 2024.09.02 06:33:38.651 2024.09.02 06:33:39.440
52 4.0.6.3146 2024.08.27 38582 F P 844 549 2024.08.30 08:13:58.934 2024.08.30 08:13:59.778 2024.08.30 06:16:52.498 2024.08.30 06:16:53.047
53 4.0.6.3145 2024.08.21 87240 P P 886 641 2024.08.27 07:51:14.318 2024.08.27 07:51:15.204 2024.08.27 05:01:56.153 2024.08.27 05:01:56.794
54 4.0.6.3144 2024.08.20 5a3b7 F P 937 616 2024.08.21 07:56:07.368 2024.08.21 07:56:08.305 2024.08.21 06:02:01.629 2024.08.21 06:02:02.245
55 4.0.6.3142 2024.08.11 b9f39 P P 687 474 2024.08.19 04:51:40.790 2024.08.19 04:51:41.477 2024.08.19 03:38:33.956 2024.08.19 03:38:34.430
56 4.0.6.3141 2024.08.09 6d39f P P 640 479 2024.08.10 04:43:52.315 2024.08.10 04:43:52.955 2024.08.10 03:32:11.430 2024.08.10 03:32:11.909
57 4.0.5.3140 2024.08.06 64f3a P P 709 446 2024.08.09 04:39:22.665 2024.08.09 04:39:23.374 2024.08.09 03:27:53.023 2024.08.09 03:27:53.469
58 4.0.5.3139 2024.08.01 3bc8b P P 415 339 2024.08.06 03:50:36.916 2024.08.06 03:50:37.331 2024.08.06 02:47:09.826 2024.08.06 02:47:10.165
59 4.0.5.3136 2024.07.31 e41ec P P 455 357 2024.08.01 03:49:36.154 2024.08.01 03:49:36.609 2024.08.01 02:46:51.615 2024.08.01 02:46:51.972
60 4.0.5.3135 2024.07.26 b4981 P P 396 324 2024.07.30 03:46:48.249 2024.07.30 03:46:48.645 2024.07.30 02:44:19.797 2024.07.30 02:44:20.121
61 4.0.5.3129 2024.07.24 b8184 P P 433 310 2024.07.25 03:44:48.769 2024.07.25 03:44:49.202 2024.07.25 02:42:11.464 2024.07.25 02:42:11.774
62 4.0.5.3128 2024.07.13 aa318 P P 443 303 2024.07.24 03:50:58.791 2024.07.24 03:50:59.234 2024.07.24 02:48:22.053 2024.07.24 02:48:22.356
63 4.0.5.3127 2024.07.10 eace3 P P 439 290 2024.07.13 03:43:20.275 2024.07.13 03:43:20.714 2024.07.13 02:40:02.924 2024.07.13 02:40:03.214
64 4.0.5.3123 2024.06.24 c27c6 P P 449 312 2024.07.10 03:35:37.990 2024.07.10 03:35:38.439 2024.07.10 02:34:22.810 2024.07.10 02:34:23.122
65 4.0.5.3112 2024.06.13 d2e61 P P 427 260 2024.06.22 03:36:11.702 2024.06.22 03:36:12.129 2024.06.22 02:35:38.867 2024.06.22 02:35:39.127
66 4.0.5.3098 2024.05.09 4c3ec P P 590 405 2024.05.14 08:11:43.551 2024.05.14 08:11:44.141 2024.05.14 07:07:20.901 2024.05.14 07:07:21.306
67 4.0.5.3092 2024.05.06 bbc47 P P 420 261 2024.05.08 19:28:04.929 2024.05.08 19:28:05.349 2024.05.08 18:32:45.994 2024.05.08 18:32:46.255
68 4.0.5.3091 2024.04.29 062a7 P P 390 272 2024.05.01 12:12:08.786 2024.05.01 12:12:09.176 2024.05.01 11:17:51.449 2024.05.01 11:17:51.721
69 4.0.5.3089 2024.04.19 08c92 P P 397 286 2024.04.27 14:11:17.707 2024.04.27 14:11:18.104 2024.04.27 13:16:08.961 2024.04.27 13:16:09.247

Elapsed time, ms. Chart for last 69 runs:

Last commits information (all timestamps in UTC):