This is an automated email from the ASF dual-hosted git repository. houston pushed a commit to branch revert-4081-solr-18083-fix-read-only-behavior in repository https://gitbox.apache.org/repos/asf/solr.git
commit b27f5004a4ad2bc162567b89ee4dabdd005054c2 Author: Houston Putman <[email protected]> AuthorDate: Wed Jan 28 13:59:50 2026 -0800 Revert "SOLR-18083: Fix replication and other general operations in readOnly …" This reverts commit f9bdca8d0390492be118b79d15bac82fb4b5ccf2. --- .../solr-18083-fix-read-only-behavior.yml | 9 --------- .../org/apache/solr/cloud/RecoveryStrategy.java | 22 +++++++++------------- .../solr/cloud/ShardLeaderElectionContext.java | 2 +- .../src/java/org/apache/solr/core/SolrCore.java | 2 +- .../java/org/apache/solr/handler/IndexFetcher.java | 6 +++--- .../apache/solr/handler/ReplicationHandler.java | 2 +- .../apache/solr/handler/RequestHandlerUtils.java | 1 - .../apache/solr/update/CommitUpdateCommand.java | 4 ---- .../apache/solr/update/DefaultSolrCoreState.java | 5 ++--- .../java/org/apache/solr/update/SolrCoreState.java | 14 +------------- .../processor/DistributedUpdateProcessor.java | 2 +- .../processor/DistributedZkUpdateProcessor.java | 10 +--------- .../apache/solr/common/params/UpdateParams.java | 3 --- 13 files changed, 20 insertions(+), 62 deletions(-) diff --git a/changelog/unreleased/solr-18083-fix-read-only-behavior.yml b/changelog/unreleased/solr-18083-fix-read-only-behavior.yml deleted file mode 100644 index 2aae02026c5..00000000000 --- a/changelog/unreleased/solr-18083-fix-read-only-behavior.yml +++ /dev/null @@ -1,9 +0,0 @@ -# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc -title: Fix operational issues with readOnly collections, such as restarting SolrNodes and replicating from the leader. -type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other -authors: - - name: Houston Putman - nick: HoustonPutman -links: - - name: SOLR-18083 - url: https://issues.apache.org/jira/browse/SOLR-18083 diff --git a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java index bf023d3cb09..0b8c2a744da 100644 --- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java +++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java @@ -303,8 +303,6 @@ public class RecoveryStrategy implements Runnable, Closeable { // ureq.getParams().set(UpdateParams.OPEN_SEARCHER, onlyLeaderIndexes); // Why do we need to open searcher if "onlyLeaderIndexes"? ureq.getParams().set(UpdateParams.OPEN_SEARCHER, false); - // If the leader is readOnly, do not fail since the core is already committed. - ureq.getParams().set(UpdateParams.FAIL_ON_READ_ONLY, false); ureq.setAction(AbstractUpdateRequest.ACTION.COMMIT, false, true).process(client); } } @@ -659,17 +657,15 @@ public class RecoveryStrategy implements Runnable, Closeable { break; } - if (!core.readOnly) { - // we wait a bit so that any updates on the leader - // that started before they saw recovering state - // are sure to have finished (see SOLR-7141 for - // discussion around current value) - // TODO since SOLR-11216, we probably won't need this - try { - Thread.sleep(waitForUpdatesWithStaleStatePauseMilliSeconds); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + // we wait a bit so that any updates on the leader + // that started before they saw recovering state + // are sure to have finished (see SOLR-7141 for + // discussion around current value) + // TODO since SOLR-11216, we probably won't need this + try { + Thread.sleep(waitForUpdatesWithStaleStatePauseMilliSeconds); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } // first thing we just try to sync diff --git a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContext.java b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContext.java index 96401345503..16a29f89a58 100644 --- a/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContext.java +++ b/solr/core/src/java/org/apache/solr/cloud/ShardLeaderElectionContext.java @@ -195,7 +195,7 @@ final class ShardLeaderElectionContext extends ShardLeaderElectionContextBase { // first cancel any current recovery core.getUpdateHandler().getSolrCoreState().cancelRecovery(); - if (weAreReplacement && !core.readOnly) { + if (weAreReplacement) { // wait a moment for any floating updates to finish try { Thread.sleep(2500); diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java index 5e246e69ff1..24c7dc83b0c 100644 --- a/solr/core/src/java/org/apache/solr/core/SolrCore.java +++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java @@ -2476,7 +2476,7 @@ public class SolrCore implements SolrInfoBean, Closeable { true, directoryFactory); } else { - RefCounted<IndexWriter> writer = getSolrCoreState().getIndexWriter(this, true); + RefCounted<IndexWriter> writer = getSolrCoreState().getIndexWriter(this); DirectoryReader newReader = null; try { newReader = indexReaderFactory.newReader(writer.get(), this); diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java index 7e44992da16..70480602807 100644 --- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java +++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java @@ -530,14 +530,14 @@ public class IndexFetcher { // we just clear ours and commit log.info("New index in Leader. Deleting mine..."); RefCounted<IndexWriter> iw = - solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(solrCore, true); + solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(solrCore); try { iw.get().deleteAll(); } finally { iw.decref(); } assert TestInjection.injectDelayBeforeFollowerCommitRefresh(); - if (skipCommitOnLeaderVersionZero || solrCore.readOnly) { + if (skipCommitOnLeaderVersionZero) { openNewSearcherAndUpdateCommitPoint(); } else { SolrQueryRequest req = new LocalSolrQueryRequest(solrCore, new ModifiableSolrParams()); @@ -624,7 +624,7 @@ public class IndexFetcher { // are successfully deleted solrCore.getUpdateHandler().newIndexWriter(true); RefCounted<IndexWriter> writer = - solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(null, true); + solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(null); try { IndexWriter indexWriter = writer.get(); int c = 0; diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java index 7f50064ffe1..cdc5de9313b 100644 --- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java @@ -1378,7 +1378,7 @@ public class ReplicationHandler extends RequestHandlerBase // ensure the writer is initialized so that we have a list of commit points RefCounted<IndexWriter> iw = - core.getUpdateHandler().getSolrCoreState().getIndexWriter(core, true); + core.getUpdateHandler().getSolrCoreState().getIndexWriter(core); iw.decref(); } catch (IOException e) { diff --git a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java index 7a04edad33e..7b5d791ae42 100644 --- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java +++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java @@ -99,7 +99,6 @@ public class RequestHandlerUtils { cmd.maxOptimizeSegments = params.getInt(UpdateParams.MAX_OPTIMIZE_SEGMENTS, cmd.maxOptimizeSegments); cmd.prepareCommit = params.getBool(UpdateParams.PREPARE_COMMIT, cmd.prepareCommit); - cmd.failOnReadOnly = params.getBool(UpdateParams.FAIL_ON_READ_ONLY, cmd.failOnReadOnly); } /** diff --git a/solr/core/src/java/org/apache/solr/update/CommitUpdateCommand.java b/solr/core/src/java/org/apache/solr/update/CommitUpdateCommand.java index 2e4d0be5fb2..6a749af2ac9 100644 --- a/solr/core/src/java/org/apache/solr/update/CommitUpdateCommand.java +++ b/solr/core/src/java/org/apache/solr/update/CommitUpdateCommand.java @@ -39,7 +39,6 @@ public class CommitUpdateCommand extends UpdateCommand { public boolean expungeDeletes = false; public boolean softCommit = false; public boolean prepareCommit = false; - public boolean failOnReadOnly = true; // fail the commit if the core or collection is readOnly /** * User provided commit data. Can be let to null if there is none. It is possible to commit this @@ -99,9 +98,6 @@ public class CommitUpdateCommand extends UpdateCommand { .append(softCommit) .append(",prepareCommit=") .append(prepareCommit); - if (!failOnReadOnly) { - sb.append(",failOnReadOnly=").append(failOnReadOnly); - } if (commitData != null) { sb.append(",commitData=").append(commitData); } diff --git a/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java b/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java index 4feb43abd9d..767c1ad0b77 100644 --- a/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java +++ b/solr/core/src/java/org/apache/solr/update/DefaultSolrCoreState.java @@ -106,9 +106,8 @@ public final class DefaultSolrCoreState extends SolrCoreState } @Override - public RefCounted<IndexWriter> getIndexWriter(SolrCore core, boolean readOnlyCompatible) - throws IOException { - if (core != null && (!core.indexEnabled || (!readOnlyCompatible && core.readOnly))) { + public RefCounted<IndexWriter> getIndexWriter(SolrCore core) throws IOException { + if (core != null && (!core.indexEnabled || core.readOnly)) { throw new SolrException( SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Indexing is temporarily disabled"); } diff --git a/solr/core/src/java/org/apache/solr/update/SolrCoreState.java b/solr/core/src/java/org/apache/solr/update/SolrCoreState.java index 5016f9fdbb6..4d6f02d229f 100644 --- a/solr/core/src/java/org/apache/solr/update/SolrCoreState.java +++ b/solr/core/src/java/org/apache/solr/update/SolrCoreState.java @@ -178,19 +178,7 @@ public abstract class SolrCoreState { * * @throws IOException If there is a low-level I/O error. */ - public RefCounted<IndexWriter> getIndexWriter(SolrCore core) throws IOException { - return getIndexWriter(core, false); - } - - /** - * Get the current IndexWriter. If a new IndexWriter must be created, use the settings from the - * given {@link SolrCore}. Be very careful using the {@code readOnlyCompatible} flag, by default - * it should be false if the returned indexWriter will be used for writing. - * - * @throws IOException If there is a low-level I/O error. - */ - public abstract RefCounted<IndexWriter> getIndexWriter(SolrCore core, boolean readOnlyCompatible) - throws IOException; + public abstract RefCounted<IndexWriter> getIndexWriter(SolrCore core) throws IOException; /** * Rollback the current IndexWriter. When creating the new IndexWriter use the settings from the diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java index fe6f44501e7..82424a5f06a 100644 --- a/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java +++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedUpdateProcessor.java @@ -127,7 +127,7 @@ public class DistributedUpdateProcessor extends UpdateRequestProcessor { protected final SolrQueryResponse rsp; private final AtomicUpdateDocumentMerger docMerger; - protected final UpdateLog ulog; + private final UpdateLog ulog; private final VersionInfo vinfo; private final boolean versionsStored; private boolean returnVersions; diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java index 12c2695a29d..34532421bf5 100644 --- a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java +++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java @@ -161,15 +161,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor { assert TestInjection.injectFailUpdateRequests(); if (isReadOnly()) { - if (cmd.failOnReadOnly) { - throw new SolrException(ErrorCode.FORBIDDEN, "Collection " + collection + " is read-only."); - } else { - // Committing on a readOnly core/collection is a no-op, since the core was committed when - // becoming read-only and hasn't had any updates since. - assert ulog == null || !ulog.hasUncommittedChanges() - : "Uncommitted changes found when trying to commit on a read-only collection"; - return; - } + throw new SolrException(ErrorCode.FORBIDDEN, "Collection " + collection + " is read-only."); } List<SolrCmdDistributor.Node> nodes = null; diff --git a/solr/solrj/src/java/org/apache/solr/common/params/UpdateParams.java b/solr/solrj/src/java/org/apache/solr/common/params/UpdateParams.java index df6b11f1f3a..f14252fb970 100644 --- a/solr/solrj/src/java/org/apache/solr/common/params/UpdateParams.java +++ b/solr/solrj/src/java/org/apache/solr/common/params/UpdateParams.java @@ -46,9 +46,6 @@ public interface UpdateParams { /** expert: calls IndexWriter.prepareCommit */ public static String PREPARE_COMMIT = "prepareCommit"; - /** Fail a commit when the core or collection is in read-only mode */ - public static String FAIL_ON_READ_ONLY = "failOnReadOnly"; - /** Rollback update commands */ public static String ROLLBACK = "rollback";
