From 0bbcc75e4b22eff3a831eb89c474b890f33f58fe Mon Sep 17 00:00:00 2001 From: chaoguang <13974480+zjuLcg@users.noreply.github.com> Date: Tue, 21 May 2019 16:22:02 -0700 Subject: [PATCH] fix bug --- fdbserver/workloads/Mako.actor.cpp | 63 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/fdbserver/workloads/Mako.actor.cpp b/fdbserver/workloads/Mako.actor.cpp index f654edde55..c97c002a23 100644 --- a/fdbserver/workloads/Mako.actor.cpp +++ b/fdbserver/workloads/Mako.actor.cpp @@ -2,6 +2,7 @@ #include "fdbserver/TesterInterface.actor.h" #include "workloads.actor.h" #include "fdbserver/workloads/BulkSetup.actor.h" +#include "fdbclient/ReadYourWrites.h" #include "flow/actorcompiler.h" @@ -158,11 +159,10 @@ struct MakoWorkload : KVWorkload { } } static void randStr(std::string& str, const int& len) { - static char randomStr[BUFFERSIZE]; + str.resize(len); for (int i = 0; i < len; ++i) { - randomStr[i] = g_random->randomAlphaNumeric(); + str[i] = g_random->randomAlphaNumeric(); } - str.assign(randomStr, len); } static void randStr(char *str, const int& len){ @@ -175,14 +175,14 @@ struct MakoWorkload : KVWorkload { // TODO : add limit on maxvaluebytes const int length = g_random->randomInt(minValueBytes, maxValueBytes + 1); randStr(valueString, length); - return StringRef((uint8_t*)valueString.c_str(), length); + return StringRef(reinterpret_cast(valueString.c_str()), length); } Key ind2key(const uint64_t& ind) { - // allocate one more byte for potential null-character added by snprintf + // allocate one more byte for potential null-character added by sprintf Key result = makeString(keyBytes+1); - uint8_t* data = mutateString(result); - sprintf((char*)data, (KEYPREFIX + "%0*d").c_str(), seqNumLen, ind); + char* data = reinterpret_cast(mutateString(result)); + sprintf(data, (KEYPREFIX + "%0*d").c_str(), seqNumLen, ind); for (int i = KEYPREFIXLEN + seqNumLen; i < keyBytes; ++i) data[i] = 'x'; return StringRef(result.begin(), keyBytes); @@ -210,7 +210,6 @@ struct MakoWorkload : KVWorkload { loop { elapsed += self->periodicLoggingInterval; wait( delayUntil(start + elapsed)); - // TODO: if there is any other traceEvent to add TraceEvent((self->description() + "_CommitLatency").c_str()).detail("Mean", self->opLatencies[OP_COMMIT].mean()).detail("Median", self->opLatencies[OP_COMMIT].median()).detail("Percentile5", self->opLatencies[OP_COMMIT].percentile(.05)).detail("Percentile95", self->opLatencies[OP_COMMIT].percentile(.95)).detail("Count", self->opCounters[OP_COMMIT].getValue()).detail("Elapsed", elapsed); TraceEvent((self->description() + "_GRVLatency").c_str()).detail("Mean", self->opLatencies[OP_GETREADVERSION].mean()).detail("Median", self->opLatencies[OP_GETREADVERSION].median()).detail("Percentile5", self->opLatencies[OP_GETREADVERSION].percentile(.05)).detail("Percentile95", self->opLatencies[OP_GETREADVERSION].percentile(.95)).detail("Count", self->opCounters[OP_GETREADVERSION].getValue()); @@ -266,7 +265,7 @@ struct MakoWorkload : KVWorkload { state Key rkey; state Value rval; - state Transaction tr(cx); + state ReadYourWritesTransaction tr(cx); state bool doCommit; state int i, count; state uint64_t range, indBegin, indEnd, rangeLen; @@ -275,7 +274,7 @@ struct MakoWorkload : KVWorkload { state KeyRangeRef rkeyRangeRef; state vector perOpCount(MAX_OP, 0); - TraceEvent("ClientStarting").detail("AcotrIndex", actorIndex).detail("ClientIndex", self->clientId).detail("NumActors", self->actorCountPerClient); + TraceEvent("ClientStarting").detail("ActorIndex", actorIndex).detail("ClientIndex", self->clientId).detail("NumActors", self->actorCountPerClient); loop { // used for throttling @@ -314,46 +313,46 @@ struct MakoWorkload : KVWorkload { } else if (i == OP_UPDATE){ // get followed by set, TODO: do I need to add counter of get here wait(logLatency(tr.get(rkey, false), &self->opLatencies[OP_GET])); - tr.set(rkey, rval, true); + tr.set(rkey, rval); doCommit = true; } else if (i == OP_INSERT){ // generate an (almost) unique key here, it starts with 'mako' and then comes with randomly generated characters - randStr((char*) mutateString(rkey) + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); - tr.set(rkey, rval, true); + randStr(reinterpret_cast(mutateString(rkey)) + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); + tr.set(rkey, rval); doCommit = true; } else if (i == OP_INSERTRANGE){ - uint8_t *rkeyPtr = mutateString(rkey); - randStr((char*) rkeyPtr + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); + char *rkeyPtr = reinterpret_cast(mutateString(rkey)); + randStr(rkeyPtr + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); for (int range_i = 0; range_i < range; ++range_i){ - sprintf((char*) rkeyPtr + self->keyBytes - rangeLen, "%0.*d", rangeLen, range_i); - tr.set(rkey, self->randomValue(), true); + sprintf(rkeyPtr + self->keyBytes - rangeLen, "%0.*d", rangeLen, range_i); + tr.set(rkey, self->randomValue()); } doCommit = true; } else if (i == OP_CLEAR){ - tr.clear(rkey, true); + tr.clear(rkey); doCommit = true; } else if(i == OP_SETCLEAR){ - randStr((char*) mutateString(rkey) + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); - tr.set(rkey, rval, true); + randStr(reinterpret_cast(mutateString(rkey)) + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); + tr.set(rkey, rval); // commit the change and update metrics commitStart = now(); wait(tr.commit()); self->opLatencies[OP_COMMIT].addSample(now() - commitStart); ++perOpCount[OP_COMMIT]; tr.reset(); - tr.clear(rkey, true); + tr.clear(rkey); doCommit = true; } else if (i == OP_CLEARRANGE){ - tr.clear(rkeyRangeRef, true); + tr.clear(rkeyRangeRef); doCommit = true; } else if (i == OP_SETCLEARRANGE){ - uint8_t *rkeyPtr = mutateString(rkey); - randStr((char*) rkeyPtr + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); + char *rkeyPtr = reinterpret_cast(mutateString(rkey)); + randStr(rkeyPtr + KEYPREFIXLEN, self->keyBytes-KEYPREFIXLEN); state std::string scr_start_key; state std::string scr_end_key; for (int range_i = 0; range_i < range; ++range_i){ - sprintf((char*) rkeyPtr + self->keyBytes - rangeLen, "%0.*d", rangeLen, range_i); - tr.set(rkey, self->randomValue(), true); + sprintf(rkeyPtr + self->keyBytes - rangeLen, "%0.*d", rangeLen, range_i); + tr.set(rkey, self->randomValue()); if (range_i == 0) scr_start_key = rkey.toString(); } @@ -363,7 +362,7 @@ struct MakoWorkload : KVWorkload { self->opLatencies[OP_COMMIT].addSample(now() - commitStart); ++perOpCount[OP_COMMIT]; tr.reset(); - tr.clear(KeyRangeRef(StringRef(scr_start_key), StringRef(scr_end_key)), true); + tr.clear(KeyRangeRef(StringRef(scr_start_key), StringRef(scr_end_key))); doCommit = true; } ++perOpCount[i]; @@ -400,18 +399,18 @@ struct MakoWorkload : KVWorkload { ACTOR Future cleanup(Database cx, MakoWorkload* self){ // clear all data starts with 'mako' in the database - state std::string startKey("mako"); - state std::string endKey("mako\xff"); - state Transaction tr(cx); + state std::string keyPrefix(KEYPREFIX); + // state std::string endKey("mako\xff"); + state ReadYourWritesTransaction tr(cx); loop{ try { - tr.clear(KeyRangeRef(KeyRef(startKey), KeyRef(endKey))); + // tr.clear(KeyRangeRef(KeyRef(startKey), KeyRef(endKey))); + tr.clear(prefixRange(keyPrefix)); wait(tr.commit()); break; } catch (Error &e){ wait(tr.onError(e)); - tr.reset(); } }