Hello, Patrick. Can <str name="replicateAfter">commit</str> help you?
On Tue, Jun 25, 2019 at 12:55 AM Patrick Bordelon < patrick.borde...@coxautoinc.com> wrote: > Hi, > > We recently upgraded to SOLR 7.5 in AWS, we had previously been running > SOLR > 6.5. In our current configuration we have our applications broken into a > single instance primary environment and a multi-instance replica > environment > separated behind a load balancer for each environment. > > Until recently we've been able to reload the primary without the replicas > updating until there was a full index. However when we upgraded to 7.5 we > started noticing that after terminating and rebuilding a primary instance > that the associated replicas would all start showing 0 documents in all > indexes. After some research we believe we've tracked down the issue. > SOLR-11293. > > SOLR-11293 changes > < > https://issues.apache.org/jira/browse/SOLR-11293?focusedCommentId=16182379&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-16182379> > > > This fix changed the way the replication handler checks before updating a > replica when the primary has an empty index. Whether it's from deleting the > old index or from terminating the instance. > > This is the code as it was in 6.5 replication handler > > if (latestVersion == 0L) { > if (forceReplication && commit.getGeneration() != 0) { > // since we won't get the files for an empty index, > // we just clear ours and commit > RefCounted<IndexWriter> iw = > solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(solrCore); > try { > iw.get().deleteAll(); > } finally { > iw.decref(); > } > SolrQueryRequest req = new LocalSolrQueryRequest(solrCore, new > ModifiableSolrParams()); > solrCore.getUpdateHandler().commit(new CommitUpdateCommand(req, > false)); > } > > > Without forced replication the index on the replica won't perform the > deletaAll operation and will keep the old index until a new index version > is > created. > > However in 7.5 the code was changed to this. > > if (latestVersion == 0L) { > if (commit.getGeneration() != 0) { > // since we won't get the files for an empty index, > // we just clear ours and commit > log.info("New index in Master. Deleting mine..."); > RefCounted<IndexWriter> iw = > solrCore.getUpdateHandler().getSolrCoreState().getIndexWriter(solrCore); > try { > iw.get().deleteAll(); > } finally { > iw.decref(); > } > assert TestInjection.injectDelayBeforeSlaveCommitRefresh(); > if (skipCommitOnMasterVersionZero) { > openNewSearcherAndUpdateCommitPoint(); > } else { > SolrQueryRequest req = new LocalSolrQueryRequest(solrCore, new > ModifiableSolrParams()); > solrCore.getUpdateHandler().commit(new CommitUpdateCommand(req, > false)); > } > } > > With the removal of the forceReplication check we believe the replica > always > deletes it's index when it detects that a new version 0 index is created. > > This is a problem as we can't afford to have active replicas to have 0 > documents on them in the event of a failure of the primary. Since we can't > control the termination on AWS instances this opens up a problem as any > primary outage has a chance of jeopardizing the replicas viability. > > Is there a way to restore this functionality in the current or future > releases? We are willing to upgrade to a later version including the latest > if it will help resolve this problem. > > If you suggest we use a load balancer health check to prevent this we > already are. However the load balancer type we are using (application) has > a > feature that allows access through it when all instances under it are > failing. This bypasses our health check and still allows the replicas to > poll from the primary even when it's not fully loaded. We can't change load > balancer types as there are other features that we are taking advantage of > and can't change currently. > > > > > -- > Sent from: http://lucene.472066.n3.nabble.com/Solr-User-f472068.html > -- Sincerely yours Mikhail Khludnev