Merge pull request #9067 from trociny/fixup-mirror_image_status_list

cls::rbd: mirror_image_status_list returned max 64 items

Reviewed-by: Jason Dillaman <dillaman@redhat.com>
This commit is contained in:
Jason Dillaman 2016-05-11 08:23:23 -04:00
commit 24578f6d13
2 changed files with 65 additions and 2 deletions

View File

@ -3320,8 +3320,8 @@ int image_status_list(cls_method_context_t hctx,
(*mirror_images)[image_id] = mirror_image;
cls::rbd::MirrorImageStatus status;
r = image_status_get(hctx, mirror_image.global_image_id, &status);
if (r < 0) {
int r1 = image_status_get(hctx, mirror_image.global_image_id, &status);
if (r1 < 0) {
continue;
}

View File

@ -1631,4 +1631,67 @@ TEST_F(TestClsRbd, mirror_image_status) {
ASSERT_EQ(0, mirror_image_status_get_summary(&ioctx, &states));
ASSERT_EQ(1U, states.size());
ASSERT_EQ(3, states[cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN]);
// Remove images
image1.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
image2.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
image3.state = cls::rbd::MIRROR_IMAGE_STATE_DISABLING;
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id1", image1));
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id2", image2));
ASSERT_EQ(0, mirror_image_set(&ioctx, "image_id3", image3));
ASSERT_EQ(0, mirror_image_remove(&ioctx, "image_id1"));
ASSERT_EQ(0, mirror_image_remove(&ioctx, "image_id2"));
ASSERT_EQ(0, mirror_image_remove(&ioctx, "image_id3"));
states.clear();
ASSERT_EQ(0, mirror_image_status_get_summary(&ioctx, &states));
ASSERT_EQ(0U, states.size());
// Test status list with large number of images
size_t N = 1024;
ASSERT_EQ(0U, N % 2);
for (size_t i = 0; i < N; i++) {
std::string id = "id" + stringify(i);
std::string uuid = "uuid" + stringify(i);
cls::rbd::MirrorImage image(uuid, cls::rbd::MIRROR_IMAGE_STATE_ENABLED);
cls::rbd::MirrorImageStatus status(cls::rbd::MIRROR_IMAGE_STATUS_STATE_UNKNOWN);
ASSERT_EQ(0, mirror_image_set(&ioctx, id, image));
ASSERT_EQ(0, mirror_image_status_set(&ioctx, uuid, status));
}
std::string last_read = "";
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, last_read, N * 2, &images,
&statuses));
ASSERT_EQ(N, images.size());
ASSERT_EQ(N, statuses.size());
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, last_read, N / 2, &images,
&statuses));
ASSERT_EQ(N / 2, images.size());
ASSERT_EQ(N / 2, statuses.size());
last_read = images.rbegin()->first;
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, last_read, N / 2, &images,
&statuses));
ASSERT_EQ(N / 2, images.size());
ASSERT_EQ(N / 2, statuses.size());
last_read = images.rbegin()->first;
images.clear();
statuses.clear();
ASSERT_EQ(0, mirror_image_status_list(&ioctx, last_read, N / 2, &images,
&statuses));
ASSERT_EQ(0U, images.size());
ASSERT_EQ(0U, statuses.size());
}