Skip to content

Commit

Permalink
fix for computed bucket size with remainder for numeric segmentation …
Browse files Browse the repository at this point in the history
…(MID-7326)
  • Loading branch information
skublik committed Oct 20, 2021
1 parent c1d6cde commit 770ef79
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ private BigInteger getOrComputeBucketSize() {
if (segmentationConfig.getBucketSize() != null) {
return segmentationConfig.getBucketSize();
} else if (segmentationConfig.getTo() != null && segmentationConfig.getNumberOfBuckets() != null) {
return segmentationConfig.getTo().subtract(getFrom()).divide(BigInteger.valueOf(segmentationConfig.getNumberOfBuckets()));
BigInteger[] bi = segmentationConfig.getTo().subtract(getFrom())
.divideAndRemainder(BigInteger.valueOf(segmentationConfig.getNumberOfBuckets()));
return bi[1].equals(BigInteger.ZERO) ? bi[0] : bi[0].add(BigInteger.ONE);
} else {
throw new IllegalStateException("Neither numberOfBuckets nor to + bucketSize is specified");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public class TestWorkerTasks extends AbstractRepoCommonTest {
private static final TestResource<TaskType> TASK_140_WORKERS_UPDATE = new TestResource<>(TEST_DIR, "task-140-workers-update.xml", "8ef8e606-3c3e-45c7-bca7-e64eb47de1e4");
private static final TestResource<TaskType> TASK_150_WORKERS_MOVE = new TestResource<>(TEST_DIR, "task-150-workers-move.xml", "f3efb438-c573-4631-bbff-ba9e09b3ae03");
private static final TestResource<TaskType> TASK_160_WORKERS_ADD_DELETE = new TestResource<>(TEST_DIR, "task-160-workers-add-delete.xml", "9e94e921-d319-422a-b9d6-9e98d9034975");
private static final TestResource<TaskType> TASK_170_NUMBER_SEGMENTATION_NUMBER_OF_BUCKETS = new TestResource<>(TEST_DIR, "task-170-num-seg-num-of-buckets.xml", "33b0f9bb-15bd-4f64-bd08-11aad034e77q");

private static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml");

Expand Down Expand Up @@ -752,4 +753,62 @@ private void setScavenger(Task task, boolean value) throws SchemaException {
ActivityStateType.F_BUCKETING, ActivityBucketingStateType.F_SCAVENGER).replace(value)
.asItemDeltas());
}

/**
* Checks the generation number of buckets and real number of buckets. Exists definition for numberOfBuckets + from + to.
*/
@Test
public void test170NumberSegmentationNumberOfBuckets() throws Exception {
given();
OperationResult result = createOperationResult();

mockRecorder.reset();

// Although we have a lot of roles, buckets for this task cover only from 5 to 100.
List<RoleType> roles = allRoles.subList(5, 100);

when();
Task root = taskAdd(TASK_170_NUMBER_SEGMENTATION_NUMBER_OF_BUCKETS, result);

then();
try {
waitForTaskTreeCloseCheckingSuspensionWithError(root.getOid(), result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL);

root.refresh(result);
assertTaskTreeAfter170(root, result);
assertExecutions(roles, 1);
} finally {
suspendAndDeleteTasks(root.getOid());
}
}

private void assertTaskTreeAfter170(Task root, OperationResult result) throws SchemaException {
// @formatter:off
assertTask(root, "after run")
.display()
.assertClosed()
.assertSuccess()
.loadSubtasksDeeply(result)
.progressInformation() // this is for the whole tree
.display()
.assertBuckets(10, 10)
.assertItems(95, null)
.end()
.assertSubtasks(2)
.subtask("Worker DefaultNode:1 for root activity in task-170")
.assertClosed()
.assertSuccess()
.rootItemProcessingInformation()
.display()
.end()
.end()
.subtask("Worker DefaultNode:2 for root activity in task-170")
.assertClosed()
.assertSuccess()
.rootItemProcessingInformation()
.display()
.end()
.end();
// @formatter:on
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2018 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<task oid="33b0f9bb-15bd-4f64-bd08-11aad034e77q"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:ext="http://midpoint.evolveum.com/xml/ns/repo-common-test/extension"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3">
<name>task-170</name>
<ownerRef oid="00000000-0000-0000-0000-000000000002" type="UserType" />
<executionState>runnable</executionState>
<activity>
<work>
<extension>
<ext:searchIterativeMock>
<ext:objectSet>
<type>RoleType</type>
<query>
<q:filter>
<q:substring>
<q:path>name</q:path>
<q:value>test-role-</q:value>
<q:anchorStart>true</q:anchorStart>
</q:substring>
</q:filter>
</query>
</ext:objectSet>
</ext:searchIterativeMock>
</extension>
</work>
<distribution>
<buckets>
<numericSegmentation>
<discriminator>extension/ext:discriminator</discriminator>
<numberOfBuckets>10</numberOfBuckets>
<to>100</to>
<from>5</from>
</numericSegmentation>
</buckets>
<workers>
<workersPerNode>
<count>2</count>
</workersPerNode>
</workers>
<workerThreads>4</workerThreads>
</distribution>
</activity>
</task>

0 comments on commit 770ef79

Please sign in to comment.