You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2016/06/17 21:08:04 UTC
[2/2] lucene-solr:branch_5x: SOLR-9036: Solr slave is doing full
replication (entire index) of index after master restart (cherry picked from
commit 51b1319)
SOLR-9036: Solr slave is doing full replication (entire index) of index after master restart
(cherry picked from commit 51b1319)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/912c3da3
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/912c3da3
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/912c3da3
Branch: refs/heads/branch_5x
Commit: 912c3da3eb7fa6d84b38357cd77c9727a24ef598
Parents: 394822d
Author: Shalin Shekhar Mangar <sh...@apache.org>
Authored: Thu May 5 21:00:20 2016 +0530
Committer: Steve Rowe <sa...@apache.org>
Committed: Fri Jun 17 17:07:16 2016 -0400
----------------------------------------------------------------------
.../org/apache/solr/handler/IndexFetcher.java | 5 +-
.../solr/handler/TestReplicationHandler.java | 77 ++++++++++++++++++++
2 files changed, 81 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/912c3da3/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
----------------------------------------------------------------------
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 f5a06a8..c54b434 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -538,7 +538,10 @@ public class IndexFetcher {
}
}
- core.getUpdateHandler().getSolrCoreState().setLastReplicateIndexSuccess(successfulInstall);
+ if (core.getCoreDescriptor().getCoreContainer().isZooKeeperAware()) {
+ // we only track replication success in SolrCloud mode
+ core.getUpdateHandler().getSolrCoreState().setLastReplicateIndexSuccess(successfulInstall);
+ }
filesToDownload = filesDownloaded = confFilesDownloaded = confFilesToDownload = null;
markReplicationStop();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/912c3da3/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
index 704597c..5f327d9 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
@@ -57,6 +57,7 @@ import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
+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.NamedList;
@@ -584,6 +585,82 @@ public class TestReplicationHandler extends SolrTestCaseJ4 {
assertEquals(nDocs+1, numFound(rQuery(nDocs+1, "*:*", slaveClient)));
}
+ /**
+ * We assert that if master is down for more than poll interval,
+ * the slave doesn't re-fetch the whole index from master again if
+ * the index hasn't changed. See SOLR-9036
+ */
+ @Test
+ public void doTestIndexFetchOnMasterRestart() throws Exception {
+ useFactory(null);
+ try {
+ clearIndexWithReplication();
+ // change solrconfig having 'replicateAfter startup' option on master
+ master.copyConfigFile(CONF_DIR + "solrconfig-master2.xml",
+ "solrconfig.xml");
+
+ masterJetty.stop();
+ masterJetty.start();
+
+ nDocs--;
+ for (int i = 0; i < nDocs; i++)
+ index(masterClient, "id", i, "name", "name = " + i);
+
+ masterClient.commit();
+
+ NamedList masterQueryRsp = rQuery(nDocs, "*:*", masterClient);
+ SolrDocumentList masterQueryResult = (SolrDocumentList) masterQueryRsp.get("response");
+ assertEquals(nDocs, numFound(masterQueryRsp));
+
+ //get docs from slave and check if number is equal to master
+ NamedList slaveQueryRsp = rQuery(nDocs, "*:*", slaveClient);
+ SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
+ assertEquals(nDocs, numFound(slaveQueryRsp));
+
+ //compare results
+ String cmp = BaseDistributedSearchTestCase.compare(masterQueryResult, slaveQueryResult, 0, null);
+ assertEquals(null, cmp);
+
+ assertEquals(1, Integer.parseInt(getSlaveDetails("timesIndexReplicated")));
+ String timesFailed = getSlaveDetails("timesFailed");
+ assertEquals(0, Integer.parseInt(timesFailed != null ? timesFailed : "0"));
+
+ masterJetty.stop();
+
+ // poll interval on slave is 1 second, so we just sleep for a few seconds
+ Thread.sleep(2000);
+
+ masterJetty.start();
+
+ // poll interval on slave is 1 second, so we just sleep for a few seconds
+ Thread.sleep(2000);
+
+ //get docs from slave and assert that they are still the same as before
+ slaveQueryRsp = rQuery(nDocs, "*:*", slaveClient);
+ slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
+ assertEquals(nDocs, numFound(slaveQueryRsp));
+
+ int failed = Integer.parseInt(getSlaveDetails("timesFailed"));
+ assertTrue(failed > 0);
+ assertEquals(1, Integer.parseInt(getSlaveDetails("timesIndexReplicated")) - failed);
+ } finally {
+ resetFactory();
+ }
+ }
+
+ private String getSlaveDetails(String keyName) throws SolrServerException, IOException {
+ ModifiableSolrParams params = new ModifiableSolrParams();
+ params.set(CommonParams.QT, "/replication");
+ params.set("command", "details");
+ QueryResponse response = slaveClient.query(params);
+ System.out.println("SHALIN: " + response.getResponse());
+ // details/slave/timesIndexReplicated
+ NamedList<Object> details = (NamedList<Object>) response.getResponse().get("details");
+ NamedList<Object> slave = (NamedList<Object>) details.get("slave");
+ Object o = slave.get(keyName);
+ return o != null ? o.toString() : null;
+ }
+
@Test
public void doTestIndexFetchWithMasterUrl() throws Exception {
//change solrconfig on slave