gfix makes "reconnect" when it is removed from mon$attachments by delete
command (issued in another window)
-----------------------------------------------------------------------------------------------------------
Key: CORE-4337
URL: http://tracker.firebirdsql.org/browse/CORE-4337
Project: Firebird Core
Issue Type: Bug
Components: GFIX
Affects Versions: 3.0 Alpha 2
Reporter: Pavel Zotov
Attachments:
gdb-gfix-unsuccessful-detach-via-delete-from-mon_attachments.zip,
trace-when-gfix-unsuccessful-detach-via-delete-from-mon_attachments.zip
Scenario.
1) create new database with default page size (4096), make FW = OFF
2) run the following DDL (exactly in NON-interactive mode, i.e. ISQL
path/database -i script.sql):
recreate table t(id int primary key, s01 varchar(36) , s02 varchar(36) , s03
varchar(36) );
commit;
create index t_s01 on t(s01);
create index t_s02 on t(s02);
create index t_s03 on t(s03);
commit;
set term ^;
execute block as
begin
begin
execute statement 'create sequence g';
when any do begin end
end
end^
set term ;^
alter sequence g restart with 0;
commit;
-- 5'000'000 ==> 1700Mb, ~7 min
set stat on;
set term ^;
execute block as
declare n int = 5000000;
begin
while (n>0) do
insert into t(id, s01, s02, s03)
values( :n +iif( mod(:n,1000)=0, 0*gen_id(g,1000), 0),
uuid_to_char(gen_uuid()),
uuid_to_char(gen_uuid()),
uuid_to_char(gen_uuid())
) returning :n-1 into n;
end^
set term ;^
set echo on;
commit;
select count(*) from t;
delete from t;
commit;
set echo off;
show version;
show database;
set echo on;
exit;
/* this script leads to lot of garbage versions that should be removed later by
gfix -sweep */
3) create simple script to non-interactive gathering of stack trace info (I
gave name "gdb_backtrace_batch.script" to it):
----
thread apply all bt full
quit
yes
----
4) create auxiliary .sql script that will attempt to remove attach of gfix from
mon$attachments:
-- file: gfixkill_eb.sql
set list on;
select * from mon$database;
commit;
set term ^;
execute block returns(dts_before timestamp, deleted_attach_id int , dts_after
timestamp) as
begin
dts_before=cast('now' as timestamp);
deleted_attach_id=-1; -- if remains to this value then no gfix attachment was
found
for
select mon$attachment_id
from mon$attachments
where mon$remote_process containing 'gfix'
into
deleted_attach_id
as cursor
tcur
do
delete from mon$attachments where current of tcur;
dts_after=cast('now' as timestamp);
suspend;
end^
set term ;^
set stat off;
set echo on;
show database;
commit;
exit;
5) create main .sh (to be run under linux shell):
# file: gfixtest.sh
clear
fbhome=/opt/fb30trnk
fbport=3333
fbname=firebird
dbname=/var/db/fb30/gfixtest30.fdb
gdb_batch_file=./gdb_backtrace_batch.script
delay=20
i=1
killall -9 gfix 2>/dev/null
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) sweep starting:
set -x
###################################################
$fbhome/bin/gfix -sweep localhost/$fbport:$dbname &
###################################################
set +x
fbpid=$(ps aux|grep /opt/fb30trnk/bin/firebird|grep -v grep|awk '{print $2}')
gfixpid=$(ps aux|grep $fbhome/bin/gfix|grep -v "defunct\|grep"|awk '{print $2}')
echo +++++++++++++++++++++++++++++++++++
echo alive \"gfix -sweep\" process: $gfixpid, firebird process: $fbpid
echo +++++++++++++++++++++++++++++++++++
ps $gfixpid
echo gather initial stacktrace of running gfix...
gdb -q -x $gdb_batch_file $fbhome/bin/gfix $gfixpid 1>logs/gfix_started_$(date
+'%y%m%d_%H%M%S').gdb.txt 2>&1
gdb -q -x $gdb_batch_file $fbhome/bin/$fbname $fbpid
1>logs/firebird_when_gfix_started_$(date +'%y%m%d_%H%M%S').gdb.txt 2>&1
echo done:
ls -l logs/*.gdb.txt
while :
do
gfixpid=$(ps aux|grep $fbhome/bin/gfix|grep -v "defunct\|grep"|awk '{print
$2}')
echo . . . . . . . . . . . iter N $i . . . . . . . . . . . . . .
echo before isql: alive gfix process: \>\>\> $gfixpid \<\<\<
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) now wait $delay
seconds before killing it...
sleep $delay
echo ....................................................................
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) attempt to detach
gfix process...
set -x
$fbhome/bin/isql localhost/$fbport:$dbname -i gfixkill_eb.sql
set +x
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) result of attempt
$i to detach gfix: check that there is NO alive gfix pid:
# again!
gfixpid=$(ps aux|grep $fbhome/bin/gfix|grep -v "defunct\|grep"|awk '{print
$2}')
if [ -n "$gfixpid" ]; then
echo after isql: alive gfix process: \>\>\> $gfixpid \<\<\<
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) starting gather
stacktrace for gfix and firebird processes.
gdb4gfixlog=logs/gfix_alive_$(date +'%y%m%d_%H%M%S').gdb.txt
gdb4fblog=logs/firebird_when_gfix_alive_$(date +'%y%m%d_%H%M%S').gdb.txt
set -x
gdb -q -x $gdb_batch_file $fbhome/bin/gfix $gfixpid 1>$gdb4gfixlog 2>&1
gdb -q -x $gdb_batch_file $fbhome/bin/$fbname $fbpid 1>$gdb4fblog 2>&1
set +x
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) finish gathered
stacktrace for gfix and firebird processes:
ls -l $gdb4gfixlog $gdb4fblog
else
echo NO gfix process found. Bye!..
exit
fi
echo $(echo -n $(date +'%Y-%m-%d %H:%M:%S.%N')|cut -c1-24) finish iter $i
i=$((i+1))
done
6) make subdirectory 'logs' under current folder, update settings in script
gfixtest.sh for your environment:
fbhome=/opt/fb30trnk
fbport=3333
fbname=firebird
dbname=/var/db/fb30/gfixtest30.fdb
7) run gfixtest.sh
This script will NOT be able to detach gfix -sweep process at the FIRST
attempt. It needs TWO such attempts.
Files in attach:
1) gdb-gfix-unsuccessful-detach-via-delete-from-mon_attachments.zip - stack
traces for GFIX and FIREBIRD processes, for two moments:
1.1) when gfix -sweep just started
1.2) when gfix could not be detached (iter #2 of .shell script)
2) trace-when-gfix-unsuccessful-detach-via-delete-from-mon_attachments.zip -
trace and .shell script output for another run of this test.
--
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
------------------------------------------------------------------------------
Android apps run on BlackBerry 10
Introducing the new BlackBerry 10.2.1 Runtime for Android apps.
Now with support for Jelly Bean, Bluetooth, Mapview and more.
Get your Android app in front of a whole new audience. Start now.
http://pubads.g.doubleclick.net/gampad/clk?id=124407151&iu=/4140/ostg.clktrk
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel