: test_mock_image_map(test_mock_image_map) {
}
- MOCK_METHOD1(mock_acquire_image, void(const std::string &));
- MOCK_METHOD1(mock_release_image, void(const std::string &));
- MOCK_METHOD2(mock_remove_image, void(const std::string &, const std::string &));
+ MOCK_METHOD2(mock_acquire_image, void(const std::string &, Context*));
+ MOCK_METHOD2(mock_release_image, void(const std::string &, Context*));
+ MOCK_METHOD3(mock_remove_image, void(const std::string &,
+ const std::string &, Context*));
void acquire_image(const std::string &global_image_id,
- const std::string &instance_id) {
- mock_acquire_image(global_image_id);
+ const std::string &instance_id, Context* on_finish) {
+ mock_acquire_image(global_image_id, on_finish);
}
void release_image(const std::string &global_image_id,
- const std::string &instance_id) {
- mock_release_image(global_image_id);
+ const std::string &instance_id, Context* on_finish) {
+ mock_release_image(global_image_id, on_finish);
}
void remove_image(const std::string &mirror_uuid,
const std::string &global_image_id,
- const std::string &instance_id) {
- mock_remove_image(mirror_uuid, global_image_id);
+ const std::string &instance_id, Context* on_finish) {
+ mock_remove_image(mirror_uuid, global_image_id, on_finish);
}
};
}
void expect_listener_acquire_image(MockListener &mock_listener,
- const std::string &global_image_id) {
- EXPECT_CALL(mock_listener, mock_acquire_image(global_image_id))
- .WillOnce(WithoutArgs(Invoke([this]() {
+ const std::string &global_image_id,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ EXPECT_CALL(mock_listener, mock_acquire_image(global_image_id, _))
+ .WillOnce(WithArg<1>(Invoke([this, global_image_id, peer_ack_ctxs](Context* ctx) {
Mutex::Locker locker(m_lock);
+ peer_ack_ctxs->insert({global_image_id, ctx});
++m_notify_update_count;
m_cond.Signal();
})));
}
void expect_listener_release_image(MockListener &mock_listener,
- const std::string &global_image_id) {
- EXPECT_CALL(mock_listener, mock_release_image(global_image_id))
- .WillOnce(WithoutArgs(Invoke([this]() {
+ const std::string &global_image_id,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ EXPECT_CALL(mock_listener, mock_release_image(global_image_id, _))
+ .WillOnce(WithArg<1>(Invoke([this, global_image_id, peer_ack_ctxs](Context* ctx) {
Mutex::Locker locker(m_lock);
+ peer_ack_ctxs->insert({global_image_id, ctx});
++m_notify_update_count;
m_cond.Signal();
})));
void expect_listener_remove_image(MockListener &mock_listener,
const std::string &mirror_uuid,
- const std::string &global_image_id) {
- EXPECT_CALL(mock_listener, mock_remove_image(mirror_uuid, global_image_id))
- .WillOnce(WithoutArgs(Invoke([this]() {
+ const std::string &global_image_id,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ EXPECT_CALL(mock_listener,
+ mock_remove_image(mirror_uuid, global_image_id, _))
+ .WillOnce(WithArg<2>(Invoke([this, global_image_id, peer_ack_ctxs](Context* ctx) {
Mutex::Locker locker(m_lock);
+ peer_ack_ctxs->insert({global_image_id, ctx});
++m_notify_update_count;
m_cond.Signal();
})));
}
void expect_listener_images_unmapped(MockListener &mock_listener,
- std::set<std::string> *global_image_ids) {
- EXPECT_CALL(mock_listener, mock_release_image(_))
+ std::set<std::string> *global_image_ids,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ EXPECT_CALL(mock_listener, mock_release_image(_, _))
.Times(AtLeast(0))
- .WillRepeatedly(WithArg<0>(Invoke([this, global_image_ids](std::string global_image_id) {
+ .WillRepeatedly(Invoke([this, global_image_ids, peer_ack_ctxs](std::string global_image_id, Context* ctx) {
Mutex::Locker locker(m_lock);
global_image_ids->emplace(global_image_id);
+ peer_ack_ctxs->insert({global_image_id, ctx});
++m_notify_update_count;
m_cond.Signal();
- })));
+ }));
}
void remote_peer_ack_nowait(MockImageMap *image_map,
- const std::set<std::string> &global_image_ids, int ret) {
- for (auto const &global_image_id : global_image_ids) {
- image_map->handle_peer_ack(global_image_id, ret);
+ const std::set<std::string> &global_image_ids,
+ int ret,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ for (auto& global_image_id : global_image_ids) {
+ auto it = peer_ack_ctxs->find(global_image_id);
+ ASSERT_TRUE(it != peer_ack_ctxs->end());
+ it->second->complete(ret);
+ peer_ack_ctxs->erase(it);
}
}
void remote_peer_ack_wait(MockImageMap *image_map,
- const std::set<std::string> &global_image_ids, int ret) {
- for (auto const &global_image_id : global_image_ids) {
- image_map->handle_peer_ack(global_image_id, ret);
+ const std::set<std::string> &global_image_ids,
+ int ret,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ for (auto& global_image_id : global_image_ids) {
+ auto it = peer_ack_ctxs->find(global_image_id);
+ ASSERT_TRUE(it != peer_ack_ctxs->end());
+ it->second->complete(ret);
+ peer_ack_ctxs->erase(it);
ASSERT_TRUE(wait_for_map_update(1));
}
}
void remote_peer_ack_listener_wait(MockImageMap *image_map,
- const std::set<std::string> &global_image_ids, int ret) {
- for (auto const &global_image_id : global_image_ids) {
- image_map->handle_peer_ack(global_image_id, ret);
+ const std::set<std::string> &global_image_ids,
+ int ret,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
+ for (auto& global_image_id : global_image_ids) {
+ auto it = peer_ack_ctxs->find(global_image_id);
+ ASSERT_TRUE(it != peer_ack_ctxs->end());
+ it->second->complete(ret);
+ peer_ack_ctxs->erase(it);
ASSERT_TRUE(wait_for_map_update(1));
ASSERT_TRUE(wait_for_listener_notify(1));
}
void update_map_and_acquire(MockThreads &mock_threads,
MockUpdateRequest &mock_update_request,
MockListener &mock_listener,
- const std::set<std::string> &global_image_ids, int ret) {
+ const std::set<std::string> &global_image_ids,
+ int ret,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
for (auto const &global_image_id : global_image_ids) {
expect_add_event(mock_threads);
expect_update_request(mock_update_request, ret);
expect_add_event(mock_threads);
- expect_listener_acquire_image(mock_listener, global_image_id);
+ expect_listener_acquire_image(mock_listener, global_image_id,
+ peer_ack_ctxs);
}
}
}
void listener_acquire_images(MockListener &mock_listener,
- const std::set<std::string> &global_image_ids) {
+ const std::set<std::string> &global_image_ids,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
for (auto const &global_image_id : global_image_ids) {
- expect_listener_acquire_image(mock_listener, global_image_id);
+ expect_listener_acquire_image(mock_listener, global_image_id,
+ peer_ack_ctxs);
}
}
void listener_release_images(MockListener &mock_listener,
- const std::set<std::string> &global_image_ids) {
+ const std::set<std::string> &global_image_ids,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
for (auto const &global_image_id : global_image_ids) {
- expect_listener_release_image(mock_listener, global_image_id);
+ expect_listener_release_image(mock_listener, global_image_id,
+ peer_ack_ctxs);
}
}
void listener_remove_images(MockListener &mock_listener,
const std::string &mirror_uuid,
- std::set<std::string> &global_image_ids) {
+ std::set<std::string> &global_image_ids,
+ std::map<std::string, Context*> *peer_ack_ctxs) {
for (auto const &global_image_id : global_image_ids) {
- expect_listener_remove_image(mock_listener, mirror_uuid, global_image_id);
+ expect_listener_remove_image(mock_listener, mirror_uuid, global_image_id,
+ peer_ack_ctxs);
}
}
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids, &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("", std::move(initial_global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(initial_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// RELEASE+REMOVE_MAPPING
expect_add_event(mock_threads);
- listener_release_images(mock_listener, remove_global_image_ids);
- update_map_request(mock_threads, mock_update_request, remove_global_image_ids, 0);
+ listener_release_images(mock_listener, remove_global_image_ids,
+ &peer_ack_ctxs);
+ update_map_request(mock_threads, mock_update_request, remove_global_image_ids,
+ 0);
// remove images
mock_image_map->update_images("", {}, std::move(remove_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(remove_global_image_ids_ack.size()));
- remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_global_image_ids,
+ &peer_ack_ctxs);
// initial image list
- mock_image_map->update_images("uuid1", std::move(initial_global_image_ids), {});
+ mock_image_map->update_images("uuid1", std::move(initial_global_image_ids),
+ {});
ASSERT_TRUE(wait_for_map_update(1));
ASSERT_TRUE(wait_for_listener_notify(initial_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// RELEASE+REMOVE_MAPPING
- listener_remove_images(mock_listener, "uuid1", remove_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", remove_global_image_ids,
+ &peer_ack_ctxs);
expect_add_event(mock_threads);
- listener_release_images(mock_listener, remove_global_image_ids);
- update_map_request(mock_threads, mock_update_request, remove_global_image_ids, 0);
+ listener_release_images(mock_listener, remove_global_image_ids,
+ &peer_ack_ctxs);
+ update_map_request(mock_threads, mock_update_request, remove_global_image_ids,
+ 0);
// remove images
mock_image_map->update_images("uuid1", {}, std::move(remove_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(remove_global_image_ids_ack.size() * 2));
- remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("uuid1", std::move(initial_global_image_ids), {});
mock_image_map->update_images("uuid1", std::move(initial_global_image_ids_dup), {});
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// RELEASE+REMOVE_MAPPING
- listener_remove_images(mock_listener, "uuid1", remove_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", remove_global_image_ids,
+ &peer_ack_ctxs);
expect_add_event(mock_threads);
- listener_release_images(mock_listener, remove_global_image_ids);
+ listener_release_images(mock_listener, remove_global_image_ids,
+ &peer_ack_ctxs);
update_map_request(mock_threads, mock_update_request, remove_global_image_ids, 0);
// remove images
mock_image_map->update_images("uuid1", {}, std::move(remove_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(remove_global_image_ids_ack.size() * 2));
- remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(), remove_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// trigger duplicate "remove" notification
mock_image_map->update_images("uuid1", {}, std::move(remove_global_image_ids_dup));
expect_add_event(mock_threads);
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("uuid1", std::move(initial_global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(initial_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), initial_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_remote_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_remote_global_image_ids,
+ &peer_ack_ctxs);
// initial remote image list
mock_image_map->update_images("uuid1", std::move(initial_remote_global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(initial_remote_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_remote_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(),
+ initial_remote_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// set initial local image list -- this is a no-op from policy pov
mock_image_map->update_images("", std::move(initial_local_global_image_ids), {});
// remove remote images -- this should be a no-op from policy pov
// except the listener notification
- listener_remove_images(mock_listener, "uuid1", remote_remove_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", remote_remove_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_images("uuid1", {}, std::move(remote_remove_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(remote_remove_global_image_ids_ack.size()));
// RELEASE+REMOVE_MAPPING
expect_add_event(mock_threads);
- listener_release_images(mock_listener, local_remove_global_image_ids);
+ listener_release_images(mock_listener, local_remove_global_image_ids,
+ &peer_ack_ctxs);
update_map_request(mock_threads, mock_update_request, local_remove_global_image_ids, 0);
// remove local images
mock_image_map->update_images("", {}, std::move(local_remove_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(local_remove_global_image_ids_ack.size()));
- remote_peer_ack_wait(mock_image_map.get(), local_remove_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(), local_remove_global_image_ids_ack,
+ 0, &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("uuid1", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids;
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_instances_added({"9876"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids,
+ &peer_ack_ctxs);
// set initial image list
mock_image_map->update_images("uuid1", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
// remote peer ACKs image acquire request -- completing action
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids;
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
-
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
+
mock_image_map->update_instances_added({"9876"});
wait_for_scheduled_task();
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
shuffled_global_image_ids.clear();
// remove added instance
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_instances_removed({"9876"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids,
+ &peer_ack_ctxs);
// set initial image list
mock_image_map->update_images("uuid1", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
// remote peer ACKs image acquire request -- completing action
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids;
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_instances_added({"9876"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
std::set<std::string> migrated_global_image_ids(shuffled_global_image_ids);
shuffled_global_image_ids.clear();
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
// add another instance
mock_image_map->update_instances_added({"5432"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
// shuffle set should be distinct
std::set<std::string> reshuffled;
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("uuid1", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_map_update(1));
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids;
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_instances_added({"9876"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
// completion shuffle action for now (re)mapped images
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids_ack(shuffled_global_image_ids);
// RELEASE
- listener_remove_images(mock_listener, "uuid1", shuffled_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", shuffled_global_image_ids,
+ &peer_ack_ctxs);
expect_add_event(mock_threads);
- listener_release_images(mock_listener, shuffled_global_image_ids);
+ listener_release_images(mock_listener, shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_images("uuid1", {}, std::move(shuffled_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids_ack.size() * 2));
// instance failed -- update policy for instance removal
mock_image_map->update_instances_removed({"9876"});
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, -EBLACKLISTED);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids,
+ -EBLACKLISTED, &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, global_image_ids,
+ &peer_ack_ctxs);
// initial image list
mock_image_map->update_images("uuid1", std::move(global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), global_image_ids_ack, 0,
+ &peer_ack_ctxs);
std::set<std::string> shuffled_global_image_ids;
// RELEASE+UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
- expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids);
+ expect_listener_images_unmapped(mock_listener, &shuffled_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_instances_added({"9876"});
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids.size()));
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ 0, &peer_ack_ctxs);
mock_image_map->update_instances_removed({"9876"});
// instance blacklisted -- ACQUIRE request fails
update_map_and_acquire(mock_threads, mock_update_request,
- mock_listener, shuffled_global_image_ids, 0);
- remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids, -EBLACKLISTED);
+ mock_listener, shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
+ remote_peer_ack_listener_wait(mock_image_map.get(), shuffled_global_image_ids,
+ -EBLACKLISTED, &peer_ack_ctxs);
// new peer acks acquire request
- remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0);
+ remote_peer_ack_nowait(mock_image_map.get(), shuffled_global_image_ids, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
std::set<std::string> shuffled_global_image_ids_ack(shuffled_global_image_ids);
// remove image
- listener_remove_images(mock_listener, "uuid1", shuffled_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", shuffled_global_image_ids,
+ &peer_ack_ctxs);
expect_add_event(mock_threads);
- listener_release_images(mock_listener, shuffled_global_image_ids);
+ listener_release_images(mock_listener, shuffled_global_image_ids,
+ &peer_ack_ctxs);
update_map_request(mock_threads, mock_update_request, shuffled_global_image_ids, 0);
mock_image_map->update_images("uuid1", {}, std::move(shuffled_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(shuffled_global_image_ids_ack.size() * 2));
- remote_peer_ack_wait(mock_image_map.get(), shuffled_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(), shuffled_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));
MockUpdateRequest mock_update_request;
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, initial_remote_global_image_ids);
+ std::map<std::string, Context*> peer_ack_ctxs;
+ listener_acquire_images(mock_listener, initial_remote_global_image_ids,
+ &peer_ack_ctxs);
// initial remote image list
mock_image_map->update_images("uuid1", std::move(initial_remote_global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(initial_remote_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), initial_remote_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(),
+ initial_remote_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// RELEASE+REMOVE_MAPPING
- listener_remove_images(mock_listener, "uuid1", remote_removed_global_image_ids);
+ listener_remove_images(mock_listener, "uuid1", remote_removed_global_image_ids,
+ &peer_ack_ctxs);
expect_add_event(mock_threads);
- listener_release_images(mock_listener, remote_removed_global_image_ids);
+ listener_release_images(mock_listener, remote_removed_global_image_ids,
+ &peer_ack_ctxs);
update_map_request(mock_threads, mock_update_request, remote_removed_global_image_ids, 0);
mock_image_map->update_images("uuid1", {}, std::move(remote_removed_global_image_ids));
ASSERT_TRUE(wait_for_listener_notify(remote_removed_global_image_ids_ack.size() * 2));
- remote_peer_ack_wait(mock_image_map.get(), remote_removed_global_image_ids_ack, 0);
+ remote_peer_ack_wait(mock_image_map.get(),
+ remote_removed_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
// UPDATE_MAPPING+ACQUIRE
expect_add_event(mock_threads);
expect_update_request(mock_update_request, 0);
expect_add_event(mock_threads);
- listener_acquire_images(mock_listener, remote_added_global_image_ids);
+ listener_acquire_images(mock_listener, remote_added_global_image_ids,
+ &peer_ack_ctxs);
mock_image_map->update_images("uuid2", std::move(remote_added_global_image_ids), {});
ASSERT_TRUE(wait_for_listener_notify(remote_added_global_image_ids_ack.size()));
// remote peer ACKs image acquire request
- remote_peer_ack_nowait(mock_image_map.get(), remote_added_global_image_ids_ack, 0);
+ remote_peer_ack_nowait(mock_image_map.get(),
+ remote_added_global_image_ids_ack, 0,
+ &peer_ack_ctxs);
wait_for_scheduled_task();
ASSERT_EQ(0, when_shut_down(mock_image_map.get()));