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
|