mirror of https://gitee.com/bigwinds/arangodb
Added reason to job abort method. (#8877)
This commit is contained in:
parent
2bb96eedac
commit
49c568e674
|
@ -155,7 +155,7 @@ bool ActiveFailoverJob::start(bool&) {
|
|||
if (jobId.second && !abortable(_snapshot, jobId.first)) {
|
||||
return false;
|
||||
} else if (jobId.second) {
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort();
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort("ActiveFailoverJob requests abort");
|
||||
}
|
||||
|
||||
// Todo entry
|
||||
|
@ -236,7 +236,7 @@ JOB_STATUS ActiveFailoverJob::status() {
|
|||
return _status;
|
||||
}
|
||||
|
||||
arangodb::Result ActiveFailoverJob::abort() {
|
||||
arangodb::Result ActiveFailoverJob::abort(std::string const& reason) {
|
||||
// We can assume that the job is in ToDo or not there:
|
||||
if (_status == NOTFOUND || _status == FINISHED || _status == FAILED) {
|
||||
return Result(TRI_ERROR_SUPERVISION_GENERAL_FAILURE,
|
||||
|
@ -246,7 +246,7 @@ arangodb::Result ActiveFailoverJob::abort() {
|
|||
Result result;
|
||||
// Can now only be TODO or PENDING
|
||||
if (_status == TODO) {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted: " + reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ struct ActiveFailoverJob final : public Job {
|
|||
virtual void run(bool&) override final;
|
||||
virtual bool create(std::shared_ptr<VPackBuilder> envelope = nullptr) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
private:
|
||||
std::string findBestFollower();
|
||||
|
|
|
@ -322,7 +322,7 @@ JOB_STATUS AddFollower::status() {
|
|||
return _status;
|
||||
}
|
||||
|
||||
arangodb::Result AddFollower::abort() {
|
||||
arangodb::Result AddFollower::abort(std::string const& reason) {
|
||||
// We can assume that the job is in ToDo or not there:
|
||||
if (_status == NOTFOUND || _status == FINISHED || _status == FAILED) {
|
||||
return Result(TRI_ERROR_SUPERVISION_GENERAL_FAILURE,
|
||||
|
@ -332,7 +332,7 @@ arangodb::Result AddFollower::abort() {
|
|||
Result result;
|
||||
// Can now only be TODO or PENDING
|
||||
if (_status == TODO) {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted:" + reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ struct AddFollower : public Job {
|
|||
virtual bool create(std::shared_ptr<VPackBuilder> envelope = nullptr) override final;
|
||||
virtual void run(bool&) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
std::string _database;
|
||||
std::string _collection;
|
||||
|
|
|
@ -88,7 +88,7 @@ JOB_STATUS CleanOutServer::status() {
|
|||
Supervision::TimePoint timeCreated = stringToTimepoint(timeCreatedString);
|
||||
Supervision::TimePoint now(std::chrono::system_clock::now());
|
||||
if (now - timeCreated > std::chrono::duration<double>(86400.0)) { // 1 day
|
||||
abort();
|
||||
abort("job timed out");
|
||||
return FAILED;
|
||||
}
|
||||
return PENDING;
|
||||
|
@ -103,7 +103,7 @@ JOB_STATUS CleanOutServer::status() {
|
|||
}
|
||||
|
||||
if (failedFound > 0) {
|
||||
abort();
|
||||
abort("child job failed");
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
@ -502,7 +502,7 @@ bool CleanOutServer::checkFeasibility() {
|
|||
return true;
|
||||
}
|
||||
|
||||
arangodb::Result CleanOutServer::abort() {
|
||||
arangodb::Result CleanOutServer::abort(std::string const& reason) {
|
||||
// We can assume that the job is either in ToDo or in Pending.
|
||||
Result result;
|
||||
|
||||
|
@ -514,7 +514,7 @@ arangodb::Result CleanOutServer::abort() {
|
|||
|
||||
// Can now only be TODO or PENDING
|
||||
if (_status == TODO) {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted:" + reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -522,14 +522,16 @@ arangodb::Result CleanOutServer::abort() {
|
|||
Node::Children const& todos = _snapshot.hasAsChildren(toDoPrefix).first;
|
||||
Node::Children const& pends = _snapshot.hasAsChildren(pendingPrefix).first;
|
||||
|
||||
std::string childAbortReason = "parent job aborted - reason: " + reason;
|
||||
|
||||
for (auto const& subJob : todos) {
|
||||
if (subJob.first.compare(0, _jobId.size() + 1, _jobId + "-") == 0) {
|
||||
JobContext(TODO, subJob.first, _snapshot, _agent).abort();
|
||||
JobContext(TODO, subJob.first, _snapshot, _agent).abort(childAbortReason);
|
||||
}
|
||||
}
|
||||
for (auto const& subJob : pends) {
|
||||
if (subJob.first.compare(0, _jobId.size() + 1, _jobId + "-") == 0) {
|
||||
JobContext(PENDING, subJob.first, _snapshot, _agent).abort();
|
||||
JobContext(PENDING, subJob.first, _snapshot, _agent).abort(childAbortReason);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -544,7 +546,7 @@ arangodb::Result CleanOutServer::abort() {
|
|||
}
|
||||
}
|
||||
|
||||
finish(_server, "", false, "job aborted", payload);
|
||||
finish(_server, "", false, "job aborted: " + reason, payload);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ struct CleanOutServer : public Job {
|
|||
virtual bool create(std::shared_ptr<VPackBuilder> envelope = nullptr) override final;
|
||||
virtual void run(bool&) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
// Check if all shards' replication factors can be satisfied after clean out.
|
||||
bool checkFeasibility();
|
||||
|
|
|
@ -273,7 +273,7 @@ bool FailedFollower::start(bool& aborts) {
|
|||
return false;
|
||||
} else if (jobId.second) {
|
||||
aborts = true;
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort();
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort("failed follower requests abort");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -340,7 +340,7 @@ JOB_STATUS FailedFollower::status() {
|
|||
return TODO;
|
||||
}
|
||||
|
||||
arangodb::Result FailedFollower::abort() {
|
||||
arangodb::Result FailedFollower::abort(std::string const& reason) {
|
||||
// We can assume that the job is in ToDo or not there:
|
||||
if (_status == NOTFOUND || _status == FINISHED || _status == FAILED) {
|
||||
return Result(TRI_ERROR_SUPERVISION_GENERAL_FAILURE,
|
||||
|
@ -350,7 +350,7 @@ arangodb::Result FailedFollower::abort() {
|
|||
Result result;
|
||||
// Can now only be TODO
|
||||
if (_status == TODO) {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted: " + reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ struct FailedFollower : public Job {
|
|||
virtual void run(bool&) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual JOB_STATUS status() override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
std::string _database;
|
||||
std::string _collection;
|
||||
|
|
|
@ -310,7 +310,7 @@ bool FailedLeader::start(bool& aborts) {
|
|||
return false;
|
||||
} else if (jobId.second) {
|
||||
aborts = true;
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort();
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort("failed leader requests abort");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -442,13 +442,13 @@ JOB_STATUS FailedLeader::status() {
|
|||
return _status;
|
||||
}
|
||||
|
||||
arangodb::Result FailedLeader::abort() {
|
||||
arangodb::Result FailedLeader::abort(std::string const& reason) {
|
||||
// job is only abortable when it is in ToDo
|
||||
if (_status != TODO) {
|
||||
return Result(TRI_ERROR_SUPERVISION_GENERAL_FAILURE,
|
||||
"Failed aborting failedFollower job beyond todo stage");
|
||||
} else {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted: " + reason);
|
||||
return Result();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ struct FailedLeader : public Job {
|
|||
virtual bool start(bool&) override final;
|
||||
virtual JOB_STATUS status() override final;
|
||||
virtual void run(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
void rollback();
|
||||
|
||||
std::string _database;
|
||||
|
|
|
@ -85,7 +85,7 @@ bool FailedServer::start(bool& aborts) {
|
|||
return false;
|
||||
} else if (jobId.second) {
|
||||
aborts = true;
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort();
|
||||
JobContext(PENDING, jobId.first, _snapshot, _agent).abort("failed server");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -364,8 +364,9 @@ JOB_STATUS FailedServer::status() {
|
|||
return _status;
|
||||
}
|
||||
|
||||
arangodb::Result FailedServer::abort() {
|
||||
arangodb::Result FailedServer::abort(std::string const& reason) {
|
||||
Result result;
|
||||
return result;
|
||||
// FIXME: No abort procedure, simply throw error or so
|
||||
// ??????????????
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ struct FailedServer : public Job {
|
|||
virtual bool create(std::shared_ptr<VPackBuilder> b = nullptr) override final;
|
||||
virtual JOB_STATUS status() override final;
|
||||
virtual void run(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
std::string _server;
|
||||
};
|
||||
|
|
|
@ -102,7 +102,7 @@ struct Job {
|
|||
}
|
||||
}
|
||||
|
||||
virtual Result abort() = 0;
|
||||
virtual Result abort(std::string const& reason) = 0;
|
||||
|
||||
virtual bool finish(std::string const& server, std::string const& shard,
|
||||
bool success = true, std::string const& reason = std::string(),
|
||||
|
|
|
@ -85,8 +85,8 @@ void JobContext::run(bool& aborts) {
|
|||
}
|
||||
}
|
||||
|
||||
void JobContext::abort() {
|
||||
void JobContext::abort(std::string const& reason) {
|
||||
if (_job != nullptr) {
|
||||
_job->abort();
|
||||
_job->abort(reason);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ class JobContext {
|
|||
void run(bool& aborts);
|
||||
|
||||
/// @brief Abort job
|
||||
void abort();
|
||||
void abort(std::string const& reason);
|
||||
|
||||
private:
|
||||
/// @brief Actual job context
|
||||
|
|
|
@ -431,7 +431,7 @@ JOB_STATUS MoveShard::pendingLeader() {
|
|||
Supervision::TimePoint timeCreated = stringToTimepoint(timeCreatedString);
|
||||
Supervision::TimePoint now(std::chrono::system_clock::now());
|
||||
if (now - timeCreated > std::chrono::duration<double>(43200.0)) { // 12h
|
||||
abort();
|
||||
abort("MoveShard timed out in pending leader");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -683,7 +683,7 @@ JOB_STATUS MoveShard::pendingFollower() {
|
|||
Supervision::TimePoint timeCreated = stringToTimepoint(timeCreatedString);
|
||||
Supervision::TimePoint now(std::chrono::system_clock::now());
|
||||
if (now - timeCreated > std::chrono::duration<double>(10000.0)) {
|
||||
abort();
|
||||
abort("MoveShard timed out in pending follower");
|
||||
return FAILED;
|
||||
}
|
||||
return PENDING;
|
||||
|
@ -745,7 +745,7 @@ JOB_STATUS MoveShard::pendingFollower() {
|
|||
return PENDING;
|
||||
}
|
||||
|
||||
arangodb::Result MoveShard::abort() {
|
||||
arangodb::Result MoveShard::abort(std::string const& reason) {
|
||||
arangodb::Result result;
|
||||
|
||||
// We can assume that the job is either in ToDo or in Pending.
|
||||
|
@ -773,7 +773,7 @@ arangodb::Result MoveShard::abort() {
|
|||
}
|
||||
}
|
||||
|
||||
if (finish("", "", true, "job aborted", todoPrec)) {
|
||||
if (finish("", "", true, "job aborted (1): " + reason, todoPrec)) {
|
||||
return result;
|
||||
}
|
||||
_status = PENDING;
|
||||
|
@ -794,7 +794,7 @@ arangodb::Result MoveShard::abort() {
|
|||
if (cur.second && cur.first[0].copyString() == _to) {
|
||||
LOG_TOPIC("72a82", INFO, Logger::SUPERVISION) <<
|
||||
"MoveShard can no longer abort through reversion to where it started. Flight forward";
|
||||
finish(_to, _shard, true, "job aborted - new leader already in place");
|
||||
finish(_to, _shard, true, "job aborted (2) - new leader already in place: " + reason);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -843,7 +843,7 @@ arangodb::Result MoveShard::abort() {
|
|||
addRemoveJobFromSomewhere(trx, "Pending", _jobId);
|
||||
Builder job;
|
||||
_snapshot.hasAsBuilder(pendingPrefix + _jobId, job);
|
||||
addPutJobIntoSomewhere(trx, "Failed", job.slice(), "job aborted");
|
||||
addPutJobIntoSomewhere(trx, "Failed", job.slice(), "job aborted (3): " + reason);
|
||||
addReleaseShard(trx, _shard);
|
||||
addReleaseServer(trx, _to);
|
||||
addIncreasePlanVersion(trx);
|
||||
|
@ -871,7 +871,7 @@ arangodb::Result MoveShard::abort() {
|
|||
// Tough luck. Things have changed. We'll move on
|
||||
LOG_TOPIC("513e6", INFO, Logger::SUPERVISION) <<
|
||||
"MoveShard can no longer abort through reversion to where it started. Flight forward";
|
||||
finish(_to, _shard, true, "job aborted - new leader already in place");
|
||||
finish(_to, _shard, true, "job aborted (4) - new leader already in place: " + reason);
|
||||
return result;
|
||||
}
|
||||
result = Result(
|
||||
|
|
|
@ -50,7 +50,7 @@ struct MoveShard : public Job {
|
|||
virtual void run(bool&) override final;
|
||||
virtual bool create(std::shared_ptr<VPackBuilder> envelope = nullptr) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual Result abort() override;
|
||||
virtual Result abort(std::string const& reason) override;
|
||||
JOB_STATUS pendingLeader();
|
||||
JOB_STATUS pendingFollower();
|
||||
|
||||
|
@ -62,7 +62,7 @@ struct MoveShard : public Job {
|
|||
bool _isLeader;
|
||||
bool _remainsFollower;
|
||||
bool _toServerIsFollower;
|
||||
|
||||
|
||||
};
|
||||
} // namespace consensus
|
||||
} // namespace arangodb
|
||||
|
|
|
@ -435,7 +435,7 @@ JOB_STATUS RemoveFollower::status() {
|
|||
return _status;
|
||||
}
|
||||
|
||||
arangodb::Result RemoveFollower::abort() {
|
||||
arangodb::Result RemoveFollower::abort(std::string const& reason) {
|
||||
Result result;
|
||||
// We can assume that the job is in ToDo or not there:
|
||||
if (_status == NOTFOUND || _status == FINISHED || _status == FAILED) {
|
||||
|
@ -445,7 +445,7 @@ arangodb::Result RemoveFollower::abort() {
|
|||
}
|
||||
// Can now only be TODO or PENDING
|
||||
if (_status == TODO) {
|
||||
finish("", "", false, "job aborted");
|
||||
finish("", "", false, "job aborted:" + reason);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ struct RemoveFollower : public Job {
|
|||
virtual bool create(std::shared_ptr<VPackBuilder> envelope = nullptr) override final;
|
||||
virtual void run(bool& aborts) override final;
|
||||
virtual bool start(bool&) override final;
|
||||
virtual Result abort() override final;
|
||||
virtual Result abort(std::string const& reason) override final;
|
||||
|
||||
std::string _database;
|
||||
std::string _collection;
|
||||
|
|
|
@ -70,7 +70,7 @@ Node createNodeFromBuilder(Builder const& builder) {
|
|||
|
||||
Builder opBuilder;
|
||||
{ VPackObjectBuilder a(&opBuilder);
|
||||
opBuilder.add("new", builder.slice()); }
|
||||
opBuilder.add("new", builder.slice()); }
|
||||
Node node("");
|
||||
node.handle<SET>(opBuilder.slice());
|
||||
return node;
|
||||
|
@ -83,11 +83,11 @@ Builder createBuilder(char const* c) {
|
|||
options.checkAttributeUniqueness = true;
|
||||
VPackParser parser(&options);
|
||||
parser.parse(c);
|
||||
|
||||
|
||||
Builder builder;
|
||||
builder.add(parser.steal()->slice());
|
||||
return builder;
|
||||
|
||||
|
||||
}
|
||||
|
||||
Node createNode(char const* c) {
|
||||
|
@ -106,10 +106,10 @@ inline static std::string typeName (Slice const& slice) {
|
|||
}
|
||||
|
||||
TEST_CASE("AddFollower", "[agency][supervision]") {
|
||||
|
||||
|
||||
auto baseStructure = createRootNode();
|
||||
arangodb::RandomGenerator::initialize(arangodb::RandomGenerator::RandomType::MERSENNE);
|
||||
|
||||
|
||||
Builder builder;
|
||||
baseStructure.toBuilder(builder);
|
||||
|
||||
|
@ -117,7 +117,7 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
|
||||
write_ret_t fakeWriteResult {true, "", std::vector<apply_ret_t> {APPLIED}, std::vector<index_t> {1}};
|
||||
trans_ret_t fakeTransResult {true, "", 1, 0, std::make_shared<Builder>()};
|
||||
|
||||
|
||||
SECTION("creating a job should create a job in todo") {
|
||||
Mock<AgentInterface> mockAgent;
|
||||
|
||||
|
@ -144,7 +144,7 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
CHECK(job.get("shard").copyString() == SHARD);
|
||||
CHECK(typeName(job.get("jobId")) == "string");
|
||||
CHECK(typeName(job.get("timeCreated")) == "string");
|
||||
|
||||
|
||||
return fakeWriteResult;
|
||||
});
|
||||
|
||||
|
@ -152,14 +152,14 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
auto& agent = mockAgent.get();
|
||||
auto addFollower = AddFollower(
|
||||
baseStructure(PREFIX), &agent, jobId, "unittest", DATABASE, COLLECTION, SHARD);
|
||||
|
||||
|
||||
addFollower.create();
|
||||
|
||||
|
||||
}
|
||||
|
||||
SECTION("<collection> still exists, if missing, job is finished, move to "
|
||||
"Target/Finished") {
|
||||
|
||||
|
||||
TestStructType createTestStructure = [&](
|
||||
Slice const& s, std::string const& path) {
|
||||
|
||||
|
@ -168,7 +168,7 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
return builder;
|
||||
}
|
||||
builder = std::make_unique<Builder>();
|
||||
|
||||
|
||||
if (s.isObject()) {
|
||||
VPackObjectBuilder b(builder.get());
|
||||
for (auto const& it: VPackObjectIterator(s)) {
|
||||
|
@ -183,14 +183,14 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
} else {
|
||||
builder->add(s);
|
||||
}
|
||||
|
||||
|
||||
return builder;
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -198,9 +198,9 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
REQUIRE(q->slice().length() == 1);
|
||||
REQUIRE(typeName(q->slice()[0]) == "array");
|
||||
// we always simply override! no preconditions...
|
||||
REQUIRE(q->slice()[0].length() == 1);
|
||||
REQUIRE(q->slice()[0].length() == 1);
|
||||
REQUIRE(typeName(q->slice()[0][0]) == "object");
|
||||
|
||||
|
||||
auto writes = q->slice()[0][0];
|
||||
REQUIRE(typeName(writes.get("/arango/Target/ToDo/1")) == "object");
|
||||
REQUIRE(typeName(writes.get("/arango/Target/ToDo/1").get("op")) == "string");
|
||||
|
@ -208,14 +208,14 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
CHECK(typeName(writes.get("/arango/Target/Finished/1")) == "object");
|
||||
return fakeWriteResult;
|
||||
});
|
||||
|
||||
|
||||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
auto& agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).start(aborts);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SECTION("if <collection> has a non-empty distributeShardsLike attribute, the "
|
||||
"job immediately fails and is moved to Target/Failed") {
|
||||
|
||||
|
@ -245,7 +245,7 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
return builder;
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
auto agency = createNodeFromBuilder(*builder);
|
||||
|
@ -269,19 +269,19 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
auto& agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).start(aborts);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
SECTION("condition (*) still holds for the mentioned collections, if not, job "
|
||||
"is finished, move to Target/Finished") {
|
||||
|
||||
TestStructType createTestStructure = [&](
|
||||
Slice const& s, std::string const& path) {
|
||||
|
||||
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
|
||||
if (s.isObject()) {
|
||||
|
||||
|
||||
VPackObjectBuilder b(builder.get());
|
||||
for (auto const& it: VPackObjectIterator(s)) {
|
||||
auto childBuilder =
|
||||
|
@ -306,13 +306,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
}
|
||||
}
|
||||
return builder;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -334,15 +334,15 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
AgentInterface &agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).start(aborts);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
SECTION("if there is no job under Supervision/Shards/<shard> (if so, do "
|
||||
"nothing, leave job in ToDo)") {
|
||||
|
||||
TestStructType createTestStructure =
|
||||
[&](Slice const& s, std::string const& path) {
|
||||
|
||||
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
if (s.isObject()) {
|
||||
VPackObjectBuilder b(builder.get());
|
||||
|
@ -363,13 +363,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
builder->add(s);
|
||||
}
|
||||
return builder;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
auto agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -387,13 +387,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
auto& agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).start(aborts);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
SECTION("we can find one (or more, if needed) which have status 'GOOD', and "
|
||||
"have `Supervision/DBServers/ empty and are not currently in the list "
|
||||
"of servers of the shard, if not, wait") {
|
||||
|
||||
|
||||
TestStructType createTestStructure =
|
||||
[&](Slice const& s, std::string const& path) {
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
|
@ -420,11 +420,11 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
}
|
||||
return builder;
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -445,13 +445,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
|
||||
}
|
||||
|
||||
|
||||
|
||||
SECTION("this job is immediately performed in a single transaction and then "
|
||||
"moved to Target/Finished") {
|
||||
|
||||
|
||||
TestStructType createTestStructure =
|
||||
[&](Slice const& s, std::string const& path) {
|
||||
|
||||
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
if (s.isObject()) {
|
||||
VPackObjectBuilder b(builder.get());
|
||||
|
@ -469,13 +469,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
builder->add(s);
|
||||
}
|
||||
return builder;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -497,16 +497,16 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
AgentInterface &agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).start(aborts);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
SECTION("As long as the job is still in Target/ToDo it can safely be aborted "
|
||||
"and moved to Target/Finished") {
|
||||
|
||||
|
||||
TestStructType createTestStructure =
|
||||
[&](Slice const& s, std::string const& path) {
|
||||
|
||||
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
if (s.isObject()) {
|
||||
VPackObjectBuilder b(builder.get());
|
||||
|
@ -524,13 +524,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
builder->add(s);
|
||||
}
|
||||
return builder;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -551,15 +551,15 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
});
|
||||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
AgentInterface &agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::PENDING, jobId).abort();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::PENDING, jobId).abort("test abort");
|
||||
|
||||
}
|
||||
|
||||
SECTION("Once the job is still in Target/Pending it can no longer be aborted") {
|
||||
|
||||
|
||||
TestStructType createTestStructure =
|
||||
[&](Slice const& s, std::string const& path) {
|
||||
|
||||
|
||||
std::unique_ptr<Builder> builder = std::make_unique<Builder>();
|
||||
if (s.isObject()) {
|
||||
VPackObjectBuilder b(builder.get());
|
||||
|
@ -577,13 +577,13 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
builder->add(s);
|
||||
}
|
||||
return builder;
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
auto builder = createTestStructure(baseStructure.toBuilder().slice(), "");
|
||||
REQUIRE(builder);
|
||||
Node agency = createNodeFromBuilder(*builder);
|
||||
|
||||
|
||||
Mock<AgentInterface> mockAgent;
|
||||
When(Method(mockAgent, write)).AlwaysDo([&](query_t const& q, consensus::AgentInterface::WriteMode w) -> write_ret_t {
|
||||
INFO(q->slice().toJson());
|
||||
|
@ -604,10 +604,10 @@ TEST_CASE("AddFollower", "[agency][supervision]") {
|
|||
});
|
||||
When(Method(mockAgent, waitFor)).AlwaysReturn(AgentInterface::raft_commit_t::OK);
|
||||
AgentInterface &agent = mockAgent.get();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).abort();
|
||||
AddFollower(agency("arango"), &agent, JOB_STATUS::TODO, jobId).abort("test abort");
|
||||
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
}}}
|
||||
|
|
|
@ -896,7 +896,7 @@ SECTION("when the cleanout server job is aborted all subjobs should be aborted t
|
|||
JOB_STATUS::PENDING,
|
||||
JOBID
|
||||
);
|
||||
cleanOutServer.abort();
|
||||
cleanOutServer.abort("test abort");
|
||||
REQUIRE(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -795,7 +795,7 @@ SECTION("the job should be abortable when it is in todo") {
|
|||
JOB_STATUS::TODO,
|
||||
jobId
|
||||
);
|
||||
failedFollower.abort();
|
||||
failedFollower.abort("test abort");
|
||||
Verify(Method(mockAgent, write));
|
||||
}
|
||||
|
||||
|
|
|
@ -1548,7 +1548,7 @@ SECTION("a moveshard job that just made it to ToDo can simply be aborted") {
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, TODO, jobId);
|
||||
moveShard.abort();
|
||||
moveShard.abort("test abort");
|
||||
Verify(Method(mockAgent,write));
|
||||
}
|
||||
|
||||
|
@ -1599,7 +1599,7 @@ SECTION("a pending moveshard job should also put the original server back into p
|
|||
LOG_DEVEL << q->slice().toJson() << " " << __LINE__;
|
||||
auto writes = q->slice()[0][0];
|
||||
CHECK(writes.get("/arango/Target/Pending/1").get("op").copyString() == "delete");
|
||||
REQUIRE(q->slice()[0].length() == 2); // Precondition: to Server not leader yet
|
||||
REQUIRE(q->slice()[0].length() == 2); // Precondition: to Server not leader yet
|
||||
CHECK(writes.get("/arango/Supervision/DBServers/" + FREE_SERVER).get("op").copyString() == "delete");
|
||||
CHECK(writes.get("/arango/Supervision/Shards/" + SHARD).get("op").copyString() == "delete");
|
||||
CHECK(std::string(writes.get("/arango/Plan/Collections/" + DATABASE + "/" + COLLECTION + "/shards/" + SHARD).typeName()) == "array");
|
||||
|
@ -1620,7 +1620,7 @@ SECTION("a pending moveshard job should also put the original server back into p
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, PENDING, jobId);
|
||||
moveShard.abort();
|
||||
moveShard.abort("test abort");
|
||||
Verify(Method(mockAgent,write));
|
||||
}
|
||||
|
||||
|
@ -1829,7 +1829,7 @@ SECTION("aborting the job while a leader transition is in progress (for example
|
|||
|
||||
auto writes = q->slice()[0][0];
|
||||
CHECK(writes.get("/arango/Target/Pending/1").get("op").copyString() == "delete");
|
||||
REQUIRE(q->slice()[0].length() == 2); // Precondition: to Server not leader yet
|
||||
REQUIRE(q->slice()[0].length() == 2); // Precondition: to Server not leader yet
|
||||
CHECK(writes.get("/arango/Supervision/DBServers/" + FREE_SERVER).get("op").copyString() == "delete");
|
||||
CHECK(writes.get("/arango/Supervision/Shards/" + SHARD).get("op").copyString() == "delete");
|
||||
CHECK(std::string(writes.get("/arango/Plan/Collections/" + DATABASE + "/" + COLLECTION + "/shards/" + SHARD).typeName()) == "array");
|
||||
|
@ -1849,7 +1849,7 @@ SECTION("aborting the job while a leader transition is in progress (for example
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, PENDING, jobId);
|
||||
moveShard.abort();
|
||||
moveShard.abort("test abort");
|
||||
Verify(Method(mockAgent,write));
|
||||
}
|
||||
|
||||
|
@ -2155,7 +2155,7 @@ SECTION("when aborting a moveshard job that is moving stuff away from a follower
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, PENDING, jobId);
|
||||
moveShard.abort();
|
||||
moveShard.abort("test abort");
|
||||
Verify(Method(mockAgent,write));
|
||||
}
|
||||
|
||||
|
@ -2213,7 +2213,7 @@ SECTION("if aborting failed report it back properly") {
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, PENDING, jobId);
|
||||
auto result = moveShard.abort();
|
||||
auto result = moveShard.abort("test abort");
|
||||
CHECK_FALSE(result.ok());
|
||||
CHECK(result.errorNumber() == TRI_ERROR_SUPERVISION_GENERAL_FAILURE);
|
||||
}
|
||||
|
@ -2272,7 +2272,7 @@ SECTION("if aborting failed due to a precondition report it properly") {
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, PENDING, jobId);
|
||||
auto result = moveShard.abort();
|
||||
auto result = moveShard.abort("test abort");
|
||||
CHECK_FALSE(result.ok());
|
||||
CHECK(result.errorNumber() == TRI_ERROR_SUPERVISION_GENERAL_FAILURE);
|
||||
}
|
||||
|
@ -2331,7 +2331,7 @@ SECTION("trying to abort a finished should result in failure") {
|
|||
|
||||
INFO("Agency: " << agency);
|
||||
auto moveShard = MoveShard(agency, &agent, FINISHED, jobId);
|
||||
auto result = moveShard.abort();
|
||||
auto result = moveShard.abort("test abort");
|
||||
CHECK_FALSE(result.ok());
|
||||
CHECK(result.errorNumber() == TRI_ERROR_SUPERVISION_GENERAL_FAILURE);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue