You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by va...@apache.org on 2017/10/25 21:30:30 UTC
lucene-solr:master: SOLR-11326: A bootstrap of a target cluster does
not need to download the tlog files from the source cluster
Repository: lucene-solr
Updated Branches:
refs/heads/master 82669b3e6 -> cb20bbdd1
SOLR-11326: A bootstrap of a target cluster does not need to download the tlog files from the source cluster
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/cb20bbdd
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/cb20bbdd
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/cb20bbdd
Branch: refs/heads/master
Commit: cb20bbdd1fb6bde7edf00d397dc6a8dc200d40eb
Parents: 82669b3
Author: Varun Thacker <va...@apache.org>
Authored: Wed Oct 25 14:29:37 2017 -0700
Committer: Varun Thacker <va...@apache.org>
Committed: Wed Oct 25 14:30:04 2017 -0700
----------------------------------------------------------------------
solr/CHANGES.txt | 3 +
.../org/apache/solr/cloud/RecoveryStrategy.java | 6 ++
.../org/apache/solr/handler/IndexFetcher.java | 7 ++
.../apache/solr/handler/ReplicationHandler.java | 4 +-
.../apache/solr/cloud/CdcrBootstrapTest.java | 85 ++++++++------------
5 files changed, 52 insertions(+), 53 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cb20bbdd/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b132e52..50d466c 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -68,6 +68,9 @@ Bug Fixes
* SOLR-11146: Small fixes to the mapping functions in the Analytics Component (Houston Putman)
+* SOLR-11326: A bootstrap of a target cluster does not need to download the tlog files from the source cluster
+ (Amrit Sarkar, Varun Thacker)
+
Optimizations
----------------------
* SOLR-11285: Refactor autoscaling framework to avoid direct references to Zookeeper and Solr
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cb20bbdd/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
----------------------------------------------------------------------
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 53e3743..3ab4eca 100644
--- a/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
+++ b/solr/core/src/java/org/apache/solr/cloud/RecoveryStrategy.java
@@ -56,6 +56,7 @@ import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.search.SolrIndexSearcher;
+import org.apache.solr.update.CdcrUpdateLog;
import org.apache.solr.update.CommitUpdateCommand;
import org.apache.solr.update.PeerSync;
import org.apache.solr.update.UpdateLog;
@@ -214,6 +215,11 @@ public class RecoveryStrategy implements Runnable, Closeable {
ModifiableSolrParams solrParams = new ModifiableSolrParams();
solrParams.set(ReplicationHandler.MASTER_URL, leaderUrl);
solrParams.set(ReplicationHandler.SKIP_COMMIT_ON_MASTER_VERSION_ZERO, replicaType == Replica.Type.TLOG);
+ // always download the tlogs from the leader when running with cdcr enabled. We need to have all the tlogs
+ // to ensure leader failover doesn't cause missing docs on the target
+ if (core.getUpdateHandler().getUpdateLog() != null && core.getUpdateHandler().getUpdateLog() instanceof CdcrUpdateLog) {
+ solrParams.set(ReplicationHandler.TLOG_FILES, true);
+ }
if (isClosed()) return; // we check closed on return
boolean success = replicationHandler.doFetch(solrParams, false).getSuccessful();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cb20bbdd/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 52d3b25..7837bdc 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -163,6 +163,8 @@ public class IndexFetcher {
private Integer soTimeout;
+ private boolean downloadTlogFiles = false;
+
private boolean skipCommitOnMasterVersionZero;
private static final String INTERRUPT_RESPONSE_MESSAGE = "Interrupted while waiting for modify lock";
@@ -255,6 +257,10 @@ public class IndexFetcher {
soTimeout = getParameter(initArgs, HttpClientUtil.PROP_SO_TIMEOUT, 120000, null);
}
+ if (initArgs.getBooleanArg(TLOG_FILES) != null) {
+ downloadTlogFiles = initArgs.getBooleanArg(TLOG_FILES);
+ }
+
String httpBasicAuthUser = (String) initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_USER);
String httpBasicAuthPassword = (String) initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_PASS);
myHttpClient = createHttpClient(solrCore, httpBasicAuthUser, httpBasicAuthPassword, useExternalCompression);
@@ -300,6 +306,7 @@ public class IndexFetcher {
private void fetchFileList(long gen) throws IOException {
ModifiableSolrParams params = new ModifiableSolrParams();
params.set(COMMAND, CMD_GET_FILE_LIST);
+ params.set(TLOG_FILES, downloadTlogFiles);
params.set(GENERATION, String.valueOf(gen));
params.set(CommonParams.WT, JAVABIN);
params.set(CommonParams.QT, ReplicationHandler.PATH);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cb20bbdd/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
----------------------------------------------------------------------
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 a9e14f4..e986960 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -690,9 +690,7 @@ public class ReplicationHandler extends RequestHandlerBase implements SolrCoreAw
}
rsp.add(CMD_GET_FILE_LIST, result);
- // fetch list of tlog files only if cdcr is activated
- if (solrParams.getBool(TLOG_FILES, true) && core.getUpdateHandler().getUpdateLog() != null
- && core.getUpdateHandler().getUpdateLog() instanceof CdcrUpdateLog) {
+ if (solrParams.getBool(TLOG_FILES, false)) {
try {
List<Map<String, Object>> tlogfiles = getTlogFileList(commit);
LOG.info("Adding tlog files to list: " + tlogfiles);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/cb20bbdd/solr/core/src/test/org/apache/solr/cloud/CdcrBootstrapTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/cloud/CdcrBootstrapTest.java b/solr/core/src/test/org/apache/solr/cloud/CdcrBootstrapTest.java
index 529b3d0..0925a68 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CdcrBootstrapTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CdcrBootstrapTest.java
@@ -22,6 +22,7 @@ import java.lang.invoke.MethodHandles;
import java.util.List;
import java.util.concurrent.TimeUnit;
+import org.apache.lucene.store.FSDirectory;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
@@ -61,7 +62,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
MiniSolrCloudCluster target = new MiniSolrCloudCluster(1, createTempDir("cdcr-target"), buildJettyConfig("/solr"));
try {
target.waitForAllNodes(30);
- System.out.println("Target zkHost = " + target.getZkServer().getZkAddress());
+ log.info("Target zkHost = " + target.getZkServer().getZkAddress());
System.setProperty("cdcr.target.zkHost", target.getZkServer().getZkAddress());
// start a cluster with no cdcr
@@ -77,21 +78,8 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
.process(source.getSolrClient());
CloudSolrClient sourceSolrClient = source.getSolrClient();
- sourceSolrClient.setDefaultCollection("cdcr-source");
int docs = (TEST_NIGHTLY ? 100 : 10);
- int numDocs = 0;
- for (int k = 0; k < docs; k++) {
- UpdateRequest req = new UpdateRequest();
- for (; numDocs < (k + 1) * 100; numDocs++) {
- SolrInputDocument doc = new SolrInputDocument();
- doc.addField("id", "source_" + numDocs);
- doc.addField("xyz", numDocs);
- req.add(doc);
- }
- req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
- System.out.println("Adding " + docs + " docs with commit=true, numDocs=" + numDocs);
- req.process(sourceSolrClient);
- }
+ int numDocs = indexDocs(sourceSolrClient, "cdcr-source", docs);
QueryResponse response = sourceSolrClient.query(new SolrQuery("*:*"));
assertEquals("", numDocs, response.getResults().getNumFound());
@@ -129,7 +117,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
cdcrStart(sourceSolrClient);
response = getCdcrQueue(sourceSolrClient);
- System.out.println("Cdcr queue response: " + response.getResponse());
+ log.info("Cdcr queue response: " + response.getResponse());
long foundDocs = waitForTargetToSync(numDocs, targetSolrClient);
assertEquals("Document mismatch on target after sync", numDocs, foundDocs);
@@ -149,6 +137,23 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
}
}
+ private int indexDocs(CloudSolrClient sourceSolrClient, String collection, int batches) throws IOException, SolrServerException {
+ sourceSolrClient.setDefaultCollection(collection);
+ int numDocs = 0;
+ for (int k = 0; k < batches; k++) {
+ UpdateRequest req = new UpdateRequest();
+ for (; numDocs < (k + 1) * 100; numDocs++) {
+ SolrInputDocument doc = new SolrInputDocument();
+ doc.addField("id", "source_" + numDocs);
+ doc.addField("xyz", numDocs);
+ req.add(doc);
+ }
+ req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
+ req.process(sourceSolrClient);
+ }
+ log.info("Adding numDocs=" + numDocs);
+ return numDocs;
+ }
/**
* This test start cdcr source, adds data,starts target cluster, verifies replication,
* stops cdcr replication and buffering, adds more data, re-enables cdcr and verify replication
@@ -158,7 +163,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
MiniSolrCloudCluster target = new MiniSolrCloudCluster(1, createTempDir("cdcr-target"), buildJettyConfig("/solr"));
try {
target.waitForAllNodes(30);
- System.out.println("Target zkHost = " + target.getZkServer().getZkAddress());
+ log.info("Target zkHost = " + target.getZkServer().getZkAddress());
System.setProperty("cdcr.target.zkHost", target.getZkServer().getZkAddress());
MiniSolrCloudCluster source = new MiniSolrCloudCluster(1, createTempDir("cdcr-source"), buildJettyConfig("/solr"));
@@ -171,21 +176,8 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
.process(source.getSolrClient());
CloudSolrClient sourceSolrClient = source.getSolrClient();
- sourceSolrClient.setDefaultCollection("cdcr-source");
int docs = (TEST_NIGHTLY ? 100 : 10);
- int numDocs = 0;
- for (int k = 0; k < docs; k++) {
- UpdateRequest req = new UpdateRequest();
- for (; numDocs < (k + 1) * 100; numDocs++) {
- SolrInputDocument doc = new SolrInputDocument();
- doc.addField("id", "source_" + numDocs);
- doc.addField("xyz", numDocs);
- req.add(doc);
- }
- req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
- System.out.println("Adding " + docs + " docs with commit=true, numDocs=" + numDocs);
- req.process(sourceSolrClient);
- }
+ int numDocs = indexDocs(sourceSolrClient, "cdcr-source", docs);
QueryResponse response = sourceSolrClient.query(new SolrQuery("*:*"));
assertEquals("", numDocs, response.getResults().getNumFound());
@@ -201,10 +193,16 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
cdcrStart(sourceSolrClient);
response = getCdcrQueue(sourceSolrClient);
- System.out.println("Cdcr queue response: " + response.getResponse());
+ log.info("Cdcr queue response: " + response.getResponse());
long foundDocs = waitForTargetToSync(numDocs, targetSolrClient);
assertEquals("Document mismatch on target after sync", numDocs, foundDocs);
+ int total_tlogs_in_index = FSDirectory.open(target.getBaseDir().resolve("node1").
+ resolve("cdcr-target_shard1_replica_n1").resolve("data").
+ resolve("tlog")).listAll().length;
+
+ assertEquals("tlogs count should be ZERO",0, total_tlogs_in_index);
+
cdcrStop(sourceSolrClient);
cdcrDisableBuffer(sourceSolrClient);
@@ -218,7 +216,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
req.add(doc);
}
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
- System.out.println("Adding 100 docs with commit=true, numDocs=" + numDocs);
+ log.info("Adding 100 docs with commit=true, numDocs=" + numDocs);
req.process(sourceSolrClient);
}
@@ -244,7 +242,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
MiniSolrCloudCluster target = new MiniSolrCloudCluster(1, createTempDir("cdcr-target"), buildJettyConfig("/solr"));
target.waitForAllNodes(30);
try {
- System.out.println("Target zkHost = " + target.getZkServer().getZkAddress());
+ log.info("Target zkHost = " + target.getZkServer().getZkAddress());
System.setProperty("cdcr.target.zkHost", target.getZkServer().getZkAddress());
MiniSolrCloudCluster source = new MiniSolrCloudCluster(1, createTempDir("cdcr-source"), buildJettyConfig("/solr"));
@@ -257,21 +255,8 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
.process(source.getSolrClient());
CloudSolrClient sourceSolrClient = source.getSolrClient();
- sourceSolrClient.setDefaultCollection("cdcr-source");
int docs = (TEST_NIGHTLY ? 100 : 10);
- int numDocs = 0;
- for (int k = 0; k < docs; k++) {
- UpdateRequest req = new UpdateRequest();
- for (; numDocs < (k + 1) * 100; numDocs++) {
- SolrInputDocument doc = new SolrInputDocument();
- doc.addField("id", "source_" + numDocs);
- doc.addField("xyz", numDocs);
- req.add(doc);
- }
- req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
- log.info("Adding " + docs + " docs with commit=true, numDocs=" + numDocs);
- req.process(sourceSolrClient);
- }
+ int numDocs = indexDocs(sourceSolrClient, "cdcr-source", docs);
QueryResponse response = sourceSolrClient.query(new SolrQuery("*:*"));
assertEquals("", numDocs, response.getResults().getNumFound());
@@ -307,7 +292,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
req.add(doc);
}
req.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true);
- log.info("Adding " + docs + " docs with commit=true, numDocs=" + numDocs);
+ log.info("Adding 100 docs with commit=true, numDocs=" + numDocs);
req.process(sourceSolrClient);
}
@@ -322,7 +307,7 @@ public class CdcrBootstrapTest extends SolrTestCaseJ4 {
log.info("cdcr: current numDocs in target-4: " + targetSolrClient.query(new SolrQuery("*:*")).getResults().getNumFound());
response = getCdcrQueue(sourceSolrClient);
- System.out.println("Cdcr queue response: " + response.getResponse());
+ log.info("Cdcr queue response: " + response.getResponse());
long foundDocs = waitForTargetToSync(numDocs, targetSolrClient);
assertEquals("Document mismatch on target after sync", numDocs, foundDocs);