-
Notifications
You must be signed in to change notification settings - Fork 2.3k
QueryGroup Resource Tracking framework and implementation #13897
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
jed326
merged 67 commits into
opensearch-project:main
from
kiranprakash154:kp/qsb-framework
Aug 7, 2024
Merged
Changes from all commits
Commits
Show all changes
67 commits
Select commit
Hold shift + click to select a range
4912d6b
initial code for the sandbox resource tracking and cancellation frame…
kiranprakash154 546837d
Fix Failing Tests
kiranprakash154 789cc38
spotless Apply
kiranprakash154 60dfab3
Update SandboxService.java
kiranprakash154 13882b8
Update SandboxService.java
kiranprakash154 4fcfb79
Update SandboxTask.java
kiranprakash154 aec68f0
Add java docs
kiranprakash154 d6918cb
spotless
kiranprakash154 d38ea3a
javadocs
kiranprakash154 b42f439
javadocs
kiranprakash154 ddc1576
java docs
kiranprakash154 ec4142a
Update AbstractTaskCancellation.java
kiranprakash154 f3764e5
Update SandboxModule.java
kiranprakash154 4b05aec
Some tests and stubs
kiranprakash154 cdb43a1
spotless
kiranprakash154 4d7436d
:server:testingConventions
kiranprakash154 0958907
Update AbstractTaskCancellation.java
kiranprakash154 9870e04
more tests
kiranprakash154 837149b
addressing comments
kiranprakash154 2962437
revert some accidentally pushed files
kiranprakash154 3952631
resolve flakiness
kiranprakash154 5ac3d83
renaming sandbox to querygroup and adjusting code based on merged PRs
kiranprakash154 9420e1b
jvm to memory
kiranprakash154 74d7736
missing java docs
kiranprakash154 9818cbb
spotless
kiranprakash154 b234c18
Update CHANGELOG.md
kiranprakash154 9a6f3ac
pluck cancellation changes out of this PR
kiranprakash154 f4d6360
remove unused
kiranprakash154 cb039fc
remove cancellation related code and add more tests coverage
kiranprakash154 d6d1a1a
us only memory and not jvm
kiranprakash154 5da43db
test conventions
kiranprakash154 bdc34ab
Bring back enum
kiranprakash154 c6b2e69
Update SearchBackpressureService.java
kiranprakash154 499e139
revert changes
kiranprakash154 538f8af
revert changes
kiranprakash154 225dbdb
all required changes
kiranprakash154 1907acc
Update CHANGELOG.md
kiranprakash154 b59ae5b
cleanups
kiranprakash154 46380d5
Delete QueryGroupService.java
kiranprakash154 4759c8d
cleanups
kiranprakash154 464db0e
Update QueryGroupLevelResourceUsageViewTests.java
kiranprakash154 af8f84e
Update QueryGroupLevelResourceUsageViewTests.java
kiranprakash154 554db7f
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 a4d3921
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 59c51fd
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 3ff68a2
Update CHANGELOG.md
kiranprakash154 0dd15f4
rebasing with latest main
kiranprakash154 f1383f1
remove experimental
kiranprakash154 ad3afde
remove queryGroupId
kiranprakash154 4abe48e
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 03fed4d
change code comments
kiranprakash154 03e0f4a
remmove QueryGroupUsageTracker
kiranprakash154 0281cc5
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 ffed5a9
Update QueryGroupResourceUsageTrackerService.java
kiranprakash154 21f37a6
remove QueryGroupTestHelpers
kiranprakash154 01f7423
cleanups
kiranprakash154 6eaa39e
remove queryGroupHelper
kiranprakash154 96213e5
Update ResourceTypeTests.java
kiranprakash154 44f4ff5
extend OpenSearchTestCase
kiranprakash154 2bf7d98
pr comments
kiranprakash154 da459bb
Update CHANGELOG.md
kiranprakash154 2b3217b
Update QueryGroupResourceUsageTrackerServiceTests.java
kiranprakash154 d51a848
Merge branch 'opensearch-project:main' into kp/qsb-framework
kiranprakash154 6d94768
Update ResourceTypeTests.java
kiranprakash154 2f4380c
Update ResourceTypeTests.java
kiranprakash154 fa6b2ba
Update ResourceType.java
kiranprakash154 36b559c
Update ResourceType.java
kiranprakash154 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
server/src/main/java/org/opensearch/wlm/QueryGroupLevelResourceUsageView.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* The OpenSearch Contributors require contributions made to | ||
* this file be licensed under the Apache-2.0 license or a | ||
* compatible open source license. | ||
*/ | ||
|
||
package org.opensearch.wlm; | ||
kiranprakash154 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
import org.opensearch.search.ResourceType; | ||
import org.opensearch.tasks.Task; | ||
|
||
import java.util.List; | ||
import java.util.Map; | ||
|
||
/** | ||
* Represents the point in time view of resource usage of a QueryGroup and | ||
* has a 1:1 relation with a QueryGroup. | ||
* This class holds the resource usage data and the list of active tasks. | ||
*/ | ||
public class QueryGroupLevelResourceUsageView { | ||
// resourceUsage holds the resource usage data for a QueryGroup at a point in time | ||
private final Map<ResourceType, Long> resourceUsage; | ||
// activeTasks holds the list of active tasks for a QueryGroup at a point in time | ||
private final List<Task> activeTasks; | ||
|
||
public QueryGroupLevelResourceUsageView(Map<ResourceType, Long> resourceUsage, List<Task> activeTasks) { | ||
this.resourceUsage = resourceUsage; | ||
this.activeTasks = activeTasks; | ||
} | ||
|
||
/** | ||
* Returns the resource usage data. | ||
* | ||
* @return The map of resource usage data | ||
*/ | ||
public Map<ResourceType, Long> getResourceUsageData() { | ||
return resourceUsage; | ||
} | ||
|
||
/** | ||
* Returns the list of active tasks. | ||
* | ||
* @return The list of active tasks | ||
*/ | ||
public List<Task> getActiveTasks() { | ||
return activeTasks; | ||
} | ||
} |
84 changes: 84 additions & 0 deletions
84
server/src/main/java/org/opensearch/wlm/tracker/QueryGroupResourceUsageTrackerService.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* The OpenSearch Contributors require contributions made to | ||
* this file be licensed under the Apache-2.0 license or a | ||
* compatible open source license. | ||
*/ | ||
|
||
package org.opensearch.wlm.tracker; | ||
|
||
import org.opensearch.search.ResourceType; | ||
import org.opensearch.tasks.Task; | ||
import org.opensearch.tasks.TaskResourceTrackingService; | ||
import org.opensearch.wlm.QueryGroupLevelResourceUsageView; | ||
import org.opensearch.wlm.QueryGroupTask; | ||
|
||
import java.util.EnumMap; | ||
import java.util.EnumSet; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.stream.Collectors; | ||
|
||
/** | ||
* This class tracks resource usage per QueryGroup | ||
*/ | ||
public class QueryGroupResourceUsageTrackerService { | ||
kiranprakash154 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
public static final EnumSet<ResourceType> TRACKED_RESOURCES = EnumSet.allOf(ResourceType.class); | ||
private final TaskResourceTrackingService taskResourceTrackingService; | ||
|
||
/** | ||
* QueryGroupResourceTrackerService constructor | ||
* | ||
* @param taskResourceTrackingService Service that helps track resource usage of tasks running on a node. | ||
*/ | ||
public QueryGroupResourceUsageTrackerService(TaskResourceTrackingService taskResourceTrackingService) { | ||
this.taskResourceTrackingService = taskResourceTrackingService; | ||
} | ||
|
||
/** | ||
* Constructs a map of QueryGroupLevelResourceUsageView instances for each QueryGroup. | ||
* | ||
* @return Map of QueryGroup views | ||
*/ | ||
public Map<String, QueryGroupLevelResourceUsageView> constructQueryGroupLevelUsageViews() { | ||
final Map<String, List<Task>> tasksByQueryGroup = getTasksGroupedByQueryGroup(); | ||
final Map<String, QueryGroupLevelResourceUsageView> queryGroupViews = new HashMap<>(); | ||
|
||
// Iterate over each QueryGroup entry | ||
for (Map.Entry<String, List<Task>> queryGroupEntry : tasksByQueryGroup.entrySet()) { | ||
// Compute the QueryGroup usage | ||
final EnumMap<ResourceType, Long> queryGroupUsage = new EnumMap<>(ResourceType.class); | ||
for (ResourceType resourceType : TRACKED_RESOURCES) { | ||
long queryGroupResourceUsage = 0; | ||
for (Task task : queryGroupEntry.getValue()) { | ||
queryGroupResourceUsage += resourceType.getResourceUsage(task); | ||
} | ||
queryGroupUsage.put(resourceType, queryGroupResourceUsage); | ||
} | ||
|
||
// Add to the QueryGroup View | ||
queryGroupViews.put( | ||
queryGroupEntry.getKey(), | ||
new QueryGroupLevelResourceUsageView(queryGroupUsage, queryGroupEntry.getValue()) | ||
); | ||
} | ||
return queryGroupViews; | ||
} | ||
|
||
/** | ||
* Groups tasks by their associated QueryGroup. | ||
* | ||
* @return Map of tasks grouped by QueryGroup | ||
*/ | ||
private Map<String, List<Task>> getTasksGroupedByQueryGroup() { | ||
return taskResourceTrackingService.getResourceAwareTasks() | ||
.values() | ||
.stream() | ||
.filter(QueryGroupTask.class::isInstance) | ||
.map(QueryGroupTask.class::cast) | ||
.collect(Collectors.groupingBy(QueryGroupTask::getQueryGroupId, Collectors.mapping(task -> (Task) task, Collectors.toList()))); | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
server/src/main/java/org/opensearch/wlm/tracker/package-info.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
/* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* The OpenSearch Contributors require contributions made to | ||
* this file be licensed under the Apache-2.0 license or a | ||
* compatible open source license. | ||
*/ | ||
|
||
/** | ||
* QueryGroup resource tracking artifacts | ||
*/ | ||
package org.opensearch.wlm.tracker; |
52 changes: 52 additions & 0 deletions
52
server/src/test/java/org/opensearch/search/ResourceTypeTests.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* The OpenSearch Contributors require contributions made to | ||
* this file be licensed under the Apache-2.0 license or a | ||
* compatible open source license. | ||
*/ | ||
|
||
package org.opensearch.search; | ||
|
||
import org.opensearch.action.search.SearchShardTask; | ||
import org.opensearch.core.tasks.resourcetracker.ResourceStats; | ||
import org.opensearch.tasks.CancellableTask; | ||
import org.opensearch.test.OpenSearchTestCase; | ||
|
||
import static org.junit.Assert.assertThrows; | ||
import static org.mockito.Mockito.mock; | ||
import static org.mockito.Mockito.when; | ||
|
||
public class ResourceTypeTests extends OpenSearchTestCase { | ||
|
||
public void testFromName() { | ||
assertSame(ResourceType.CPU, ResourceType.fromName("cpu")); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("CPU"); }); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("Cpu"); }); | ||
|
||
assertSame(ResourceType.MEMORY, ResourceType.fromName("memory")); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("Memory"); }); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("MEMORY"); }); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("JVM"); }); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("Heap"); }); | ||
assertThrows(IllegalArgumentException.class, () -> { ResourceType.fromName("Disk"); }); | ||
} | ||
|
||
public void testGetName() { | ||
assertEquals("cpu", ResourceType.CPU.getName()); | ||
assertEquals("memory", ResourceType.MEMORY.getName()); | ||
} | ||
|
||
public void testGetResourceUsage() { | ||
SearchShardTask mockTask = createMockTask(SearchShardTask.class, 100, 200); | ||
assertEquals(100, ResourceType.CPU.getResourceUsage(mockTask)); | ||
assertEquals(200, ResourceType.MEMORY.getResourceUsage(mockTask)); | ||
} | ||
|
||
private <T extends CancellableTask> T createMockTask(Class<T> type, long cpuUsage, long heapUsage) { | ||
T task = mock(type); | ||
when(task.getTotalResourceUtilization(ResourceStats.CPU)).thenReturn(cpuUsage); | ||
when(task.getTotalResourceUtilization(ResourceStats.MEMORY)).thenReturn(heapUsage); | ||
return task; | ||
} | ||
} |
64 changes: 64 additions & 0 deletions
64
server/src/test/java/org/opensearch/wlm/QueryGroupLevelResourceUsageViewTests.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* The OpenSearch Contributors require contributions made to | ||
* this file be licensed under the Apache-2.0 license or a | ||
* compatible open source license. | ||
*/ | ||
|
||
package org.opensearch.wlm; | ||
|
||
import org.opensearch.action.search.SearchAction; | ||
import org.opensearch.core.tasks.TaskId; | ||
import org.opensearch.search.ResourceType; | ||
import org.opensearch.tasks.Task; | ||
import org.opensearch.test.OpenSearchTestCase; | ||
|
||
import java.util.Collections; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
public class QueryGroupLevelResourceUsageViewTests extends OpenSearchTestCase { | ||
Map<ResourceType, Long> resourceUsage; | ||
List<Task> activeTasks; | ||
|
||
public void setUp() throws Exception { | ||
super.setUp(); | ||
resourceUsage = Map.of(ResourceType.fromName("memory"), 34L, ResourceType.fromName("cpu"), 12L); | ||
activeTasks = List.of(getRandomTask(4321)); | ||
} | ||
|
||
public void testGetResourceUsageData() { | ||
QueryGroupLevelResourceUsageView queryGroupLevelResourceUsageView = new QueryGroupLevelResourceUsageView( | ||
resourceUsage, | ||
activeTasks | ||
); | ||
Map<ResourceType, Long> resourceUsageData = queryGroupLevelResourceUsageView.getResourceUsageData(); | ||
assertTrue(assertResourceUsageData(resourceUsageData)); | ||
} | ||
|
||
public void testGetActiveTasks() { | ||
QueryGroupLevelResourceUsageView queryGroupLevelResourceUsageView = new QueryGroupLevelResourceUsageView( | ||
resourceUsage, | ||
activeTasks | ||
); | ||
List<Task> activeTasks = queryGroupLevelResourceUsageView.getActiveTasks(); | ||
assertEquals(1, activeTasks.size()); | ||
assertEquals(4321, activeTasks.get(0).getId()); | ||
} | ||
|
||
private boolean assertResourceUsageData(Map<ResourceType, Long> resourceUsageData) { | ||
return resourceUsageData.get(ResourceType.fromName("memory")) == 34L && resourceUsageData.get(ResourceType.fromName("cpu")) == 12L; | ||
} | ||
|
||
private Task getRandomTask(long id) { | ||
return new Task( | ||
id, | ||
"transport", | ||
SearchAction.NAME, | ||
"test description", | ||
new TaskId(randomLong() + ":" + randomLong()), | ||
Collections.emptyMap() | ||
); | ||
} | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.