update TagThrottleApiWorkload

This commit is contained in:
XiaoxiWang 2020-08-25 19:06:33 +00:00 committed by Xiaoxi Wang
parent ec56e1f286
commit f94a78ff03
1 changed files with 55 additions and 10 deletions

View File

@ -26,13 +26,18 @@
#include "flow/actorcompiler.h" // This must be the last #include. #include "flow/actorcompiler.h" // This must be the last #include.
struct TagThrottleApiWorkload : TestWorkload { struct TagThrottleApiWorkload : TestWorkload {
int apiVersion;
bool autoThrottleEnabled;
double testDuration; double testDuration;
constexpr static const char* NAME = "TagThrottleApi";
TagThrottleApiWorkload(WorkloadContext const& wcx) : TestWorkload(wcx) { TagThrottleApiWorkload(WorkloadContext const& wcx) : TestWorkload(wcx) {
testDuration = getOption( options, LiteralStringRef("testDuration"), 10.0 ); testDuration = getOption( options, LiteralStringRef("testDuration"), 10.0 );
autoThrottleEnabled = SERVER_KNOBS->AUTO_TAG_THROTTLING_ENABLED;
} }
virtual std::string description() { return "TagThrottleApi"; } virtual std::string description() { return TagThrottleApiWorkload::NAME; }
virtual Future<Void> setup(Database const& cx) { virtual Future<Void> setup(Database const& cx) {
DatabaseContext::debugUseTags = true; DatabaseContext::debugUseTags = true;
@ -40,6 +45,20 @@ struct TagThrottleApiWorkload : TestWorkload {
} }
virtual Future<Void> start(Database const& cx) { virtual Future<Void> start(Database const& cx) {
// choose a version to check compatibility.
double choice = deterministicRandom()->random01();
if(choice < 0.3) {
apiVersion = 630;
}
else if(choice < 0.7){
apiVersion = 700;
}
else {
apiVersion = Database::API_VERSION_LATEST;
}
TraceEvent("VersionStampApiVersion").detail("ApiVersion", apiVersion);
cx->apiVersion = apiVersion;
if (this->clientId != 0) return Void(); if (this->clientId != 0) return Void();
return timeout(runThrottleApi(this, cx), testDuration, Void()); return timeout(runThrottleApi(this, cx), testDuration, Void());
} }
@ -76,7 +95,7 @@ struct TagThrottleApiWorkload : TestWorkload {
tagSet.addTag(tag); tagSet.addTag(tag);
try { try {
wait(ThrottleApi::throttleTags(cx, tagSet, rate, duration, TagThrottleType::MANUAL, priority)); wait(ThrottleApi::throttleTags(cx, tagSet, rate, duration, TagThrottleType::MANUAL, priority, Optional<double>(), TagThrottledReason::MANUAL));
} }
catch(Error &e) { catch(Error &e) {
state Error err = e; state Error err = e;
@ -88,7 +107,9 @@ struct TagThrottleApiWorkload : TestWorkload {
throw err; throw err;
} }
manuallyThrottledTags->insert_or_assign(std::make_pair(tag, priority), TagThrottleInfo(tag, TagThrottleType::MANUAL, priority, rate, now() + duration, duration)); manuallyThrottledTags->insert_or_assign(
std::make_pair(tag, priority), TagThrottleInfo(tag, TagThrottleType::MANUAL, priority, rate,
now() + duration, duration, TagThrottledReason::MANUAL));
return Void(); return Void();
} }
@ -127,19 +148,26 @@ struct TagThrottleApiWorkload : TestWorkload {
return Void(); return Void();
} }
ACTOR Future<Void> getTags(Database cx, std::map<std::pair<TransactionTag, TransactionPriority>, TagThrottleInfo> const* manuallyThrottledTags) { ACTOR Future<Void> getTags(TagThrottleApiWorkload* self, Database cx, std::map<std::pair<TransactionTag, TransactionPriority>, TagThrottleInfo> const* manuallyThrottledTags) {
std::vector<TagThrottleInfo> tags = wait(ThrottleApi::getThrottledTags(cx, CLIENT_KNOBS->TOO_MANY)); std::vector<TagThrottleInfo> tags = wait(ThrottleApi::getThrottledTags(cx, CLIENT_KNOBS->TOO_MANY));
int manualThrottledTags = 0; int manualThrottledTags = 0;
int activeAutoThrottledTags = 0; int activeAutoThrottledTags = 0;
for(auto &tag : tags) { for(auto &tag : tags) {
if(tag.throttleType == TagThrottleType::MANUAL) { if(tag.throttleType == TagThrottleType::AUTO) {
ASSERT(self->autoThrottleEnabled);
}
else if(tag.throttleType == TagThrottleType::MANUAL) {
ASSERT(manuallyThrottledTags->find(std::make_pair(tag.tag, tag.priority)) != manuallyThrottledTags->end()); ASSERT(manuallyThrottledTags->find(std::make_pair(tag.tag, tag.priority)) != manuallyThrottledTags->end());
++manualThrottledTags; ++manualThrottledTags;
} }
else if(tag.expirationTime > now()) { else if(tag.expirationTime > now()) {
++activeAutoThrottledTags; ++activeAutoThrottledTags;
} }
if(self->apiVersion == 630) {
ASSERT(tag.reason == TagThrottledReason::UNSET);
}
} }
ASSERT(manualThrottledTags <= SERVER_KNOBS->MAX_MANUAL_THROTTLED_TRANSACTION_TAGS); ASSERT(manualThrottledTags <= SERVER_KNOBS->MAX_MANUAL_THROTTLED_TRANSACTION_TAGS);
@ -158,6 +186,18 @@ struct TagThrottleApiWorkload : TestWorkload {
return Void(); return Void();
} }
ACTOR Future<Void> getRecommendedTags(TagThrottleApiWorkload* self, Database cx) {
std::vector<TagThrottleInfo> tags = wait(ThrottleApi::getRecommendedTags(cx, CLIENT_KNOBS->TOO_MANY));
for(auto& tag : tags) {
ASSERT(tag.throttleType == TagThrottleType::AUTO);
if(self->apiVersion == 630) {
ASSERT(tag.reason == TagThrottledReason::UNSET);
}
}
return Void();
}
ACTOR Future<Void> unthrottleTagGroup(Database cx, std::map<std::pair<TransactionTag, TransactionPriority>, TagThrottleInfo> *manuallyThrottledTags) { ACTOR Future<Void> unthrottleTagGroup(Database cx, std::map<std::pair<TransactionTag, TransactionPriority>, TagThrottleInfo> *manuallyThrottledTags) {
state Optional<TagThrottleType> throttleType = TagThrottleApiWorkload::randomTagThrottleType(); state Optional<TagThrottleType> throttleType = TagThrottleApiWorkload::randomTagThrottleType();
state Optional<TransactionPriority> priority = deterministicRandom()->coinflip() ? Optional<TransactionPriority>() : deterministicRandom()->randomChoice(allTransactionPriorities); state Optional<TransactionPriority> priority = deterministicRandom()->coinflip() ? Optional<TransactionPriority>() : deterministicRandom()->randomChoice(allTransactionPriorities);
@ -190,15 +230,17 @@ struct TagThrottleApiWorkload : TestWorkload {
return Void(); return Void();
} }
ACTOR Future<Void> enableAutoThrottling(Database cx) { ACTOR Future<Void> enableAutoThrottling(TagThrottleApiWorkload* self, Database cx) {
if(deterministicRandom()->coinflip()) { if(deterministicRandom()->coinflip()) {
wait(ThrottleApi::enableAuto(cx, true)); wait(ThrottleApi::enableAuto(cx, true));
self->autoThrottleEnabled = true;
if(deterministicRandom()->coinflip()) { if(deterministicRandom()->coinflip()) {
bool unthrottled = wait(ThrottleApi::unthrottleAll(cx, TagThrottleType::AUTO, Optional<TransactionPriority>())); bool unthrottled = wait(ThrottleApi::unthrottleAll(cx, TagThrottleType::AUTO, Optional<TransactionPriority>()));
} }
} }
else { else {
wait(ThrottleApi::enableAuto(cx, false)); wait(ThrottleApi::enableAuto(cx, false));
self->autoThrottleEnabled = false;
} }
return Void(); return Void();
@ -210,7 +252,7 @@ struct TagThrottleApiWorkload : TestWorkload {
double delayTime = deterministicRandom()->random01() * 5; double delayTime = deterministicRandom()->random01() * 5;
wait(delay(delayTime)); wait(delay(delayTime));
state int action = deterministicRandom()->randomInt(0, 5); state int action = deterministicRandom()->randomInt(0, 6);
if(action == 0) { if(action == 0) {
wait(self->throttleTag(cx, &manuallyThrottledTags)); wait(self->throttleTag(cx, &manuallyThrottledTags));
@ -219,16 +261,19 @@ struct TagThrottleApiWorkload : TestWorkload {
wait(self->unthrottleTag(cx, &manuallyThrottledTags)); wait(self->unthrottleTag(cx, &manuallyThrottledTags));
} }
else if(action == 2) { else if(action == 2) {
wait(self->getTags(cx, &manuallyThrottledTags)); wait(self->getTags(self, cx, &manuallyThrottledTags));
} }
else if(action == 3) { else if(action == 3) {
wait(self->unthrottleTagGroup(cx, &manuallyThrottledTags)); wait(self->unthrottleTagGroup(cx, &manuallyThrottledTags));
} }
else if(action == 4) { else if(action == 4) {
wait(self->enableAutoThrottling(cx)); wait(self->enableAutoThrottling(self, cx));
}
else if(action == 5) {
wait(self->getRecommendedTags(self, cx));
} }
} }
} }
}; };
WorkloadFactory<TagThrottleApiWorkload> TagThrottleApiWorkloadFactory("TagThrottleApi"); WorkloadFactory<TagThrottleApiWorkload> TagThrottleApiWorkloadFactory(TagThrottleApiWorkload::NAME);