[ 
https://issues.apache.org/jira/browse/SOLR-18607?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated SOLR-18607:
----------------------------------
    Labels: pull-request-available  (was: )

> bin/solr cannot find a Solr process started in the foreground
> -------------------------------------------------------------
>
>                 Key: SOLR-18607
>                 URL: https://issues.apache.org/jira/browse/SOLR-18607
>             Project: Solr
>          Issue Type: Bug
>          Components: scripts and tools
>            Reporter: Jan Høydahl
>            Assignee: Jan Høydahl
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> Solr started in the foreground ({{{}solr start -f{}}}, i.e. every container) 
> writes no PID file. That is by design: {{start_solr}} does {{{}exec java 
> ...{}}}, and only the background branch writes 
> {{{}$SOLR_PID_DIR/solr-<port>.pid{}}}.
> That should be fine, because both discovery mechanisms have a path that does 
> not need the PID file: {{bin/solr}} falls back to {{{}ps{}}}, and 
> {{SolrProcessManager}} scans live processes via {{{}ProcessHandle{}}}. But 
> three commands fail to use them correctly, so a foreground Solr looks "not 
> running" to its own CLI.
> h2. 1. {{solr stop -p <port>}} always fails (regression in 10.x)
> SOLR-15442 renamed {{-Djetty.port}} to {{-Dsolr.port.listen}} throughout 
> {{{}bin/solr{}}}, but missed one line: the {{ps}} fallback in the 
> stop/restart branch.
> {code:none}
> solr/bin/solr:1017  (start branch)  awk 
> "/\-Dsolr\.port\.listen=$SOLR_PORT_LISTEN/"   <- converted
> solr/bin/solr:1030  (stop  branch)  awk "/\-Djetty\.port=$SOLR_PORT_LISTEN/"  
>         <- missed
> {code}
> Solr starts with {{{}-Dsolr.port.listen=<port>{}}}, so the stop branch's 
> pattern matches nothing. Verified on the official images, started in the 
> foreground, same command:
> {code:none}
> # solr:9.11
> $ solr stop -p 8983
> Sending stop command to Solr running on port 8983 ... waiting up to 180 
> seconds to allow Jetty process 11 to stop gracefully.
> -> graceful shutdown, container exit 0
> # solr:10.1
> $ solr stop -p 8983
> No process found for Solr node running on port 8983
> -> exit 1, Solr still running
> {code}
> Patching only that line in a live {{solr:10.1}} container makes the same 
> command shut Solr down gracefully with exit 0, confirming the root cause. One 
> line fix; {{branch_9x}} is unaffected.
> h2. 2. {{solr stop --all}} exits 0 while stopping nothing
> With no PID files present the {{--all}} branch iterates an empty {{find}} 
> result and exits 0, without stopping anything and without printing a warning 
> — a silent false success, worse than the honest failure in case 1. The script 
> already carries a TODO noting that {{none_stopped}} does not propagate out of 
> the {{while}} subshell, which is why the "No Solr nodes found to stop." 
> message cannot fire on this path.
> h2. 3. {{solr status}} without {{-p}} reports nothing
> {{StatusTool}} uses {{processMgr.scanSolrPidFiles()}} when no port is given, 
> so it reports "No Solr nodes are running." in any container. With {{-p}} it 
> uses {{{}processMgr.processForPort(){}}}, backed by 
> {{{}SolrProcessManager{}}}'s live {{ProcessHandle}} scan filtering on 
> {{{}-Dsolr.port.listen={}}}, and works correctly:
> {code:none}
> $ solr status
> No Solr nodes are running.
> $ solr status -p 8983
> Solr process 11 running on port 8983
> {...}
> {code}
> h2. Suggested fix
>  * Case 1: correct the sysprop name on {{{}solr/bin/solr:1030{}}}.
>  * Case 2: make the {{--all}} path report when it stopped nothing, and fall 
> back to live process discovery rather than PID files alone.
>  * Case 3: have {{StatusTool}} fall back to (or prefer) the live 
> {{ProcessHandle}} scan when no PID files are found, instead of concluding 
> nothing is running.
> More generally, {{SolrProcessManager}} already does discovery without PID 
> files correctly; the shell fallbacks and the no-argument paths should lean on 
> it rather than treating the PID file as the primary source of truth.
> h2. Note: writing a PID file in foreground mode would be the wrong fix
> {{exec}} preserves {{{}$${}}}, so capturing the PID is possible, but nothing 
> removes the file when the process is killed. On a mounted volume 
> ({{{}SOLR_PID_DIR{}}} is typically the data volume) a stale file survives 
> into the next container, and {{solr_pid_by_port}} only checks that the 
> recorded PID exists, not that it is Solr. Container PIDs are small and 
> reused, so this turns a cosmetic problem into a startup failure. Reproduced 
> by planting a stale PID file:
> {code:none}
> $ echo 1 > /var/solr/solr-8983.pid   # stale, points at a PID that is alive
> $ # on container restart:
> Port 8983 is already being used by another process (pid: 1)
> Please choose a different port using the -p option.
> {code}
> h2. Downstream impact
> Found via solr-operator issue 
> [871|https://github.com/apache/solr-operator/issues/871], where the pod's 
> {{preStop}} hook runs {{{}solr stop -p <port>{}}}. That hook emits a 
> {{FailedPreStopHook}} warning on both 9.x and 10.x, but only the 10.x cause 
> is a Solr bug



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to