mirror of https://github.com/apache/lucene.git
SOLR-1264 if master slave is out of sync w/ master replication is not successful
git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@792474 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1ed4c39835
commit
511ea76b32
|
@ -280,6 +280,7 @@ public class SnapPuller {
|
||||||
if (isIndexStale())
|
if (isIndexStale())
|
||||||
isSnapNeeded = true;
|
isSnapNeeded = true;
|
||||||
boolean successfulInstall = false;
|
boolean successfulInstall = false;
|
||||||
|
boolean deleteTmpIdxDir = true;
|
||||||
try {
|
try {
|
||||||
File indexDir = new File(core.getIndexDir());
|
File indexDir = new File(core.getIndexDir());
|
||||||
downloadIndexFiles(isSnapNeeded, tmpIndexDir, latestVersion);
|
downloadIndexFiles(isSnapNeeded, tmpIndexDir, latestVersion);
|
||||||
|
@ -300,7 +301,8 @@ public class SnapPuller {
|
||||||
} else {
|
} else {
|
||||||
terminateAndWaitFsyncService();
|
terminateAndWaitFsyncService();
|
||||||
if (isSnapNeeded) {
|
if (isSnapNeeded) {
|
||||||
modifyIndexProps(tmpIndexDir.getName());
|
successfulInstall = modifyIndexProps(tmpIndexDir.getName());
|
||||||
|
deleteTmpIdxDir = false;
|
||||||
} else {
|
} else {
|
||||||
successfulInstall = copyIndexFiles(tmpIndexDir, indexDir);
|
successfulInstall = copyIndexFiles(tmpIndexDir, indexDir);
|
||||||
}
|
}
|
||||||
|
@ -316,10 +318,9 @@ public class SnapPuller {
|
||||||
} catch (SolrException e) {
|
} catch (SolrException e) {
|
||||||
throw e;
|
throw e;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
delTree(tmpIndexDir);
|
|
||||||
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Index fetch failed : ", e);
|
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Index fetch failed : ", e);
|
||||||
} finally {
|
} finally {
|
||||||
delTree(tmpIndexDir);
|
if(deleteTmpIdxDir) delTree(tmpIndexDir);
|
||||||
}
|
}
|
||||||
return successfulInstall;
|
return successfulInstall;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -582,7 +583,7 @@ public class SnapPuller {
|
||||||
/**
|
/**
|
||||||
* If the index is stale by any chance, load index from a different dir in the data dir.
|
* If the index is stale by any chance, load index from a different dir in the data dir.
|
||||||
*/
|
*/
|
||||||
private void modifyIndexProps(String snap) {
|
private boolean modifyIndexProps(String snap) {
|
||||||
LOG.info("New index installed. Updating index properties...");
|
LOG.info("New index installed. Updating index properties...");
|
||||||
File idxprops = new File(solrCore.getDataDir() + "index.properties");
|
File idxprops = new File(solrCore.getDataDir() + "index.properties");
|
||||||
Properties p = new Properties();
|
Properties p = new Properties();
|
||||||
|
@ -608,6 +609,7 @@ public class SnapPuller {
|
||||||
} finally {
|
} finally {
|
||||||
IOUtils.closeQuietly(os);
|
IOUtils.closeQuietly(os);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map<String, FileInfo> confFileInfoCache = new HashMap<String, FileInfo>();
|
private final Map<String, FileInfo> confFileInfoCache = new HashMap<String, FileInfo>();
|
||||||
|
|
|
@ -133,15 +133,15 @@ public class TestReplicationHandler extends TestCase {
|
||||||
//get docs from slave and check if number is equal to master
|
//get docs from slave and check if number is equal to master
|
||||||
NamedList slaveQueryRsp = query("*:*", slaveClient);
|
NamedList slaveQueryRsp = query("*:*", slaveClient);
|
||||||
SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
|
|
||||||
if(slaveQueryResult.getNumFound() == 0) {
|
if (slaveQueryResult.getNumFound() == 0) {
|
||||||
//try sleeping again in case of slower comp
|
//try sleeping again in case of slower comp
|
||||||
Thread.sleep(5000);
|
Thread.sleep(5000);
|
||||||
|
|
||||||
slaveQueryRsp = query("*:*", slaveClient);
|
slaveQueryRsp = query("*:*", slaveClient);
|
||||||
slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(500, slaveQueryResult.getNumFound());
|
assertEquals(500, slaveQueryResult.getNumFound());
|
||||||
|
|
||||||
//compare results
|
//compare results
|
||||||
|
@ -196,15 +196,15 @@ public class TestReplicationHandler extends TestCase {
|
||||||
//get docs from slave and check if number is equal to master
|
//get docs from slave and check if number is equal to master
|
||||||
NamedList slaveQueryRsp = query("*:*", slaveClient);
|
NamedList slaveQueryRsp = query("*:*", slaveClient);
|
||||||
SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
|
|
||||||
if(slaveQueryResult.getNumFound() == 0) {
|
if (slaveQueryResult.getNumFound() == 0) {
|
||||||
//try sleeping again in case of slower comp
|
//try sleeping again in case of slower comp
|
||||||
Thread.sleep(5000);
|
Thread.sleep(5000);
|
||||||
|
|
||||||
slaveQueryRsp = query("*:*", slaveClient);
|
slaveQueryRsp = query("*:*", slaveClient);
|
||||||
slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
}
|
}
|
||||||
|
|
||||||
assertEquals(500, slaveQueryResult.getNumFound());
|
assertEquals(500, slaveQueryResult.getNumFound());
|
||||||
|
|
||||||
//compare results
|
//compare results
|
||||||
|
@ -382,6 +382,53 @@ public class TestReplicationHandler extends TestCase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testReplicateAfterWrite2Slave() throws Exception {
|
||||||
|
|
||||||
|
//add 500 docs to master
|
||||||
|
for (int i = 0; i < 500; i++)
|
||||||
|
index(masterClient, "id", i, "name", "name = " + i);
|
||||||
|
|
||||||
|
masterClient.commit();
|
||||||
|
|
||||||
|
NamedList masterQueryRsp = query("*:*", masterClient);
|
||||||
|
SolrDocumentList masterQueryResult = (SolrDocumentList) masterQueryRsp.get("response");
|
||||||
|
assertEquals(500, masterQueryResult.getNumFound());
|
||||||
|
|
||||||
|
String masterUrl = "http://localhost:" + masterJetty.getLocalPort() + "/solr/replication?command=disableReplication";
|
||||||
|
URL url = new URL(masterUrl);
|
||||||
|
InputStream stream = url.openStream();
|
||||||
|
try {
|
||||||
|
stream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
index(slaveClient, "id", 555, "name", "name = " + 555);
|
||||||
|
slaveClient.commit(true, true);
|
||||||
|
|
||||||
|
//this doc is added to slave so it should show an item w/ that result
|
||||||
|
NamedList slaveQueryRsp = query("id:555", slaveClient);
|
||||||
|
SolrDocumentList slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
|
assertEquals(1, slaveQueryResult.getNumFound());
|
||||||
|
|
||||||
|
masterUrl = "http://localhost:" + masterJetty.getLocalPort() + "/solr/replication?command=enableReplication";
|
||||||
|
url = new URL(masterUrl);
|
||||||
|
stream = url.openStream();
|
||||||
|
try {
|
||||||
|
stream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
//e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
//sleep for pollinterval time 3s, to let slave pull data.
|
||||||
|
Thread.sleep(3000);
|
||||||
|
//the slave should have done a full copy of the index so the doc with id:555 should not be there in the slave now
|
||||||
|
slaveQueryRsp = query("id:555", slaveClient);
|
||||||
|
slaveQueryResult = (SolrDocumentList) slaveQueryRsp.get("response");
|
||||||
|
assertEquals(0, slaveQueryResult.getNumFound());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* character copy of file using UTF-8 */
|
/* character copy of file using UTF-8 */
|
||||||
void copyFile(File src, File dst) throws IOException {
|
void copyFile(File src, File dst) throws IOException {
|
||||||
copyFile(src, dst, null);
|
copyFile(src, dst, null);
|
||||||
|
|
Loading…
Reference in New Issue