6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-22 13:33:07 +01:00
firebird-qa/tests/bugs/core_4582_test.py

162 lines
5.8 KiB
Python
Raw Permalink Normal View History

2021-04-26 20:07:00 +02:00
#coding:utf-8
2022-01-23 20:41:55 +01:00
"""
ID: issue-4898
ISSUE: 4898
TITLE: Within LINGER period one can not change some database properties
2022-01-23 20:41:55 +01:00
DESCRIPTION:
Test verifies that after set LINGER one may still do following:
* change buffers number in DB header (actual only for CS / SC);
* change FW attribute to 'sync' (by default DB is created with FW = OFF);
* change sweep interval;
* change space usage to '-use <FULL>'
* for FB 4.x+: change DB attribute to 'REPLICA READ_WRITE'.
* change DB mode to read_only.
Confirmed on WI-T3.0.0.31374 Beta 1: running GFIX -buffers N has NO affect if this is done within linger period
2022-01-23 20:41:55 +01:00
JIRA: CORE-4582
FBTEST: bugs.core_4582
NOTES:
[21.12.2021] pcisar
FAILs on v4.0.0.2496 and v3.0.8.33535 as database couldn't be reverted to online state
[21.09.2022] pzotov
It was encountered that if we change DB access to 'shutdown single maintenace' than further 'gifx -online'
will raise message 'database db shutdown', and only 2nd call of gfix will bring DB to online.
Report was sent to FB team, 17.09.2022 23:18, reply from Vlad got: 19.09.2022 13:06.
It was decided to SKIP this action ('gfix -shut single -at NN') until this problem will be resolved.
Checked on Linux and Windows: 3.0.8.33535 (SS/CS), 4.0.1.2692 (SS/CS)
2022-01-23 20:41:55 +01:00
"""
2021-04-26 20:07:00 +02:00
import pytest
2022-01-23 20:41:55 +01:00
from firebird.qa import *
from firebird.driver import DbWriteMode, DbAccessMode, ShutdownMode, ShutdownMethod, SrvStatFlag
2021-04-26 20:07:00 +02:00
substitutions = [
('[\t ]+', ' '),
('^((?!:::MSG:::|buffers|before|after|Sweep|Attributes).)*$', ''),
('N/A', 'YES')
]
2021-04-26 20:07:00 +02:00
2022-01-23 20:41:55 +01:00
init_script = """
2021-04-26 20:07:00 +02:00
-- Result of this test on WI-T3.0.0.31374 Beta 1:
-- Expected standard output from Python does not match actual output.
-- - GFIX could change buffers ? => YES
-- ? ^^^
-- + GFIX could change buffers ? => NO!
-- ? ^^^
set term ^;
-- Aux procedure that determines: is current connection to SuperServer ?
-- If yes, returns current value of page buffers, otherwise (SC/CS) always return -1, in order to
-- make final output = 'N/A' and give 'substitutions' section handle this case as acceptable.
create or alter procedure sp_get_buff returns(mon_buffers int) as
begin
mon_buffers = -1;
2021-11-26 19:20:43 +01:00
if (exists(select * from mon$attachments where mon$user containing 'cache writer' and mon$system_flag = 1))
2021-04-26 20:07:00 +02:00
then
select mon$page_buffers from mon$database into mon_buffers;
2021-11-26 19:20:43 +01:00
2021-04-26 20:07:00 +02:00
suspend;
end
^
set term ;^
commit;
recreate table log(buf_before int, buf_after int);
commit;
2021-11-26 19:20:43 +01:00
"""
2021-04-26 20:07:00 +02:00
2022-01-23 20:41:55 +01:00
db = db_factory(init=init_script)
#db = db_factory(filename = '#tmp_core_4582_alias', init=init_script)
2021-04-26 20:07:00 +02:00
2022-01-23 20:41:55 +01:00
act = python_act('db', substitutions=substitutions)
2021-11-26 19:20:43 +01:00
2021-04-26 20:07:00 +02:00
@pytest.mark.version('>=3.0')
2022-01-23 20:41:55 +01:00
def test_1(act: Action, capsys):
if act.is_version('>=4'):
ADDED_REPLICA_ATTR = ", read-write replica"
else:
ADDED_REPLICA_ATTR = ''
expected_stdout = f"""
Page buffers 3791
Attributes force write, no reserve, read only{ADDED_REPLICA_ATTR}
Sweep interval: 5678
GFIX could change buffers ? => YES
"""
2022-01-24 20:27:02 +01:00
script = """
insert into log(buf_before) select mon_buffers from sp_get_buff;
commit;
alter database set linger to 15;
commit;
2022-01-24 20:27:02 +01:00
"""
act.isql(switches=[], input=script)
2022-01-23 20:41:55 +01:00
#with act.connect_server() as srv:
#srv.database.set_default_cache_size(database=act.db.db_path, size=3791)
#srv.database.set_write_mode(database=act.db.db_path, mode=DbWriteMode.ASYNC)
#srv.database.set_access_mode(database=act.db.db_path, mode=DbAccessMode.READ_ONLY)
#srv.database.shutdown(database=act.db.db_path, mode=ShutdownMode.SINGLE,
2021-11-26 19:20:43 +01:00
#method=ShutdownMethod.DENNY_ATTACHMENTS, timeout=20)
2022-01-23 20:41:55 +01:00
#srv.database.get_statistics(database=act.db.db_path, flags=SrvStatFlag.HDR_PAGES,
2021-11-26 19:20:43 +01:00
#callback=print)
2022-01-23 20:41:55 +01:00
#srv.database.bring_online(database=act.db.db_path)
#srv.database.set_access_mode(database=act.db.db_path, mode=DbAccessMode.READ_WRITE)
act.reset()
act.gfix(switches=['-buffers', '3791', act.db.dsn])
act.reset()
act.gfix(switches=['-write','sync', act.db.dsn])
act.reset()
act.gfix(switches=['-housekeeping','5678', act.db.dsn])
act.reset()
act.gfix(switches=['-use','full', act.db.dsn])
2022-01-23 20:41:55 +01:00
act.reset()
if act.is_version('>=4'):
act.gfix(switches=['-replica','read_write', act.db.dsn])
act.reset()
2022-01-23 20:41:55 +01:00
act.gfix(switches=['-mode','read_only', act.db.dsn])
act.reset()
'''
TEMPORARY COMMENTED, SEE NOTES. DO NOT DELETE THIS TEXT!
2022-01-23 20:41:55 +01:00
act.gfix(switches=['-shutdown','single', '-at', '20', act.db.dsn])
act.reset()
'''
2022-01-23 20:41:55 +01:00
act.gstat(switches=['-h'])
print(act.stdout)
act.reset()
'''
TEMPORARY COMMENTED, SEE NOTES. DO NOT DELETE THIS TEXT!
2021-12-22 20:23:11 +01:00
# [pcisar] 21.12.2021
# FAILs on v4.0.0.2496 and v3.0.8.33535 as database couldn't be reverted to online
# state
2022-01-23 20:41:55 +01:00
act.gfix(switches=[act.db.dsn, '-online'])
act.reset()
'''
2022-01-23 20:41:55 +01:00
act.gfix(switches=['-mode','read_write', act.db.dsn])
2021-11-26 19:20:43 +01:00
script_2 = """
set list on;
update log set buf_after = (select mon_buffers from sp_get_buff);
commit;
select iif( g.buf_before > 0,
iif( g.buf_before is distinct from g.buf_after, 'YES', 'NO!' ),
'N/A'
) as "GFIX could change buffers ? =>"
from log g;
2022-01-24 20:27:02 +01:00
"""
2022-01-23 20:41:55 +01:00
act.reset()
act.isql(switches=[], input=script_2)
print(act.stdout)
2021-11-26 19:20:43 +01:00
# Check
2022-01-23 20:41:55 +01:00
act.expected_stdout = expected_stdout
act.stdout = capsys.readouterr().out
assert act.clean_stdout == act.clean_expected_stdout