6
0
mirror of https://github.com/FirebirdSQL/firebird-qa.git synced 2025-01-23 14:03:06 +01:00
firebird-qa/tests/bugs/core_6237_test.py

89 lines
3.5 KiB
Python
Raw Normal View History

2021-04-26 20:07:00 +02:00
#coding:utf-8
2022-01-27 20:08:36 +01:00
"""
ID: issue-6481
ISSUE: 6481
TITLE: Performance problem when using SRP plugin
DESCRIPTION:
:::::::::::::::::::: N O T A B E N E :::::::::::::::::
It is crucial for this test that firebird.conf have following _SEQUENCE_ of auth-plugins: Srp, ..., Legacy_Auth
-- i.e. Srp must be specified BEFORE Legacy.
Slow time of attach establishing can NOT be seen otherwise; rather almost no difference will be in that case.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Test creates two users: one usingLegacy plugin and second using Srp.
Then we make ~20...30 pairs of attach/detach by each of these users and get total time difference for these actions.
Ratio between these total differences must be limited with threshold. Its value was determined after dozen of runs
and it seems to be reasonable assign to it value 1.25 (see MIN_RATIO_THRESHOLD in the code).
2021-04-26 20:07:00 +02:00
2022-01-27 20:08:36 +01:00
Test output will contain ALERT if total time of <attaches_using_Srp> vs <attaches_using_Legacy>
will be greater than MIN_RATIO_THRESHOLD.
2021-04-26 20:07:00 +02:00
2022-01-27 20:08:36 +01:00
Reproduced on on several builds 4.x before 17.01.2020 (tested: 4.0.0.1712 CS, 4.0.0.1731 CS - got ratio = ~1.95).
Reproduced also on 3.0.5.33221 Classic - got ratio ~1.50 ... 1.70; could NOT reproduce on 3.0.5 SuperClassic / SuperServer.
2022-02-09 20:47:40 +01:00
[09.02.2022] pcisar
Fails on Windows 4.0.1 with ratio 1.98 - raw iron W10, does not fail with Linux on the same HW
JIRA: CORE-6237
FBTEST: bugs.core_6237
NOTES:
[30.07.2022] pzotov
Checked on 5.0.0.591, 4.0.1.2692, 3.0.8.33535 (windows only; pisix will be checked later).
2022-01-27 20:08:36 +01:00
"""
2021-04-26 20:07:00 +02:00
2022-01-27 20:08:36 +01:00
import pytest
import datetime
2022-02-09 20:47:40 +01:00
import platform
2022-01-27 20:08:36 +01:00
from firebird.qa import *
2021-04-26 20:07:00 +02:00
2022-01-27 20:08:36 +01:00
db = db_factory()
2021-04-26 20:07:00 +02:00
2022-01-27 20:08:36 +01:00
leg_user = user_factory('db', name='tmp_c6237_leg', password='123', plugin='Legacy_UserManager')
srp_user = user_factory('db', name='tmp_c6237_srp', password='123', plugin='Srp')
2021-12-14 20:56:34 +01:00
2022-01-27 20:08:36 +01:00
act = python_act('db')
2021-04-26 20:07:00 +02:00
#------------------
def median(lst):
n = len(lst)
s = sorted(lst)
return (sum(s[n//2-1:n//2+1])/2.0, s[n//2])[n % 2] if n else None
#------------------
2022-01-27 20:08:36 +01:00
expected_stdout = """
2021-04-26 20:07:00 +02:00
EXPECTED. Ratio of total elapsed time when use Srp vs Legacy is less then threshold.
2021-12-22 20:23:11 +01:00
"""
2021-04-26 20:07:00 +02:00
2021-12-14 20:56:34 +01:00
@pytest.mark.version('>=3.0.5')
2022-01-27 20:08:36 +01:00
def test_1(act: Action, leg_user: User, srp_user: User, capsys):
N_COUNT = 100
2021-12-14 20:56:34 +01:00
MIN_RATIO_THRESHOLD = 1.41
sp_time = {}
2021-12-14 20:56:34 +01:00
for user in [leg_user, srp_user]:
for i in range(N_COUNT):
start = datetime.datetime.now()
stop = start
with act.db.connect(user=user.name, password=user.password):
stop = datetime.datetime.now()
diff = stop - start
sp_time[user.name, i] = int(diff.seconds) * 1000 + diff.microseconds / 1000
leg_user_conn_time = [round(v,2) for k,v in sp_time.items() if k[0] == leg_user.name]
srp_user_conn_time = [round(v,2) for k,v in sp_time.items() if k[0] == srp_user.name]
conn_time_ratio = median(srp_user_conn_time) / median(leg_user_conn_time)
if conn_time_ratio < MIN_RATIO_THRESHOLD:
2021-12-14 20:56:34 +01:00
print('EXPECTED. Ratio of total elapsed time when use Srp vs Legacy is less then threshold.')
else:
print(f'Ratio Srp/Legacy: {conn_time_ratio} - is GREATER than threshold = {MIN_RATIO_THRESHOLD}.')
print(f' Median for Srp: {median(srp_user_conn_time)}')
print(f' Median for Legacy: {median(leg_user_conn_time)}')
2022-01-27 20:08:36 +01:00
act.expected_stdout = expected_stdout
act.stdout = capsys.readouterr().out
assert act.clean_stdout == act.clean_expected_stdout