From 55f7e7d372798b431f239179da740c754716f5c0 Mon Sep 17 00:00:00 2001 From: Evan Tschannen Date: Thu, 13 Jun 2019 14:28:30 -0700 Subject: [PATCH] fix: The delay inside the disabledMap was causing the storage server updateStorage actor to run on the client process --- fdbrpc/sim2.actor.cpp | 13 ------------- fdbrpc/simulator.h | 16 +++++++++++++--- fdbserver/storageserver.actor.cpp | 5 ++++- fdbserver/workloads/LocalRatekeeper.actor.cpp | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/fdbrpc/sim2.actor.cpp b/fdbrpc/sim2.actor.cpp index 7e2d67bb5a..6defa4c560 100644 --- a/fdbrpc/sim2.actor.cpp +++ b/fdbrpc/sim2.actor.cpp @@ -84,19 +84,6 @@ void ISimulator::displayWorkers() const return; } -void ISimulator::disableFor(const std::string& desc, double time) { - disabledMap[desc] = map(::delay(time), [this, desc](Void v){ disabledMap.erase(desc); return Void(); }); -} - -Future ISimulator::checkDisabled(const std::string& desc) const -{ - auto iter = disabledMap.find(desc); - if (iter != disabledMap.end()) { - return iter->second; - } - return Void(); -} - namespace std { template<> class hash { diff --git a/fdbrpc/simulator.h b/fdbrpc/simulator.h index cd546f726f..81e3ecc4f6 100644 --- a/fdbrpc/simulator.h +++ b/fdbrpc/simulator.h @@ -311,8 +311,18 @@ public: virtual flowGlobalType global(int id) { return getCurrentProcess()->global(id); }; virtual void setGlobal(size_t id, flowGlobalType v) { getCurrentProcess()->setGlobal(id,v); }; - Future checkDisabled(const std::string& desc) const; - void disableFor(const std::string& desc, double time); + virtual void disableFor(const std::string& desc, double time) { + disabledMap[desc] = time; + } + + virtual double checkDisabled(const std::string& desc) const + { + auto iter = disabledMap.find(desc); + if (iter != disabledMap.end()) { + return iter->second; + } + return 0; + } static thread_local ProcessInfo* currentProcess; protected: @@ -323,7 +333,7 @@ private: std::map excludedAddresses; std::map clearedAddresses; std::map> roleAddresses; - std::map> disabledMap; + std::map disabledMap; bool allSwapsDisabled; }; diff --git a/fdbserver/storageserver.actor.cpp b/fdbserver/storageserver.actor.cpp index e9f80878fc..81667f981d 100644 --- a/fdbserver/storageserver.actor.cpp +++ b/fdbserver/storageserver.actor.cpp @@ -2863,7 +2863,10 @@ ACTOR Future updateStorage(StorageServer* data) { loop { ASSERT( data->durableVersion.get() == data->storageVersion() ); if (g_network->isSimulated()) { - wait(g_pSimulator->checkDisabled(format("%s/updateStorage", data->thisServerID.toString().c_str()))); + double endTime = g_simulator.checkDisabled(format("%s/updateStorage", data->thisServerID.toString().c_str())); + if(endTime > now()) { + wait(delay(endTime - now(), TaskUpdateStorage)); + } } wait( data->desiredOldestVersion.whenAtLeast( data->storageVersion()+1 ) ); wait( delay(0, TaskUpdateStorage) ); diff --git a/fdbserver/workloads/LocalRatekeeper.actor.cpp b/fdbserver/workloads/LocalRatekeeper.actor.cpp index e69ec63ed6..95c7eea701 100644 --- a/fdbserver/workloads/LocalRatekeeper.actor.cpp +++ b/fdbserver/workloads/LocalRatekeeper.actor.cpp @@ -115,7 +115,7 @@ struct LocalRatekeeperWorkload : TestWorkload { ACTOR static Future _start(LocalRatekeeperWorkload* self, Database cx) { wait(delay(self->startAfter)); state StorageServerInterface ssi = wait(getRandomStorage(cx)); - g_simulator.disableFor(format("%s/updateStorage", ssi.id().toString().c_str()), self->blockWritesFor); + g_simulator.disableFor(format("%s/updateStorage", ssi.id().toString().c_str()), now() + self->blockWritesFor); state Future done = delay(self->blockWritesFor); // not much will happen until the storage goes over the soft limit wait(delay(double(SERVER_KNOBS->STORAGE_DURABILITY_LAG_SOFT_MAX/1e6)));