Dirty RDB$PAGES after an error after phase 3 of create_relation
---------------------------------------------------------------
Key: CORE-5677
URL: http://tracker.firebirdsql.org/browse/CORE-5677
Project: Firebird Core
Issue Type: Bug
Components: Engine
Affects Versions: 4.0 Alpha 1, 3.0.2, 2.5.7, 3.0.1, 2.5.6, 3.0.0, 4.0
Initial
Environment: Ubuntu x86_64
Reporter: Roman Simakov
In case of error after phase 3 of create_relation in dfw the engine have filled
RDB$PAGES in system transaction. Changes of RDB$RELATIONS and RDB$DATABASE are
doing in user transaction and they rolled back. As result we have a couple of
records in RDB$PAGES. Later if some attachment will scan pages it creates an
object jrd_rel in att_relations and marks it by flag REL_check_existance and
later REL_deleted.
If we will try to create a table in this attachment we can do it. But at least
we will have duplicated records in RDB$PAGES for the relation. Then if we will
try to create an index for that table MET_lookup_relation_id will check
REL_deleted and returns NULL. Index creation will fails.
Reconnect can helps but duplicates of RDB$PAGES is not good in any case.
Here is a scenario to reproduce it by 2 terminals (1: and 2:) on Classic
arcitecture:
2: create database '/tmp/d.fdb';
2: set transaction read committed;
1: gdb --args ./isql /tmp/d.fdb
1: r
1: Ctrl+C
1: break check_not_null if (phase==3)
1: c
1: create table tn(i integer);
1: insert into tn values(NULL);
1: commit;
1: set autoddl off;
1: set transaction read committed;
1: create table terr(i integer);
1: alter table tn alter i set not null;
1: commit;
1: will break in breakpoint
2: select * from rdb$pages; // to force write RDB$PAGES via AST
1: c
1: ERROR: Cannot make field I of table TN NOT NULL because there are NULLs
present
1+2: Ctrl+D to exit
Now we can connect to the database and check:
SQL> select * from rdb$pages where rdb$relation_id=129;
RDB$PAGE_NUMBER RDB$RELATION_ID RDB$PAGE_SEQUENCE RDB$PAGE_TYPE
=============== =============== ================= =============
186 129 0 4
187 129 0 6
SQL> select * from rdb$relations where rdb$relation_id=129;
SQL> select rdb$relation_id from rdb$database;
RDB$RELATION_ID
===============
129
The idea of fix is to cleanup RDB$PAGES and release physically located pages at
phase 0 of create_relation. I'll prepare PR soon.
--
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
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel