1
0
Fork 0

Added reason to job abort method. (#8877)

This commit is contained in:
Lars Maier 2019-05-14 15:39:53 +02:00 committed by Max Neunhöffer
parent 2bb96eedac
commit 49c568e674
23 changed files with 116 additions and 113 deletions

View File

@ -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;
}

View File

@ -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();

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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();

View File

@ -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;
}

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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;

View File

@ -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
// ??????????????
}

View File

@ -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;
};

View File

@ -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(),

View File

@ -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);
}
}

View File

@ -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

View File

@ -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(

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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");
}
};
}}}

View File

@ -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);
}

View File

@ -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));
}

View File

@ -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);
}