diff options
Diffstat (limited to 'storage/src/tests/distributor/pendingmessagetrackertest.cpp')
-rw-r--r-- | storage/src/tests/distributor/pendingmessagetrackertest.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/storage/src/tests/distributor/pendingmessagetrackertest.cpp b/storage/src/tests/distributor/pendingmessagetrackertest.cpp index 71b51c9a7b6..72365c61597 100644 --- a/storage/src/tests/distributor/pendingmessagetrackertest.cpp +++ b/storage/src/tests/distributor/pendingmessagetrackertest.cpp @@ -93,6 +93,16 @@ public: return cmd; } + std::shared_ptr<api::GetCommand> create_get_to_node(uint16_t node) const { + document::BucketId bucket(16, 1234); + auto cmd = std::make_shared<api::GetCommand>( + makeDocumentBucket(bucket), + document::DocumentId("id::testdoctype1:n=1234:foo"), + "[all]"); + cmd->setAddress(makeStorageAddress(node)); + return cmd; + } + PendingMessageTracker& tracker() { return *_tracker; } auto& clock() { return _clock; } @@ -444,7 +454,7 @@ document::BucketId bucket_of(const document::DocumentId& id) { } -TEST_F(PendingMessageTrackerTest, start_deferred_task_immediately_if_no_pending_ops) { +TEST_F(PendingMessageTrackerTest, start_deferred_task_immediately_if_no_pending_write_ops) { Fixture f; auto cmd = f.createPutToNode(0); auto bucket_id = bucket_of(cmd->getDocumentId()); @@ -455,6 +465,18 @@ TEST_F(PendingMessageTrackerTest, start_deferred_task_immediately_if_no_pending_ EXPECT_EQ(state, TaskRunState::OK); } +TEST_F(PendingMessageTrackerTest, start_deferred_task_immediately_if_only_pending_read_ops) { + Fixture f; + auto cmd = f.create_get_to_node(0); + f.tracker().insert(cmd); + auto bucket_id = bucket_of(cmd->getDocumentId()); + auto state = TaskRunState::Aborted; + f.tracker().run_once_no_pending_for_bucket(makeDocumentBucket(bucket_id), make_deferred_task([&](TaskRunState s){ + state = s; + })); + EXPECT_EQ(state, TaskRunState::OK); +} + TEST_F(PendingMessageTrackerTest, deferred_task_not_started_before_pending_ops_completed) { Fixture f; auto cmd = f.sendPut(RequestBuilder().toNode(0)); @@ -468,6 +490,20 @@ TEST_F(PendingMessageTrackerTest, deferred_task_not_started_before_pending_ops_c EXPECT_EQ(state, TaskRunState::OK); } +TEST_F(PendingMessageTrackerTest, deferred_task_can_be_started_with_pending_read_op) { + Fixture f; + auto cmd = f.sendPut(RequestBuilder().toNode(0)); + auto bucket_id = bucket_of(cmd->getDocumentId()); + auto state = TaskRunState::Aborted; + f.tracker().run_once_no_pending_for_bucket(makeDocumentBucket(bucket_id), make_deferred_task([&](TaskRunState s){ + state = s; + })); + EXPECT_EQ(state, TaskRunState::Aborted); + f.tracker().insert(f.create_get_to_node(0)); // Concurrent Get and Put + f.sendPutReply(*cmd, RequestBuilder()); // Deferred task should be allowed to run + EXPECT_EQ(state, TaskRunState::OK); +} + TEST_F(PendingMessageTrackerTest, abort_invokes_deferred_tasks_with_aborted_status) { Fixture f; auto cmd = f.sendPut(RequestBuilder().toNode(0)); |