From: <di...@us...> - 2010-11-08 19:43:59
|
Revision: 51878 http://firebird.svn.sourceforge.net/firebird/?rev=51878&view=rev Author: dimitr Date: 2010-11-08 19:43:53 +0000 (Mon, 08 Nov 2010) Log Message: ----------- Avoid destructing the temporary transaction twice. This is expected to fix the crash reported in CORE-3207. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2010-11-08 18:12:03 UTC (rev 51877) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2010-11-08 19:43:53 UTC (rev 51878) @@ -1614,6 +1614,7 @@ try { transaction = transaction_start(tdbb, temp); + delete temp; } catch (const Exception&) { @@ -1666,6 +1667,7 @@ { transaction_options(tdbb, temp, tpb, tpb_length); transaction = transaction_start(tdbb, temp); + delete temp; } catch (const Exception&) { @@ -3322,7 +3324,6 @@ trans->tra_top = number; trans->tra_oldest = oldest; trans->tra_oldest_active = active; - delete temp; trans->tra_lock = lock; lock->lck_key.lck_long = number; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2011-06-24 11:48:12
|
Revision: 53226 http://firebird.svn.sourceforge.net/firebird/?rev=53226&view=rev Author: hvlad Date: 2011-06-24 11:48:06 +0000 (Fri, 24 Jun 2011) Log Message: ----------- Backported : don't try to undo changes when invalidated transaction is rolled back. I.e. force rollback via TIP if transaction was invalidated. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2011-06-24 11:42:22 UTC (rev 53225) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2011-06-24 11:48:06 UTC (rev 53226) @@ -1263,7 +1263,7 @@ MET_update_transaction(tdbb, transaction, false); // If force flag is true, get rid of all savepoints to mark the transaction as dead - if (force_flag) + if (force_flag || transaction->tra_flags & TRA_invalidated) { // Free all savepoint data // We can do it in reverse order because nothing except simple deallocation This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2012-06-28 10:54:05
|
Revision: 54689 http://firebird.svn.sourceforge.net/firebird/?rev=54689&view=rev Author: hvlad Date: 2012-06-28 10:53:54 +0000 (Thu, 28 Jun 2012) Log Message: ----------- Improvement CORE-2668 : Write note into log when automatic sweep is started Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-06-28 10:13:59 UTC (rev 54688) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-06-28 10:53:54 UTC (rev 54689) @@ -1739,6 +1739,10 @@ if (dbb->dbb_flags & DBB_sweep_in_progress) return true; + if (tdbb->getAttachment()->att_flags & ATT_NO_CLEANUP) { + return true; + } + // fill out a lock block, zeroing it out first Lock temp_lock; @@ -1774,6 +1778,8 @@ tdbb->tdbb_flags |= TDBB_sweeper; + TraceSweepEvent traceSweep(tdbb); + // Start a transaction, if necessary, to perform the sweep. // Save the transaction's oldest snapshot as it is refreshed // during the course of the database sweep. Since it is used @@ -1798,8 +1804,6 @@ transaction->tra_attachment->att_flags &= ~ATT_notify_gc; #endif - TraceSweepEvent traceSweep(tdbb); - if (VIO_sweep(tdbb, transaction, &traceSweep)) { const ULONG base = transaction->tra_oldest & ~TRA_MASK; @@ -1859,6 +1863,8 @@ } // try catch (const Firebird::Exception& ex) { + iscLogException("Error during sweep:", ex); + Firebird::stuff_exception(tdbb->tdbb_status_vector, ex); try { if (!trans && transaction) @@ -3634,7 +3640,24 @@ { m_tdbb = tdbb; + WIN window(HEADER_PAGE_NUMBER); + Ods::header_page *header = (Ods::header_page*) CCH_FETCH(m_tdbb, &window, LCK_read, pag_header); + + m_sweep_info.update(header); + CCH_RELEASE(m_tdbb, &window); + Attachment* att = m_tdbb->getAttachment(); + + gds__log("Sweep is started by %s\n" + "\tDatabase \"%s\" \n" + "\tOIT %ld, OAT %ld, OST %ld, Next %ld", + att->att_user->usr_user_name.c_str(), + att->att_filename.c_str(), + m_sweep_info.getOIT(), + m_sweep_info.getOAT(), + m_sweep_info.getOST(), + m_sweep_info.getNext()); + TraceManager* trace_mgr = att->att_trace_manager; m_need_trace = trace_mgr->needs().event_sweep; @@ -3645,12 +3668,6 @@ m_tdbb->setRequest(&m_request); m_start_clock = fb_utils::query_performance_counter(); - WIN window(HEADER_PAGE_NUMBER); - Ods::header_page* header = (Ods::header_page*) CCH_FETCH(m_tdbb, &window, LCK_read, pag_header); - - m_sweep_info.update(header); - CCH_RELEASE(m_tdbb, &window); - TraceConnectionImpl conn(att); trace_mgr->event_sweep(&conn, &m_sweep_info, process_state_started); @@ -3667,11 +3684,24 @@ void TraceSweepEvent::report(ntrace_process_state_t state, jrd_rel* relation) { + Attachment* att = m_tdbb->getAttachment(); + + if (state == process_state_finished) + { + gds__log("Sweep is finished\n" + "\tDatabase \"%s\" \n" + "\tOIT %ld, OAT %ld, OST %ld, Next %ld", + att->att_filename.c_str(), + m_sweep_info.getOIT(), + m_sweep_info.getOAT(), + m_sweep_info.getOST(), + m_sweep_info.getNext()); + } + if (!m_need_trace) return; Database* dbb = m_tdbb->getDatabase(); - Attachment* att = m_tdbb->getAttachment(); TraceManager* trace_mgr = att->att_trace_manager; TraceConnectionImpl conn(att); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-08-28 18:00:29
|
Revision: 57064 http://firebird.svn.sourceforge.net/firebird/?rev=57064&view=rev Author: dimitr Date: 2012-08-28 18:00:22 +0000 (Tue, 28 Aug 2012) Log Message: ----------- Misc. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-08-28 17:58:36 UTC (rev 57063) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-08-28 18:00:22 UTC (rev 57064) @@ -1779,7 +1779,7 @@ TraceSweepEvent traceSweep(tdbb); - // Start a transaction, if necessary, to perform the sweep. + // Start a transaction to perform the sweep. // Save the transaction's oldest snapshot as it is refreshed // during the course of the database sweep. Since it is used // below to advance the OIT we must save it before it changes. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2012-11-13 09:38:43
|
Revision: 57349 http://firebird.svn.sourceforge.net/firebird/?rev=57349&view=rev Author: dimitr Date: 2012-11-13 09:38:37 +0000 (Tue, 13 Nov 2012) Log Message: ----------- Fixed CORE-3978: Invalid transaction counters may be reported in firebird.log during the sweep. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-11-12 08:51:41 UTC (rev 57348) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2012-11-13 09:38:37 UTC (rev 57349) @@ -3639,7 +3639,7 @@ gds__log("Sweep is started by %s\n" "\tDatabase \"%s\" \n" - "\tOIT %ld, OAT %ld, OST %ld, Next %ld", + "\tOIT %"SLONGFORMAT", OAT %"SLONGFORMAT", OST %"SLONGFORMAT", Next %"SLONGFORMAT, att->att_user->usr_user_name.c_str(), att->att_filename.c_str(), m_sweep_info.getOIT(), @@ -3726,7 +3726,7 @@ { gds__log("Sweep is finished\n" "\tDatabase \"%s\" \n" - "\tOIT %ld, OAT %ld, OST %ld, Next %ld", + "\tOIT %"SLONGFORMAT", OAT %"SLONGFORMAT", OST %"SLONGFORMAT", Next %"SLONGFORMAT, att->att_filename.c_str(), m_sweep_info.getOIT(), m_sweep_info.getOAT(), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2013-05-15 14:29:58
|
Revision: 58076 http://sourceforge.net/p/firebird/code/58076 Author: hvlad Date: 2013-05-15 14:29:55 +0000 (Wed, 15 May 2013) Log Message: ----------- Fixed bug CORE-4100 : Automatic sweep could be run when there is no need for it Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2013-05-15 14:28:51 UTC (rev 58075) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2013-05-15 14:29:55 UTC (rev 58076) @@ -3440,7 +3440,8 @@ if (dbb->dbb_sweep_interval && !(tdbb->getAttachment()->att_flags & ATT_no_cleanup) && - (trans->tra_oldest_active - trans->tra_oldest > dbb->dbb_sweep_interval) && + (trans->tra_oldest_active > oldest) && + (trans->tra_oldest_active - oldest > dbb->dbb_sweep_interval) && oldest_state != tra_limbo) { start_sweeper(tdbb); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2015-02-14 08:11:51
|
Revision: 60684 http://sourceforge.net/p/firebird/code/60684 Author: dimitr Date: 2015-02-14 08:11:48 +0000 (Sat, 14 Feb 2015) Log Message: ----------- Forgotten change for CORE-4383. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2015-02-14 07:34:58 UTC (rev 60683) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2015-02-14 08:11:48 UTC (rev 60684) @@ -3498,7 +3498,9 @@ jrd_tra::~jrd_tra() { - delete tra_undo_record; + while (tra_undo_records.hasData()) + delete tra_undo_records.pop(); + delete tra_undo_space; delete tra_user_management; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <di...@us...> - 2015-02-19 14:39:02
|
Revision: 60732 http://sourceforge.net/p/firebird/code/60732 Author: dimitr Date: 2015-02-19 14:38:57 +0000 (Thu, 19 Feb 2015) Log Message: ----------- 1) Fixed CORE-4382: User savepoints are not released on commit. 2) Respect the "no-auto-undo" option when retaining a transaction context. Thanks to Dimitry Sibiryakov. Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2015-02-19 14:19:52 UTC (rev 60731) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2015-02-19 14:38:57 UTC (rev 60732) @@ -448,6 +448,14 @@ EXT_trans_commit(transaction); + if (transaction->tra_flags & TRA_write) + { + // Get rid of user savepoints to allow intermediate garbage collection + // in indices and BLOBs after in-place updates + while (transaction->tra_save_point && (transaction->tra_save_point->sav_flags & SAV_user)) + VIO_verb_cleanup(tdbb, transaction); + } + #ifdef GARBAGE_THREAD // Flush pages if transaction logically modified data @@ -2613,9 +2621,15 @@ { if (!(transaction->tra_save_point->sav_flags & SAV_trans_level)) BUGCHECK(287); // Too many savepoints + VIO_verb_cleanup(tdbb, transaction); // get rid of transaction savepoint - VIO_start_save_point(tdbb, transaction); // start new savepoint - transaction->tra_save_point->sav_flags |= SAV_trans_level; + + if (!(transaction->tra_flags & TRA_no_auto_undo)) + { + // start new transaction savepoint + VIO_start_save_point(tdbb, transaction); + transaction->tra_save_point->sav_flags |= SAV_trans_level; + } } if (transaction->tra_flags & TRA_precommitted) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2016-02-02 10:08:34
|
Revision: 62905 http://sourceforge.net/p/firebird/code/62905 Author: hvlad Date: 2016-02-02 10:08:31 +0000 (Tue, 02 Feb 2016) Log Message: ----------- Postfix for CORE-5067. Avoid crashing in TRA_update_counters() with initialized Database object Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2016-02-02 00:15:12 UTC (rev 62904) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2016-02-02 10:08:31 UTC (rev 62905) @@ -852,8 +852,11 @@ **************************************/ SET_TDBB(tdbb); - if (!dbb || dbb->dbb_flags & DBB_read_only) + if (!dbb || dbb->dbb_flags & DBB_read_only || dbb->dbb_flags & DBB_new || + dbb->dbb_oldest_transaction == 0) + { return; + } WIN window(HEADER_PAGE_NUMBER); header_page* header = (header_page*) CCH_FETCH(tdbb, &window, LCK_write, pag_header); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hv...@us...> - 2016-03-07 22:27:20
|
Revision: 63104 http://sourceforge.net/p/firebird/code/63104 Author: hvlad Date: 2016-03-07 22:27:17 +0000 (Mon, 07 Mar 2016) Log Message: ----------- Fixed bug CORE-4645 : internal Firebird consistency check (cannot find tip page (165), file: tra.cpp line: 2375) Modified Paths: -------------- firebird/branches/B2_5_Release/src/jrd/tra.cpp Modified: firebird/branches/B2_5_Release/src/jrd/tra.cpp =================================================================== --- firebird/branches/B2_5_Release/src/jrd/tra.cpp 2016-03-07 15:51:40 UTC (rev 63103) +++ firebird/branches/B2_5_Release/src/jrd/tra.cpp 2016-03-07 22:27:17 UTC (rev 63104) @@ -1596,6 +1596,10 @@ if (number == TRA_system_transaction) return tra_committed; + const Database* dbb = tdbb->getDatabase(); + if ((dbb->dbb_flags & DBB_read_only) && (number > trans->tra_top)) + return tra_committed; + // Look in the transaction cache for read committed transactions // fast, and the system transaction. The system transaction can read // data from active transactions. @@ -3283,8 +3287,11 @@ // of four, which puts the transaction on a byte boundary. ULONG base = oldest & ~TRA_MASK; + const ULONG top = (dbb->dbb_flags & DBB_read_only) ? + dbb->dbb_next_transaction : number; - const size_t length = (temp->tra_flags & TRA_read_committed) ? 0 : (number - base + TRA_MASK) / 4; + const size_t length = (temp->tra_flags & TRA_read_committed) || (top < oldest) ? + 0 : (top + 1 - base + TRA_MASK) / 4; MemoryPool* const pool = tdbb->getDefaultPool(); jrd_tra* const trans = jrd_tra::create(pool, attachment, temp->tra_outer, length); @@ -3294,7 +3301,7 @@ trans->tra_lock_timeout = temp->tra_lock_timeout; trans->tra_flags = temp->tra_flags; trans->tra_number = number; - trans->tra_top = number; + trans->tra_top = top; trans->tra_oldest = oldest; trans->tra_oldest_active = active; @@ -3343,9 +3350,9 @@ // since they need to know what is currently committed. if (trans->tra_flags & TRA_read_committed) - TPC_initialize_tpc(tdbb, number); - else - TRA_get_inventory(tdbb, trans->tra_transactions.begin(), base, number); + TPC_initialize_tpc(tdbb, top); + else if (top > base) + TRA_get_inventory(tdbb, trans->tra_transactions.begin(), base, top); // Next task is to find the oldest active transaction on the system. This // is needed for garbage collection. Things are made ever so slightly @@ -3366,12 +3373,12 @@ bool cleanup = !(number % TRA_ACTIVE_CLEANUP); int oldest_state; - for (; active < number; active++) + for (; active < top; active++) { if (trans->tra_flags & TRA_read_committed) { const ULONG mask = (1 << tra_active); - active = TPC_find_states(tdbb, active, number, mask, oldest_state); + active = TPC_find_states(tdbb, active, top, mask, oldest_state); if (!active) { active = number; @@ -3472,15 +3479,15 @@ oldest_state = tra_committed; - for (oldest = trans->tra_oldest; oldest < number; oldest++) + for (oldest = trans->tra_oldest; oldest < top; oldest++) { if (trans->tra_flags & TRA_read_committed) { const ULONG mask = ~((1 << tra_committed) | (1 << tra_precommitted)); - oldest = TPC_find_states(tdbb, trans->tra_oldest, number, mask, oldest_state); + oldest = TPC_find_states(tdbb, trans->tra_oldest, top, mask, oldest_state); if (!oldest) { - oldest = number; + oldest = top; break; } fb_assert(oldest_state != tra_committed && oldest_state != tra_precommitted); @@ -3496,6 +3503,9 @@ break; } + if (oldest >= top && dbb->dbb_flags & DBB_read_only) + oldest = number; + if (--oldest > (ULONG) dbb->dbb_oldest_transaction) dbb->dbb_oldest_transaction = oldest; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |