FBSVCMGR with `action_trace_stop` does not verify that trace log is ENTIRELY written on disk before returning control to outer environment -------------------------------------------------------------------------------------------------------------------------------------------
Key: CORE-4896 URL: http://tracker.firebirdsql.org/browse/CORE-4896 Project: Firebird Core Issue Type: Bug Components: SVCMGR Affects Versions: 3.0 RC 1 Reporter: Pavel Zotov Priority: Critical It looks like very unpleasant "feature" that FBSVCMGR with action_trace_stop can return control to outer environment (batch or fbtest) without checking that OS really has finished writing of log. This effect can be watched at least on Windows 32-bit, I've checked FB build WI-V3.0.0.31948. Consider following batch (be sure that you have standard utility for comparing text files - 'fc.exe' on Windows): === start of batch `fbsvc_check.bat` === @echo off setlocal enabledelayedexpansion enableextensions cls set fbhome=C:\1INSTALL\FIREBIRD\fb30sS set fbhost=localhost set fbport=3333 set dbtest=C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb set dbbkup=C:\FBTESTING\qa\fbt-repo\tmp\e30.fbk set fbsrun=%fbhome%\fbsvcmgr %fbhost%/%fbport%:service_mgr user SYSDBA password masterkey set fbscfg=%~n0.cfg.tmp set fbslst=%~n0.lst.tmp set fbslog=%~n0.trc.log set ownlog=%~n0.own.log del %fbscfg% 2>nul del %fbslst% 2>nul del %fbslog% 2>nul del %ownlog% 2>nul echo services>> %fbscfg% echo {>> %fbscfg% echo enabled = true>> %fbscfg% echo log_services = true>> %fbscfg% echo exclude_filter = "%%((List Trace Sessions)|(Start Trace Session))%%">> %fbscfg% echo }>> %fbscfg% set estlog=%~n0.est.log del %estlog% 2>nul set actlog=%~n0.act.log del %actlog% 2>nul echo %dbtest% %dbbkup% >>%estlog% echo -REPLACE_DATABASE %dbbkup% %dbtest% >>%estlog% echo %dbtest% -SYSTEM >>%estlog% echo %dbtest% -HEADER >>%estlog% echo %dbtest% -WRITE ASYNC >>%estlog% echo %dbtest% -BUFFERS 3210 >>%estlog% echo %dbtest% -HOUSEKEEPING 33333 >>%estlog% echo %dbtest% -SQL_DIALECT 1 >>%estlog% echo %dbtest% -MODE READ_ONLY >>%estlog% echo %dbtest% -MODE READ_WRITE >>%estlog% set str=%fbsrun% action_trace_start trc_cfg %fbscfg% 1^>%fbslog% 2^>^&1 echo Starting trace session using FBSVCMGR. echo Command: %str% start /min cmd /c !str! ping -n 2 127.0.0.1>nul @rem Do some actions which should be written into trace log: @echo --- BACKUP --- %fbsrun% action_backup dbname %dbtest% bkp_file %dbbkup% @echo --- RESTORE --- %fbsrun% action_restore bkp_file %dbbkup% dbname %dbtest% res_replace @echo --- STATISTICS of sys relations --- %fbsrun% action_db_stats dbname %dbtest% sts_sys_relations 1>nul @echo --- STATISTICS of header --- %fbsrun% action_db_stats dbname %dbtest% sts_hdr_pages 1>nul @echo --- PROPERTIES: update FW --- %fbsrun% action_properties dbname %dbtest% prp_write_mode prp_wm_async @echo --- PROPERTIES: update BUFFERS number --- %fbsrun% action_properties dbname %dbtest% prp_page_buffers 3210 @echo --- PROPERTIES: update SWEEP interval --- %fbsrun% action_properties dbname %dbtest% prp_sweep_interval 33333 @echo --- PROPERTIES: change SQL DIALECT --- %fbsrun% action_properties dbname %dbtest% prp_set_sql_dialect 1 @echo --- PROPERTIES: make database READ-ONLY --- %fbsrun% action_properties dbname %dbtest% prp_access_mode prp_am_readonly @echo --- PROPERTIES: return database to READ-WRITE --- %fbsrun% action_properties dbname %dbtest% prp_access_mode prp_am_readwrite %fbsrun% action_trace_list 1>%fbslst% 2>&1 for /f "tokens=3" %%i in ('findstr "Session" fbsvc_check.lst.tmp') do ( echo %time% %~nx0: request to stop trace session with id = %%i 1>>%ownlog% %fbsrun% action_trace_stop trc_id %%i 1>>%ownlog% echo %time% %~nx0: control from FBSVCMGR returned to this batch.>>%ownlog% copy %fbslog% copy-of-%fbslog% 1>nul echo %time% %~nx0: copy of trace log has been created.>>%ownlog% ) @rem ping -n 4 127.0.0.1>nul ----------------------------- [ ########### 1 ########### ] cls echo Estimated to be seen in trace log (see %estlog%^): echo -------------------------------------------------------------------- type %estlog% echo -------------------------------------------------------------------- findstr /c:"%dbtest%" %fbslog%>%actlog% echo. echo Actual content of trace log (%fbslog%^) related to actions: echo -------------------------------------------------------------------- type %actlog% echo -------------------------------------------------------------------- echo. echo Difference between estimated and actual content, w/o leading or trailing spaces and tabs: echo ----------------------------------------------------------------------------------------- fc.exe /c /n /w %actlog% %estlog% @rem echo %errorlevel% echo Content of copy-of-%fbslog% related to actions: findstr /c:"%dbtest%" copy-of-%fbslog% === end of batch `fbsvc_check.bat` === Correct following env. variables in it: set fbhome=C:\1INSTALL\FIREBIRD\fb30sS set fbhost=localhost set fbport=3333 set dbtest=C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb set dbbkup=C:\FBTESTING\qa\fbt-repo\tmp\e30.fbk -- and run several times. You will be able to see following messages about comparing files using fc.exe: . . . Comparing files fbsvc_check.act.log and FBSVC_CHECK.EST.LOG ***** fbsvc_check.act.log ***** FBSVC_CHECK.EST.LOG 9: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_ONLY 10: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_WRITE ***** . . . ***** fbsvc_check.act.log ***** FBSVC_CHECK.EST.LOG 10: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_WRITE ***** . . . ***** fbsvc_check.act.log ***** FBSVC_CHECK.EST.LOG 7: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -HOUSEKEEPING 33333 8: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -SQL_DIALECT 1 9: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_ONLY 10: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_WRITE ***** . . . ***** fbsvc_check.act.log ***** FBSVC_CHECK.EST.LOG 10: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_WRITE ***** . . . ***** fbsvc_check.act.log ***** FBSVC_CHECK.EST.LOG 8: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -SQL_DIALECT 1 9: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_ONLY 10: C:\FBTESTING\qa\fbt-repo\tmp\e30.fdb -MODE READ_WRITE ***** etc. Is is unlikely that you will see message about no difference between estimated and actual output of trace - untill you UNCOMMENT line: @rem ping -n 4 127.0.0.1>nul ----------------------------- [ ########### 1 ########### ] (and maybe you need to change number of seconds from '4' to +/- (1..2) here) Without knowledge about this 'feature' (that one need to wait several seconds after fbsvcmgr is stopped) it is very easy to get wrong results if analysis of trace log starts immediately after trace finish. And if trace log is huge I suppose that one need to wait this log to be flushed on disk much more - dozen seconds ? -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://tracker.firebirdsql.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira ------------------------------------------------------------------------------ Firebird-Devel mailing list, web interface at https://lists.sourceforge.net/lists/listinfo/firebird-devel