From acccb1650f2263603364d652c08b75a980cc7662 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 03:35:42 +0530 Subject: [PATCH 01/47] initial changes --- .../api/endpoint/ListActiveTasksApi.java | 20 +++++++++++++++++++ .../client/api/model/ActiveTaskDetails.java | 5 +++++ .../api/model/ListActiveTaskResponse.java | 9 +++++++++ 3 files changed, 34 insertions(+) create mode 100644 solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java new file mode 100644 index 000000000000..1dc06f44d76a --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -0,0 +1,20 @@ +package org.apache.solr.client.api.endpoint; + +import io.swagger.v3.oas.annotations.Operation; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.util.StoreApiParameters; + +import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; + +@Path(INDEX_PATH_PREFIX + "/tasks/list") +public interface ListActiveTasksApi { + @GET + @StoreApiParameters + @Operation( + summary = "Lists all the currently running tasks", + tags = {"tasks"}) + ListActiveTaskResponse listActiveTasks(@QueryParam("taskUUID") String taskUUID) throws Exception; +} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java new file mode 100644 index 000000000000..28553667b33b --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java @@ -0,0 +1,5 @@ +package org.apache.solr.client.api.model; + +public class ActiveTaskDetails { + +} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java new file mode 100644 index 000000000000..826039cd8060 --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -0,0 +1,9 @@ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +public class ListActiveTaskResponse extends SolrJerseyResponse { + @JsonProperty + public List taskList; +} From e4260140cebb3d841de26378c2d9d530539c1c04 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 14:48:01 +0530 Subject: [PATCH 02/47] testing --- .../api/endpoint/ListActiveTasksApi.java | 7 +++- .../client/api/model/ActiveTaskDetails.java | 5 --- .../api/model/ListActiveTaskResponse.java | 3 +- .../handler/admin/api/ListActiveTasks.java | 40 +++++++++++++++++++ .../component/TaskManagementHandler.java | 9 +++++ 5 files changed, 56 insertions(+), 8 deletions(-) delete mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java create mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index 1dc06f44d76a..b76775456002 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -1,20 +1,23 @@ package org.apache.solr.client.api.endpoint; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; import jakarta.ws.rs.QueryParam; import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.util.StoreApiParameters; import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; -@Path(INDEX_PATH_PREFIX + "/tasks/list") +@Path(INDEX_PATH_PREFIX + "/tasks/listjalaz") public interface ListActiveTasksApi { @GET @StoreApiParameters @Operation( summary = "Lists all the currently running tasks", tags = {"tasks"}) - ListActiveTaskResponse listActiveTasks(@QueryParam("taskUUID") String taskUUID) throws Exception; + ListActiveTaskResponse listActiveTasks( + @QueryParam("taskUUID") String taskUUID) throws Exception; } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java deleted file mode 100644 index 28553667b33b..000000000000 --- a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.apache.solr.client.api.model; - -public class ActiveTaskDetails { - -} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java index 826039cd8060..57e0af3b972a 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -2,8 +2,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.Map; public class ListActiveTaskResponse extends SolrJerseyResponse { @JsonProperty - public List taskList; + public Map taskList; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java new file mode 100644 index 000000000000..8b6b1ffaf1de --- /dev/null +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -0,0 +1,40 @@ +package org.apache.solr.handler.admin.api; + +import jakarta.inject.Inject; +import org.apache.solr.api.JerseyResource; +import org.apache.solr.client.api.endpoint.ListActiveTasksApi; +import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.common.SolrException; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.jersey.PermissionName; + +import java.util.Map; + +import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR; +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + +public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { + + private final CoreContainer coreContainer; + + @Inject + public ListActiveTasks(CoreContainer coreContainer) { + this.coreContainer = coreContainer; + } + + @Override + @PermissionName(READ_PERM) + public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { + if (coreContainer == null || coreContainer.isShutDown()) { + throw new SolrException( + SERVER_ERROR, "CoreContainer is either not initialized or shutting down"); + } + + final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); + + response.taskList = Map.of("xyz","jalaz"); + + return response; + + } +} diff --git a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java index afb7a05c5868..1785ba075fcd 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java @@ -21,14 +21,18 @@ import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; +import org.apache.solr.api.JerseyResource; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; import org.apache.solr.handler.RequestHandlerBase; +import org.apache.solr.handler.admin.api.ListActiveTasks; +import org.apache.solr.handler.admin.api.NodeHealth; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.PermissionNameProvider; @@ -132,4 +136,9 @@ public static ResponseBuilder buildResponseBuilder( return rb; } + + @Override + public Collection> getJerseyResources() { + return List.of(ListActiveTasks.class); + } } From 7b157910c42aa8ec30db4b69df85772dfefeea6c Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 16:27:35 +0530 Subject: [PATCH 03/47] working api --- .../solr/handler/admin/api/ListActiveTasks.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 8b6b1ffaf1de..7c6faa48b941 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -4,35 +4,26 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.common.SolrException; -import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; import java.util.Map; -import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { - private final CoreContainer coreContainer; - @Inject - public ListActiveTasks(CoreContainer coreContainer) { - this.coreContainer = coreContainer; + public ListActiveTasks() { + } @Override @PermissionName(READ_PERM) public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { - if (coreContainer == null || coreContainer.isShutDown()) { - throw new SolrException( - SERVER_ERROR, "CoreContainer is either not initialized or shutting down"); - } final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - response.taskList = Map.of("xyz","jalaz"); + response.taskList = Map.of("xyz","jalaz", "mno", "pqr"); return response; From 02c14b969c2c86bc9f141f0e0182811187e9794b Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 18:59:25 +0530 Subject: [PATCH 04/47] working setup --- .../handler/admin/CollectionsHandler.java | 15 ++++++++++- .../handler/admin/api/ListActiveTasks.java | 27 ++++++++++++++++--- .../solr/common/params/CollectionParams.java | 1 + 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java index be9f394d26c5..41592f699533 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java @@ -97,6 +97,7 @@ import static org.apache.solr.common.params.CommonAdminParams.SPLIT_METHOD; import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE; import static org.apache.solr.common.params.CommonParams.NAME; +import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import static org.apache.solr.common.params.CommonParams.TIMING; import static org.apache.solr.common.params.CommonParams.VALUE_LONG; import static org.apache.solr.common.params.CoreAdminParams.BACKUP_LOCATION; @@ -124,6 +125,7 @@ import org.apache.solr.client.api.model.CreateCollectionSnapshotRequestBody; import org.apache.solr.client.api.model.CreateCollectionSnapshotResponse; import org.apache.solr.client.api.model.InstallShardDataRequestBody; +import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.ListCollectionSnapshotsResponse; import org.apache.solr.client.api.model.ReplaceNodeRequestBody; import org.apache.solr.client.api.model.SetClusterPropertyRequestBody; @@ -194,6 +196,7 @@ import org.apache.solr.handler.admin.api.DeleteShard; import org.apache.solr.handler.admin.api.ForceLeader; import org.apache.solr.handler.admin.api.InstallShardData; +import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.handler.admin.api.ListAliases; import org.apache.solr.handler.admin.api.ListCollectionBackups; import org.apache.solr.handler.admin.api.ListCollectionSnapshots; @@ -958,6 +961,15 @@ public Map execute( V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, listCollectionsResponse); return null; }), + /** Handle list of active tasks request. Do list collection request to zk host */ + LIST_TASK_OP( + LIST, + (req, rsp, h) -> { + final ListActiveTasks listActiveTasks = new ListActiveTasks(req); + final ListActiveTaskResponse listActiveTaskResponse = listActiveTasks.listActiveTasks(req.getParams().get(TASK_CHECK_UUID)); + V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, listActiveTaskResponse); + return null; + }), /** * Handle cluster status request. Can return status per specific collection/shard or per all * collections. @@ -1377,7 +1389,8 @@ public Collection> getJerseyResources() { ListCollectionSnapshots.class, CreateCollectionSnapshot.class, DeleteCollectionSnapshot.class, - ClusterProperty.class); + ClusterProperty.class, + ListActiveTasks.class); } @Override diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 7c6faa48b941..03d187bebf49 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -4,26 +4,45 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.SolrQueryResponse; +import java.util.HashMap; +import java.util.Iterator; import java.util.Map; +import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PERM; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { - @Inject - public ListActiveTasks() { + private final SolrQueryRequest solrQueryRequest; + @Inject + public ListActiveTasks( + SolrQueryRequest solrQueryRequest) { + this.solrQueryRequest = solrQueryRequest; } + + @Override - @PermissionName(READ_PERM) + @PermissionName(COLL_READ_PERM) public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - response.taskList = Map.of("xyz","jalaz", "mno", "pqr"); + Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); + + Map taskList = new HashMap<>(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + taskList.put(entry.getKey(), entry.getValue()); + } + + response.taskList = taskList; return response; diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java index a066ff1e89b3..2b92f60df478 100644 --- a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java +++ b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java @@ -114,6 +114,7 @@ enum CollectionAction { // For testing. Could eventually be exposed publicly if needed DISTRIBUTEDAPIPROCESSING(false, LockLevel.NONE), LIST(false, LockLevel.NONE), + LIST_TASK(false, LockLevel.NONE), CLUSTERSTATUS(false, LockLevel.NONE), ADDREPLICAPROP(true, LockLevel.NONE), // atomic; no lock DELETEREPLICAPROP(true, LockLevel.NONE), // atomic; no lock From 177d2c646843c126e3121c2136e6c6dca094021b Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 19:34:11 +0530 Subject: [PATCH 05/47] cleanup --- .../solr/handler/admin/CollectionsHandler.java | 12 +----------- .../apache/solr/common/params/CollectionParams.java | 1 - 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java index 41592f699533..9f7b21a36efa 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java @@ -961,15 +961,6 @@ public Map execute( V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, listCollectionsResponse); return null; }), - /** Handle list of active tasks request. Do list collection request to zk host */ - LIST_TASK_OP( - LIST, - (req, rsp, h) -> { - final ListActiveTasks listActiveTasks = new ListActiveTasks(req); - final ListActiveTaskResponse listActiveTaskResponse = listActiveTasks.listActiveTasks(req.getParams().get(TASK_CHECK_UUID)); - V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, listActiveTaskResponse); - return null; - }), /** * Handle cluster status request. Can return status per specific collection/shard or per all * collections. @@ -1389,8 +1380,7 @@ public Collection> getJerseyResources() { ListCollectionSnapshots.class, CreateCollectionSnapshot.class, DeleteCollectionSnapshot.class, - ClusterProperty.class, - ListActiveTasks.class); + ClusterProperty.class); } @Override diff --git a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java index 2b92f60df478..a066ff1e89b3 100644 --- a/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java +++ b/solr/solrj/src/java/org/apache/solr/common/params/CollectionParams.java @@ -114,7 +114,6 @@ enum CollectionAction { // For testing. Could eventually be exposed publicly if needed DISTRIBUTEDAPIPROCESSING(false, LockLevel.NONE), LIST(false, LockLevel.NONE), - LIST_TASK(false, LockLevel.NONE), CLUSTERSTATUS(false, LockLevel.NONE), ADDREPLICAPROP(true, LockLevel.NONE), // atomic; no lock DELETEREPLICAPROP(true, LockLevel.NONE), // atomic; no lock From 95ace8df723035eab7fcb0e86bfc79b3a78f1c52 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 19:49:25 +0530 Subject: [PATCH 06/47] cleanup --- .../apache/solr/client/api/endpoint/ListActiveTasksApi.java | 4 +--- .../apache/solr/client/api/model/ListActiveTaskResponse.java | 1 - .../org/apache/solr/handler/admin/CollectionsHandler.java | 3 --- .../org/apache/solr/handler/admin/api/ListActiveTasks.java | 5 +---- .../apache/solr/handler/component/TaskManagementHandler.java | 1 - 5 files changed, 2 insertions(+), 12 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index b76775456002..9c31458af815 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -1,10 +1,8 @@ package org.apache.solr.client.api.endpoint; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; import jakarta.ws.rs.QueryParam; import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.util.StoreApiParameters; @@ -16,7 +14,7 @@ public interface ListActiveTasksApi { @GET @StoreApiParameters @Operation( - summary = "Lists all the currently running tasks", + summary = "Lists all the currently running tasks or status of any taskUUID being passed as queryParam", tags = {"tasks"}) ListActiveTaskResponse listActiveTasks( @QueryParam("taskUUID") String taskUUID) throws Exception; diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java index 57e0af3b972a..9885e0f7204f 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -1,7 +1,6 @@ package org.apache.solr.client.api.model; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; import java.util.Map; public class ListActiveTaskResponse extends SolrJerseyResponse { diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java index 9f7b21a36efa..be9f394d26c5 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionsHandler.java @@ -97,7 +97,6 @@ import static org.apache.solr.common.params.CommonAdminParams.SPLIT_METHOD; import static org.apache.solr.common.params.CommonAdminParams.WAIT_FOR_FINAL_STATE; import static org.apache.solr.common.params.CommonParams.NAME; -import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import static org.apache.solr.common.params.CommonParams.TIMING; import static org.apache.solr.common.params.CommonParams.VALUE_LONG; import static org.apache.solr.common.params.CoreAdminParams.BACKUP_LOCATION; @@ -125,7 +124,6 @@ import org.apache.solr.client.api.model.CreateCollectionSnapshotRequestBody; import org.apache.solr.client.api.model.CreateCollectionSnapshotResponse; import org.apache.solr.client.api.model.InstallShardDataRequestBody; -import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.ListCollectionSnapshotsResponse; import org.apache.solr.client.api.model.ReplaceNodeRequestBody; import org.apache.solr.client.api.model.SetClusterPropertyRequestBody; @@ -196,7 +194,6 @@ import org.apache.solr.handler.admin.api.DeleteShard; import org.apache.solr.handler.admin.api.ForceLeader; import org.apache.solr.handler.admin.api.InstallShardData; -import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.handler.admin.api.ListAliases; import org.apache.solr.handler.admin.api.ListCollectionBackups; import org.apache.solr.handler.admin.api.ListCollectionSnapshots; diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 03d187bebf49..bcd655df74f5 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -4,16 +4,13 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.SolrQueryResponse; import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PERM; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { @@ -29,7 +26,7 @@ public ListActiveTasks( @Override - @PermissionName(COLL_READ_PERM) + @PermissionName(READ_PERM) public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); diff --git a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java index 1785ba075fcd..817269b48c95 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java @@ -32,7 +32,6 @@ import org.apache.solr.core.SolrCore; import org.apache.solr.handler.RequestHandlerBase; import org.apache.solr.handler.admin.api.ListActiveTasks; -import org.apache.solr.handler.admin.api.NodeHealth; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.PermissionNameProvider; From 7dc167a7e082dcf9182c837ee7234fc446b6bd6e Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 20:01:10 +0530 Subject: [PATCH 07/47] logging --- .../solr/handler/admin/api/ListActiveTasks.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index bcd655df74f5..3c49a6fe1e09 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -4,9 +4,13 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.lang.invoke.MethodHandles; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -15,6 +19,8 @@ public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + private final SolrQueryRequest solrQueryRequest; @Inject @@ -30,6 +36,13 @@ public ListActiveTasks( public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); + CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); + + if (coreContainer.isZooKeeperAware()) { + log.debug("solr cloud"); + } else { + log.debug("stand alone"); + } Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); From 1a32bb16439387e9f7c3ffe8cbbbc951ffee5418 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 16 May 2026 21:32:23 +0530 Subject: [PATCH 08/47] minor --- .../handler/admin/api/ListActiveTasks.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 3c49a6fe1e09..6b7e22db7b15 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -39,11 +39,24 @@ public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); if (coreContainer.isZooKeeperAware()) { - log.debug("solr cloud"); + if (log.isDebugEnabled()) { + log.debug("solr cloud"); + } + handleSolrCloudMode(response, taskUUID); } else { - log.debug("stand alone"); + if (log.isDebugEnabled()) { + log.debug("standalone solr"); + } + handleStandAloneMode(response, taskUUID); } + log.debug("something random"); + + return response; + + } + + private void handleStandAloneMode(ListActiveTaskResponse response, String taskUUID) { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); Map taskList = new HashMap<>(); @@ -53,8 +66,17 @@ public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception } response.taskList = taskList; + } - return response; + private void handleSolrCloudMode(ListActiveTaskResponse response, String taskUUID) { + Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); + Map taskList = new HashMap<>(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + taskList.put(entry.getKey(), entry.getValue()); + } + + response.taskList = taskList; } } From d746e210c8d3784b435c91e0a844765366d5cea8 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Wed, 20 May 2026 02:51:50 +0530 Subject: [PATCH 09/47] response model for 2nd API --- .../api/endpoint/ListActiveTasksApi.java | 20 +++++++++++----- .../client/api/model/TaskStatusResponse.java | 8 +++++++ .../handler/admin/api/ListActiveTasks.java | 23 ++++++++++++------- 3 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index 9c31458af815..3b6ed8bc854f 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -3,19 +3,27 @@ import io.swagger.v3.oas.annotations.Operation; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; -import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.PathParam; import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.client.api.util.StoreApiParameters; import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; @Path(INDEX_PATH_PREFIX + "/tasks/listjalaz") public interface ListActiveTasksApi { + + // Handles: .../tasks/listjalaz (Lists all) + @GET + @StoreApiParameters + @Operation(summary = "Lists all the currently running tasks", tags = {"tasks"}) + ListActiveTaskResponse listAllActiveTasks() throws Exception; + + // Handles: .../tasks/listjalaz/xyz (Lists specific) @GET + @Path("/{taskUUID}") @StoreApiParameters - @Operation( - summary = "Lists all the currently running tasks or status of any taskUUID being passed as queryParam", - tags = {"tasks"}) - ListActiveTaskResponse listActiveTasks( - @QueryParam("taskUUID") String taskUUID) throws Exception; + @Operation(summary = "Status of a specific taskUUID passed as pathParam", tags = {"tasks"}) + TaskStatusResponse getTaskStatus( + @PathParam("taskUUID") String taskUUID) throws Exception; } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java new file mode 100644 index 000000000000..da691675468f --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -0,0 +1,8 @@ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class TaskStatusResponse extends SolrJerseyResponse { + @JsonProperty + public boolean taskStatus; +} diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 6b7e22db7b15..b902eb005b4c 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -4,6 +4,7 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; @@ -29,12 +30,9 @@ public ListActiveTasks( this.solrQueryRequest = solrQueryRequest; } - - @Override @PermissionName(READ_PERM) - public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception { - + public ListActiveTaskResponse listAllActiveTasks() throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); @@ -42,21 +40,28 @@ public ListActiveTaskResponse listActiveTasks(String taskUUID) throws Exception if (log.isDebugEnabled()) { log.debug("solr cloud"); } - handleSolrCloudMode(response, taskUUID); + handleSolrCloudMode(response); } else { if (log.isDebugEnabled()) { log.debug("standalone solr"); } - handleStandAloneMode(response, taskUUID); + handleStandAloneMode(response); } log.debug("something random"); return response; + } + @Override + @PermissionName(READ_PERM) + public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { + return null; } - private void handleStandAloneMode(ListActiveTaskResponse response, String taskUUID) { + + + private void handleStandAloneMode(ListActiveTaskResponse response) { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); Map taskList = new HashMap<>(); @@ -68,7 +73,7 @@ private void handleStandAloneMode(ListActiveTaskResponse response, String taskUU response.taskList = taskList; } - private void handleSolrCloudMode(ListActiveTaskResponse response, String taskUUID) { + private void handleSolrCloudMode(ListActiveTaskResponse response) { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); Map taskList = new HashMap<>(); @@ -79,4 +84,6 @@ private void handleSolrCloudMode(ListActiveTaskResponse response, String taskUUI response.taskList = taskList; } + + } From df5c42883edda7540cc0129c52b9f5551a63c633 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Wed, 20 May 2026 04:05:24 +0530 Subject: [PATCH 10/47] verifies for solr cloud --- .../handler/admin/api/ListActiveTasks.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index b902eb005b4c..978aaa8d6f4f 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -40,28 +40,41 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { if (log.isDebugEnabled()) { log.debug("solr cloud"); } - handleSolrCloudMode(response); + response.taskList = handleSolrCloudMode(); } else { if (log.isDebugEnabled()) { log.debug("standalone solr"); } - handleStandAloneMode(response); + response.taskList = handleStandAloneMode(); } - log.debug("something random"); - return response; } @Override @PermissionName(READ_PERM) public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { - return null; + final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); + CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); + + if (coreContainer.isZooKeeperAware()) { + if (log.isDebugEnabled()) { + log.debug("solr cloud"); + } + response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + } else { + if (log.isDebugEnabled()) { + log.debug("standalone solr"); + } + response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + } + + return response; } - private void handleStandAloneMode(ListActiveTaskResponse response) { + private Map handleStandAloneMode() { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); Map taskList = new HashMap<>(); @@ -70,10 +83,10 @@ private void handleStandAloneMode(ListActiveTaskResponse response) { taskList.put(entry.getKey(), entry.getValue()); } - response.taskList = taskList; + return taskList; } - private void handleSolrCloudMode(ListActiveTaskResponse response) { + private Map handleSolrCloudMode() { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); Map taskList = new HashMap<>(); @@ -82,7 +95,7 @@ private void handleSolrCloudMode(ListActiveTaskResponse response) { taskList.put(entry.getKey(), entry.getValue()); } - response.taskList = taskList; + return taskList; } From 354d0f5e733dde8a7a3838d06073f5a8a053db94 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Wed, 20 May 2026 23:51:26 +0530 Subject: [PATCH 11/47] changes related to pojo & duplicate code removal --- .../client/api/model/ActiveTaskDetails.java | 17 +++++ .../api/model/ListActiveTaskResponse.java | 4 +- .../handler/admin/api/ListActiveTasks.java | 63 ++++--------------- 3 files changed, 30 insertions(+), 54 deletions(-) create mode 100644 solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java new file mode 100644 index 000000000000..c7c58f073c43 --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java @@ -0,0 +1,17 @@ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class ActiveTaskDetails { + + public ActiveTaskDetails() {} + + public ActiveTaskDetails(String taskUUID, String taskQuery) { + this.taskUUID = taskUUID; + this.taskQuery = taskQuery; + } + + @JsonProperty public String taskUUID; + @JsonProperty public String taskQuery; + +} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java index 9885e0f7204f..826039cd8060 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -1,9 +1,9 @@ package org.apache.solr.client.api.model; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.Map; +import java.util.List; public class ListActiveTaskResponse extends SolrJerseyResponse { @JsonProperty - public Map taskList; + public List taskList; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 978aaa8d6f4f..da7aa2093346 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -3,25 +3,21 @@ import jakarta.inject.Inject; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; +import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.TaskStatusResponse; -import org.apache.solr.core.CoreContainer; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.lang.invoke.MethodHandles; -import java.util.HashMap; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.Map; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { - private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); - private final SolrQueryRequest solrQueryRequest; @Inject @@ -34,19 +30,8 @@ public ListActiveTasks( @PermissionName(READ_PERM) public ListActiveTaskResponse listAllActiveTasks() throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); - - if (coreContainer.isZooKeeperAware()) { - if (log.isDebugEnabled()) { - log.debug("solr cloud"); - } - response.taskList = handleSolrCloudMode(); - } else { - if (log.isDebugEnabled()) { - log.debug("standalone solr"); - } - response.taskList = handleStandAloneMode(); - } + + response.taskList = extractActiveTaskLists(); return response; } @@ -55,48 +40,22 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { @PermissionName(READ_PERM) public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - CoreContainer coreContainer = solrQueryRequest.getCoreContainer(); - - if (coreContainer.isZooKeeperAware()) { - if (log.isDebugEnabled()) { - log.debug("solr cloud"); - } - response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); - } else { - if (log.isDebugEnabled()) { - log.debug("standalone solr"); - } - response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); - } - - return response; - } - + response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); - private Map handleStandAloneMode() { - Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); - - Map taskList = new HashMap<>(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - taskList.put(entry.getKey(), entry.getValue()); - } - - return taskList; + return response; } - private Map handleSolrCloudMode() { + private List extractActiveTaskLists() { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); - Map taskList = new HashMap<>(); + List activeTaskDetails = new ArrayList<>(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); - taskList.put(entry.getKey(), entry.getValue()); + activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), entry.getValue())); } - return taskList; + return activeTaskDetails; } - } From 1cad09dedffecf3a6fa8403ca5aeaa35532a365d Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 00:50:31 +0530 Subject: [PATCH 12/47] removed older interfaces --- .../component/ActiveTasksListComponent.java | 128 ------------------ .../component/ActiveTasksListHandler.java | 44 +++--- .../component/TaskManagementHandler.java | 7 - 3 files changed, 18 insertions(+), 161 deletions(-) delete mode 100644 solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListComponent.java diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListComponent.java deleted file mode 100644 index ce8a31335c2f..000000000000 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListComponent.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ -package org.apache.solr.handler.component; - -import java.io.IOException; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import org.apache.solr.common.MapWriter; -import org.apache.solr.common.util.NamedList; - -/** List the active tasks that can be cancelled */ -public class ActiveTasksListComponent extends SearchComponent { - public static final String COMPONENT_NAME = "activetaskslist"; - - private boolean shouldProcess; - - @Override - public void prepare(ResponseBuilder rb) throws IOException { - if (rb.isTaskListRequest()) { - shouldProcess = true; - } - } - - @Override - public void process(ResponseBuilder rb) { - if (!shouldProcess) { - return; - } - - if (rb.getTaskStatusCheckUUID() != null) { - boolean isActiveOnThisShard = - rb.req - .getCore() - .getCancellableQueryTracker() - .isQueryIdActive(rb.getTaskStatusCheckUUID()); - - rb.rsp.add("taskStatus", isActiveOnThisShard); - return; - } - - rb.rsp.add( - "taskList", - (MapWriter) - ew -> { - Iterator> iterator = - rb.req.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); - - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - ew.put(entry.getKey(), entry.getValue()); - } - }); - } - - @Override - @SuppressWarnings("unchecked") - public void handleResponses(ResponseBuilder rb, ShardRequest sreq) { - if (!shouldProcess) { - return; - } - - NamedList resultList = new NamedList<>(); - - for (ShardResponse r : sreq.responses) { - - if (rb.getTaskStatusCheckUUID() != null) { - boolean isTaskActiveOnShard = r.getSolrResponse().getResponse().getBooleanArg("taskStatus"); - - if (isTaskActiveOnShard) { - rb.rsp - .getValues() - .add("taskStatus", "id:" + rb.getTaskStatusCheckUUID() + ", status: active"); - return; - } else { - continue; - } - } - - LinkedHashMap result = - (LinkedHashMap) r.getSolrResponse().getResponse().get("taskList"); - - Iterator> iterator = result.entrySet().iterator(); - - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - - resultList.add(entry.getKey(), entry.getValue()); - } - } - - if (rb.getTaskStatusCheckUUID() != null) { - // We got here with the specific taskID check being specified -- this means that the taskID - // was not found in active tasks on any shard - rb.rsp - .getValues() - .add("taskStatus", "id:" + rb.getTaskStatusCheckUUID() + ", status: inactive"); - return; - } - - rb.rsp.getValues().add("taskList", resultList); - } - - @Override - public String getDescription() { - return "Responsible for listing all active cancellable tasks and also supports checking the status of " - + "a particular task"; - } - - @Override - public Category getCategory() { - return Category.OTHER; - } -} diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index f1ce12cd9378..82c9f1a26349 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -19,44 +19,38 @@ import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import org.apache.solr.api.AnnotatedApi; import org.apache.solr.api.Api; -import org.apache.solr.handler.admin.api.ListActiveTasksAPI; +import org.apache.solr.api.JerseyResource; +import org.apache.solr.handler.admin.api.ListActiveTasks; +import org.apache.solr.handler.api.V2ApiUtils; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.AuthorizationContext; import org.apache.solr.security.PermissionNameProvider; -/** Handles request for listing all active cancellable tasks */ + +/** + * Handles request for listing all active cancellable tasks + * + * All active tasks logic lives in the v2 {@link ListActiveTasks}; this handler is a thin v1 bridge + * that extracts request parameters and delegates. + */ public class ActiveTasksListHandler extends TaskManagementHandler { // This can be a parent level member but we keep it here to allow future handlers to have // a custom list of components - private List components; @Override public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - Map extraParams = null; - ResponseBuilder rb = buildResponseBuilder(req, rsp, getComponentsList()); - - rb.setIsTaskListRequest(true); - String taskStatusCheckUUID = req.getParams().get(TASK_CHECK_UUID, null); if (taskStatusCheckUUID != null) { - if (rb.isDistrib) { - extraParams = new HashMap<>(); - - extraParams.put(TASK_CHECK_UUID, taskStatusCheckUUID); - } - - rb.setTaskStatusCheckUUID(taskStatusCheckUUID); + V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); + } else { + V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, new ListActiveTasks(req).listAllActiveTasks()); } - processRequest(req, rb, extraParams); } @Override @@ -90,14 +84,12 @@ public Boolean registerV2() { @Override public Collection getApis() { - return AnnotatedApi.getApis(new ListActiveTasksAPI(this)); + return List.of(); } - private List getComponentsList() { - if (components == null) { - components = buildComponentsList(); - } - - return components; + @Override + public Collection> getJerseyResources() { + return List.of(ListActiveTasks.class); } + } diff --git a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java index 817269b48c95..630c15de74d1 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java @@ -118,9 +118,6 @@ public static List buildComponentsList() { QueryCancellationComponent component = new QueryCancellationComponent(); components.add(component); - ActiveTasksListComponent activeTasksListComponent = new ActiveTasksListComponent(); - components.add(activeTasksListComponent); - return components; } @@ -136,8 +133,4 @@ public static ResponseBuilder buildResponseBuilder( return rb; } - @Override - public Collection> getJerseyResources() { - return List.of(ListActiveTasks.class); - } } From 579925d3fe6054fa59207d2cb6a73d91a0222677 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 00:56:22 +0530 Subject: [PATCH 13/47] removing debug --- .../apache/solr/client/api/endpoint/ListActiveTasksApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index 3b6ed8bc854f..8a373d9bef32 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -10,16 +10,16 @@ import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; -@Path(INDEX_PATH_PREFIX + "/tasks/listjalaz") +@Path(INDEX_PATH_PREFIX + "/tasks/list") public interface ListActiveTasksApi { - // Handles: .../tasks/listjalaz (Lists all) + // Handles: .../tasks/list (Lists all) @GET @StoreApiParameters @Operation(summary = "Lists all the currently running tasks", tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; - // Handles: .../tasks/listjalaz/xyz (Lists specific) + // Handles: .../tasks/list/xyz (Lists specific) @GET @Path("/{taskUUID}") @StoreApiParameters From eb1cd97d75c099ad20bf983f13a6dbefb849d003 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 03:26:16 +0530 Subject: [PATCH 14/47] done --- .../component/ActiveTasksListHandler.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 82c9f1a26349..0763cda74147 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -19,9 +19,12 @@ import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.solr.api.Api; import org.apache.solr.api.JerseyResource; +import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.handler.api.V2ApiUtils; import org.apache.solr.request.SolrQueryRequest; @@ -48,14 +51,22 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw if (taskStatusCheckUUID != null) { V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); } else { - V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, new ListActiveTasks(req).listAllActiveTasks()); + Map mapTasks = new HashMap<>(); + List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; + if (taskList != null) { + for (ActiveTaskDetails task : taskList) { + mapTasks.put(task.taskUUID, task.taskQuery); + } + } + rsp.add("taskList", mapTasks); } - } + // ////////////////////// SolrInfoMBeans methods ////////////////////// + @Override public String getDescription() { - return "activetaskslist"; + return "Active Tasks List"; } @Override @@ -73,7 +84,6 @@ public SolrRequestHandler getSubHandler(String path) { if (path.startsWith("/tasks/list")) { return this; } - return null; } From 4e10720ae432aa6321cc0446fdbc9caf8d7a2cd7 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 03:29:05 +0530 Subject: [PATCH 15/47] self review --- .../apache/solr/client/api/endpoint/ListActiveTasksApi.java | 2 +- .../apache/solr/handler/component/ActiveTasksListHandler.java | 1 - .../apache/solr/handler/component/TaskManagementHandler.java | 4 ---- 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index 8a373d9bef32..e5de534a7f5c 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -19,7 +19,7 @@ public interface ListActiveTasksApi { @Operation(summary = "Lists all the currently running tasks", tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; - // Handles: .../tasks/list/xyz (Lists specific) + // Handles: .../tasks/list/slow-task-id (Lists specific) @GET @Path("/{taskUUID}") @StoreApiParameters diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 0763cda74147..6991bc942865 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -36,7 +36,6 @@ /** * Handles request for listing all active cancellable tasks - * * All active tasks logic lives in the v2 {@link ListActiveTasks}; this handler is a thin v1 bridge * that extracts request parameters and delegates. */ diff --git a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java index 630c15de74d1..3e9c5ec21160 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/TaskManagementHandler.java @@ -21,17 +21,14 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; -import org.apache.solr.api.JerseyResource; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.core.CoreContainer; import org.apache.solr.core.SolrCore; import org.apache.solr.handler.RequestHandlerBase; -import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.PermissionNameProvider; @@ -132,5 +129,4 @@ public static ResponseBuilder buildResponseBuilder( return rb; } - } From eb9b51b265cf023d00ae8d2f8df50487ba4f1bb7 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 03:40:00 +0530 Subject: [PATCH 16/47] added cl --- changelog/unreleased/SOLR-18248-list-tasks.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 changelog/unreleased/SOLR-18248-list-tasks.yml diff --git a/changelog/unreleased/SOLR-18248-list-tasks.yml b/changelog/unreleased/SOLR-18248-list-tasks.yml new file mode 100644 index 000000000000..5e8df2c0b414 --- /dev/null +++ b/changelog/unreleased/SOLR-18248-list-tasks.yml @@ -0,0 +1,7 @@ +title: Migrated ListTasks API & TaskStatus API from homegrown @EndPoint to JAX-RS +type: added +authors: + - name: Jalaz Kumar +links: + - name: SOLR-18248 + url: https://issues.apache.org/jira/browse/SOLR-18248 From adc7006aa78c46592eea9f1cf385182384103b61 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 03:45:00 +0530 Subject: [PATCH 17/47] tidying done --- .../api/endpoint/ListActiveTasksApi.java | 15 +++++++----- .../client/api/model/ActiveTaskDetails.java | 1 - .../api/model/ListActiveTaskResponse.java | 3 +-- .../client/api/model/TaskStatusResponse.java | 3 +-- .../handler/admin/api/ListActiveTasks.java | 23 +++++++++---------- .../component/ActiveTasksListHandler.java | 11 ++++----- 6 files changed, 27 insertions(+), 29 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index e5de534a7f5c..d857a7541637 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -1,5 +1,7 @@ package org.apache.solr.client.api.endpoint; +import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; + import io.swagger.v3.oas.annotations.Operation; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -8,22 +10,23 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.client.api.util.StoreApiParameters; -import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; - @Path(INDEX_PATH_PREFIX + "/tasks/list") public interface ListActiveTasksApi { // Handles: .../tasks/list (Lists all) @GET @StoreApiParameters - @Operation(summary = "Lists all the currently running tasks", tags = {"tasks"}) + @Operation( + summary = "Lists all the currently running tasks", + tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; // Handles: .../tasks/list/slow-task-id (Lists specific) @GET @Path("/{taskUUID}") @StoreApiParameters - @Operation(summary = "Status of a specific taskUUID passed as pathParam", tags = {"tasks"}) - TaskStatusResponse getTaskStatus( - @PathParam("taskUUID") String taskUUID) throws Exception; + @Operation( + summary = "Status of a specific taskUUID passed as pathParam", + tags = {"tasks"}) + TaskStatusResponse getTaskStatus(@PathParam("taskUUID") String taskUUID) throws Exception; } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java index c7c58f073c43..750638acdb46 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java @@ -13,5 +13,4 @@ public ActiveTaskDetails(String taskUUID, String taskQuery) { @JsonProperty public String taskUUID; @JsonProperty public String taskQuery; - } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java index 826039cd8060..f04771650c19 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -4,6 +4,5 @@ import java.util.List; public class ListActiveTaskResponse extends SolrJerseyResponse { - @JsonProperty - public List taskList; + @JsonProperty public List taskList; } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java index da691675468f..843df81bceed 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -3,6 +3,5 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class TaskStatusResponse extends SolrJerseyResponse { - @JsonProperty - public boolean taskStatus; + @JsonProperty public boolean taskStatus; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index da7aa2093346..672fd7e0115a 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -1,6 +1,12 @@ package org.apache.solr.handler.admin.api; +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + import jakarta.inject.Inject; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.ListActiveTasksApi; import org.apache.solr.client.api.model.ActiveTaskDetails; @@ -9,20 +15,12 @@ import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; - public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { private final SolrQueryRequest solrQueryRequest; @Inject - public ListActiveTasks( - SolrQueryRequest solrQueryRequest) { + public ListActiveTasks(SolrQueryRequest solrQueryRequest) { this.solrQueryRequest = solrQueryRequest; } @@ -41,13 +39,15 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - response.taskStatus = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + response.taskStatus = + solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); return response; } private List extractActiveTaskLists() { - Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); + Iterator> iterator = + solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); List activeTaskDetails = new ArrayList<>(); while (iterator.hasNext()) { @@ -57,5 +57,4 @@ private List extractActiveTaskLists() { return activeTaskDetails; } - } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 6991bc942865..30d6dd68b52b 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -33,11 +33,10 @@ import org.apache.solr.security.AuthorizationContext; import org.apache.solr.security.PermissionNameProvider; - /** - * Handles request for listing all active cancellable tasks - * All active tasks logic lives in the v2 {@link ListActiveTasks}; this handler is a thin v1 bridge - * that extracts request parameters and delegates. + * Handles request for listing all active cancellable tasks All active tasks logic lives in the v2 + * {@link ListActiveTasks}; this handler is a thin v1 bridge that extracts request parameters and + * delegates. */ public class ActiveTasksListHandler extends TaskManagementHandler { // This can be a parent level member but we keep it here to allow future handlers to have @@ -48,7 +47,8 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw String taskStatusCheckUUID = req.getParams().get(TASK_CHECK_UUID, null); if (taskStatusCheckUUID != null) { - V2ApiUtils.squashIntoSolrResponseWithoutHeader(rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); + V2ApiUtils.squashIntoSolrResponseWithoutHeader( + rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); } else { Map mapTasks = new HashMap<>(); List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; @@ -100,5 +100,4 @@ public Collection getApis() { public Collection> getJerseyResources() { return List.of(ListActiveTasks.class); } - } From 996b45b2eb2d8be47884ad96c3c4ad87b37b9b61 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Thu, 21 May 2026 03:53:07 +0530 Subject: [PATCH 18/47] added apache license --- .../api/endpoint/ListActiveTasksApi.java | 17 +++++++ .../client/api/model/ActiveTaskDetails.java | 17 +++++++ .../api/model/ListActiveTaskResponse.java | 17 +++++++ .../client/api/model/TaskStatusResponse.java | 17 +++++++ .../handler/admin/api/ListActiveTasks.java | 17 +++++++ .../handler/admin/api/ListActiveTasksAPI.java | 48 ------------------- 6 files changed, 85 insertions(+), 48 deletions(-) delete mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasksAPI.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java index d857a7541637..b42a8cb38f1c 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.client.api.endpoint; import static org.apache.solr.client.api.util.Constants.INDEX_PATH_PREFIX; diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java index 750638acdb46..874267024f58 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.client.api.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java index f04771650c19..f74ec9096077 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ListActiveTaskResponse.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.client.api.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java index 843df81bceed..9a1c700873dd 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.client.api.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 672fd7e0115a..6d71505e281b 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.handler.admin.api; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasksAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasksAPI.java deleted file mode 100644 index fba3d9d26f3f..000000000000 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasksAPI.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.solr.handler.admin.api; - -import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET; - -import org.apache.solr.api.EndPoint; -import org.apache.solr.handler.component.ActiveTasksListHandler; -import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.SolrQueryResponse; -import org.apache.solr.security.PermissionNameProvider; - -/** - * V2 API for listing any currently running "tasks". - * - *

This API (GET /v2/collections/collectionName/tasks/list) is analogous to the v1 - * /solr/collectionName/tasks/list API. - */ -public class ListActiveTasksAPI { - private final ActiveTasksListHandler listTaskHandler; - - public ListActiveTasksAPI(ActiveTasksListHandler listTaskHandler) { - this.listTaskHandler = listTaskHandler; - } - - @EndPoint( - path = {"/tasks/list"}, - method = GET, - permission = PermissionNameProvider.Name.READ_PERM) - public void listActiveTasks(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - listTaskHandler.handleRequestBody(req, rsp); - } -} From f6cb8f719813a94f8b997b1c1d3b702a6f210a2a Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 23 May 2026 03:32:14 +0530 Subject: [PATCH 19/47] tests --- .../admin/api/ListActiveTasksTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java new file mode 100644 index 000000000000..a4a473b7e8d5 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -0,0 +1,60 @@ +package org.apache.solr.handler.admin.api; + +import io.opentelemetry.api.trace.Span; +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.client.api.model.ActiveTaskDetails; +import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.model.ListAliasesResponse; +import org.apache.solr.cloud.ZkController; +import org.apache.solr.common.cloud.Aliases; +import org.apache.solr.common.cloud.ZkStateReader; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.SolrQueryResponse; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class ListActiveTasksTest extends SolrTestCaseJ4 { + + private SolrQueryRequest mockQueryRequest; + + private ListActiveTasks listActiveTasks; + + @BeforeClass + public static void ensureWorkingMockito() { + assumeWorkingMockito(); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + + mockQueryRequest = mock(SolrQueryRequest.class); + + listActiveTasks = new ListActiveTasks(mockQueryRequest); + } + + @Test + public void testGetActiveTasks() throws Exception { + + Map myMap = new HashMap<>(); + myMap.put("Key1", "Value1"); + myMap.put("Key2", "Value2"); + Iterator> mockIterator = myMap.entrySet().iterator(); + + when(mockQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated()).thenReturn(mockIterator); + + ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks(); + + } + +} From 97e5afa64fa8b64cc3b58bc0a8948333a9bbf0cd Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 23 May 2026 16:02:27 +0530 Subject: [PATCH 20/47] added 1 test --- .../admin/api/ListActiveTasksTest.java | 61 +++++++++++++------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index a4a473b7e8d5..acaffbdddb4e 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -1,30 +1,26 @@ package org.apache.solr.handler.admin.api; -import io.opentelemetry.api.trace.Span; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; import org.apache.solr.SolrTestCaseJ4; -import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.client.api.model.ListAliasesResponse; -import org.apache.solr.cloud.ZkController; -import org.apache.solr.common.cloud.Aliases; -import org.apache.solr.common.cloud.ZkStateReader; -import org.apache.solr.core.CoreContainer; +import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.core.CancellableQueryTracker; +import org.apache.solr.core.SolrCore; import org.apache.solr.request.SolrQueryRequest; -import org.apache.solr.response.SolrQueryResponse; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - public class ListActiveTasksTest extends SolrTestCaseJ4 { private SolrQueryRequest mockQueryRequest; + private SolrCore solrCore; + private CancellableQueryTracker cancellableQueryTracker; private ListActiveTasks listActiveTasks; @@ -39,6 +35,8 @@ public void setUp() throws Exception { super.setUp(); mockQueryRequest = mock(SolrQueryRequest.class); + solrCore = mock(SolrCore.class); + cancellableQueryTracker = mock(CancellableQueryTracker.class); listActiveTasks = new ListActiveTasks(mockQueryRequest); } @@ -46,15 +44,40 @@ public void setUp() throws Exception { @Test public void testGetActiveTasks() throws Exception { - Map myMap = new HashMap<>(); - myMap.put("Key1", "Value1"); - myMap.put("Key2", "Value2"); + Map myMap = new LinkedHashMap<>(); + myMap.put("taskID1", "/search?q=h&gf=text-1"); + myMap.put("taskID2", "/search?q=h&gf=text-2"); Iterator> mockIterator = myMap.entrySet().iterator(); - when(mockQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated()).thenReturn(mockIterator); + when(mockQueryRequest.getCore()).thenReturn(solrCore); + when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); + when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator); ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks(); + assertNotNull(response.taskList); + + assertEquals(2, response.taskList.size()); + assertEquals("taskID1", response.taskList.get(0).taskUUID); + assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); + + assertNull(response.error); } + @Test + public void testGetTaskStatus() throws Exception { + + when(mockQueryRequest.getCore()).thenReturn(solrCore); + when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); + when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); + when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); + + TaskStatusResponse responseRunningTask = listActiveTasks.getTaskStatus("taskID_running"); + assertTrue(responseRunningTask.taskStatus); + assertNull(responseRunningTask.error); + + TaskStatusResponse responseStoppedTask = listActiveTasks.getTaskStatus("taskID_stopped"); + assertFalse(responseStoppedTask.taskStatus); + assertNull(responseStoppedTask.error); + } } From 3d72214eb82bee0d0bb23cbf02bedc9e4cd930b7 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 23 May 2026 21:07:24 +0530 Subject: [PATCH 21/47] added license --- .../handler/admin/api/ListActiveTasksTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index acaffbdddb4e..22a86ad00a14 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.handler.admin.api; import static org.mockito.Mockito.mock; From 68eec354cdbe3856f5dd5464dd55f9c317c63c1c Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sun, 24 May 2026 16:40:38 +0530 Subject: [PATCH 22/47] test corrections --- .../apache/solr/client/api/model/TaskStatusResponse.java | 2 +- .../apache/solr/handler/admin/api/ListActiveTasks.java | 9 +++++++-- .../solr/handler/component/ActiveTasksListHandler.java | 7 ++++--- .../solr/handler/admin/api/ListActiveTasksTest.java | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java index 9a1c700873dd..6cae72670d7c 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -20,5 +20,5 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class TaskStatusResponse extends SolrJerseyResponse { - @JsonProperty public boolean taskStatus; + @JsonProperty public String taskStatus; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 6d71505e281b..ab8a1459b840 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -56,8 +56,13 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - response.taskStatus = - solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + + boolean isTaskActive = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + if (isTaskActive) { + response.taskStatus = "id: "+ taskUUID + ", status: active"; + } else { + response.taskStatus = "id: "+ taskUUID + ", status: inactive"; + } return response; } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 30d6dd68b52b..9fd25bcde501 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -25,6 +25,7 @@ import org.apache.solr.api.Api; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.model.ActiveTaskDetails; +import org.apache.solr.common.util.NamedList; import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.handler.api.V2ApiUtils; import org.apache.solr.request.SolrQueryRequest; @@ -50,14 +51,14 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw V2ApiUtils.squashIntoSolrResponseWithoutHeader( rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); } else { - Map mapTasks = new HashMap<>(); + NamedList tasks = new NamedList<>(); List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; if (taskList != null) { for (ActiveTaskDetails task : taskList) { - mapTasks.put(task.taskUUID, task.taskQuery); + tasks.add(task.taskUUID, task.taskQuery); } } - rsp.add("taskList", mapTasks); + rsp.add("taskList", tasks); } } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index 22a86ad00a14..7fb8114e0726 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -90,11 +90,11 @@ public void testGetTaskStatus() throws Exception { when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); TaskStatusResponse responseRunningTask = listActiveTasks.getTaskStatus("taskID_running"); - assertTrue(responseRunningTask.taskStatus); + assertTrue(responseRunningTask.taskStatus.contains("active")); assertNull(responseRunningTask.error); TaskStatusResponse responseStoppedTask = listActiveTasks.getTaskStatus("taskID_stopped"); - assertFalse(responseStoppedTask.taskStatus); + assertTrue(responseStoppedTask.taskStatus.contains("inactive")); assertNull(responseStoppedTask.error); } } From 87204e22104396b75555e5174ccad1ea7dbfc67e Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sun, 24 May 2026 16:45:32 +0530 Subject: [PATCH 23/47] minor tidy --- .../apache/solr/handler/admin/api/ListActiveTasks.java | 8 ++++---- .../solr/handler/component/ActiveTasksListHandler.java | 2 -- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index ab8a1459b840..ea3fd00a4426 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -56,12 +56,12 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - - boolean isTaskActive = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + boolean isTaskActive = + solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); if (isTaskActive) { - response.taskStatus = "id: "+ taskUUID + ", status: active"; + response.taskStatus = "id: " + taskUUID + ", status: active"; } else { - response.taskStatus = "id: "+ taskUUID + ", status: inactive"; + response.taskStatus = "id: " + taskUUID + ", status: inactive"; } return response; diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 9fd25bcde501..4f367aad1a0d 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -19,9 +19,7 @@ import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.solr.api.Api; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.model.ActiveTaskDetails; From 930312b848b6f0fb59647d9509c4c9285798c70a Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sun, 24 May 2026 17:38:29 +0530 Subject: [PATCH 24/47] test to check actual active/inactive --- .../solr/search/TestTaskManagement.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java index 13c98d87aceb..ed6a0bb121c0 100644 --- a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java +++ b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java @@ -213,6 +213,46 @@ public void testCheckSpecificQueryStatus() throws Exception { assertTrue(result.contains("inactive")); } + @Test + public void testCheckSpecificQueryStatus_Active() throws Exception { + for (int i = 0; i < 10; i++) { + executeQueryAsync(Integer.toString(i)); + } + + ModifiableSolrParams params = new ModifiableSolrParams(); + params.set("taskUUID", "5"); + + var request = + new GenericSolrRequest( + SolrRequest.METHOD.GET, "/tasks/list", SolrRequest.SolrRequestType.ADMIN, params) + .setRequiresCollection(true); + NamedList queryResponse = cluster.getSolrClient(COLLECTION_NAME).request(request); + + String result = (String) queryResponse.get("taskStatus"); + + assertTrue(result.contains("active")); + } + + @Test + public void testCheckSpecificQueryStatus_Inactive() throws Exception { + for (int i = 0; i < 10; i++) { + executeQueryAsync(Integer.toString(i)); + } + + ModifiableSolrParams params = new ModifiableSolrParams(); + params.set("taskUUID", "15"); + + var request = + new GenericSolrRequest( + SolrRequest.METHOD.GET, "/tasks/list", SolrRequest.SolrRequestType.ADMIN, params) + .setRequiresCollection(true); + NamedList queryResponse = cluster.getSolrClient(COLLECTION_NAME).request(request); + + String result = (String) queryResponse.get("taskStatus"); + + assertTrue(result.contains("inactive")); + } + private CompletableFuture cancelQuery( final String queryID, Set cancelledQueryIdsSet, Set notFoundQueryIdSet) { return CompletableFuture.runAsync( From 199cb2453cfb9a1b680b45ed35143767c54049ba Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 00:48:37 +0530 Subject: [PATCH 25/47] comments addressal --- .../{ListActiveTasksApi.java => TasksApi.java} | 10 ++++------ .../solr/client/api/model/ActiveTaskDetails.java | 6 +++--- .../solr/handler/admin/api/ListActiveTasks.java | 12 ++++++------ .../handler/component/ActiveTasksListHandler.java | 2 +- .../solr/handler/admin/api/ListActiveTasksTest.java | 4 ++-- 5 files changed, 16 insertions(+), 18 deletions(-) rename solr/api/src/java/org/apache/solr/client/api/endpoint/{ListActiveTasksApi.java => TasksApi.java} (84%) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java similarity index 84% rename from solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java rename to solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index b42a8cb38f1c..1c9cb95e4193 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ListActiveTasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -27,10 +27,9 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.client.api.util.StoreApiParameters; -@Path(INDEX_PATH_PREFIX + "/tasks/list") -public interface ListActiveTasksApi { +@Path(INDEX_PATH_PREFIX + "/tasks") +public interface TasksApi { - // Handles: .../tasks/list (Lists all) @GET @StoreApiParameters @Operation( @@ -38,12 +37,11 @@ public interface ListActiveTasksApi { tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; - // Handles: .../tasks/list/slow-task-id (Lists specific) @GET - @Path("/{taskUUID}") + @Path("/{taskID}") @StoreApiParameters @Operation( summary = "Status of a specific taskUUID passed as pathParam", tags = {"tasks"}) - TaskStatusResponse getTaskStatus(@PathParam("taskUUID") String taskUUID) throws Exception; + TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java index 874267024f58..8781623c5c95 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/ActiveTaskDetails.java @@ -23,11 +23,11 @@ public class ActiveTaskDetails { public ActiveTaskDetails() {} - public ActiveTaskDetails(String taskUUID, String taskQuery) { - this.taskUUID = taskUUID; + public ActiveTaskDetails(String taskID, String taskQuery) { + this.taskID = taskID; this.taskQuery = taskQuery; } - @JsonProperty public String taskUUID; + @JsonProperty public String taskID; @JsonProperty public String taskQuery; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index ea3fd00a4426..c2becbcbd43e 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -25,14 +25,14 @@ import java.util.List; import java.util.Map; import org.apache.solr.api.JerseyResource; -import org.apache.solr.client.api.endpoint.ListActiveTasksApi; +import org.apache.solr.client.api.endpoint.TasksApi; import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -public class ListActiveTasks extends JerseyResource implements ListActiveTasksApi { +public class ListActiveTasks extends JerseyResource implements TasksApi { private final SolrQueryRequest solrQueryRequest; @@ -53,15 +53,15 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { @Override @PermissionName(READ_PERM) - public TaskStatusResponse getTaskStatus(String taskUUID) throws Exception { + public TaskStatusResponse getTaskStatus(String taskID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); boolean isTaskActive = - solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskUUID); + solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); if (isTaskActive) { - response.taskStatus = "id: " + taskUUID + ", status: active"; + response.taskStatus = "id: " + taskID + ", status: active"; } else { - response.taskStatus = "id: " + taskUUID + ", status: inactive"; + response.taskStatus = "id: " + taskID + ", status: inactive"; } return response; diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 4f367aad1a0d..4b34f9d49261 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -53,7 +53,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; if (taskList != null) { for (ActiveTaskDetails task : taskList) { - tasks.add(task.taskUUID, task.taskQuery); + tasks.add(task.taskID, task.taskQuery); } } rsp.add("taskList", tasks); diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index 7fb8114e0726..13c2789cdef5 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -75,8 +75,8 @@ public void testGetActiveTasks() throws Exception { assertEquals(2, response.taskList.size()); - assertEquals("taskID1", response.taskList.get(0).taskUUID); - assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); + assertEquals("taskID1", response.taskList.getFirst().taskID); + assertEquals("/search?q=h&gf=text-1", response.taskList.getFirst().taskQuery); assertNull(response.error); } From 24ca810f9e7f09a34b973fd06e9bac166e1b61de Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 02:41:45 +0530 Subject: [PATCH 26/47] comments addressed --- .../unreleased/SOLR-18248-list-tasks.yml | 1 + .../solr/client/api/endpoint/TasksApi.java | 33 ++++---- .../client/api/model/TaskStatusResponse.java | 14 +++- .../solr/handler/admin/api/GetTaskStatus.java | 48 ++++++++++++ .../handler/admin/api/ListActiveTasks.java | 21 +---- .../component/ActiveTasksListHandler.java | 19 +++-- .../handler/admin/api/GetTaskStatusTest.java | 77 +++++++++++++++++++ .../admin/api/ListActiveTasksTest.java | 25 ++---- 8 files changed, 175 insertions(+), 63 deletions(-) create mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java create mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java diff --git a/changelog/unreleased/SOLR-18248-list-tasks.yml b/changelog/unreleased/SOLR-18248-list-tasks.yml index 5e8df2c0b414..3dc9716c12c5 100644 --- a/changelog/unreleased/SOLR-18248-list-tasks.yml +++ b/changelog/unreleased/SOLR-18248-list-tasks.yml @@ -2,6 +2,7 @@ title: Migrated ListTasks API & TaskStatus API from homegrown @EndPoint to JAX-R type: added authors: - name: Jalaz Kumar + - name: Eric Pugh links: - name: SOLR-18248 url: https://issues.apache.org/jira/browse/SOLR-18248 diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index 1c9cb95e4193..c11126c30c13 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -27,21 +27,26 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.client.api.util.StoreApiParameters; -@Path(INDEX_PATH_PREFIX + "/tasks") +@Path(INDEX_PATH_PREFIX) public interface TasksApi { - @GET - @StoreApiParameters - @Operation( - summary = "Lists all the currently running tasks", - tags = {"tasks"}) - ListActiveTaskResponse listAllActiveTasks() throws Exception; + @Path("/tasks") + interface List { + @GET + @StoreApiParameters + @Operation( + summary = "Lists all the currently running active tasks.", + tags = {"tasks"}) + ListActiveTaskResponse listAllActiveTasks() throws Exception; + } - @GET - @Path("/{taskID}") - @StoreApiParameters - @Operation( - summary = "Status of a specific taskUUID passed as pathParam", - tags = {"tasks"}) - TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; + @Path("/tasks/{taskID}") + interface Status { + @GET + @StoreApiParameters + @Operation( + summary = "Status of a specific taskID passed as pathParam.", + tags = {"tasks"}) + TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; + } } diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java index 6cae72670d7c..2b3692203d80 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -20,5 +20,17 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class TaskStatusResponse extends SolrJerseyResponse { - @JsonProperty public String taskStatus; + + public enum TaskStatus { + ACTIVE("active"), + INACTIVE("inactive"); + + private final String value; + + TaskStatus(String value) { this.value = value; } + + public String getValue() { return this.value; } + } + + @JsonProperty public TaskStatus taskStatus; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java new file mode 100644 index 000000000000..6b178da187db --- /dev/null +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.solr.handler.admin.api; + +import org.apache.solr.api.JerseyResource; +import org.apache.solr.client.api.endpoint.TasksApi; +import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.jersey.PermissionName; +import org.apache.solr.request.SolrQueryRequest; + +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + +public class GetTaskStatus extends JerseyResource implements TasksApi.Status { + + private final SolrQueryRequest solrQueryRequest; + + public GetTaskStatus(SolrQueryRequest solrQueryRequest) { + this.solrQueryRequest = solrQueryRequest; + } + + @Override + @PermissionName(READ_PERM) + public TaskStatusResponse getTaskStatus(String taskID) throws Exception { + final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); + + boolean isTaskActive = + solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); + + response.taskStatus = (isTaskActive) ? TaskStatusResponse.TaskStatus.ACTIVE : TaskStatusResponse.TaskStatus.INACTIVE; + + return response; + } +} diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index c2becbcbd43e..56c4a1ba8a3f 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -28,11 +28,10 @@ import org.apache.solr.client.api.endpoint.TasksApi; import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -public class ListActiveTasks extends JerseyResource implements TasksApi { +public class ListActiveTasks extends JerseyResource implements TasksApi.List { private final SolrQueryRequest solrQueryRequest; @@ -45,25 +44,7 @@ public ListActiveTasks(SolrQueryRequest solrQueryRequest) { @PermissionName(READ_PERM) public ListActiveTaskResponse listAllActiveTasks() throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - response.taskList = extractActiveTaskLists(); - - return response; - } - - @Override - @PermissionName(READ_PERM) - public TaskStatusResponse getTaskStatus(String taskID) throws Exception { - final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - - boolean isTaskActive = - solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); - if (isTaskActive) { - response.taskStatus = "id: " + taskID + ", status: active"; - } else { - response.taskStatus = "id: " + taskID + ", status: inactive"; - } - return response; } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 4b34f9d49261..52d268ad5f69 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -23,9 +23,10 @@ import org.apache.solr.api.Api; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.model.ActiveTaskDetails; +import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.common.util.NamedList; +import org.apache.solr.handler.admin.api.GetTaskStatus; import org.apache.solr.handler.admin.api.ListActiveTasks; -import org.apache.solr.handler.api.V2ApiUtils; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.SolrQueryResponse; @@ -33,9 +34,9 @@ import org.apache.solr.security.PermissionNameProvider; /** - * Handles request for listing all active cancellable tasks All active tasks logic lives in the v2 - * {@link ListActiveTasks}; this handler is a thin v1 bridge that extracts request parameters and - * delegates. + * Handles request for listing the active cancellable tasks & Status check of any particular task, + * actual logic lives in the v2: {@link ListActiveTasks} & {@link GetTaskStatus}; + * this handler is a thin v1 bridge that extracts request parameters and delegates over to v2. */ public class ActiveTasksListHandler extends TaskManagementHandler { // This can be a parent level member but we keep it here to allow future handlers to have @@ -43,11 +44,13 @@ public class ActiveTasksListHandler extends TaskManagementHandler { @Override public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - String taskStatusCheckUUID = req.getParams().get(TASK_CHECK_UUID, null); + String taskStatusCheckID = req.getParams().get(TASK_CHECK_UUID, null); + + if (taskStatusCheckID != null) { + TaskStatusResponse taskStatusResponse = new GetTaskStatus(req).getTaskStatus(taskStatusCheckID); + String taskStatus = "id: " + taskStatusCheckID + ", status: " + taskStatusResponse.taskStatus.getValue(); + rsp.add("taskStatus", taskStatus); - if (taskStatusCheckUUID != null) { - V2ApiUtils.squashIntoSolrResponseWithoutHeader( - rsp, new ListActiveTasks(req).getTaskStatus(taskStatusCheckUUID)); } else { NamedList tasks = new NamedList<>(); List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java new file mode 100644 index 000000000000..b9b09a83dfa4 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.solr.handler.admin.api; + +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.core.CancellableQueryTracker; +import org.apache.solr.core.SolrCore; +import org.apache.solr.request.SolrQueryRequest; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class GetTaskStatusTest extends SolrTestCaseJ4 { + + private SolrQueryRequest mockQueryRequest; + private SolrCore solrCore; + private CancellableQueryTracker cancellableQueryTracker; + + private GetTaskStatus getTaskStatus; + + + @BeforeClass + public static void ensureWorkingMockito() { + assumeWorkingMockito(); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + + mockQueryRequest = mock(SolrQueryRequest.class); + solrCore = mock(SolrCore.class); + cancellableQueryTracker = mock(CancellableQueryTracker.class); + + getTaskStatus = new GetTaskStatus(mockQueryRequest); + } + + @Test + public void testGetTaskStatus() throws Exception { + + when(mockQueryRequest.getCore()).thenReturn(solrCore); + when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); + when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); + when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); + + TaskStatusResponse taskStatusResponse; + + taskStatusResponse = getTaskStatus.getTaskStatus("taskID_running"); + assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, taskStatusResponse.taskStatus); + assertNull(taskStatusResponse.error); + + taskStatusResponse = getTaskStatus.getTaskStatus("taskID_stopped"); + assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, taskStatusResponse.taskStatus); + assertNull(taskStatusResponse.error); + } + +} diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index 13c2789cdef5..5c543baf97f1 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -25,7 +25,6 @@ import java.util.Map; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.core.CancellableQueryTracker; import org.apache.solr.core.SolrCore; import org.apache.solr.request.SolrQueryRequest; @@ -75,26 +74,12 @@ public void testGetActiveTasks() throws Exception { assertEquals(2, response.taskList.size()); - assertEquals("taskID1", response.taskList.getFirst().taskID); - assertEquals("/search?q=h&gf=text-1", response.taskList.getFirst().taskQuery); + assertEquals("taskID1", response.taskList.get(0).taskID); + assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); - assertNull(response.error); - } + assertEquals("taskID2", response.taskList.get(1).taskID); + assertEquals("/search?q=h&gf=text-2", response.taskList.get(1).taskQuery); - @Test - public void testGetTaskStatus() throws Exception { - - when(mockQueryRequest.getCore()).thenReturn(solrCore); - when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); - when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); - when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); - - TaskStatusResponse responseRunningTask = listActiveTasks.getTaskStatus("taskID_running"); - assertTrue(responseRunningTask.taskStatus.contains("active")); - assertNull(responseRunningTask.error); - - TaskStatusResponse responseStoppedTask = listActiveTasks.getTaskStatus("taskID_stopped"); - assertTrue(responseStoppedTask.taskStatus.contains("inactive")); - assertNull(responseStoppedTask.error); + assertNull(response.error); } } From c583c386ffc0c4e12d488edef2474c01cc05dede Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 02:45:16 +0530 Subject: [PATCH 27/47] tidying it up --- .../solr/client/api/model/TaskStatusResponse.java | 8 ++++++-- .../apache/solr/handler/admin/api/GetTaskStatus.java | 9 ++++++--- .../handler/component/ActiveTasksListHandler.java | 12 +++++++----- .../solr/handler/admin/api/GetTaskStatusTest.java | 8 +++----- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java index 2b3692203d80..16a0f89c53bf 100644 --- a/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java +++ b/solr/api/src/java/org/apache/solr/client/api/model/TaskStatusResponse.java @@ -27,9 +27,13 @@ public enum TaskStatus { private final String value; - TaskStatus(String value) { this.value = value; } + TaskStatus(String value) { + this.value = value; + } - public String getValue() { return this.value; } + public String getValue() { + return this.value; + } } @JsonProperty public TaskStatus taskStatus; diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java index 6b178da187db..6edef2d6f306 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -17,14 +17,14 @@ package org.apache.solr.handler.admin.api; +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.TasksApi; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; - public class GetTaskStatus extends JerseyResource implements TasksApi.Status { private final SolrQueryRequest solrQueryRequest; @@ -41,7 +41,10 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { boolean isTaskActive = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); - response.taskStatus = (isTaskActive) ? TaskStatusResponse.TaskStatus.ACTIVE : TaskStatusResponse.TaskStatus.INACTIVE; + response.taskStatus = + (isTaskActive) + ? TaskStatusResponse.TaskStatus.ACTIVE + : TaskStatusResponse.TaskStatus.INACTIVE; return response; } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 52d268ad5f69..19ae609c50f9 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -34,9 +34,9 @@ import org.apache.solr.security.PermissionNameProvider; /** - * Handles request for listing the active cancellable tasks & Status check of any particular task, - * actual logic lives in the v2: {@link ListActiveTasks} & {@link GetTaskStatus}; - * this handler is a thin v1 bridge that extracts request parameters and delegates over to v2. + * Handles request for listing the active cancellable tasks and Status check of any particular task, + * actual logic lives in the v2: {@link ListActiveTasks} and {@link GetTaskStatus}; this handler is + * a thin v1 bridge that extracts request parameters and delegates over to v2. */ public class ActiveTasksListHandler extends TaskManagementHandler { // This can be a parent level member but we keep it here to allow future handlers to have @@ -47,8 +47,10 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw String taskStatusCheckID = req.getParams().get(TASK_CHECK_UUID, null); if (taskStatusCheckID != null) { - TaskStatusResponse taskStatusResponse = new GetTaskStatus(req).getTaskStatus(taskStatusCheckID); - String taskStatus = "id: " + taskStatusCheckID + ", status: " + taskStatusResponse.taskStatus.getValue(); + TaskStatusResponse taskStatusResponse = + new GetTaskStatus(req).getTaskStatus(taskStatusCheckID); + String taskStatus = + "id: " + taskStatusCheckID + ", status: " + taskStatusResponse.taskStatus.getValue(); rsp.add("taskStatus", taskStatus); } else { diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java index b9b09a83dfa4..d824d6438e22 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java @@ -17,6 +17,9 @@ package org.apache.solr.handler.admin.api; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.core.CancellableQueryTracker; @@ -26,9 +29,6 @@ import org.junit.BeforeClass; import org.junit.Test; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - public class GetTaskStatusTest extends SolrTestCaseJ4 { private SolrQueryRequest mockQueryRequest; @@ -37,7 +37,6 @@ public class GetTaskStatusTest extends SolrTestCaseJ4 { private GetTaskStatus getTaskStatus; - @BeforeClass public static void ensureWorkingMockito() { assumeWorkingMockito(); @@ -73,5 +72,4 @@ public void testGetTaskStatus() throws Exception { assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, taskStatusResponse.taskStatus); assertNull(taskStatusResponse.error); } - } From bb0f0f147570ac4e536b37e9e2982c4ed9e31601 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 08:17:10 +0530 Subject: [PATCH 28/47] comments addressed --- .../apache/solr/client/api/endpoint/TasksApi.java | 4 ++-- .../apache/solr/handler/admin/api/GetTaskStatus.java | 5 +++-- .../handler/component/ActiveTasksListHandler.java | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index c11126c30c13..a706a00cfaba 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -35,7 +35,7 @@ interface List { @GET @StoreApiParameters @Operation( - summary = "Lists all the currently running active tasks.", + summary = "Lists all the active tasks.", tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; } @@ -45,7 +45,7 @@ interface Status { @GET @StoreApiParameters @Operation( - summary = "Status of a specific taskID passed as pathParam.", + summary = "Status of a specific taskID.", tags = {"tasks"}) TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java index 6edef2d6f306..e24a32949da3 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -17,6 +17,7 @@ package org.apache.solr.handler.admin.api; +import static org.apache.solr.client.api.model.TaskStatusResponse.TaskStatus; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; import org.apache.solr.api.JerseyResource; @@ -43,8 +44,8 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { response.taskStatus = (isTaskActive) - ? TaskStatusResponse.TaskStatus.ACTIVE - : TaskStatusResponse.TaskStatus.INACTIVE; + ? TaskStatus.ACTIVE + : TaskStatus.INACTIVE; return response; } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 19ae609c50f9..839be5b41847 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -34,8 +34,8 @@ import org.apache.solr.security.PermissionNameProvider; /** - * Handles request for listing the active cancellable tasks and Status check of any particular task, - * actual logic lives in the v2: {@link ListActiveTasks} and {@link GetTaskStatus}; this handler is + * Handles request for listing all active cancellable tasks and get status check of any taskId. + * Actual logic lives in the v2: {@link ListActiveTasks} and {@link GetTaskStatus}; this handler is * a thin v1 bridge that extracts request parameters and delegates over to v2. */ public class ActiveTasksListHandler extends TaskManagementHandler { @@ -44,13 +44,13 @@ public class ActiveTasksListHandler extends TaskManagementHandler { @Override public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - String taskStatusCheckID = req.getParams().get(TASK_CHECK_UUID, null); + String taskStatusCheckUUID = req.getParams().get(TASK_CHECK_UUID, null); - if (taskStatusCheckID != null) { + if (taskStatusCheckUUID != null) { TaskStatusResponse taskStatusResponse = - new GetTaskStatus(req).getTaskStatus(taskStatusCheckID); + new GetTaskStatus(req).getTaskStatus(taskStatusCheckUUID); String taskStatus = - "id: " + taskStatusCheckID + ", status: " + taskStatusResponse.taskStatus.getValue(); + "id: " + taskStatusCheckUUID + ", status: " + taskStatusResponse.taskStatus.getValue(); rsp.add("taskStatus", taskStatus); } else { From d0ddec6dfb76597d324f410e5f5cf0ce91d19ddb Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 08:17:57 +0530 Subject: [PATCH 29/47] tidy up --- .../org/apache/solr/handler/admin/api/GetTaskStatus.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java index e24a32949da3..98c77028158f 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -42,10 +42,7 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { boolean isTaskActive = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); - response.taskStatus = - (isTaskActive) - ? TaskStatus.ACTIVE - : TaskStatus.INACTIVE; + response.taskStatus = (isTaskActive) ? TaskStatus.ACTIVE : TaskStatus.INACTIVE; return response; } From 09052026d7012722ece4a6768b5c8c6c28841a8a Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 08:22:57 +0530 Subject: [PATCH 30/47] update --- .../src/java/org/apache/solr/client/api/endpoint/TasksApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index a706a00cfaba..30dce7597918 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -45,7 +45,7 @@ interface Status { @GET @StoreApiParameters @Operation( - summary = "Status of a specific taskID.", + summary = "Status of a specific task.", tags = {"tasks"}) TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; } From d08d788075a6ff987e1baebaef6e3c7c0dc4b390 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 29 May 2026 09:22:04 +0530 Subject: [PATCH 31/47] minor --- .../src/java/org/apache/solr/client/api/endpoint/TasksApi.java | 2 +- .../java/org/apache/solr/handler/admin/api/GetTaskStatus.java | 2 ++ .../apache/solr/handler/component/ActiveTasksListHandler.java | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index 30dce7597918..12d1ae0d3ef3 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -27,7 +27,7 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.client.api.util.StoreApiParameters; -@Path(INDEX_PATH_PREFIX) +@Path(INDEX_PATH_PREFIX + "/tasks") public interface TasksApi { @Path("/tasks") diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java index 98c77028158f..95ca04837b9d 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -20,6 +20,7 @@ import static org.apache.solr.client.api.model.TaskStatusResponse.TaskStatus; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; +import jakarta.inject.Inject; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.TasksApi; import org.apache.solr.client.api.model.TaskStatusResponse; @@ -30,6 +31,7 @@ public class GetTaskStatus extends JerseyResource implements TasksApi.Status { private final SolrQueryRequest solrQueryRequest; + @Inject public GetTaskStatus(SolrQueryRequest solrQueryRequest) { this.solrQueryRequest = solrQueryRequest; } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 839be5b41847..c64fc1669bb2 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -102,6 +102,6 @@ public Collection getApis() { @Override public Collection> getJerseyResources() { - return List.of(ListActiveTasks.class); + return List.of(ListActiveTasks.class, GetTaskStatus.class); } } From 1b0b81da66d503668ee83fa88ef23e543c725bd4 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Fri, 29 May 2026 07:48:51 -0400 Subject: [PATCH 32/47] Remove "breadcrumb" pointer, we only do it in one other place. Turns out I started this pattern, but it's not actually a pattern we want to support! So backing it out of the two places that have it. --- .../org/apache/solr/handler/admin/HealthCheckHandler.java | 3 --- .../solr/handler/component/ActiveTasksListHandler.java | 6 +----- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java index 1dab5d1d9778..8c73ac11af3b 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/HealthCheckHandler.java @@ -59,9 +59,6 @@ * specify the acceptable generation lag follower should be with respect to its leader using the * maxGenerationLag=<max_generation_lag> request parameter. If * maxGenerationLag is not provided then health check would simply return OK. - * - *

All health-check logic lives in the v2 {@link NodeHealth}; this handler is a thin v1 bridge - * that extracts request parameters and delegates. */ public class HealthCheckHandler extends RequestHandlerBase { diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index c64fc1669bb2..2cd5e3857a45 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -33,11 +33,7 @@ import org.apache.solr.security.AuthorizationContext; import org.apache.solr.security.PermissionNameProvider; -/** - * Handles request for listing all active cancellable tasks and get status check of any taskId. - * Actual logic lives in the v2: {@link ListActiveTasks} and {@link GetTaskStatus}; this handler is - * a thin v1 bridge that extracts request parameters and delegates over to v2. - */ +/** Handles request for listing all active cancellable tasks and get status check of any taskId. */ public class ActiveTasksListHandler extends TaskManagementHandler { // This can be a parent level member but we keep it here to allow future handlers to have // a custom list of components From 200afbaeb67adc97993462b5d45cdaec7f79f0b5 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Sat, 30 May 2026 02:47:17 +0530 Subject: [PATCH 33/47] checking --- .../java/org/apache/solr/client/api/endpoint/TasksApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index 12d1ae0d3ef3..ff2762dbf5c4 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -30,7 +30,7 @@ @Path(INDEX_PATH_PREFIX + "/tasks") public interface TasksApi { - @Path("/tasks") + @Path("") interface List { @GET @StoreApiParameters @@ -40,7 +40,7 @@ interface List { ListActiveTaskResponse listAllActiveTasks() throws Exception; } - @Path("/tasks/{taskID}") + @Path("{taskID}") interface Status { @GET @StoreApiParameters From d1614855dbdbf1c970bd304092568e1d7555a6e2 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Wed, 3 Jun 2026 01:14:59 +0530 Subject: [PATCH 34/47] this works --- .../solr/client/api/endpoint/TasksApi.java | 31 ++++------ .../solr/handler/admin/api/ActiveTask.java | 61 +++++++++++++++++++ 2 files changed, 74 insertions(+), 18 deletions(-) create mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index ff2762dbf5c4..98061204eebf 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -30,23 +30,18 @@ @Path(INDEX_PATH_PREFIX + "/tasks") public interface TasksApi { - @Path("") - interface List { - @GET - @StoreApiParameters - @Operation( - summary = "Lists all the active tasks.", - tags = {"tasks"}) - ListActiveTaskResponse listAllActiveTasks() throws Exception; - } + @GET + @StoreApiParameters + @Operation( + summary = "Lists all the currently running tasks", + tags = {"tasks"}) + ListActiveTaskResponse listAllActiveTasks() throws Exception; - @Path("{taskID}") - interface Status { - @GET - @StoreApiParameters - @Operation( - summary = "Status of a specific task.", - tags = {"tasks"}) - TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; - } + @GET + @Path("/{taskUUID}") + @StoreApiParameters + @Operation( + summary = "Status of a specific taskUUID passed as pathParam", + tags = {"tasks"}) + TaskStatusResponse getTaskStatus(@PathParam("taskUUID") String taskUUID) throws Exception; } diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java new file mode 100644 index 000000000000..3b02b6eba3b6 --- /dev/null +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -0,0 +1,61 @@ +package org.apache.solr.handler.admin.api; + +import jakarta.inject.Inject; +import org.apache.solr.api.JerseyResource; +import org.apache.solr.client.api.endpoint.TasksApi; +import org.apache.solr.client.api.model.ActiveTaskDetails; +import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.jersey.PermissionName; +import org.apache.solr.request.SolrQueryRequest; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + +public class ActiveTask extends JerseyResource implements TasksApi { + + private final SolrQueryRequest solrQueryRequest; + + @Inject + public ActiveTask(SolrQueryRequest solrQueryRequest) { + this.solrQueryRequest = solrQueryRequest; + } + + @Override + @PermissionName(READ_PERM) + public ListActiveTaskResponse listAllActiveTasks() throws Exception { + final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); + response.taskList = extractActiveTaskLists(); + return response; + } + + @Override + @PermissionName(READ_PERM) + public TaskStatusResponse getTaskStatus(String taskID) throws Exception { + final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); + + boolean isTaskActive = + solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); + + response.taskStatus = (isTaskActive) ? TaskStatusResponse.TaskStatus.ACTIVE : TaskStatusResponse.TaskStatus.INACTIVE; + + return response; + } + + private List extractActiveTaskLists() { + Iterator> iterator = + solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); + + List activeTaskDetails = new ArrayList<>(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), entry.getValue())); + } + + return activeTaskDetails; + } + +} From 12e0a9c27a68f2e66b27f00c6fdb70e7934d3811 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Wed, 3 Jun 2026 01:15:40 +0530 Subject: [PATCH 35/47] commenting the remaining code & related tests for now --- .../solr/handler/admin/api/GetTaskStatus.java | 44 ++++----- .../handler/admin/api/ListActiveTasks.java | 60 ++++++------ .../component/ActiveTasksListHandler.java | 12 ++- .../handler/admin/api/GetTaskStatusTest.java | 82 ++++++++-------- .../admin/api/ListActiveTasksTest.java | 96 +++++++++---------- 5 files changed, 148 insertions(+), 146 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java index 95ca04837b9d..4819fd7f95c5 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java @@ -27,25 +27,25 @@ import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -public class GetTaskStatus extends JerseyResource implements TasksApi.Status { - - private final SolrQueryRequest solrQueryRequest; - - @Inject - public GetTaskStatus(SolrQueryRequest solrQueryRequest) { - this.solrQueryRequest = solrQueryRequest; - } - - @Override - @PermissionName(READ_PERM) - public TaskStatusResponse getTaskStatus(String taskID) throws Exception { - final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - - boolean isTaskActive = - solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); - - response.taskStatus = (isTaskActive) ? TaskStatus.ACTIVE : TaskStatus.INACTIVE; - - return response; - } -} +//public class GetTaskStatus extends JerseyResource implements TasksApi.Status { +// +// private final SolrQueryRequest solrQueryRequest; +// +// @Inject +// public GetTaskStatus(SolrQueryRequest solrQueryRequest) { +// this.solrQueryRequest = solrQueryRequest; +// } +// +// @Override +// @PermissionName(READ_PERM) +// public TaskStatusResponse getTaskStatus(String taskID) throws Exception { +// final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); +// +// boolean isTaskActive = +// solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); +// +// response.taskStatus = (isTaskActive) ? TaskStatus.ACTIVE : TaskStatus.INACTIVE; +// +// return response; +// } +//} diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java index 56c4a1ba8a3f..ed65a644e056 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java @@ -31,33 +31,33 @@ import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -public class ListActiveTasks extends JerseyResource implements TasksApi.List { - - private final SolrQueryRequest solrQueryRequest; - - @Inject - public ListActiveTasks(SolrQueryRequest solrQueryRequest) { - this.solrQueryRequest = solrQueryRequest; - } - - @Override - @PermissionName(READ_PERM) - public ListActiveTaskResponse listAllActiveTasks() throws Exception { - final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - response.taskList = extractActiveTaskLists(); - return response; - } - - private List extractActiveTaskLists() { - Iterator> iterator = - solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); - - List activeTaskDetails = new ArrayList<>(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), entry.getValue())); - } - - return activeTaskDetails; - } -} +//public class ListActiveTasks extends JerseyResource implements TasksApi.List { + +// private final SolrQueryRequest solrQueryRequest; +// +// @Inject +// public ListActiveTasks(SolrQueryRequest solrQueryRequest) { +// this.solrQueryRequest = solrQueryRequest; +// } +// +// @Override +// @PermissionName(READ_PERM) +// public ListActiveTaskResponse listAllActiveTasks() throws Exception { +// final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); +// response.taskList = extractActiveTaskLists(); +// return response; +// } +// +// private List extractActiveTaskLists() { +// Iterator> iterator = +// solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); +// +// List activeTaskDetails = new ArrayList<>(); +// while (iterator.hasNext()) { +// Map.Entry entry = iterator.next(); +// activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), entry.getValue())); +// } +// +// return activeTaskDetails; +// } +//} diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 2cd5e3857a45..77fe7bb59d3a 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -25,8 +25,9 @@ import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.common.util.NamedList; -import org.apache.solr.handler.admin.api.GetTaskStatus; -import org.apache.solr.handler.admin.api.ListActiveTasks; +import org.apache.solr.handler.admin.api.ActiveTask; +//import org.apache.solr.handler.admin.api.GetTaskStatus; +//import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.SolrQueryResponse; @@ -44,14 +45,14 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw if (taskStatusCheckUUID != null) { TaskStatusResponse taskStatusResponse = - new GetTaskStatus(req).getTaskStatus(taskStatusCheckUUID); + new ActiveTask(req).getTaskStatus(taskStatusCheckUUID); String taskStatus = "id: " + taskStatusCheckUUID + ", status: " + taskStatusResponse.taskStatus.getValue(); rsp.add("taskStatus", taskStatus); } else { NamedList tasks = new NamedList<>(); - List taskList = new ListActiveTasks(req).listAllActiveTasks().taskList; + List taskList = new ActiveTask(req).listAllActiveTasks().taskList; if (taskList != null) { for (ActiveTaskDetails task : taskList) { tasks.add(task.taskID, task.taskQuery); @@ -98,6 +99,7 @@ public Collection getApis() { @Override public Collection> getJerseyResources() { - return List.of(ListActiveTasks.class, GetTaskStatus.class); +// return List.of(ListActiveTasks.class, GetTaskStatus.class); + return List.of(ActiveTask.class); } } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java index d824d6438e22..9ea347190b1e 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java @@ -31,45 +31,45 @@ public class GetTaskStatusTest extends SolrTestCaseJ4 { - private SolrQueryRequest mockQueryRequest; - private SolrCore solrCore; - private CancellableQueryTracker cancellableQueryTracker; - - private GetTaskStatus getTaskStatus; - - @BeforeClass - public static void ensureWorkingMockito() { - assumeWorkingMockito(); - } - - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - - mockQueryRequest = mock(SolrQueryRequest.class); - solrCore = mock(SolrCore.class); - cancellableQueryTracker = mock(CancellableQueryTracker.class); - - getTaskStatus = new GetTaskStatus(mockQueryRequest); - } - - @Test - public void testGetTaskStatus() throws Exception { - - when(mockQueryRequest.getCore()).thenReturn(solrCore); - when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); - when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); - when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); - - TaskStatusResponse taskStatusResponse; - - taskStatusResponse = getTaskStatus.getTaskStatus("taskID_running"); - assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, taskStatusResponse.taskStatus); - assertNull(taskStatusResponse.error); - - taskStatusResponse = getTaskStatus.getTaskStatus("taskID_stopped"); - assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, taskStatusResponse.taskStatus); - assertNull(taskStatusResponse.error); - } +// private SolrQueryRequest mockQueryRequest; +// private SolrCore solrCore; +// private CancellableQueryTracker cancellableQueryTracker; +// +// private GetTaskStatus.java getTaskStatus; +// +// @BeforeClass +// public static void ensureWorkingMockito() { +// assumeWorkingMockito(); +// } +// +// @Override +// @Before +// public void setUp() throws Exception { +// super.setUp(); +// +// mockQueryRequest = mock(SolrQueryRequest.class); +// solrCore = mock(SolrCore.class); +// cancellableQueryTracker = mock(CancellableQueryTracker.class); +// +// getTaskStatus = new GetTaskStatus.java(mockQueryRequest); +// } +// +// @Test +// public void testGetTaskStatus() throws Exception { +// +// when(mockQueryRequest.getCore()).thenReturn(solrCore); +// when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); +// when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); +// when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); +// +// TaskStatusResponse taskStatusResponse; +// +// taskStatusResponse = getTaskStatus.getTaskStatus("taskID_running"); +// assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, taskStatusResponse.taskStatus); +// assertNull(taskStatusResponse.error); +// +// taskStatusResponse = getTaskStatus.getTaskStatus("taskID_stopped"); +// assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, taskStatusResponse.taskStatus); +// assertNull(taskStatusResponse.error); +// } } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java index 5c543baf97f1..f7c89e174a81 100644 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java @@ -34,52 +34,52 @@ public class ListActiveTasksTest extends SolrTestCaseJ4 { - private SolrQueryRequest mockQueryRequest; - private SolrCore solrCore; - private CancellableQueryTracker cancellableQueryTracker; - - private ListActiveTasks listActiveTasks; - - @BeforeClass - public static void ensureWorkingMockito() { - assumeWorkingMockito(); - } - - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - - mockQueryRequest = mock(SolrQueryRequest.class); - solrCore = mock(SolrCore.class); - cancellableQueryTracker = mock(CancellableQueryTracker.class); - - listActiveTasks = new ListActiveTasks(mockQueryRequest); - } - - @Test - public void testGetActiveTasks() throws Exception { - - Map myMap = new LinkedHashMap<>(); - myMap.put("taskID1", "/search?q=h&gf=text-1"); - myMap.put("taskID2", "/search?q=h&gf=text-2"); - Iterator> mockIterator = myMap.entrySet().iterator(); - - when(mockQueryRequest.getCore()).thenReturn(solrCore); - when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); - when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator); - - ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks(); - assertNotNull(response.taskList); - - assertEquals(2, response.taskList.size()); - - assertEquals("taskID1", response.taskList.get(0).taskID); - assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); - - assertEquals("taskID2", response.taskList.get(1).taskID); - assertEquals("/search?q=h&gf=text-2", response.taskList.get(1).taskQuery); - - assertNull(response.error); - } +// private SolrQueryRequest mockQueryRequest; +// private SolrCore solrCore; +// private CancellableQueryTracker cancellableQueryTracker; +// +// private ListActiveTasks listActiveTasks; +// +// @BeforeClass +// public static void ensureWorkingMockito() { +// assumeWorkingMockito(); +// } +// +// @Override +// @Before +// public void setUp() throws Exception { +// super.setUp(); +// +// mockQueryRequest = mock(SolrQueryRequest.class); +// solrCore = mock(SolrCore.class); +// cancellableQueryTracker = mock(CancellableQueryTracker.class); +// +// listActiveTasks = new ListActiveTasks(mockQueryRequest); +// } +// +// @Test +// public void testGetActiveTasks() throws Exception { +// +// Map myMap = new LinkedHashMap<>(); +// myMap.put("taskID1", "/search?q=h&gf=text-1"); +// myMap.put("taskID2", "/search?q=h&gf=text-2"); +// Iterator> mockIterator = myMap.entrySet().iterator(); +// +// when(mockQueryRequest.getCore()).thenReturn(solrCore); +// when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); +// when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator); +// +// ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks(); +// assertNotNull(response.taskList); +// +// assertEquals(2, response.taskList.size()); +// +// assertEquals("taskID1", response.taskList.get(0).taskID); +// assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); +// +// assertEquals("taskID2", response.taskList.get(1).taskID); +// assertEquals("/search?q=h&gf=text-2", response.taskList.get(1).taskQuery); +// +// assertNull(response.error); +// } } From 8132972f1b053792ade2074fdfa8e0c3cc5bcf57 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Wed, 3 Jun 2026 16:26:00 -0400 Subject: [PATCH 36/47] Fix the path structure, nesting didn't work. --- .../java/org/apache/solr/client/api/endpoint/TasksApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index 12d1ae0d3ef3..16ef6cec800a 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -30,7 +30,7 @@ @Path(INDEX_PATH_PREFIX + "/tasks") public interface TasksApi { - @Path("/tasks") + @Path(INDEX_PATH_PREFIX + "/tasks") interface List { @GET @StoreApiParameters @@ -40,7 +40,7 @@ interface List { ListActiveTaskResponse listAllActiveTasks() throws Exception; } - @Path("/tasks/{taskID}") + @Path(INDEX_PATH_PREFIX + "/tasks/{taskID}") interface Status { @GET @StoreApiParameters From 6c3ed49c9846be8cc82d907a33a6409151a3bc4e Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 15 Jun 2026 00:41:35 +0530 Subject: [PATCH 37/47] removed commented code --- .../solr/handler/admin/api/GetTaskStatus.java | 51 ----------- .../handler/admin/api/ListActiveTasks.java | 63 -------------- .../component/ActiveTasksListHandler.java | 3 - .../handler/admin/api/GetTaskStatusTest.java | 75 ---------------- .../admin/api/ListActiveTasksTest.java | 85 ------------------- 5 files changed, 277 deletions(-) delete mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java delete mode 100644 solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java delete mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java delete mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java deleted file mode 100644 index 4819fd7f95c5..000000000000 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetTaskStatus.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.solr.handler.admin.api; - -import static org.apache.solr.client.api.model.TaskStatusResponse.TaskStatus; -import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; - -import jakarta.inject.Inject; -import org.apache.solr.api.JerseyResource; -import org.apache.solr.client.api.endpoint.TasksApi; -import org.apache.solr.client.api.model.TaskStatusResponse; -import org.apache.solr.jersey.PermissionName; -import org.apache.solr.request.SolrQueryRequest; - -//public class GetTaskStatus extends JerseyResource implements TasksApi.Status { -// -// private final SolrQueryRequest solrQueryRequest; -// -// @Inject -// public GetTaskStatus(SolrQueryRequest solrQueryRequest) { -// this.solrQueryRequest = solrQueryRequest; -// } -// -// @Override -// @PermissionName(READ_PERM) -// public TaskStatusResponse getTaskStatus(String taskID) throws Exception { -// final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); -// -// boolean isTaskActive = -// solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); -// -// response.taskStatus = (isTaskActive) ? TaskStatus.ACTIVE : TaskStatus.INACTIVE; -// -// return response; -// } -//} diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java deleted file mode 100644 index ed65a644e056..000000000000 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ListActiveTasks.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.solr.handler.admin.api; - -import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; - -import jakarta.inject.Inject; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import org.apache.solr.api.JerseyResource; -import org.apache.solr.client.api.endpoint.TasksApi; -import org.apache.solr.client.api.model.ActiveTaskDetails; -import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.jersey.PermissionName; -import org.apache.solr.request.SolrQueryRequest; - -//public class ListActiveTasks extends JerseyResource implements TasksApi.List { - -// private final SolrQueryRequest solrQueryRequest; -// -// @Inject -// public ListActiveTasks(SolrQueryRequest solrQueryRequest) { -// this.solrQueryRequest = solrQueryRequest; -// } -// -// @Override -// @PermissionName(READ_PERM) -// public ListActiveTaskResponse listAllActiveTasks() throws Exception { -// final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); -// response.taskList = extractActiveTaskLists(); -// return response; -// } -// -// private List extractActiveTaskLists() { -// Iterator> iterator = -// solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); -// -// List activeTaskDetails = new ArrayList<>(); -// while (iterator.hasNext()) { -// Map.Entry entry = iterator.next(); -// activeTaskDetails.add(new ActiveTaskDetails(entry.getKey(), entry.getValue())); -// } -// -// return activeTaskDetails; -// } -//} diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 77fe7bb59d3a..8f9937c0dd0e 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -26,8 +26,6 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.common.util.NamedList; import org.apache.solr.handler.admin.api.ActiveTask; -//import org.apache.solr.handler.admin.api.GetTaskStatus; -//import org.apache.solr.handler.admin.api.ListActiveTasks; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestHandler; import org.apache.solr.response.SolrQueryResponse; @@ -99,7 +97,6 @@ public Collection getApis() { @Override public Collection> getJerseyResources() { -// return List.of(ListActiveTasks.class, GetTaskStatus.class); return List.of(ActiveTask.class); } } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java deleted file mode 100644 index 9ea347190b1e..000000000000 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetTaskStatusTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.solr.handler.admin.api; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import org.apache.solr.SolrTestCaseJ4; -import org.apache.solr.client.api.model.TaskStatusResponse; -import org.apache.solr.core.CancellableQueryTracker; -import org.apache.solr.core.SolrCore; -import org.apache.solr.request.SolrQueryRequest; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class GetTaskStatusTest extends SolrTestCaseJ4 { - -// private SolrQueryRequest mockQueryRequest; -// private SolrCore solrCore; -// private CancellableQueryTracker cancellableQueryTracker; -// -// private GetTaskStatus.java getTaskStatus; -// -// @BeforeClass -// public static void ensureWorkingMockito() { -// assumeWorkingMockito(); -// } -// -// @Override -// @Before -// public void setUp() throws Exception { -// super.setUp(); -// -// mockQueryRequest = mock(SolrQueryRequest.class); -// solrCore = mock(SolrCore.class); -// cancellableQueryTracker = mock(CancellableQueryTracker.class); -// -// getTaskStatus = new GetTaskStatus.java(mockQueryRequest); -// } -// -// @Test -// public void testGetTaskStatus() throws Exception { -// -// when(mockQueryRequest.getCore()).thenReturn(solrCore); -// when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); -// when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); -// when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); -// -// TaskStatusResponse taskStatusResponse; -// -// taskStatusResponse = getTaskStatus.getTaskStatus("taskID_running"); -// assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, taskStatusResponse.taskStatus); -// assertNull(taskStatusResponse.error); -// -// taskStatusResponse = getTaskStatus.getTaskStatus("taskID_stopped"); -// assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, taskStatusResponse.taskStatus); -// assertNull(taskStatusResponse.error); -// } -} diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java deleted file mode 100644 index f7c89e174a81..000000000000 --- a/solr/core/src/test/org/apache/solr/handler/admin/api/ListActiveTasksTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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. - */ - -package org.apache.solr.handler.admin.api; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import org.apache.solr.SolrTestCaseJ4; -import org.apache.solr.client.api.model.ListActiveTaskResponse; -import org.apache.solr.core.CancellableQueryTracker; -import org.apache.solr.core.SolrCore; -import org.apache.solr.request.SolrQueryRequest; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class ListActiveTasksTest extends SolrTestCaseJ4 { - -// private SolrQueryRequest mockQueryRequest; -// private SolrCore solrCore; -// private CancellableQueryTracker cancellableQueryTracker; -// -// private ListActiveTasks listActiveTasks; -// -// @BeforeClass -// public static void ensureWorkingMockito() { -// assumeWorkingMockito(); -// } -// -// @Override -// @Before -// public void setUp() throws Exception { -// super.setUp(); -// -// mockQueryRequest = mock(SolrQueryRequest.class); -// solrCore = mock(SolrCore.class); -// cancellableQueryTracker = mock(CancellableQueryTracker.class); -// -// listActiveTasks = new ListActiveTasks(mockQueryRequest); -// } -// -// @Test -// public void testGetActiveTasks() throws Exception { -// -// Map myMap = new LinkedHashMap<>(); -// myMap.put("taskID1", "/search?q=h&gf=text-1"); -// myMap.put("taskID2", "/search?q=h&gf=text-2"); -// Iterator> mockIterator = myMap.entrySet().iterator(); -// -// when(mockQueryRequest.getCore()).thenReturn(solrCore); -// when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); -// when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator); -// -// ListActiveTaskResponse response = listActiveTasks.listAllActiveTasks(); -// assertNotNull(response.taskList); -// -// assertEquals(2, response.taskList.size()); -// -// assertEquals("taskID1", response.taskList.get(0).taskID); -// assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); -// -// assertEquals("taskID2", response.taskList.get(1).taskID); -// assertEquals("/search?q=h&gf=text-2", response.taskList.get(1).taskQuery); -// -// assertNull(response.error); -// } -} From 1a6c5e3b9f6a5442ee9ffb64b33e3631bdd3d334 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 15 Jun 2026 00:58:04 +0530 Subject: [PATCH 38/47] pr ready again --- .../solr/client/api/endpoint/TasksApi.java | 8 +- .../handler/admin/api/ActiveTaskTest.java | 100 ++++++++++++++++++ 2 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java index 98061204eebf..3e46c1465c64 100644 --- a/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/TasksApi.java @@ -33,15 +33,15 @@ public interface TasksApi { @GET @StoreApiParameters @Operation( - summary = "Lists all the currently running tasks", + summary = "Lists all the active tasks", tags = {"tasks"}) ListActiveTaskResponse listAllActiveTasks() throws Exception; @GET - @Path("/{taskUUID}") + @Path("/{taskID}") @StoreApiParameters @Operation( - summary = "Status of a specific taskUUID passed as pathParam", + summary = "Status of a specific task", tags = {"tasks"}) - TaskStatusResponse getTaskStatus(@PathParam("taskUUID") String taskUUID) throws Exception; + TaskStatusResponse getTaskStatus(@PathParam("taskID") String taskID) throws Exception; } diff --git a/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java b/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java new file mode 100644 index 000000000000..7ce01936abbb --- /dev/null +++ b/solr/core/src/test/org/apache/solr/handler/admin/api/ActiveTaskTest.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + +package org.apache.solr.handler.admin.api; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.client.api.model.ListActiveTaskResponse; +import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.core.CancellableQueryTracker; +import org.apache.solr.core.SolrCore; +import org.apache.solr.request.SolrQueryRequest; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ActiveTaskTest extends SolrTestCaseJ4 { + + private SolrQueryRequest mockQueryRequest; + private SolrCore solrCore; + private CancellableQueryTracker cancellableQueryTracker; + + private ActiveTask activeTask; + + @BeforeClass + public static void ensureWorkingMockito() { + assumeWorkingMockito(); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + + mockQueryRequest = mock(SolrQueryRequest.class); + solrCore = mock(SolrCore.class); + cancellableQueryTracker = mock(CancellableQueryTracker.class); + + activeTask = new ActiveTask(mockQueryRequest); + } + + @Test + public void testGetActiveTasks() throws Exception { + + Map myMap = new LinkedHashMap<>(); + myMap.put("taskID1", "/search?q=h&gf=text-1"); + myMap.put("taskID2", "/search?q=h&gf=text-2"); + Iterator> mockIterator = myMap.entrySet().iterator(); + + when(mockQueryRequest.getCore()).thenReturn(solrCore); + when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); + when(cancellableQueryTracker.getActiveQueriesGenerated()).thenReturn(mockIterator); + + ListActiveTaskResponse response = activeTask.listAllActiveTasks(); + assertNotNull(response.taskList); + + assertEquals(2, response.taskList.size()); + + assertEquals("taskID1", response.taskList.get(0).taskID); + assertEquals("/search?q=h&gf=text-1", response.taskList.get(0).taskQuery); + + assertNull(response.error); + } + + @Test + public void testGetTaskStatus() throws Exception { + + when(mockQueryRequest.getCore()).thenReturn(solrCore); + when(solrCore.getCancellableQueryTracker()).thenReturn(cancellableQueryTracker); + when(cancellableQueryTracker.isQueryIdActive("taskID_running")).thenReturn(true); + when(cancellableQueryTracker.isQueryIdActive("taskID_stopped")).thenReturn(false); + + TaskStatusResponse responseRunningTask = activeTask.getTaskStatus("taskID_running"); + assertEquals(TaskStatusResponse.TaskStatus.ACTIVE, responseRunningTask.taskStatus); + assertNull(responseRunningTask.error); + + TaskStatusResponse responseStoppedTask = activeTask.getTaskStatus("taskID_stopped"); + assertEquals(TaskStatusResponse.TaskStatus.INACTIVE, responseStoppedTask.taskStatus); + assertNull(responseStoppedTask.error); + } +} From 4b16add7f292b14154616d4cf7c2009fe1cf30cb Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 15 Jun 2026 01:03:53 +0530 Subject: [PATCH 39/47] tidy up --- .../apache/solr/handler/admin/api/ActiveTask.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java index 3b02b6eba3b6..f21bea6e74fe 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -1,6 +1,12 @@ package org.apache.solr.handler.admin.api; +import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; + import jakarta.inject.Inject; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.endpoint.TasksApi; import org.apache.solr.client.api.model.ActiveTaskDetails; @@ -8,12 +14,6 @@ import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; public class ActiveTask extends JerseyResource implements TasksApi { @@ -57,5 +57,4 @@ private List extractActiveTaskLists() { return activeTaskDetails; } - } From 96ad4f49a11998b0788f142c11efb0ed4a7ff0a7 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 15 Jun 2026 01:05:37 +0530 Subject: [PATCH 40/47] added license --- .../solr/handler/admin/api/ActiveTask.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java index f21bea6e74fe..588518d90aa6 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ + package org.apache.solr.handler.admin.api; import static org.apache.solr.security.PermissionNameProvider.Name.READ_PERM; From 6133beb66ea0e9b74f9589a2ebe68481cc346396 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 15 Jun 2026 01:27:44 +0530 Subject: [PATCH 41/47] tidy forced --- .../java/org/apache/solr/handler/admin/api/ActiveTask.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java index 588518d90aa6..91845608fcff 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -57,7 +57,10 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { boolean isTaskActive = solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); - response.taskStatus = (isTaskActive) ? TaskStatusResponse.TaskStatus.ACTIVE : TaskStatusResponse.TaskStatus.INACTIVE; + response.taskStatus = + (isTaskActive) + ? TaskStatusResponse.TaskStatus.ACTIVE + : TaskStatusResponse.TaskStatus.INACTIVE; return response; } From c85327f44d00704cdff5b9dd44e204d33780c730 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 19 Jun 2026 00:34:10 +0530 Subject: [PATCH 42/47] fixed response format v1-list api --- .../apache/solr/handler/component/ActiveTasksListHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 8f9937c0dd0e..320aabf5bd2b 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -25,6 +25,7 @@ import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.common.util.NamedList; +import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.handler.admin.api.ActiveTask; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.request.SolrRequestHandler; @@ -49,7 +50,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw rsp.add("taskStatus", taskStatus); } else { - NamedList tasks = new NamedList<>(); + NamedList tasks = new SimpleOrderedMap<>(); List taskList = new ActiveTask(req).listAllActiveTasks().taskList; if (taskList != null) { for (ActiveTaskDetails task : taskList) { From e128b415f9636cd5ee11edfa2ce42aec0caadb11 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Fri, 19 Jun 2026 00:42:50 +0530 Subject: [PATCH 43/47] changes in response of v1 api --- .../apache/solr/handler/component/ActiveTasksListHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 320aabf5bd2b..b990c0c1ef86 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -16,6 +16,7 @@ */ package org.apache.solr.handler.component; +import static org.apache.solr.client.api.model.TaskStatusResponse.TaskStatus.ACTIVE; import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import java.util.Collection; @@ -45,8 +46,7 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw if (taskStatusCheckUUID != null) { TaskStatusResponse taskStatusResponse = new ActiveTask(req).getTaskStatus(taskStatusCheckUUID); - String taskStatus = - "id: " + taskStatusCheckUUID + ", status: " + taskStatusResponse.taskStatus.getValue(); + boolean taskStatus = taskStatusResponse.taskStatus.equals(ACTIVE); rsp.add("taskStatus", taskStatus); } else { From 1b67fe2a8edf644570381920737f250e19716318 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Sun, 21 Jun 2026 14:02:31 -0400 Subject: [PATCH 44/47] Test that demonstrates cross shard task status visibility works on main. The test method "testCrossShardTaskStatusVisibility" works on the main branch, but not on this branch. --- .../solr/search/TestTaskManagement.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java index ed6a0bb121c0..81fa4c01618e 100644 --- a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java +++ b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java @@ -33,15 +33,23 @@ import org.apache.solr.client.solrj.SolrRequest; import org.apache.solr.client.solrj.SolrRequest.SolrRequestType; import org.apache.solr.client.solrj.SolrServerException; +import org.apache.solr.client.solrj.jetty.HttpJettySolrClient; import org.apache.solr.client.solrj.request.CollectionAdminRequest; import org.apache.solr.client.solrj.request.GenericSolrRequest; import org.apache.solr.client.solrj.request.QueryRequest; import org.apache.solr.cloud.SolrCloudTestCase; import org.apache.solr.common.SolrInputDocument; +import org.apache.solr.common.cloud.DocCollection; +import org.apache.solr.common.cloud.Replica; +import org.apache.solr.common.cloud.Slice; +import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.ModifiableSolrParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.common.util.ExecutorUtil; import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.SolrCore; +import org.apache.solr.embedded.JettySolrRunner; +import org.apache.solr.request.SolrQueryRequestBase; import org.hamcrest.Matcher; import org.hamcrest.Matchers; import org.junit.After; @@ -253,6 +261,75 @@ public void testCheckSpecificQueryStatus_Inactive() throws Exception { assertTrue(result.contains("inactive")); } + /** + * Regression test for cross-shard task visibility. + * + *

On {@code main}, {@code ActiveTasksListHandler.handleRequestBody()} delegates to {@code + * processRequest()}, which fans the request out to every shard via the distributed query + * pipeline. {@code ActiveTasksListComponent.handleResponses()} then aggregates the per-shard + * results, so a task running on shard 2 is visible when the status-check request lands on shard + * 1. + * + *

If this handler is migrated to JAX-RS and the fan-out is replaced with a direct call to the + * handler node's own {@code CancellableQueryTracker}, a task registered only on shard 2 becomes + * invisible to a request handled by shard 1, causing a false "inactive" response. + */ + @Test + public void testCrossShardTaskStatusVisibility() throws Exception { + DocCollection docCollection = + cluster.getSolrClient().getClusterState().getCollection(COLLECTION_NAME); + List slices = new ArrayList<>(docCollection.getSlices()); + assertEquals("test requires exactly 2 shards", 2, slices.size()); + Replica shard1Leader = slices.get(0).getLeader(); + Replica shard2Leader = slices.get(1).getLeader(); + assumeFalse( + "Both shard leaders landed on the same node — cross-shard scenario cannot be tested", + shard1Leader.getNodeName().equals(shard2Leader.getNodeName())); + + final String taskId = "cross-shard-visibility-test"; + + JettySolrRunner shard2Jetty = + cluster.getJettySolrRunners().stream() + .filter(j -> j.getNodeName().equals(shard2Leader.getNodeName())) + .findFirst() + .orElseThrow(() -> new AssertionError("No Jetty found for shard 2 leader")); + try (SolrCore shard2Core = + shard2Jetty.getCoreContainer().getCore(shard2Leader.getCoreName())) { + assertNotNull("Could not open shard 2 core", shard2Core); + ModifiableSolrParams fakeParams = new ModifiableSolrParams(); + fakeParams.set(CommonParams.QUERY_UUID, taskId); + try (var fakeReq = new SolrQueryRequestBase(shard2Core, fakeParams)) { + shard2Core.getCancellableQueryTracker().generateQueryID(fakeReq); + } + + try { + try (var shard1Client = + new HttpJettySolrClient.Builder(shard1Leader.getBaseUrl()).build()) { + ModifiableSolrParams params = new ModifiableSolrParams(); + params.set(CommonParams.TASK_CHECK_UUID, taskId); + var statusReq = + new GenericSolrRequest( + SolrRequest.METHOD.GET, "/tasks/list", SolrRequestType.ADMIN, params) + .setRequiresCollection(true); + NamedList response = shard1Client.request(statusReq, COLLECTION_NAME); + + Object taskStatus = response.get("taskStatus"); + assertNotNull("taskStatus missing from response", taskStatus); + assertTrue( + "Task registered on shard 2 must be visible from shard 1 via cross-shard fan-out. " + + "Got: " + + taskStatus + + " (" + + taskStatus.getClass().getSimpleName() + + ") — if this is Boolean.FALSE the distributed aggregation was dropped.", + taskStatus instanceof String && ((String) taskStatus).contains("status: active")); + } + } finally { + shard2Core.getCancellableQueryTracker().releaseQueryID(taskId); + } + } + } + private CompletableFuture cancelQuery( final String queryID, Set cancelledQueryIdsSet, Set notFoundQueryIdSet) { return CompletableFuture.runAsync( From a87890f9edef60c094a8a170c7e8500f19f14172 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Mon, 29 Jun 2026 01:30:57 +0530 Subject: [PATCH 45/47] changes --- .../solr/handler/admin/api/ActiveTask.java | 13 +- .../component/ActiveTaskQuerySupport.java | 151 ++++++++++++++++++ .../component/ActiveTasksListHandler.java | 18 ++- 3 files changed, 171 insertions(+), 11 deletions(-) create mode 100644 solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java index 91845608fcff..6e09a7bb4785 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -29,6 +29,8 @@ import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.handler.component.ActiveTaskQuerySupport; +import org.apache.solr.handler.component.ActiveTasksListHandler; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; @@ -45,7 +47,7 @@ public ActiveTask(SolrQueryRequest solrQueryRequest) { @PermissionName(READ_PERM) public ListActiveTaskResponse listAllActiveTasks() throws Exception { final ListActiveTaskResponse response = instantiateJerseyResponse(ListActiveTaskResponse.class); - response.taskList = extractActiveTaskLists(); + response.taskList = ActiveTaskQuerySupport.listActiveTasks(solrQueryRequest); return response; } @@ -54,8 +56,7 @@ public ListActiveTaskResponse listAllActiveTasks() throws Exception { public TaskStatusResponse getTaskStatus(String taskID) throws Exception { final TaskStatusResponse response = instantiateJerseyResponse(TaskStatusResponse.class); - boolean isTaskActive = - solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskID); + boolean isTaskActive = ActiveTaskQuerySupport.isTaskActive(solrQueryRequest, taskID); response.taskStatus = (isTaskActive) @@ -65,7 +66,7 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { return response; } - private List extractActiveTaskLists() { + public static List getActiveTasksOnThisShard(SolrQueryRequest solrQueryRequest) { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); @@ -77,4 +78,8 @@ private List extractActiveTaskLists() { return activeTaskDetails; } + + public static boolean isTaskActiveOnThisShard(SolrQueryRequest solrQueryRequest, String taskId) { + return solrQueryRequest.getCore().getCancellableQueryTracker().isQueryIdActive(taskId); + } } diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java new file mode 100644 index 000000000000..92b97afd9e0d --- /dev/null +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java @@ -0,0 +1,151 @@ +package org.apache.solr.handler.component; + +import org.apache.solr.client.api.model.ActiveTaskDetails; +import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.util.NamedList; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.handler.admin.api.ActiveTask; +import org.apache.solr.request.SolrQueryRequest; +import org.apache.solr.response.SolrQueryResponse; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.apache.solr.common.params.CommonParams.DISTRIB; +import static org.apache.solr.common.params.CommonParams.QT; +import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; + +public class ActiveTaskQuerySupport { + private static final String ACTIVE_TASK_LIST_HANDLER_PATH = "/tasks/list"; + + private ActiveTaskQuerySupport() {} + + public static List listActiveTasks(SolrQueryRequest req) throws Exception { + return execute(req, null).taskList; + } + + public static boolean isTaskActive(SolrQueryRequest req, String taskId) throws Exception { + return execute(req, taskId).taskActive; + } + + private static TaskQueryResult execute(SolrQueryRequest req, String taskId) throws Exception { + if (!shouldDistributed(req)) { + return localResult(req, taskId); + } + return distributedResult(req, taskId); + } + + private static TaskQueryResult localResult(SolrQueryRequest req, String taskId) { + if (taskId != null) { + return new TaskQueryResult(List.of(), ActiveTask.isTaskActiveOnThisShard(req, taskId)); + } + return new TaskQueryResult(ActiveTask.getActiveTasksOnThisShard(req), false); + } + + private static TaskQueryResult distributedResult(SolrQueryRequest req, String taskId) throws Exception { + final ShardHandler shardHandler = req.getCoreContainer().getShardHandlerFactory().getShardHandler(); + final ResponseBuilder responseBuilder = TaskManagementHandler.buildResponseBuilder(req, new SolrQueryResponse(), List.of()); + shardHandler.prepDistributed(responseBuilder); + + if (!responseBuilder.isDistrib || responseBuilder.shards == null || responseBuilder.shards.length ==0) { + return localResult(req, taskId); + } + + final ShardRequest shardRequest = new ShardRequest(); + shardRequest.shards = responseBuilder.shards; + shardRequest.actualShards = shardRequest.shards; + shardRequest.responses = new ArrayList<>(shardRequest.actualShards.length); + + for (String shard: shardRequest.actualShards) { + ModifiableSolrParams params = new ModifiableSolrParams(); + params.set(QT, ACTIVE_TASK_LIST_HANDLER_PATH); + if (taskId != null) { + params.set(TASK_CHECK_UUID, taskId); + } + ShardHandler.setShardAttributesToParams(params, shardRequest.purpose); + shardHandler.submit(shardRequest, shard, params); + } + + ShardResponse shardResponse = shardHandler.takeCompletedOrError(); + if (shardResponse != null && shardResponse.getShard() != null) { + shardHandler.cancelAll(); + if (shardResponse.getException() instanceof SolrException) { + throw (SolrException) shardResponse.getException(); + } + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, shardResponse.getException()); + } + + if (taskId != null) { + return new TaskQueryResult(List.of(), mergeTaskStatus(shardRequest.responses)); + } + return new TaskQueryResult(mergeTaskList(shardRequest.responses), false); + + } + + private static boolean shouldDistributed(SolrQueryRequest req) { + CoreContainer coreContainer = req.getCoreContainer(); + if (coreContainer == null) { + return false; + } + return req.getParams().getBool(DISTRIB, coreContainer.isZooKeeperAware()); + } + + private static boolean mergeTaskStatus(List responses) { + for (ShardResponse shardResponse: responses) { + Object taskStatus = shardResponse.getSolrResponse().getResponse().get("taskStatus"); + if (taskStatus instanceof Boolean && (Boolean) taskStatus) { + return true; + } + + if (taskStatus instanceof String && ((String) taskStatus).contains("active")) { + return true; + } + } + return false; + } + + + @SuppressWarnings("unchecked") + private static List mergeTaskList(List responses) { + Map mergedTasks = new LinkedHashMap<>(); + for (ShardResponse shardResponse : responses) { + Object taskList = shardResponse.getSolrResponse().getResponse().get("taskList"); + if (taskList instanceof NamedList) { + NamedList namedList = (NamedList) taskList; + for (int i = 0; i < namedList.size(); i++) { + String taskId = namedList.getName(i); + Object taskQuery = namedList.getVal(i); + if (taskId != null) { + mergedTasks.put(taskId, taskQuery == null ? null : taskQuery.toString()); + } + } + } else if (taskList instanceof Map) { + for (Map.Entry entry : ((Map) taskList).entrySet()) { + if (entry.getKey() != null) { + mergedTasks.put(entry.getKey().toString(), entry.getValue() == null ? null : entry.getValue().toString()); + } + } + } + } + + List mergedTaskList = new ArrayList<>(mergedTasks.size()); + for (Map.Entry task : mergedTasks.entrySet()) { + mergedTaskList.add(new ActiveTaskDetails(task.getKey(), task.getValue())); + } + + return mergedTaskList; + + } + + private static final class TaskQueryResult { + private final List taskList; + private final boolean taskActive; + + private TaskQueryResult(List taskList, boolean taskActive) { + this.taskList = taskList; + this.taskActive = taskActive; + } + } +} diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index b990c0c1ef86..1b006c27e680 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -25,6 +25,7 @@ import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.client.api.model.TaskStatusResponse; +import org.apache.solr.common.params.ShardParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.handler.admin.api.ActiveTask; @@ -41,17 +42,20 @@ public class ActiveTasksListHandler extends TaskManagementHandler { @Override public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { - String taskStatusCheckUUID = req.getParams().get(TASK_CHECK_UUID, null); + String taskStatusCheckID = req.getParams().get(TASK_CHECK_UUID, null); + boolean isShardedRequest = req.getParams().getBool(ShardParams.IS_SHARD, false); - if (taskStatusCheckUUID != null) { - TaskStatusResponse taskStatusResponse = - new ActiveTask(req).getTaskStatus(taskStatusCheckUUID); - boolean taskStatus = taskStatusResponse.taskStatus.equals(ACTIVE); - rsp.add("taskStatus", taskStatus); + if (taskStatusCheckID != null) { + boolean taskStatus = ActiveTaskQuerySupport.isTaskActive(req, taskStatusCheckID); + if (isShardedRequest) { + rsp.add("taskStatus", taskStatus); + } else { + rsp.add("taskStatus", "id: " + taskStatusCheckID + ", status: " + (taskStatus ? "active" : "inactive")); + } } else { NamedList tasks = new SimpleOrderedMap<>(); - List taskList = new ActiveTask(req).listAllActiveTasks().taskList; + List taskList = ActiveTaskQuerySupport.listActiveTasks(req); if (taskList != null) { for (ActiveTaskDetails task : taskList) { tasks.add(task.taskID, task.taskQuery); From 6922c3edf563c1caeb979844cea1c56262e77d54 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Tue, 30 Jun 2026 02:30:17 +0530 Subject: [PATCH 46/47] changes --- .../solr/handler/component/ActiveTaskQuerySupport.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java index 92b97afd9e0d..cc337dd05d29 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java @@ -70,11 +70,13 @@ private static TaskQueryResult distributedResult(SolrQueryRequest req, String ta ShardResponse shardResponse = shardHandler.takeCompletedOrError(); if (shardResponse != null && shardResponse.getShard() != null) { - shardHandler.cancelAll(); - if (shardResponse.getException() instanceof SolrException) { - throw (SolrException) shardResponse.getException(); + if (shardResponse.getException() != null) { + shardHandler.cancelAll(); + if (shardResponse.getException() instanceof SolrException) { + throw (SolrException) shardResponse.getException(); + } + throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, shardResponse.getException()); } - throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, shardResponse.getException()); } if (taskId != null) { From 1ae020e0febfd3096e5da5df55156ad88ec0ba39 Mon Sep 17 00:00:00 2001 From: jaykay12 Date: Tue, 30 Jun 2026 02:50:05 +0530 Subject: [PATCH 47/47] tidying up --- .../solr/handler/admin/api/ActiveTask.java | 4 +- .../component/ActiveTaskQuerySupport.java | 58 +++++++++++-------- .../component/ActiveTasksListHandler.java | 6 +- .../solr/search/TestTaskManagement.java | 3 +- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java index 6e09a7bb4785..1d9782954caa 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/ActiveTask.java @@ -30,7 +30,6 @@ import org.apache.solr.client.api.model.ListActiveTaskResponse; import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.handler.component.ActiveTaskQuerySupport; -import org.apache.solr.handler.component.ActiveTasksListHandler; import org.apache.solr.jersey.PermissionName; import org.apache.solr.request.SolrQueryRequest; @@ -66,7 +65,8 @@ public TaskStatusResponse getTaskStatus(String taskID) throws Exception { return response; } - public static List getActiveTasksOnThisShard(SolrQueryRequest solrQueryRequest) { + public static List getActiveTasksOnThisShard( + SolrQueryRequest solrQueryRequest) { Iterator> iterator = solrQueryRequest.getCore().getCancellableQueryTracker().getActiveQueriesGenerated(); diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java index cc337dd05d29..e1da0f6bb44f 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTaskQuerySupport.java @@ -1,5 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ package org.apache.solr.handler.component; +import static org.apache.solr.common.params.CommonParams.DISTRIB; +import static org.apache.solr.common.params.CommonParams.QT; +import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import org.apache.solr.client.api.model.ActiveTaskDetails; import org.apache.solr.common.SolrException; import org.apache.solr.common.params.ModifiableSolrParams; @@ -8,14 +32,6 @@ import org.apache.solr.handler.admin.api.ActiveTask; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static org.apache.solr.common.params.CommonParams.DISTRIB; -import static org.apache.solr.common.params.CommonParams.QT; -import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; public class ActiveTaskQuerySupport { private static final String ACTIVE_TASK_LIST_HANDLER_PATH = "/tasks/list"; @@ -44,12 +60,17 @@ private static TaskQueryResult localResult(SolrQueryRequest req, String taskId) return new TaskQueryResult(ActiveTask.getActiveTasksOnThisShard(req), false); } - private static TaskQueryResult distributedResult(SolrQueryRequest req, String taskId) throws Exception { - final ShardHandler shardHandler = req.getCoreContainer().getShardHandlerFactory().getShardHandler(); - final ResponseBuilder responseBuilder = TaskManagementHandler.buildResponseBuilder(req, new SolrQueryResponse(), List.of()); + private static TaskQueryResult distributedResult(SolrQueryRequest req, String taskId) + throws Exception { + final ShardHandler shardHandler = + req.getCoreContainer().getShardHandlerFactory().getShardHandler(); + final ResponseBuilder responseBuilder = + TaskManagementHandler.buildResponseBuilder(req, new SolrQueryResponse(), List.of()); shardHandler.prepDistributed(responseBuilder); - if (!responseBuilder.isDistrib || responseBuilder.shards == null || responseBuilder.shards.length ==0) { + if (!responseBuilder.isDistrib + || responseBuilder.shards == null + || responseBuilder.shards.length == 0) { return localResult(req, taskId); } @@ -58,7 +79,7 @@ private static TaskQueryResult distributedResult(SolrQueryRequest req, String ta shardRequest.actualShards = shardRequest.shards; shardRequest.responses = new ArrayList<>(shardRequest.actualShards.length); - for (String shard: shardRequest.actualShards) { + for (String shard : shardRequest.actualShards) { ModifiableSolrParams params = new ModifiableSolrParams(); params.set(QT, ACTIVE_TASK_LIST_HANDLER_PATH); if (taskId != null) { @@ -83,7 +104,6 @@ private static TaskQueryResult distributedResult(SolrQueryRequest req, String ta return new TaskQueryResult(List.of(), mergeTaskStatus(shardRequest.responses)); } return new TaskQueryResult(mergeTaskList(shardRequest.responses), false); - } private static boolean shouldDistributed(SolrQueryRequest req) { @@ -95,7 +115,7 @@ private static boolean shouldDistributed(SolrQueryRequest req) { } private static boolean mergeTaskStatus(List responses) { - for (ShardResponse shardResponse: responses) { + for (ShardResponse shardResponse : responses) { Object taskStatus = shardResponse.getSolrResponse().getResponse().get("taskStatus"); if (taskStatus instanceof Boolean && (Boolean) taskStatus) { return true; @@ -108,7 +128,6 @@ private static boolean mergeTaskStatus(List responses) { return false; } - @SuppressWarnings("unchecked") private static List mergeTaskList(List responses) { Map mergedTasks = new LinkedHashMap<>(); @@ -123,12 +142,6 @@ private static List mergeTaskList(List respons mergedTasks.put(taskId, taskQuery == null ? null : taskQuery.toString()); } } - } else if (taskList instanceof Map) { - for (Map.Entry entry : ((Map) taskList).entrySet()) { - if (entry.getKey() != null) { - mergedTasks.put(entry.getKey().toString(), entry.getValue() == null ? null : entry.getValue().toString()); - } - } } } @@ -138,7 +151,6 @@ private static List mergeTaskList(List respons } return mergedTaskList; - } private static final class TaskQueryResult { diff --git a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java index 1b006c27e680..7c321f12d895 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ActiveTasksListHandler.java @@ -16,7 +16,6 @@ */ package org.apache.solr.handler.component; -import static org.apache.solr.client.api.model.TaskStatusResponse.TaskStatus.ACTIVE; import static org.apache.solr.common.params.CommonParams.TASK_CHECK_UUID; import java.util.Collection; @@ -24,7 +23,6 @@ import org.apache.solr.api.Api; import org.apache.solr.api.JerseyResource; import org.apache.solr.client.api.model.ActiveTaskDetails; -import org.apache.solr.client.api.model.TaskStatusResponse; import org.apache.solr.common.params.ShardParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; @@ -50,7 +48,9 @@ public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throw if (isShardedRequest) { rsp.add("taskStatus", taskStatus); } else { - rsp.add("taskStatus", "id: " + taskStatusCheckID + ", status: " + (taskStatus ? "active" : "inactive")); + rsp.add( + "taskStatus", + "id: " + taskStatusCheckID + ", status: " + (taskStatus ? "active" : "inactive")); } } else { diff --git a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java index 81fa4c01618e..f1039705765e 100644 --- a/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java +++ b/solr/core/src/test/org/apache/solr/search/TestTaskManagement.java @@ -293,8 +293,7 @@ public void testCrossShardTaskStatusVisibility() throws Exception { .filter(j -> j.getNodeName().equals(shard2Leader.getNodeName())) .findFirst() .orElseThrow(() -> new AssertionError("No Jetty found for shard 2 leader")); - try (SolrCore shard2Core = - shard2Jetty.getCoreContainer().getCore(shard2Leader.getCoreName())) { + try (SolrCore shard2Core = shard2Jetty.getCoreContainer().getCore(shard2Leader.getCoreName())) { assertNotNull("Could not open shard 2 core", shard2Core); ModifiableSolrParams fakeParams = new ModifiableSolrParams(); fakeParams.set(CommonParams.QUERY_UUID, taskId);