Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/jrd/dpm.epp
Original file line number Diff line number Diff line change
Expand Up @@ -1509,7 +1509,7 @@ SINT64 DPM_gen_id(thread_db* tdbb, SLONG generator, bool initialize, SINT64 val)
if (transaction)
transaction->tra_flags |= TRA_write;

REPL_gen_id(tdbb, generator, value);
REPL_gen_id(tdbb, generator, value, transaction);

return value;
}
Expand Down
10 changes: 8 additions & 2 deletions src/jrd/replication/Publisher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -623,7 +623,7 @@ void REPL_erase(thread_db* tdbb, const record_param* rpb, jrd_tra* transaction)
checkStatus(tdbb, status, transaction);
}

void REPL_gen_id(thread_db* tdbb, SLONG genId, SINT64 value)
void REPL_gen_id(thread_db* tdbb, SLONG genId, SINT64 value, jrd_tra* transaction)
{
if (tdbb->tdbb_flags & (TDBB_dont_post_dfw | TDBB_repl_in_progress))
return;
Expand All @@ -642,6 +642,13 @@ void REPL_gen_id(thread_db* tdbb, SLONG genId, SINT64 value)
if (!replicator)
return;

FbLocalStatus status;

// Create IReplicatedTransaction object for current transaction
// without any operations before changing generator
if (transaction && !transaction->tra_replicator)
getReplicator(tdbb, status, transaction);

const auto database = tdbb->getDatabase();

QualifiedName genName;
Expand All @@ -655,7 +662,6 @@ void REPL_gen_id(thread_db* tdbb, SLONG genId, SINT64 value)

AutoSetRestoreFlag<ULONG> noRecursion(&tdbb->tdbb_flags, TDBB_repl_in_progress, true);

FbLocalStatus status;
replicator->setSequence2(&status, genName.schema.c_str(), genName.object.c_str(), value);

checkStatus(tdbb, status);
Expand Down
2 changes: 1 addition & 1 deletion src/jrd/replication/Publisher.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void REPL_store(Jrd::thread_db* tdbb, const Jrd::record_param* rpb,
void REPL_modify(Jrd::thread_db* tdbb, const Jrd::record_param* orgRpb,
const Jrd::record_param* newRpb, Jrd::jrd_tra* transaction);
void REPL_erase(Jrd::thread_db* tdbb, const Jrd::record_param* rpb, Jrd::jrd_tra* transaction);
void REPL_gen_id(Jrd::thread_db* tdbb, SLONG genId, SINT64 value);
void REPL_gen_id(Jrd::thread_db* tdbb, SLONG genId, SINT64 value, Jrd::jrd_tra* transaction);
void REPL_exec_sql(Jrd::thread_db* tdbb, Jrd::jrd_tra* transaction, const Firebird::string& sql,
const Firebird::ObjectsArray<Firebird::MetaString>& schemaSearchPath);
void REPL_journal_switch(Jrd::thread_db* tdbb);
Expand Down
21 changes: 7 additions & 14 deletions src/jrd/replication/Replicator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,18 +207,7 @@ void Replicator::commitTransaction(CheckStatusWrapper* status, Transaction* tran
const auto dataLength = txnData.buffer->getCount() - sizeof(Block);
fb_assert(txnData.flushes || dataLength > sizeof(UCHAR));

for (const auto& generator : m_generators)
{
fb_assert(generator.name.object.hasData() && generator.name.schema.hasData());

const auto [schemaAtom, objectAtom] = txnData.defineQualifiedAtom(generator.name);

txnData.putTag(opSetSequence);
txnData.putInt32(schemaAtom);
txnData.putInt32(objectAtom);
txnData.putInt64(generator.value);
}

txnData.putGenerators(m_generators);
m_generators.clear();

txnData.putTag(opCommitTransaction);
Expand All @@ -236,9 +225,13 @@ void Replicator::rollbackTransaction(CheckStatusWrapper* status, Transaction* tr
{
auto& txnData = transaction->getData();

if (txnData.flushes)
if (txnData.flushes || m_generators.hasData())
{
txnData.putTag(opRollbackTransaction);
txnData.putGenerators(m_generators);
m_generators.clear();

if (txnData.flushes)
txnData.putTag(opRollbackTransaction);
flush(txnData, FLUSH_SYNC, BLOCK_END_TRANS);
}
}
Expand Down
31 changes: 23 additions & 8 deletions src/jrd/replication/Replicator.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ namespace Replication
typedef Firebird::ObjectsArray<Firebird::string> NameCache;
typedef Firebird::HalfStaticArray<SavNumber, 16> SavepointStack;

struct GeneratorValue
{
Jrd::QualifiedName name;
SINT64 value = 0;
};

typedef Firebird::Array<GeneratorValue> GeneratorCache;

struct BatchBlock
{
Block header{};
Expand Down Expand Up @@ -135,6 +143,21 @@ namespace Replication
{
buffer->add(data, length);
}

void putGenerators(const GeneratorCache& generators)
{
for (const auto& generator : generators)
{
fb_assert(generator.name.object.hasData() && generator.name.schema.hasData());

const auto [schemaAtom, objectAtom] = defineQualifiedAtom(generator.name);

putTag(opSetSequence);
putInt32(schemaAtom);
putInt32(objectAtom);
putInt64(generator.value);
}
}
};

class Transaction final :
Expand Down Expand Up @@ -255,14 +278,6 @@ namespace Replication
BatchBlock m_data;
};

struct GeneratorValue
{
Jrd::QualifiedName name;
SINT64 value = 0;
};

typedef Firebird::Array<GeneratorValue> GeneratorCache;

enum FlushReason
{
FLUSH_OVERFLOW,
Expand Down