mirror of
https://github.com/apple/foundationdb.git
synced 2025-05-15 18:32:18 +08:00
Add a knob PROXY_REJECT_BATCH_QUEUED_TOO_LONG
Disable the proxy rejection feature for backup workload, because of the ApplyMutationsError.
This commit is contained in:
parent
5cb0b138be
commit
df5293e2be
@ -344,6 +344,7 @@ ServerKnobs::ServerKnobs(bool randomize, ClientKnobs* clientKnobs, bool isSimula
|
|||||||
init( MAX_PROXY_COMPUTE, 2.0 );
|
init( MAX_PROXY_COMPUTE, 2.0 );
|
||||||
init( PROXY_COMPUTE_BUCKETS, 20000 );
|
init( PROXY_COMPUTE_BUCKETS, 20000 );
|
||||||
init( PROXY_COMPUTE_GROWTH_RATE, 0.01 );
|
init( PROXY_COMPUTE_GROWTH_RATE, 0.01 );
|
||||||
|
init( PROXY_REJECT_BATCH_QUEUED_TOO_LONG, true );
|
||||||
|
|
||||||
init( RESET_MASTER_BATCHES, 200 );
|
init( RESET_MASTER_BATCHES, 200 );
|
||||||
init( RESET_RESOLVER_BATCHES, 200 );
|
init( RESET_RESOLVER_BATCHES, 200 );
|
||||||
|
@ -289,6 +289,7 @@ public:
|
|||||||
double MAX_PROXY_COMPUTE;
|
double MAX_PROXY_COMPUTE;
|
||||||
int PROXY_COMPUTE_BUCKETS;
|
int PROXY_COMPUTE_BUCKETS;
|
||||||
double PROXY_COMPUTE_GROWTH_RATE;
|
double PROXY_COMPUTE_GROWTH_RATE;
|
||||||
|
bool PROXY_REJECT_BATCH_QUEUED_TOO_LONG;
|
||||||
|
|
||||||
int RESET_MASTER_BATCHES;
|
int RESET_MASTER_BATCHES;
|
||||||
int RESET_RESOLVER_BATCHES;
|
int RESET_RESOLVER_BATCHES;
|
||||||
|
@ -627,19 +627,27 @@ ACTOR Future<Void> commitBatch(
|
|||||||
TEST(self->latestLocalCommitBatchResolving.get() < localBatchNumber-1); // Queuing pre-resolution commit processing
|
TEST(self->latestLocalCommitBatchResolving.get() < localBatchNumber-1); // Queuing pre-resolution commit processing
|
||||||
wait(self->latestLocalCommitBatchResolving.whenAtLeast(localBatchNumber-1));
|
wait(self->latestLocalCommitBatchResolving.whenAtLeast(localBatchNumber-1));
|
||||||
double queuingDelay = g_network->timer() - timeStart;
|
double queuingDelay = g_network->timer() - timeStart;
|
||||||
if (queuingDelay > (double)SERVER_KNOBS->MAX_READ_TRANSACTION_LIFE_VERSIONS / SERVER_KNOBS->VERSIONS_PER_SECOND ||
|
if ((queuingDelay > (double)SERVER_KNOBS->MAX_READ_TRANSACTION_LIFE_VERSIONS / SERVER_KNOBS->VERSIONS_PER_SECOND ||
|
||||||
(BUGGIFY && g_network->isSimulated() && deterministicRandom()->random01() < 0.01 && trs.size() > 0 &&
|
(BUGGIFY && g_network->isSimulated() && deterministicRandom()->random01() < 0.01)) &&
|
||||||
!trs[0].transaction.mutations[0].param1.startsWith(LiteralStringRef("\xff")))) {
|
SERVER_KNOBS->PROXY_REJECT_BATCH_QUEUED_TOO_LONG &&
|
||||||
|
trs.size() > 0 && !trs[0].transaction.mutations.empty() && !trs[0].transaction.mutations[0].param1.startsWith(LiteralStringRef("\xff"))) {
|
||||||
// Disabled for the recovery transaction. otherwise, recovery can't finish and keeps doing more recoveries.
|
// Disabled for the recovery transaction. otherwise, recovery can't finish and keeps doing more recoveries.
|
||||||
TEST(true); // Reject transactions in the batch
|
TEST(true); // Reject transactions in the batch
|
||||||
TraceEvent("ProxyReject", self->dbgid).detail("Delay", queuingDelay).detail("N", trs.size());
|
TraceEvent("ProxyReject", self->dbgid).detail("Delay", queuingDelay).detail("N", trs.size()).detail("BatchNumber", localBatchNumber);
|
||||||
for (const auto m : trs[0].transaction.mutations) {
|
int i = 0;
|
||||||
TraceEvent("ProxyReject", self->dbgid).detail("Mutation", m.toString());
|
for (const auto tr : trs) {
|
||||||
|
int j = 0;
|
||||||
|
for (const auto& m : tr.transaction.mutations) {
|
||||||
|
TraceEvent("ProxyReject", self->dbgid).detail("T", i).detail("M", j).detail("Mutation", m.toString());
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
}
|
}
|
||||||
ASSERT(self->latestLocalCommitBatchResolving.get() == localBatchNumber - 1);
|
ASSERT(self->latestLocalCommitBatchResolving.get() == localBatchNumber - 1);
|
||||||
self->latestLocalCommitBatchResolving.set(localBatchNumber);
|
self->latestLocalCommitBatchResolving.set(localBatchNumber);
|
||||||
|
|
||||||
wait(self->latestLocalCommitBatchLogging.whenAtLeast(localBatchNumber-1));
|
wait(self->latestLocalCommitBatchLogging.whenAtLeast(localBatchNumber-1));
|
||||||
|
ASSERT(self->latestLocalCommitBatchLogging.get() == localBatchNumber - 1);
|
||||||
self->latestLocalCommitBatchLogging.set(localBatchNumber);
|
self->latestLocalCommitBatchLogging.set(localBatchNumber);
|
||||||
for (const auto& tr : trs) {
|
for (const auto& tr : trs) {
|
||||||
tr.reply.sendError(not_committed());
|
tr.reply.sendError(not_committed());
|
||||||
|
@ -61,6 +61,9 @@ struct AtomicRestoreWorkload : TestWorkload {
|
|||||||
ACTOR static Future<Void> _start(Database cx, AtomicRestoreWorkload* self) {
|
ACTOR static Future<Void> _start(Database cx, AtomicRestoreWorkload* self) {
|
||||||
state FileBackupAgent backupAgent;
|
state FileBackupAgent backupAgent;
|
||||||
|
|
||||||
|
// Disable proxy rejection
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = false;
|
||||||
|
|
||||||
wait( delay(self->startAfter * deterministicRandom()->random01()) );
|
wait( delay(self->startAfter * deterministicRandom()->random01()) );
|
||||||
TraceEvent("AtomicRestore_Start");
|
TraceEvent("AtomicRestore_Start");
|
||||||
|
|
||||||
@ -105,6 +108,7 @@ struct AtomicRestoreWorkload : TestWorkload {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TraceEvent("AtomicRestore_Done");
|
TraceEvent("AtomicRestore_Done");
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = true;
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -152,6 +152,9 @@ struct AtomicSwitchoverWorkload : TestWorkload {
|
|||||||
state DatabaseBackupAgent backupAgent(cx);
|
state DatabaseBackupAgent backupAgent(cx);
|
||||||
state DatabaseBackupAgent restoreAgent(self->extraDB);
|
state DatabaseBackupAgent restoreAgent(self->extraDB);
|
||||||
|
|
||||||
|
// Disable proxy rejection to avoid ApplyMutationsError
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = false;
|
||||||
|
|
||||||
TraceEvent("AS_Wait1");
|
TraceEvent("AS_Wait1");
|
||||||
wait(success( backupAgent.waitBackup(self->extraDB, BackupAgentBase::getDefaultTag(), false) ));
|
wait(success( backupAgent.waitBackup(self->extraDB, BackupAgentBase::getDefaultTag(), false) ));
|
||||||
TraceEvent("AS_Ready1");
|
TraceEvent("AS_Ready1");
|
||||||
@ -177,6 +180,8 @@ struct AtomicSwitchoverWorkload : TestWorkload {
|
|||||||
g_simulator.drAgents = ISimulator::NoBackupAgents;
|
g_simulator.drAgents = ISimulator::NoBackupAgents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = true;
|
||||||
|
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#include "fdbclient/ManagementAPI.actor.h"
|
#include "fdbclient/ManagementAPI.actor.h"
|
||||||
#include "fdbclient/NativeAPI.actor.h"
|
#include "fdbclient/NativeAPI.actor.h"
|
||||||
#include "fdbserver/workloads/workloads.actor.h"
|
#include "fdbserver/workloads/workloads.actor.h"
|
||||||
|
#include "fdbserver/Knobs.h"
|
||||||
|
|
||||||
#include "flow/actorcompiler.h" // This must be the last #include.
|
#include "flow/actorcompiler.h" // This must be the last #include.
|
||||||
|
|
||||||
struct BackupToDBAbort : TestWorkload {
|
struct BackupToDBAbort : TestWorkload {
|
||||||
@ -54,6 +56,8 @@ struct BackupToDBAbort : TestWorkload {
|
|||||||
ACTOR static Future<Void> _setup(BackupToDBAbort* self, Database cx) {
|
ACTOR static Future<Void> _setup(BackupToDBAbort* self, Database cx) {
|
||||||
state DatabaseBackupAgent backupAgent(cx);
|
state DatabaseBackupAgent backupAgent(cx);
|
||||||
try {
|
try {
|
||||||
|
// Disable proxy rejection to avoid ApplyMutationsError
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = false;
|
||||||
TraceEvent("BDBA_Submit1");
|
TraceEvent("BDBA_Submit1");
|
||||||
wait( backupAgent.submitBackup(self->extraDB, BackupAgentBase::getDefaultTag(), self->backupRanges, false, StringRef(), StringRef(), true) );
|
wait( backupAgent.submitBackup(self->extraDB, BackupAgentBase::getDefaultTag(), self->backupRanges, false, StringRef(), StringRef(), true) );
|
||||||
TraceEvent("BDBA_Submit2");
|
TraceEvent("BDBA_Submit2");
|
||||||
@ -61,6 +65,7 @@ struct BackupToDBAbort : TestWorkload {
|
|||||||
if( e.code() != error_code_backup_duplicate )
|
if( e.code() != error_code_backup_duplicate )
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = true;
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -442,6 +442,9 @@ struct BackupToDBCorrectnessWorkload : TestWorkload {
|
|||||||
TraceEvent("BARW_Arguments").detail("BackupTag", printable(self->backupTag)).detail("BackupAfter", self->backupAfter)
|
TraceEvent("BARW_Arguments").detail("BackupTag", printable(self->backupTag)).detail("BackupAfter", self->backupAfter)
|
||||||
.detail("AbortAndRestartAfter", self->abortAndRestartAfter).detail("DifferentialAfter", self->stopDifferentialAfter);
|
.detail("AbortAndRestartAfter", self->abortAndRestartAfter).detail("DifferentialAfter", self->stopDifferentialAfter);
|
||||||
|
|
||||||
|
// Disable proxy rejection to avoid ApplyMutationsError
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = false;
|
||||||
|
|
||||||
state UID randomID = nondeterministicRandom()->randomUniqueID();
|
state UID randomID = nondeterministicRandom()->randomUniqueID();
|
||||||
|
|
||||||
// Increment the backup agent requets
|
// Increment the backup agent requets
|
||||||
@ -575,6 +578,8 @@ struct BackupToDBCorrectnessWorkload : TestWorkload {
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = true;
|
||||||
|
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -346,6 +346,9 @@ struct BackupToDBUpgradeWorkload : TestWorkload {
|
|||||||
state UID logUid;
|
state UID logUid;
|
||||||
state Version commitVersion;
|
state Version commitVersion;
|
||||||
|
|
||||||
|
// Disable proxy rejection to avoid ApplyMutationsError
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = false;
|
||||||
|
|
||||||
state Future<Void> stopDifferential = delay(self->stopDifferentialAfter);
|
state Future<Void> stopDifferential = delay(self->stopDifferentialAfter);
|
||||||
state Future<Void> waitUpgrade = backupAgent.waitUpgradeToLatestDrVersion(self->extraDB, self->backupTag);
|
state Future<Void> waitUpgrade = backupAgent.waitUpgradeToLatestDrVersion(self->extraDB, self->backupTag);
|
||||||
wait(success(stopDifferential) && success(waitUpgrade));
|
wait(success(stopDifferential) && success(waitUpgrade));
|
||||||
@ -462,6 +465,8 @@ struct BackupToDBUpgradeWorkload : TestWorkload {
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const_cast<ServerKnobs*>(SERVER_KNOBS)->PROXY_REJECT_BATCH_QUEUED_TOO_LONG = true;
|
||||||
|
|
||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user