You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@solr.apache.org by "Jason Gerlowski (Jira)" <ji...@apache.org> on 2023/02/16 14:08:00 UTC

[jira] [Commented] (SOLR-16282) Improve custom actions support of CoreAdminHandler

    [ https://issues.apache.org/jira/browse/SOLR-16282?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17689780#comment-17689780 ] 

Jason Gerlowski commented on SOLR-16282:
----------------------------------------

Trying to understand this feature a bit better, and had what may be a dumb question.

When would a plugin developer attach their new functionality onto CoreAdminHandler/CoreAdminOp, as opposed to adding an entirely new endpoint/handler/api?  Or put differently - what's the benefit of tacking additional operations onto CAH that plugin authors don't get when they package their code as a separate endpoint?

Is it primarily the ability to make use of CAH's async support?  Or are their other motivating factors?

> Improve custom actions support of CoreAdminHandler
> --------------------------------------------------
>
>                 Key: SOLR-16282
>                 URL: https://issues.apache.org/jira/browse/SOLR-16282
>             Project: Solr
>          Issue Type: Improvement
>    Affects Versions: main (10.0)
>            Reporter: Artem Abeleshev
>            Assignee: Christine Poerschke
>            Priority: Minor
>             Fix For: 9.1, main (10.0)
>
>          Time Spent: 7h 10m
>  Remaining Estimate: 0h
>
> Original _CoreAdminHandler_ ({_}org.apache.solr.handler.admin.CoreAdminHandler{_}) has a support of custom actions by providing _handleCustomAction_ method. It is intended for users who want to implement an additional actions (for example, for some instumental or statistical purposes). By default _handleCustomAction_ method throws an exception implying user should subclass handler and provide its own _handleCustomAction_ method implementation. But there are some structural problems.
> If we check how the _CoreAdminHandler_ triggers the _handleCustomAction_ method we will see that it is always runs in a _sync_ way. Despite the fact that _CoreAdminHandler_ has nice support of running the actions in an _async_ way. Moreover, if user push the custom action request with an _async_ parameter it will create _TaskObject_ object and will place it to the tracking map occupying one slot and will never clean it up:
> _org.apache.solr.handler.admin.CoreAdminHandler.handleRequestBody(SolrQueryRequest, SolrQueryResponse)_
> {code:java}
>   @Override
>   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
>       ...
>       final String taskId = req.getParams().get(CommonAdminParams.ASYNC);
>       final TaskObject taskObject = new TaskObject(taskId);
>       if (taskId != null) {
>         ...
>         addTask(RUNNING, taskObject);
>       }
>       final String action = req.getParams().get(ACTION, STATUS.toString()).toLowerCase(Locale.ROOT);
>       CoreAdminOperation op = opMap.get(action);
>       if (op == null) {
>         handleCustomAction(req, rsp);
>         return;
>       }
>       
>       final CallInfo callInfo = new CallInfo(this, req, rsp, op);
>       ...
>       if (taskId == null) {
>         callInfo.call();
>       } else {
>         try {
>           ...
>           parallelExecutor.execute(
>               () -> {
>                 boolean exceptionCaught = false;
>                 try {
>                   callInfo.call();
>                   taskObject.setRspObject(callInfo.rsp);
>                   taskObject.setOperationRspObject(callInfo.rsp);
>                 } catch (Exception e) {
>                   exceptionCaught = true;
>                   taskObject.setRspObjectFromException(e);
>                 } finally {
>                   removeTask("running", taskObject.taskId);
>                   if (exceptionCaught) {
>                     addTask("failed", taskObject, true);
>                   } else {
>                     addTask("completed", taskObject, true);
>                   }
>                 }
>               });
>         } finally {
>           ...
>         }
>       }
>       ...
>   } {code}
> As we can see, the call to the _handleRequestBody_ is just a call to the custom block of the code that is not weaved nicely to the overall worflow. I suggest to update the logic to not just call custom block of the code, but instead to force it to provide a _CoreAdminOp_ instance, that would be used in the further execution as a regular operation extracterd from the {_}opMap{_}. Like this:
>  
> {code:java}
>       ...
>       final String action = req.getParams().get(ACTION, STATUS.toString()).toLowerCase(Locale.ROOT);
>       CoreAdminOp op = opMap.get(action);
>       if (op == null) {
>         op = getCustomOperation(action);
>       }
>       ...
> {code}
>  
> This way the custom actions can be easily integrated in the general worflow with minimal efforts. In result we will get:
>  - support of an async custom actions
>  - using of the standard _CoreAdminOp_ and _CallInfo_ structures
>  - more clean code



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@solr.apache.org
For additional commands, e-mail: issues-help@solr.apache.org