Skip to content

Commit

Permalink
[fix](bdb) Write OP_TIMESTAMP operation until it successed (#33967)
Browse files Browse the repository at this point in the history
For now, it will reset the next journal id and return if the OP_TIMESTAMP
operation writes failed. Because BDBJE will replicate the committed txns (only
persisted in BDB log, but not replicated to other members) to FOLLOWERs after
the connection resumed, directly resetting the next journal id and returning
will cause subsequent txn written to the same journal ID not to be replayed by
the FOLLOWERS. So for OP_TIMESTAMP operation, try to write until it succeeds.
  • Loading branch information
w41ter authored and Doris-Extras committed Apr 24, 2024
1 parent 94cc58b commit 7e64304
Showing 1 changed file with 10 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -244,9 +244,18 @@ public synchronized long write(short op, Writable writable) throws IOException {
if (LOG.isDebugEnabled()) {
LOG.debug("opCode = {}, journal size = {}", op, theData.getSize());
}

// Write the key value pair to bdb.
boolean writeSucceed = false;
for (int i = 0; i < RETRY_TIME; i++) {
// ATTN: If all the followers exit except master, master should continue provide
// query service, so do not exit if the write operation is OP_TIMESTAMP.
//
// Because BDBJE will replicate the committed txns to FOLLOWERs after the connection
// resumed, directly reseting the next journal id and returning will cause subsequent
// txn written to the same journal ID not to be replayed by the FOLLOWERS. So for
// OP_TIMESTAMP operation, try to write until it succeeds here.
int retryTimes = op == OperationType.OP_TIMESTAMP ? Integer.MAX_VALUE : RETRY_TIME;
for (int i = 0; i < retryTimes; i++) {
try {
// Parameter null means auto commit
if (currentJournalDB.put(null, theKey, theData) == OperationStatus.SUCCESS) {
Expand Down Expand Up @@ -288,17 +297,6 @@ public synchronized long write(short op, Writable writable) throws IOException {
}

if (!writeSucceed) {
if (op == OperationType.OP_TIMESTAMP) {
/*
* Do not exit if the write operation is OP_TIMESTAMP.
* If all the followers exit except master, master should continue provide query
* service.
* To prevent master exit, we should exempt OP_TIMESTAMP write
*/
nextJournalId.set(id);
LOG.warn("master can not achieve quorum. write timestamp fail. but will not exit.");
return -1;
}
String msg = "write bdb failed. will exit. journalId: " + id + ", bdb database Name: "
+ currentJournalDB.getDatabaseName();
LOG.error(msg);
Expand Down

0 comments on commit 7e64304

Please sign in to comment.