Skip to content

Commit 7a34855

Browse files
committed
odb: Clean up nested journaling
Signed-off-by: Eren Dogan <[email protected]>
1 parent d3242d0 commit 7a34855

File tree

3 files changed

+40
-60
lines changed

3 files changed

+40
-60
lines changed

src/odb/include/odb/db.h

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7423,10 +7423,6 @@ class dbDatabase : public dbObject
74237423

74247424
///
74257425
/// Undo the last ECO changes on the specified block.
7426-
/// Only supports:
7427-
/// create and destroy of dbInst and dbNet
7428-
/// dbInst::swapMaster
7429-
/// connect and disconnect of dbBTerm and dbITerm
74307426
///
74317427
static void undoEco(dbBlock* block);
74327428

@@ -7436,18 +7432,19 @@ class dbDatabase : public dbObject
74367432
static bool ecoEmpty(dbBlock* block);
74377433

74387434
///
7439-
/// Return true if the ECO history is empty.
7435+
/// Return true if the ECO stack is empty. The ECO stack holds
7436+
/// the nested uncommitted ECOs that can still be undone.
74407437
///
7441-
static bool ecoHistoryEmpty(dbBlock* block);
7438+
static bool ecoStackEmpty(dbBlock* block);
74427439

74437440
///
7444-
/// Read the ECO changes from the specified stream to be applied to the
7441+
/// Read the ECO changes from the specified file to be applied to the
74457442
/// specified block.
74467443
///
74477444
static void readEco(dbBlock* block, const char* filename);
74487445

74497446
///
7450-
/// Write the ECO changes to the specified stream.
7447+
/// Write the ECO changes to the specified file.
74517448
///
74527449
static void writeEco(dbBlock* block, const char* filename);
74537450

src/odb/src/db/dbBlock.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ class _dbBlock : public _dbObject
301301
void* _extmi;
302302

303303
dbJournal* _journal;
304-
std::vector<dbJournal*> _journal_history;
304+
std::stack<dbJournal*> _journal_stack;
305305

306306
_dbBlock(_dbDatabase* db);
307307
~_dbBlock();

src/odb/src/db/dbDatabase.cpp

Lines changed: 34 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -718,14 +718,7 @@ void dbDatabase::beginEco(dbBlock* block_)
718718
{
719719
_dbBlock* block = (_dbBlock*) block_;
720720
if (block->_journal) {
721-
block->_journal_history.push_back(block->_journal);
722-
debugPrint(block_->getImpl()->getLogger(),
723-
utl::ODB,
724-
"DB_ECO",
725-
2,
726-
"ECO: Ended ECO #{} (size {}) and pushed to ECO history",
727-
block->_journal_history.size() - 1,
728-
block->_journal->size());
721+
endEco(block_);
729722
}
730723
block->_journal = new dbJournal(block_);
731724
assert(block->_journal);
@@ -734,56 +727,54 @@ void dbDatabase::beginEco(dbBlock* block_)
734727
"DB_ECO",
735728
2,
736729
"ECO: Started ECO #{}",
737-
block->_journal_history.size());
730+
block->_journal_stack.size());
738731
}
739732

740733
void dbDatabase::endEco(dbBlock* block_)
741734
{
742735
_dbBlock* block = (_dbBlock*) block_;
743736
assert(block->_journal);
744-
block->_journal_history.push_back(block->_journal);
737+
block->_journal_stack.push(block->_journal);
745738
block->_journal = nullptr;
746739
debugPrint(block_->getImpl()->getLogger(),
747740
utl::ODB,
748741
"DB_ECO",
749742
2,
750-
"ECO: Ended ECO #{} (size {}) and pushed to ECO history",
751-
block->_journal_history.size() - 1,
752-
block->_journal_history.back()->size());
743+
"ECO: Ended ECO #{} (size {}) and pushed to ECO stack",
744+
block->_journal_stack.size() - 1,
745+
block->_journal_stack.top()->size());
753746
}
754747

755748
void dbDatabase::commitEco(dbBlock* block_)
756749
{
757750
_dbBlock* block = (_dbBlock*) block_;
758-
// Commit the current journal or the last journal in history
759-
assert(block->_journal || !block->_journal_history.empty());
751+
// Commit the current ECO or the last ECO into stack
752+
assert(block->_journal || !block->_journal_stack.empty());
760753
if (!block->_journal) {
761-
block->_journal = block->_journal_history.back();
762-
block->_journal_history.pop_back();
763-
}
764-
if (!block->_journal_history.empty()) {
765-
dbJournal* next_journal = block->_journal_history.back();
766-
block->_journal_history.pop_back();
767-
int old_size = next_journal->size();
768-
next_journal->append(block->_journal);
769-
block->_journal_history.push_back(next_journal);
754+
block->_journal = block->_journal_stack.top();
755+
block->_journal_stack.pop();
756+
}
757+
if (!block->_journal_stack.empty()) {
758+
dbJournal* prev_journal = block->_journal_stack.top();
759+
int old_size = prev_journal->size();
760+
prev_journal->append(block->_journal);
770761
debugPrint(block_->getImpl()->getLogger(),
771762
utl::ODB,
772763
"DB_ECO",
773764
2,
774765
"ECO: Merged ECO #{} (size {}) with ECO #{} (size {} -> {})",
775-
block->_journal_history.size(),
766+
block->_journal_stack.size(),
776767
block->_journal->size(),
777-
block->_journal_history.size() - 1,
768+
block->_journal_stack.size() - 1,
778769
old_size,
779-
block->_journal_history.back()->size());
770+
block->_journal_stack.top()->size());
780771
} else {
781772
debugPrint(block_->getImpl()->getLogger(),
782773
utl::ODB,
783774
"DB_ECO",
784775
2,
785-
"ECO: Committed ECO #{} (size {}) and removed from ECO history",
786-
block->_journal_history.size(),
776+
"ECO: Committed ECO #{} (size {}) and removed from ECO stack",
777+
block->_journal_stack.size(),
787778
block->_journal->size());
788779
}
789780
delete block->_journal;
@@ -793,26 +784,18 @@ void dbDatabase::commitEco(dbBlock* block_)
793784
void dbDatabase::undoEco(dbBlock* block_)
794785
{
795786
_dbBlock* block = (_dbBlock*) block_;
796-
assert(block->_journal || !block->_journal_history.empty());
787+
assert(block->_journal || !block->_journal_stack.empty());
797788
if (!block->_journal) {
798-
block->_journal = block->_journal_history.back();
799-
block->_journal_history.pop_back();
800-
debugPrint(block_->getImpl()->getLogger(),
801-
utl::ODB,
802-
"DB_ECO",
803-
2,
804-
"ECO: Undid ECO #{} (size {})",
805-
block->_journal_history.size(),
806-
block->_journal->size());
807-
} else {
808-
debugPrint(block_->getImpl()->getLogger(),
809-
utl::ODB,
810-
"DB_ECO",
811-
2,
812-
"ECO: Undid ECO #{} (size {})",
813-
block->_journal_history.size(),
814-
block->_journal->size());
789+
block->_journal = block->_journal_stack.top();
790+
block->_journal_stack.pop();
815791
}
792+
debugPrint(block_->getImpl()->getLogger(),
793+
utl::ODB,
794+
"DB_ECO",
795+
2,
796+
"ECO: Undid ECO #{} (size {})",
797+
block->_journal_stack.size(),
798+
block->_journal->size());
816799
dbJournal* journal = block->_journal;
817800
block->_journal = nullptr;
818801
journal->undo();
@@ -828,10 +811,10 @@ bool dbDatabase::ecoEmpty(dbBlock* block_)
828811
return false;
829812
}
830813

831-
bool dbDatabase::ecoHistoryEmpty(dbBlock* block_)
814+
bool dbDatabase::ecoStackEmpty(dbBlock* block_)
832815
{
833816
_dbBlock* block = (_dbBlock*) block_;
834-
return block->_journal_history.empty();
817+
return block->_journal_stack.empty();
835818
}
836819

837820
void dbDatabase::readEco(dbBlock* block_, const char* filename)
@@ -872,9 +855,9 @@ void dbDatabase::writeEco(dbBlock* block_, const char* filename)
872855
if (block->_journal) {
873856
dbOStream stream(block->getDatabase(), file);
874857
stream << *block->_journal;
875-
} else if (!block->_journal_history.empty()) {
858+
} else if (!block->_journal_stack.empty()) {
876859
dbOStream stream(block->getDatabase(), file);
877-
stream << *block->_journal_history.back();
860+
stream << *block->_journal_stack.top();
878861
}
879862
}
880863

0 commit comments

Comments
 (0)