From 526a35e1f3a77466ca0047207686be091b4a9c39 Mon Sep 17 00:00:00 2001 From: Camille Perin Date: Mon, 27 Apr 2020 11:15:42 +0200 Subject: [PATCH 1/2] Add cancellation test and progress display --- tests/CMakeLists.txt | 1 + tests/OpenVDS/RequestCancellation.cpp | 62 +++++++++++++++++++++++++++ tests/OpenVDS/RequestVolumeTraces.cpp | 12 +++++- tests/OpenVDS/WaitForCompletion.cpp | 1 + 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/OpenVDS/RequestCancellation.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e0e00e0e..202be86a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -79,6 +79,7 @@ add_test_executable(openvds_integration_tests OpenVDS/RequestVolumeSubsetFormat.cpp OpenVDS/DataAccessorClone.cpp OpenVDS/WaitForCompletion.cpp + OpenVDS/RequestCancellation.cpp ) add_test_executable(multithreaded_requests diff --git a/tests/OpenVDS/RequestCancellation.cpp b/tests/OpenVDS/RequestCancellation.cpp new file mode 100644 index 00000000..d6a0cf88 --- /dev/null +++ b/tests/OpenVDS/RequestCancellation.cpp @@ -0,0 +1,62 @@ +/**************************************************************************** +** Copyright 2020 The Open Group +** Copyright 2020 Bluware, Inc. +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +****************************************************************************/ + +#include +#include +#include +#include + +#include +#include + +#include "../utils/GenerateVDS.h" +#include "../utils/SlowIOManager.h" + +#include +#include + +TEST(OpenVDS_integration, RequestCancellation) +{ + OpenVDS::InMemoryOpenOptions options; + OpenVDS::Error error; + std::unique_ptr inMemory(new OpenVDS::IOManagerInMemory(options, error)); + SlowIOManager* slowIOManager = new SlowIOManager(50, inMemory.get()); + std::unique_ptr handle(generateSimpleInMemory3DVDS(60,60,60, OpenVDS::VolumeDataChannelDescriptor::Format_U8, OpenVDS::VolumeDataLayoutDescriptor::BrickSize_32, slowIOManager), OpenVDS::Close); + fill3DVDSWithBitNoise(handle.get()); + OpenVDS::VolumeDataLayout *layout = OpenVDS::GetLayout(handle.get()); + OpenVDS::VolumeDataAccessManager *accessManager = OpenVDS::GetAccessManager(handle.get()); + + int32_t minPos[OpenVDS::Dimensionality_Max]; + int32_t maxPos[OpenVDS::Dimensionality_Max]; + int32_t voxelCount; + minPos[0] = 0; minPos[1] = 10; minPos[2] = 10; + maxPos[0] = 50; maxPos[1] = 60; maxPos[2] = 50; + voxelCount = (maxPos[0] - minPos[0]) * (maxPos[1] - minPos[1]) * (maxPos[2] - minPos[2]); + + std::vector bufferFloat; + bufferFloat.resize(voxelCount); + + for (int i = 0; i < 10 ; i++) { + int64_t requestFloat = accessManager->RequestVolumeSubset(bufferFloat.data(), layout, OpenVDS::Dimensions_012, 0, + 0, minPos, maxPos, + OpenVDS::VolumeDataChannelDescriptor::Format_R32); + accessManager->Cancel(requestFloat); + ASSERT_FALSE(accessManager->WaitForCompletion(requestFloat)); + ASSERT_TRUE(accessManager->IsCanceled(requestFloat)); + ASSERT_FALSE(accessManager->IsCanceled(requestFloat)); + } +} diff --git a/tests/OpenVDS/RequestVolumeTraces.cpp b/tests/OpenVDS/RequestVolumeTraces.cpp index 5e468082..1de83359 100644 --- a/tests/OpenVDS/RequestVolumeTraces.cpp +++ b/tests/OpenVDS/RequestVolumeTraces.cpp @@ -70,7 +70,17 @@ GTEST_TEST(OpenVDS_integration, SimpleRequestVolumeTraces) } int64_t requestId = accessManager->RequestVolumeTraces(buffer.data(), layout, OpenVDS::Dimensions_012, 0, 0, tracePos, 10, OpenVDS::InterpolationMethod::Nearest, 0); - accessManager->WaitForCompletion(requestId); + + float previousProgress = -1; + while(!accessManager->WaitForCompletion(requestId,1000)){ + ASSERT_FALSE(accessManager->IsCanceled(requestId)); + + float progress = accessManager->GetCompletionFactor(requestId); + if (progress != previousProgress) { + previousProgress = progress; + GTEST_LOG_(INFO) << "Request progress : " << progress * 100. << " %"; + } + } auto pageAccessor = accessManager->CreateVolumeDataPageAccessor(layout, OpenVDS::Dimensions_012, 0, 0, 1000, OpenVDS::VolumeDataAccessManager::AccessMode_ReadOnly); auto valueReader = accessManager->Create3DInterpolatingVolumeDataAccessorR32(pageAccessor, 0.0f, OpenVDS::InterpolationMethod::Nearest); diff --git a/tests/OpenVDS/WaitForCompletion.cpp b/tests/OpenVDS/WaitForCompletion.cpp index 093f321b..35045b9a 100644 --- a/tests/OpenVDS/WaitForCompletion.cpp +++ b/tests/OpenVDS/WaitForCompletion.cpp @@ -53,4 +53,5 @@ TEST(WaitForCompletion, waitTimeout) ASSERT_FALSE(accessManager->WaitForCompletion(requestFloat, 1)); ASSERT_TRUE(accessManager->WaitForCompletion(requestFloat, 0)); + ASSERT_FALSE(accessManager->WaitForCompletion(requestFloat, 0)); } -- GitLab From b6b30431d08582b1ee14b4101353f476d2ad0e45 Mon Sep 17 00:00:00 2001 From: Camille Perin Date: Mon, 27 Apr 2020 11:57:55 +0200 Subject: [PATCH 2/2] Split request launch and request cancellation in different loops --- tests/OpenVDS/RequestCancellation.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/OpenVDS/RequestCancellation.cpp b/tests/OpenVDS/RequestCancellation.cpp index d6a0cf88..94553285 100644 --- a/tests/OpenVDS/RequestCancellation.cpp +++ b/tests/OpenVDS/RequestCancellation.cpp @@ -50,13 +50,19 @@ TEST(OpenVDS_integration, RequestCancellation) std::vector bufferFloat; bufferFloat.resize(voxelCount); + std::vector requests; for (int i = 0; i < 10 ; i++) { int64_t requestFloat = accessManager->RequestVolumeSubset(bufferFloat.data(), layout, OpenVDS::Dimensions_012, 0, 0, minPos, maxPos, OpenVDS::VolumeDataChannelDescriptor::Format_R32); - accessManager->Cancel(requestFloat); - ASSERT_FALSE(accessManager->WaitForCompletion(requestFloat)); - ASSERT_TRUE(accessManager->IsCanceled(requestFloat)); - ASSERT_FALSE(accessManager->IsCanceled(requestFloat)); + requests.emplace_back(requestFloat); + } + for (auto &req : requests){ + accessManager->Cancel(req); + if (!accessManager->IsCompleted(req)) { + ASSERT_FALSE(accessManager->WaitForCompletion(req)); + ASSERT_TRUE(accessManager->IsCanceled(req)); + ASSERT_FALSE(accessManager->IsCanceled(req)); + } } } -- GitLab