I guess it depends on how much credit you want to take for it :-)  I'd normally 
put a CHANGES entry in for something that has a JIRA number attached to it 
though.

Alan Woodward
www.flax.co.uk


On 4 Mar 2015, at 21:17, [email protected] wrote:

> I use that judgement too — sometimes I don’t bother if it’s internal and I 
> never would for something trivial like a typo.
> 
> ~ David Smiley
> Freelance Apache Lucene/Solr Search Consultant/Developer
> http://www.linkedin.com/in/davidwsmiley
> 
> On Wed, Mar 4, 2015 at 4:13 PM, Ramkumar R. Aiyengar 
> <[email protected]> wrote:
> The change had no functional impact, hence left it alone.
> 
> But happy to follow whatever is the existing practice. Should I have one for 
> every change?
> 
> On Wed, Mar 4, 2015 at 8:29 PM, Alan Woodward <[email protected]> wrote:
> Hi Ram, I think you missed a CHANGES.txt entry on this one?
> 
> Alan Woodward
> www.flax.co.uk
> 
> 
> On 4 Mar 2015, at 19:45, [email protected] wrote:
> 
>> Author: andyetitmoves
>> Date: Wed Mar  4 19:45:09 2015
>> New Revision: 1664126
>> 
>> URL: http://svn.apache.org/r1664126
>> Log:
>> SOLR-6804: Untangle SnapPuller and ReplicationHandler
>> 
>> This closes #110
>> 
>> Added:
>>    
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
>>      - copied, changed from r1663969, 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapPuller.java
>> Removed:
>>    
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapPuller.java
>> Modified:
>>    lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
>>    
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
>>    
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
>>    lucene/dev/trunk/solr/core/src/test-files/log4j.properties
>>    
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java
>>    
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
>>    
>> lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
>> 
>> Modified: 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java 
>> (original)
>> +++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/core/SolrCore.java 
>> Wed Mar  4 19:45:09 2015
>> @@ -83,9 +83,9 @@ import org.apache.solr.common.util.IOUti
>> import org.apache.solr.common.util.NamedList;
>> import org.apache.solr.common.util.SimpleOrderedMap;
>> import org.apache.solr.core.DirectoryFactory.DirContext;
>> +import org.apache.solr.handler.IndexFetcher;
>> import org.apache.solr.handler.ReplicationHandler;
>> import org.apache.solr.handler.RequestHandlerBase;
>> -import org.apache.solr.handler.SnapPuller;
>> import org.apache.solr.handler.admin.ShowFileRequestHandler;
>> import org.apache.solr.handler.component.DebugComponent;
>> import org.apache.solr.handler.component.ExpandComponent;
>> @@ -291,7 +291,7 @@ public final class SolrCore implements S
>>       dir = getDirectoryFactory().get(getDataDir(), DirContext.META_DATA, 
>> getSolrConfig().indexConfig.lockType);
>>       IndexInput input;
>>       try {
>> -        input = dir.openInput(SnapPuller.INDEX_PROPERTIES, 
>> IOContext.DEFAULT);
>> +        input = dir.openInput(IndexFetcher.INDEX_PROPERTIES, 
>> IOContext.DEFAULT);
>>       } catch (FileNotFoundException | NoSuchFileException e) {
>>         input = null;
>>       }
>> @@ -307,7 +307,7 @@ public final class SolrCore implements S
>>           }
>> 
>>         } catch (Exception e) {
>> -          log.error("Unable to load " + SnapPuller.INDEX_PROPERTIES, e);
>> +          log.error("Unable to load " + IndexFetcher.INDEX_PROPERTIES, e);
>>         } finally {
>>           IOUtils.closeQuietly(is);
>>         }
>> 
>> Copied: 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
>>  (from r1663969, 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapPuller.java)
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java?p2=lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java&p1=lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapPuller.java&r1=1663969&r2=1664126&rev=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapPuller.java 
>> (original)
>> +++ 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
>>  Wed Mar  4 19:45:09 2015
>> @@ -67,11 +67,7 @@ import java.util.concurrent.ExecutionExc
>> import java.util.concurrent.ExecutorService;
>> import java.util.concurrent.Executors;
>> import java.util.concurrent.Future;
>> -import java.util.concurrent.ScheduledExecutorService;
>> import java.util.concurrent.TimeUnit;
>> -import java.util.concurrent.atomic.AtomicBoolean;
>> -import java.util.regex.Matcher;
>> -import java.util.regex.Pattern;
>> import java.util.zip.Adler32;
>> import java.util.zip.Checksum;
>> import java.util.zip.InflaterInputStream;
>> @@ -94,7 +90,6 @@ import org.apache.solr.common.SolrExcept
>> import org.apache.solr.common.SolrException.ErrorCode;
>> import org.apache.solr.common.params.CommonParams;
>> import org.apache.solr.common.params.ModifiableSolrParams;
>> -import org.apache.solr.common.util.ExecutorUtil;
>> import org.apache.solr.common.util.FastInputStream;
>> import org.apache.solr.common.util.NamedList;
>> import org.apache.solr.core.DirectoryFactory;
>> @@ -121,24 +116,16 @@ import org.slf4j.LoggerFactory;
>>  *
>>  * @since solr 1.4
>>  */
>> -public class SnapPuller {
>> +public class IndexFetcher {
>>   private static final int _100K = 100000;
>> 
>>   public static final String INDEX_PROPERTIES = "index.properties";
>> 
>> -  private static final Logger LOG = 
>> LoggerFactory.getLogger(SnapPuller.class.getName());
>> +  private static final Logger LOG = 
>> LoggerFactory.getLogger(IndexFetcher.class.getName());
>> 
>>   private final String masterUrl;
>> 
>> -  private final ReplicationHandler replicationHandler;
>> -
>> -  private final Integer pollInterval;
>> -
>> -  private String pollIntervalStr;
>> -
>> -  private ScheduledExecutorService executorService;
>> -
>> -  private volatile long executorStartTime;
>> +  final ReplicationHandler replicationHandler;
>> 
>>   private volatile long replicationStartTime;
>> 
>> @@ -166,11 +153,6 @@ public class SnapPuller {
>> 
>>   private boolean useExternal = false;
>> 
>> -  /**
>> -   * Disable the timer task for polling
>> -   */
>> -  private AtomicBoolean pollDisabled = new AtomicBoolean(false);
>> -
>>   private final HttpClient myHttpClient;
>> 
>>   private static HttpClient createHttpClient(SolrCore core, String 
>> connTimeout, String readTimeout, String httpBasicAuthUser, String 
>> httpBasicAuthPassword, boolean useCompression) {
>> @@ -184,7 +166,7 @@ public class SnapPuller {
>>     return HttpClientUtil.createClient(httpClientParams, 
>> core.getCoreDescriptor().getCoreContainer().getUpdateShardHandler().getConnectionManager());
>>   }
>> 
>> -  public SnapPuller(final NamedList initArgs, final ReplicationHandler 
>> handler, final SolrCore sc) {
>> +  public IndexFetcher(final NamedList initArgs, final ReplicationHandler 
>> handler, final SolrCore sc) {
>>     solrCore = sc;
>>     String masterUrl = (String) initArgs.get(MASTER_URL);
>>     if (masterUrl == null)
>> @@ -197,8 +179,6 @@ public class SnapPuller {
>>     this.masterUrl = masterUrl;
>> 
>>     this.replicationHandler = handler;
>> -    pollIntervalStr = (String) initArgs.get(POLL_INTERVAL);
>> -    pollInterval = readInterval(pollIntervalStr);
>>     String compress = (String) initArgs.get(COMPRESSION);
>>     useInternal = INTERNAL.equals(compress);
>>     useExternal = EXTERNAL.equals(compress);
>> @@ -207,35 +187,6 @@ public class SnapPuller {
>>     String httpBasicAuthUser = (String) 
>> initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_USER);
>>     String httpBasicAuthPassword = (String) 
>> initArgs.get(HttpClientUtil.PROP_BASIC_AUTH_PASS);
>>     myHttpClient = createHttpClient(solrCore, connTimeout, readTimeout, 
>> httpBasicAuthUser, httpBasicAuthPassword, useExternal);
>> -    if (pollInterval != null && pollInterval > 0) {
>> -      startExecutorService();
>> -    } else {
>> -      LOG.info(" No value set for 'pollInterval'. Timer Task not started.");
>> -    }
>> -  }
>> -
>> -  private void startExecutorService() {
>> -    Runnable task = new Runnable() {
>> -      @Override
>> -      public void run() {
>> -        if (pollDisabled.get()) {
>> -          LOG.info("Poll disabled");
>> -          return;
>> -        }
>> -        try {
>> -          LOG.debug("Polling for index modifications");
>> -          executorStartTime = System.currentTimeMillis();
>> -          replicationHandler.doFetch(null, false);
>> -        } catch (Exception e) {
>> -          LOG.error("Exception in fetching index", e);
>> -        }
>> -      }
>> -    };
>> -    executorService = Executors.newSingleThreadScheduledExecutor(
>> -        new DefaultSolrThreadFactory("snapPuller"));
>> -    long initialDelay = pollInterval - (System.currentTimeMillis() % 
>> pollInterval);
>> -    executorService.scheduleAtFixedRate(task, initialDelay, pollInterval, 
>> TimeUnit.MILLISECONDS);
>> -    LOG.info("Poll Scheduled at an interval of " + pollInterval + "ms");
>>   }
>> 
>>   /**
>> @@ -427,13 +378,13 @@ public class SnapPuller {
>>               Thread.sleep(1000);
>>               c++;
>>               if (c >= 30)  {
>> -                LOG.warn("SnapPuller unable to cleanup unused lucene index 
>> files so we must do a full copy instead");
>> +                LOG.warn("IndexFetcher unable to cleanup unused lucene 
>> index files so we must do a full copy instead");
>>                 isFullCopyNeeded = true;
>>                 break;
>>               }
>>             }
>>             if (c > 0)  {
>> -              LOG.info("SnapPuller slept for " + (c * 1000) + "ms for 
>> unused lucene index files to be delete-able");
>> +              LOG.info("IndexFetcher slept for " + (c * 1000) + "ms for 
>> unused lucene index files to be delete-able");
>>             }
>>           } finally {
>>             writer.decref();
>> @@ -634,7 +585,7 @@ public class SnapPuller {
>>         props.setProperty(TIMES_CONFIG_REPLICATED, 
>> String.valueOf(confFilesCount));
>>       }
>> 
>> -      props.setProperty(LAST_CYCLE_BYTES_DOWNLOADED, 
>> String.valueOf(getTotalBytesDownloaded(this)));
>> +      props.setProperty(LAST_CYCLE_BYTES_DOWNLOADED, 
>> String.valueOf(getTotalBytesDownloaded()));
>>       if (!successfulInstall) {
>>         int numFailures = 1;
>>         if (props.containsKey(TIMES_FAILED)) {
>> @@ -663,20 +614,20 @@ public class SnapPuller {
>>     }
>>   }
>> 
>> -  static long getTotalBytesDownloaded(SnapPuller snappuller) {
>> +  long getTotalBytesDownloaded() {
>>     long bytesDownloaded = 0;
>>     //get size from list of files to download
>> -    for (Map<String, Object> file : snappuller.getFilesDownloaded()) {
>> +    for (Map<String, Object> file : getFilesDownloaded()) {
>>       bytesDownloaded += (Long) file.get(SIZE);
>>     }
>> 
>>     //get size from list of conf files to download
>> -    for (Map<String, Object> file : snappuller.getConfFilesDownloaded()) {
>> +    for (Map<String, Object> file : getConfFilesDownloaded()) {
>>       bytesDownloaded += (Long) file.get(SIZE);
>>     }
>> 
>>     //get size from current file being downloaded
>> -    Map<String, Object> currentFile = snappuller.getCurrentFile();
>> +    Map<String, Object> currentFile = getCurrentFile();
>>     if (currentFile != null) {
>>       if (currentFile.containsKey("bytesDownloaded")) {
>>         bytesDownloaded += (Long) currentFile.get("bytesDownloaded");
>> @@ -1053,33 +1004,33 @@ public class SnapPuller {
>>     Directory dir = null;
>>     try {
>>       dir = solrCore.getDirectoryFactory().get(solrCore.getDataDir(), 
>> DirContext.META_DATA, solrCore.getSolrConfig().indexConfig.lockType);
>> -      if (slowFileExists(dir, SnapPuller.INDEX_PROPERTIES)){
>> -        final IndexInput input = dir.openInput(SnapPuller.INDEX_PROPERTIES, 
>> DirectoryFactory.IOCONTEXT_NO_CACHE);
>> +      if (slowFileExists(dir, IndexFetcher.INDEX_PROPERTIES)){
>> +        final IndexInput input = 
>> dir.openInput(IndexFetcher.INDEX_PROPERTIES, 
>> DirectoryFactory.IOCONTEXT_NO_CACHE);
>> 
>>         final InputStream is = new PropertiesInputStream(input);
>>         try {
>>           p.load(new InputStreamReader(is, StandardCharsets.UTF_8));
>>         } catch (Exception e) {
>> -          LOG.error("Unable to load " + SnapPuller.INDEX_PROPERTIES, e);
>> +          LOG.error("Unable to load " + IndexFetcher.INDEX_PROPERTIES, e);
>>         } finally {
>>           IOUtils.closeQuietly(is);
>>         }
>>       }
>>       try {
>> -        dir.deleteFile(SnapPuller.INDEX_PROPERTIES);
>> +        dir.deleteFile(IndexFetcher.INDEX_PROPERTIES);
>>       } catch (IOException e) {
>>         // no problem
>>       }
>> -      final IndexOutput out = dir.createOutput(SnapPuller.INDEX_PROPERTIES, 
>> DirectoryFactory.IOCONTEXT_NO_CACHE);
>> +      final IndexOutput out = 
>> dir.createOutput(IndexFetcher.INDEX_PROPERTIES, 
>> DirectoryFactory.IOCONTEXT_NO_CACHE);
>>       p.put("index", tmpIdxDirName);
>>       Writer os = null;
>>       try {
>>         os = new OutputStreamWriter(new PropertiesOutputStream(out), 
>> StandardCharsets.UTF_8);
>> -        p.store(os, SnapPuller.INDEX_PROPERTIES);
>> +        p.store(os, IndexFetcher.INDEX_PROPERTIES);
>>         dir.sync(Collections.singleton(INDEX_PROPERTIES));
>>       } catch (Exception e) {
>>         throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
>> -            "Unable to write " + SnapPuller.INDEX_PROPERTIES, e);
>> +            "Unable to write " + IndexFetcher.INDEX_PROPERTIES, e);
>>       } finally {
>>         IOUtils.closeQuietly(os);
>>       }
>> @@ -1161,25 +1112,9 @@ public class SnapPuller {
>>   }
>> 
>>   /**
>> -   * Disable periodic polling
>> -   */
>> -  void disablePoll() {
>> -    pollDisabled.set(true);
>> -    LOG.info("inside disable poll, value of pollDisabled = " + 
>> pollDisabled);
>> -  }
>> -
>> -  /**
>> -   * Enable periodic polling
>> -   */
>> -  void enablePoll() {
>> -    pollDisabled.set(false);
>> -    LOG.info("inside enable poll, value of pollDisabled = " + pollDisabled);
>> -  }
>> -
>> -  /**
>> -   * Stops the ongoing pull
>> +   * Stops the ongoing fetch
>>    */
>> -  void abortPull() {
>> +  void abortFetch() {
>>     stop = true;
>>   }
>> 
>> @@ -1187,6 +1122,13 @@ public class SnapPuller {
>>     return replicationStartTime;
>>   }
>> 
>> +  long getReplicationTimeElapsed() {
>> +    long timeElapsed = 0;
>> +    if (getReplicationStartTime() > 0)
>> +      timeElapsed = TimeUnit.SECONDS.convert(System.currentTimeMillis() - 
>> getReplicationStartTime(), TimeUnit.MILLISECONDS);
>> +    return timeElapsed;
>> +  }
>> +
>>   List<Map<String, Object>> getConfFilesToDownload() {
>>     //make a copy first because it can be null later
>>     List<Map<String, Object>> tmp = confFilesToDownload;
>> @@ -1224,17 +1166,6 @@ public class SnapPuller {
>>     return tmp;
>>   }
>> 
>> -  boolean isPollingDisabled() {
>> -    return pollDisabled.get();
>> -  }
>> -
>> -  Long getNextScheduledExecTime() {
>> -    Long nextTime = null;
>> -    if (executorStartTime > 0)
>> -      nextTime = executorStartTime + pollInterval;
>> -    return nextTime;
>> -  }
>> -
>>   private static class ReplicationHandlerException extends 
>> InterruptedException {
>>     public ReplicationHandlerException(String message) {
>>       super(message);
>> @@ -1586,55 +1517,14 @@ public class SnapPuller {
>>     }
>>   }
>> 
>> -  static Integer readInterval(String interval) {
>> -    if (interval == null)
>> -      return null;
>> -    int result = 0;
>> -    Matcher m = INTERVAL_PATTERN.matcher(interval.trim());
>> -    if (m.find()) {
>> -      String hr = m.group(1);
>> -      String min = m.group(2);
>> -      String sec = m.group(3);
>> -      result = 0;
>> -      try {
>> -        if (sec != null && sec.length() > 0)
>> -          result += Integer.parseInt(sec);
>> -        if (min != null && min.length() > 0)
>> -          result += (60 * Integer.parseInt(min));
>> -        if (hr != null && hr.length() > 0)
>> -          result += (60 * 60 * Integer.parseInt(hr));
>> -        result *= 1000;
>> -      } catch (NumberFormatException e) {
>> -        throw new SolrException(ErrorCode.SERVER_ERROR, INTERVAL_ERR_MSG);
>> -      }
>> -    } else {
>> -      throw new SolrException(ErrorCode.SERVER_ERROR, INTERVAL_ERR_MSG);
>> -    }
>> -
>> -    return result;
>> -  }
>> -
>>   public void destroy() {
>> -    try {
>> -      if (executorService != null) executorService.shutdown();
>> -    } finally {
>> -      try {
>> -        abortPull();
>> -      } finally {
>> -        if (executorService != null) ExecutorUtil
>> -            .shutdownNowAndAwaitTermination(executorService);
>> -      }
>> -    }
>> +    abortFetch();
>>   }
>> 
>>   String getMasterUrl() {
>>     return masterUrl;
>>   }
>> 
>> -  String getPollInterval() {
>> -    return pollIntervalStr;
>> -  }
>> -
>>   private static final int MAX_RETRIES = 5;
>> 
>>   private static final int NO_CONTENT = 1;
>> @@ -1643,12 +1533,6 @@ public class SnapPuller {
>> 
>>   public static final String REPLICATION_PROPERTIES = 
>> "replication.properties";
>> 
>> -  public static final String POLL_INTERVAL = "pollInterval";
>> -
>> -  public static final String INTERVAL_ERR_MSG = "The " + POLL_INTERVAL + " 
>> must be in this format 'HH:mm:ss'";
>> -
>> -  private static final Pattern INTERVAL_PATTERN = 
>> Pattern.compile("(\\d*?):(\\d*?):(\\d*)");
>> -
>>   static final String INDEX_REPLICATED_AT = "indexReplicatedAt";
>> 
>>   static final String TIMES_INDEX_REPLICATED = "timesIndexReplicated";
>> 
>> Modified: 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
>>  (original)
>> +++ 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
>>  Wed Mar  4 19:45:09 2015
>> @@ -36,9 +36,13 @@ import java.util.HashMap;
>> import java.util.List;
>> import java.util.Map;
>> import java.util.Properties;
>> +import java.util.concurrent.Executors;
>> +import java.util.concurrent.ScheduledExecutorService;
>> import java.util.concurrent.TimeUnit;
>> import java.util.concurrent.atomic.AtomicBoolean;
>> import java.util.concurrent.locks.ReentrantLock;
>> +import java.util.regex.Matcher;
>> +import java.util.regex.Pattern;
>> import java.util.zip.Adler32;
>> import java.util.zip.Checksum;
>> import java.util.zip.DeflaterOutputStream;
>> @@ -60,6 +64,7 @@ import org.apache.solr.common.SolrExcept
>> 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.ExecutorUtil;
>> import org.apache.solr.common.util.FastOutputStream;
>> import org.apache.solr.common.util.NamedList;
>> import org.apache.solr.common.util.SimpleOrderedMap;
>> @@ -75,6 +80,7 @@ import org.apache.solr.request.SolrQuery
>> import org.apache.solr.response.SolrQueryResponse;
>> import org.apache.solr.search.SolrIndexSearcher;
>> import org.apache.solr.update.SolrIndexWriter;
>> +import org.apache.solr.util.DefaultSolrThreadFactory;
>> import org.apache.solr.util.NumberUtils;
>> import org.apache.solr.util.PropertiesInputStream;
>> import org.apache.solr.util.RefCounted;
>> @@ -90,8 +96,8 @@ import org.slf4j.LoggerFactory;
>>  * file (command=filecontent&amp;file=&lt;FILE_NAME&gt;) You can optionally 
>> specify an offset and length to get that
>>  * chunk of the file. You can request a configuration file by using "cf" 
>> parameter instead of the "file" parameter.</li>
>>  * <li>Get status/statistics (command=details)</li> </ol> <p>When running on 
>> the slave, it provides the following
>> - * commands <ol> <li>Perform a snap pull now (command=snappull)</li> 
>> <li>Get status/statistics (command=details)</li>
>> - * <li>Abort a snap pull (command=abort)</li> <li>Enable/Disable polling 
>> the master for new versions (command=enablepoll
>> + * commands <ol> <li>Perform an index fetch now (command=snappull)</li> 
>> <li>Get status/statistics (command=details)</li>
>> + * <li>Abort an index fetch (command=abort)</li> <li>Enable/Disable polling 
>> the master for new versions (command=enablepoll
>>  * or command=disablepoll)</li> </ol>
>>  *
>>  *
>> @@ -134,9 +140,9 @@ public class ReplicationHandler extends
>>     }
>>   }
>> 
>> -  private SnapPuller snapPuller;
>> +  private IndexFetcher pollingIndexFetcher;
>> 
>> -  private ReentrantLock snapPullLock = new ReentrantLock();
>> +  private ReentrantLock indexFetchLock = new ReentrantLock();
>> 
>>   private String includeConfFiles;
>> 
>> @@ -151,14 +157,18 @@ public class ReplicationHandler extends
>>   private boolean replicateOnCommit = false;
>> 
>>   private boolean replicateOnStart = false;
>> -  
>> +
>> +  private ScheduledExecutorService executorService;
>> +
>> +  private volatile long executorStartTime;
>> +
>>   private int numberBackupsToKeep = 0; //zero: do not delete old backups
>> 
>>   private int numTimesReplicated = 0;
>> 
>>   private final Map<String, FileInfo> confFileInfoCache = new HashMap<>();
>> 
>> -  private Integer reserveCommitDuration = 
>> SnapPuller.readInterval("00:00:10");
>> +  private Integer reserveCommitDuration = readInterval("00:00:10");
>> 
>>   volatile IndexCommit indexCommitPoint;
>> 
>> @@ -166,6 +176,19 @@ public class ReplicationHandler extends
>> 
>>   private AtomicBoolean replicationEnabled = new AtomicBoolean(true);
>> 
>> +  private Integer pollInterval;
>> +
>> +  private String pollIntervalStr;
>> +
>> +  /**
>> +   * Disable the timer task for polling
>> +   */
>> +  private AtomicBoolean pollDisabled = new AtomicBoolean(false);
>> +
>> +  String getPollInterval() {
>> +    return pollIntervalStr;
>> +  }
>> +
>>   @Override
>>   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) 
>> throws Exception {
>>     rsp.setHttpCaching(false);
>> @@ -221,38 +244,38 @@ public class ReplicationHandler extends
>>         return;
>>       }
>>       final SolrParams paramsCopy = new ModifiableSolrParams(solrParams);
>> -      Thread puller = new Thread("explicit-fetchindex-cmd") {
>> +      Thread fetchThread = new Thread("explicit-fetchindex-cmd") {
>>         @Override
>>         public void run() {
>>           doFetch(paramsCopy, false);
>>         }
>>       };
>> -      puller.setDaemon(false);
>> -      puller.start();
>> +      fetchThread.setDaemon(false);
>> +      fetchThread.start();
>>       if (solrParams.getBool(WAIT, false)) {
>> -        puller.join();
>> +        fetchThread.join();
>>       }
>>       rsp.add(STATUS, OK_STATUS);
>>     } else if (command.equalsIgnoreCase(CMD_DISABLE_POLL)) {
>> -      if (snapPuller != null){
>> -        snapPuller.disablePoll();
>> +      if (pollingIndexFetcher != null){
>> +        disablePoll();
>>         rsp.add(STATUS, OK_STATUS);
>>       } else {
>>         rsp.add(STATUS, ERR_STATUS);
>>         rsp.add("message","No slave configured");
>>       }
>>     } else if (command.equalsIgnoreCase(CMD_ENABLE_POLL)) {
>> -      if (snapPuller != null){
>> -        snapPuller.enablePoll();
>> +      if (pollingIndexFetcher != null){
>> +        enablePoll();
>>         rsp.add(STATUS, OK_STATUS);
>>       }else {
>>         rsp.add(STATUS,ERR_STATUS);
>>         rsp.add("message","No slave configured");
>>       }
>>     } else if (command.equalsIgnoreCase(CMD_ABORT_FETCH)) {
>> -      SnapPuller temp = tempSnapPuller;
>> -      if (temp != null){
>> -        temp.abortPull();
>> +      IndexFetcher fetcher = currentIndexFetcher;
>> +      if (fetcher != null){
>> +        fetcher.abortFetch();
>>         rsp.add(STATUS, OK_STATUS);
>>       } else {
>>         rsp.add(STATUS,ERR_STATUS);
>> @@ -321,38 +344,35 @@ public class ReplicationHandler extends
>>     return null;
>>   }
>> 
>> -  private volatile SnapPuller tempSnapPuller;
>> +  private volatile IndexFetcher currentIndexFetcher;
>> 
>>   public boolean doFetch(SolrParams solrParams, boolean forceReplication) {
>>     String masterUrl = solrParams == null ? null : 
>> solrParams.get(MASTER_URL);
>> -    if (!snapPullLock.tryLock())
>> +    if (!indexFetchLock.tryLock())
>>       return false;
>>     try {
>>       if (masterUrl != null) {
>> -        if (tempSnapPuller != null && tempSnapPuller != snapPuller) {
>> -          tempSnapPuller.destroy();
>> +        if (currentIndexFetcher != null && currentIndexFetcher != 
>> pollingIndexFetcher) {
>> +          currentIndexFetcher.destroy();
>>         }
>> -        
>> -        NamedList<Object> nl = solrParams.toNamedList();
>> -        nl.remove(SnapPuller.POLL_INTERVAL);
>> -        tempSnapPuller = new SnapPuller(nl, this, core);
>> +        currentIndexFetcher = new IndexFetcher(solrParams.toNamedList(), 
>> this, core);
>>       } else {
>> -        tempSnapPuller = snapPuller;
>> +        currentIndexFetcher = pollingIndexFetcher;
>>       }
>> -      return tempSnapPuller.fetchLatestIndex(core, forceReplication);
>> +      return currentIndexFetcher.fetchLatestIndex(core, forceReplication);
>>     } catch (Exception e) {
>> -      SolrException.log(LOG, "SnapPull failed ", e);
>> +      SolrException.log(LOG, "Index fetch failed ", e);
>>     } finally {
>> -      if (snapPuller != null) {
>> -        tempSnapPuller = snapPuller;
>> +      if (pollingIndexFetcher != null) {
>> +        currentIndexFetcher = pollingIndexFetcher;
>>       }
>> -      snapPullLock.unlock();
>> +      indexFetchLock.unlock();
>>     }
>>     return false;
>>   }
>> 
>>   boolean isReplicating() {
>> -    return snapPullLock.isLocked();
>> +    return indexFetchLock.isLocked();
>>   }
>> 
>>   private void doSnapShoot(SolrParams params, SolrQueryResponse rsp,
>> @@ -390,10 +410,10 @@ public class ReplicationHandler extends
>> 
>>   /**
>>    * This method adds an Object of FileStream to the response . The 
>> FileStream implements a custom protocol which is
>> -   * understood by SnapPuller.FileFetcher
>> +   * understood by IndexFetcher.FileFetcher
>>    *
>> -   * @see org.apache.solr.handler.SnapPuller.LocalFsFileFetcher
>> -   * @see org.apache.solr.handler.SnapPuller.DirectoryFileFetcher
>> +   * @see IndexFetcher.LocalFsFileFetcher
>> +   * @see IndexFetcher.DirectoryFileFetcher
>>    */
>>   private void getFileStream(SolrParams solrParams, SolrQueryResponse rsp) {
>>     ModifiableSolrParams rawParams = new ModifiableSolrParams(solrParams);
>> @@ -538,18 +558,28 @@ public class ReplicationHandler extends
>>   }
>> 
>>   void disablePoll() {
>> -    if (isSlave)
>> -      snapPuller.disablePoll();
>> +    if (isSlave) {
>> +      pollDisabled.set(true);
>> +      LOG.info("inside disable poll, value of pollDisabled = " + 
>> pollDisabled);
>> +    }
>>   }
>> 
>>   void enablePoll() {
>> -    if (isSlave)
>> -      snapPuller.enablePoll();
>> +    if (isSlave) {
>> +      pollDisabled.set(false);
>> +      LOG.info("inside enable poll, value of pollDisabled = " + 
>> pollDisabled);
>> +    }
>>   }
>> 
>>   boolean isPollingDisabled() {
>> -    if (snapPuller == null) return true;
>> -    return snapPuller.isPollingDisabled();
>> +    return pollDisabled.get();
>> +  }
>> +
>> +  Long getNextScheduledExecTime() {
>> +    Long nextTime = null;
>> +    if (executorStartTime > 0)
>> +      nextTime = executorStartTime + pollInterval;
>> +    return nextTime;
>>   }
>> 
>>   int getTimesReplicatedSinceStartup() {
>> @@ -611,31 +641,31 @@ public class ReplicationHandler extends
>>       list.add("isMaster", String.valueOf(isMaster));
>>       list.add("isSlave", String.valueOf(isSlave));
>> 
>> -      SnapPuller snapPuller = tempSnapPuller;
>> -      if (snapPuller != null) {
>> -        list.add(MASTER_URL, snapPuller.getMasterUrl());
>> -        if (snapPuller.getPollInterval() != null) {
>> -          list.add(SnapPuller.POLL_INTERVAL, snapPuller.getPollInterval());
>> +      IndexFetcher fetcher = currentIndexFetcher;
>> +      if (fetcher != null) {
>> +        list.add(MASTER_URL, fetcher.getMasterUrl());
>> +        if (getPollInterval() != null) {
>> +          list.add(POLL_INTERVAL, getPollInterval());
>>         }
>>         list.add("isPollingDisabled", String.valueOf(isPollingDisabled()));
>>         list.add("isReplicating", String.valueOf(isReplicating()));
>> -        long elapsed = getTimeElapsed(snapPuller);
>> -        long val = SnapPuller.getTotalBytesDownloaded(snapPuller);
>> +        long elapsed = fetcher.getReplicationTimeElapsed();
>> +        long val = fetcher.getTotalBytesDownloaded();
>>         if (elapsed > 0) {
>>           list.add("timeElapsed", elapsed);
>>           list.add("bytesDownloaded", val);
>>           list.add("downloadSpeed", val / elapsed);
>>         }
>>         Properties props = loadReplicationProperties();
>> -        addVal(list, SnapPuller.PREVIOUS_CYCLE_TIME_TAKEN, props, 
>> Long.class);
>> -        addVal(list, SnapPuller.INDEX_REPLICATED_AT, props, Date.class);
>> -        addVal(list, SnapPuller.CONF_FILES_REPLICATED_AT, props, 
>> Date.class);
>> -        addVal(list, SnapPuller.REPLICATION_FAILED_AT, props, Date.class);
>> -        addVal(list, SnapPuller.TIMES_FAILED, props, Integer.class);
>> -        addVal(list, SnapPuller.TIMES_INDEX_REPLICATED, props, 
>> Integer.class);
>> -        addVal(list, SnapPuller.LAST_CYCLE_BYTES_DOWNLOADED, props, 
>> Long.class);
>> -        addVal(list, SnapPuller.TIMES_CONFIG_REPLICATED, props, 
>> Integer.class);
>> -        addVal(list, SnapPuller.CONF_FILES_REPLICATED, props, String.class);
>> +        addVal(list, IndexFetcher.PREVIOUS_CYCLE_TIME_TAKEN, props, 
>> Long.class);
>> +        addVal(list, IndexFetcher.INDEX_REPLICATED_AT, props, Date.class);
>> +        addVal(list, IndexFetcher.CONF_FILES_REPLICATED_AT, props, 
>> Date.class);
>> +        addVal(list, IndexFetcher.REPLICATION_FAILED_AT, props, Date.class);
>> +        addVal(list, IndexFetcher.TIMES_FAILED, props, Integer.class);
>> +        addVal(list, IndexFetcher.TIMES_INDEX_REPLICATED, props, 
>> Integer.class);
>> +        addVal(list, IndexFetcher.LAST_CYCLE_BYTES_DOWNLOADED, props, 
>> Long.class);
>> +        addVal(list, IndexFetcher.TIMES_CONFIG_REPLICATED, props, 
>> Integer.class);
>> +        addVal(list, IndexFetcher.CONF_FILES_REPLICATED, props, 
>> String.class);
>>       }
>>       if (isMaster) {
>>         if (includeConfFiles != null) list.add("confFilesToReplicate", 
>> includeConfFiles);
>> @@ -677,12 +707,12 @@ public class ReplicationHandler extends
>>       master.add("replicableGeneration", repCommitInfo.generation);
>>     }
>> 
>> -    SnapPuller snapPuller = tempSnapPuller;
>> -    if (snapPuller != null) {
>> +    IndexFetcher fetcher = currentIndexFetcher;
>> +    if (fetcher != null) {
>>       Properties props = loadReplicationProperties();
>>       if (showSlaveDetails) {
>>         try {
>> -          NamedList nl = snapPuller.getDetails();
>> +          NamedList nl = fetcher.getDetails();
>>           slave.add("masterDetails", nl.get(CMD_DETAILS));
>>         } catch (Exception e) {
>>           LOG.warn(
>> @@ -691,26 +721,26 @@ public class ReplicationHandler extends
>>           slave.add(ERR_STATUS, "invalid_master");
>>         }
>>       }
>> -      slave.add(MASTER_URL, snapPuller.getMasterUrl());
>> -      if (snapPuller.getPollInterval() != null) {
>> -        slave.add(SnapPuller.POLL_INTERVAL, snapPuller.getPollInterval());
>> +      slave.add(MASTER_URL, fetcher.getMasterUrl());
>> +      if (getPollInterval() != null) {
>> +        slave.add(POLL_INTERVAL, getPollInterval());
>>       }
>> -      if (snapPuller.getNextScheduledExecTime() != null && 
>> !isPollingDisabled()) {
>> -        slave.add(NEXT_EXECUTION_AT, new 
>> Date(snapPuller.getNextScheduledExecTime()).toString());
>> +      if (getNextScheduledExecTime() != null && !isPollingDisabled()) {
>> +        slave.add(NEXT_EXECUTION_AT, new 
>> Date(getNextScheduledExecTime()).toString());
>>       } else if (isPollingDisabled()) {
>>         slave.add(NEXT_EXECUTION_AT, "Polling disabled");
>>       }
>> -      addVal(slave, SnapPuller.INDEX_REPLICATED_AT, props, Date.class);
>> -      addVal(slave, SnapPuller.INDEX_REPLICATED_AT_LIST, props, List.class);
>> -      addVal(slave, SnapPuller.REPLICATION_FAILED_AT_LIST, props, 
>> List.class);
>> -      addVal(slave, SnapPuller.TIMES_INDEX_REPLICATED, props, 
>> Integer.class);
>> -      addVal(slave, SnapPuller.CONF_FILES_REPLICATED, props, Integer.class);
>> -      addVal(slave, SnapPuller.TIMES_CONFIG_REPLICATED, props, 
>> Integer.class);
>> -      addVal(slave, SnapPuller.CONF_FILES_REPLICATED_AT, props, 
>> Integer.class);
>> -      addVal(slave, SnapPuller.LAST_CYCLE_BYTES_DOWNLOADED, props, 
>> Long.class);
>> -      addVal(slave, SnapPuller.TIMES_FAILED, props, Integer.class);
>> -      addVal(slave, SnapPuller.REPLICATION_FAILED_AT, props, Date.class);
>> -      addVal(slave, SnapPuller.PREVIOUS_CYCLE_TIME_TAKEN, props, 
>> Long.class);
>> +      addVal(slave, IndexFetcher.INDEX_REPLICATED_AT, props, Date.class);
>> +      addVal(slave, IndexFetcher.INDEX_REPLICATED_AT_LIST, props, 
>> List.class);
>> +      addVal(slave, IndexFetcher.REPLICATION_FAILED_AT_LIST, props, 
>> List.class);
>> +      addVal(slave, IndexFetcher.TIMES_INDEX_REPLICATED, props, 
>> Integer.class);
>> +      addVal(slave, IndexFetcher.CONF_FILES_REPLICATED, props, 
>> Integer.class);
>> +      addVal(slave, IndexFetcher.TIMES_CONFIG_REPLICATED, props, 
>> Integer.class);
>> +      addVal(slave, IndexFetcher.CONF_FILES_REPLICATED_AT, props, 
>> Integer.class);
>> +      addVal(slave, IndexFetcher.LAST_CYCLE_BYTES_DOWNLOADED, props, 
>> Long.class);
>> +      addVal(slave, IndexFetcher.TIMES_FAILED, props, Integer.class);
>> +      addVal(slave, IndexFetcher.REPLICATION_FAILED_AT, props, Date.class);
>> +      addVal(slave, IndexFetcher.PREVIOUS_CYCLE_TIME_TAKEN, props, 
>> Long.class);
>> 
>>       slave.add("currentDate", new Date().toString());
>>       slave.add("isPollingDisabled", String.valueOf(isPollingDisabled()));
>> @@ -720,13 +750,13 @@ public class ReplicationHandler extends
>>         try {
>>           long bytesToDownload = 0;
>>           List<String> filesToDownload = new ArrayList<>();
>> -          for (Map<String, Object> file : snapPuller.getFilesToDownload()) {
>> +          for (Map<String, Object> file : fetcher.getFilesToDownload()) {
>>             filesToDownload.add((String) file.get(NAME));
>>             bytesToDownload += (Long) file.get(SIZE);
>>           }
>> 
>>           //get list of conf files to download
>> -          for (Map<String, Object> file : 
>> snapPuller.getConfFilesToDownload()) {
>> +          for (Map<String, Object> file : fetcher.getConfFilesToDownload()) 
>> {
>>             filesToDownload.add((String) file.get(NAME));
>>             bytesToDownload += (Long) file.get(SIZE);
>>           }
>> @@ -737,18 +767,18 @@ public class ReplicationHandler extends
>> 
>>           long bytesDownloaded = 0;
>>           List<String> filesDownloaded = new ArrayList<>();
>> -          for (Map<String, Object> file : snapPuller.getFilesDownloaded()) {
>> +          for (Map<String, Object> file : fetcher.getFilesDownloaded()) {
>>             filesDownloaded.add((String) file.get(NAME));
>>             bytesDownloaded += (Long) file.get(SIZE);
>>           }
>> 
>>           //get list of conf files downloaded
>> -          for (Map<String, Object> file : 
>> snapPuller.getConfFilesDownloaded()) {
>> +          for (Map<String, Object> file : fetcher.getConfFilesDownloaded()) 
>> {
>>             filesDownloaded.add((String) file.get(NAME));
>>             bytesDownloaded += (Long) file.get(SIZE);
>>           }
>> 
>> -          Map<String, Object> currentFile = snapPuller.getCurrentFile();
>> +          Map<String, Object> currentFile = fetcher.getCurrentFile();
>>           String currFile = null;
>>           long currFileSize = 0, currFileSizeDownloaded = 0;
>>           float percentDownloaded = 0;
>> @@ -767,10 +797,10 @@ public class ReplicationHandler extends
>> 
>>           long estimatedTimeRemaining = 0;
>> 
>> -          if (snapPuller.getReplicationStartTime() > 0) {
>> -            slave.add("replicationStartTime", new 
>> Date(snapPuller.getReplicationStartTime()).toString());
>> +          if (fetcher.getReplicationStartTime() > 0) {
>> +            slave.add("replicationStartTime", new 
>> Date(fetcher.getReplicationStartTime()).toString());
>>           }
>> -          long elapsed = getTimeElapsed(snapPuller);
>> +          long elapsed = fetcher.getReplicationTimeElapsed();
>>           slave.add("timeElapsed", String.valueOf(elapsed) + "s");
>> 
>>           if (bytesDownloaded > 0)
>> @@ -840,13 +870,6 @@ public class ReplicationHandler extends
>>     return replicateAfter;
>>   }
>> 
>> -  private long getTimeElapsed(SnapPuller snapPuller) {
>> -    long timeElapsed = 0;
>> -    if (snapPuller.getReplicationStartTime() > 0)
>> -      timeElapsed = TimeUnit.SECONDS.convert(System.currentTimeMillis() - 
>> snapPuller.getReplicationStartTime(), TimeUnit.MILLISECONDS);
>> -    return timeElapsed;
>> -  }
>> -
>>   Properties loadReplicationProperties() {
>>     Directory dir = null;
>>     try {
>> @@ -856,7 +879,7 @@ public class ReplicationHandler extends
>>         IndexInput input;
>>         try {
>>           input = dir.openInput(
>> -            SnapPuller.REPLICATION_PROPERTIES, IOContext.DEFAULT);
>> +            IndexFetcher.REPLICATION_PROPERTIES, IOContext.DEFAULT);
>>         } catch (FileNotFoundException | NoSuchFileException e) {
>>           return new Properties();
>>         }
>> @@ -887,6 +910,37 @@ public class ReplicationHandler extends
>> //    }
>> //  }
>> 
>> +  private void setupPolling(String intervalStr) {
>> +    pollIntervalStr = intervalStr;
>> +    pollInterval = readInterval(pollIntervalStr);
>> +    if (pollInterval == null || pollInterval <= 0) {
>> +      LOG.info(" No value set for 'pollInterval'. Timer Task not started.");
>> +      return;
>> +    }
>> +
>> +    Runnable task = new Runnable() {
>> +      @Override
>> +      public void run() {
>> +        if (pollDisabled.get()) {
>> +          LOG.info("Poll disabled");
>> +          return;
>> +        }
>> +        try {
>> +          LOG.debug("Polling for index modifications");
>> +          executorStartTime = System.currentTimeMillis();
>> +          doFetch(null, false);
>> +        } catch (Exception e) {
>> +          LOG.error("Exception in fetching index", e);
>> +        }
>> +      }
>> +    };
>> +    executorService = Executors.newSingleThreadScheduledExecutor(
>> +        new DefaultSolrThreadFactory("indexFetcher"));
>> +    long initialDelay = pollInterval - (System.currentTimeMillis() % 
>> pollInterval);
>> +    executorService.scheduleAtFixedRate(task, initialDelay, pollInterval, 
>> TimeUnit.MILLISECONDS);
>> +    LOG.info("Poll Scheduled at an interval of " + pollInterval + "ms");
>> +  }
>> +
>>   @Override
>>   @SuppressWarnings("unchecked")
>>   public void inform(SolrCore core) {
>> @@ -901,7 +955,8 @@ public class ReplicationHandler extends
>>     NamedList slave = (NamedList) initArgs.get("slave");
>>     boolean enableSlave = isEnabled( slave );
>>     if (enableSlave) {
>> -      tempSnapPuller = snapPuller = new SnapPuller(slave, this, core);
>> +      currentIndexFetcher = pollingIndexFetcher = new IndexFetcher(slave, 
>> this, core);
>> +      setupPolling((String) slave.get(POLL_INTERVAL));
>>       isSlave = true;
>>     }
>>     NamedList master = (NamedList) initArgs.get("master");
>> @@ -1005,7 +1060,7 @@ public class ReplicationHandler extends
>>       }
>>       String reserve = (String) master.get(RESERVE);
>>       if (reserve != null && !reserve.trim().equals("")) {
>> -        reserveCommitDuration = SnapPuller.readInterval(reserve);
>> +        reserveCommitDuration = readInterval(reserve);
>>       }
>>       LOG.info("Commits will be reserved for  " + reserveCommitDuration);
>>       isMaster = true;
>> @@ -1029,11 +1084,20 @@ public class ReplicationHandler extends
>>     core.addCloseHook(new CloseHook() {
>>       @Override
>>       public void preClose(SolrCore core) {
>> -        if (snapPuller != null) {
>> -          snapPuller.destroy();
>> +        try {
>> +          if (executorService != null) executorService.shutdown();
>> +        } finally {
>> +          try {
>> +            if (pollingIndexFetcher != null) {
>> +              pollingIndexFetcher.destroy();
>> +            }
>> +          } finally {
>> +            if (executorService != null) ExecutorUtil
>> +                .shutdownNowAndAwaitTermination(executorService);
>> +          }
>>         }
>> -        if (tempSnapPuller != null && tempSnapPuller != snapPuller) {
>> -          tempSnapPuller.destroy();
>> +        if (currentIndexFetcher != null && currentIndexFetcher != 
>> pollingIndexFetcher) {
>> +          currentIndexFetcher.destroy();
>>         }
>>       }
>> 
>> @@ -1307,8 +1371,40 @@ public class ReplicationHandler extends
>>         releaseCommitPointAndExtendReserve();
>>       }
>>     }
>> -  } 
>> -  
>> +  }
>> +
>> +  static Integer readInterval(String interval) {
>> +    if (interval == null)
>> +      return null;
>> +    int result = 0;
>> +    if (interval != null) {
>> +      Matcher m = INTERVAL_PATTERN.matcher(interval.trim());
>> +      if (m.find()) {
>> +        String hr = m.group(1);
>> +        String min = m.group(2);
>> +        String sec = m.group(3);
>> +        result = 0;
>> +        try {
>> +          if (sec != null && sec.length() > 0)
>> +            result += Integer.parseInt(sec);
>> +          if (min != null && min.length() > 0)
>> +            result += (60 * Integer.parseInt(min));
>> +          if (hr != null && hr.length() > 0)
>> +            result += (60 * 60 * Integer.parseInt(hr));
>> +          result *= 1000;
>> +        } catch (NumberFormatException e) {
>> +          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
>> +              INTERVAL_ERR_MSG);
>> +        }
>> +      } else {
>> +        throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
>> +            INTERVAL_ERR_MSG);
>> +      }
>> +
>> +    }
>> +    return result;
>> +  }
>> +
>>   public static final String MASTER_URL = "masterUrl";
>> 
>>   public static final String STATUS = "status";
>> @@ -1369,6 +1465,12 @@ public class ReplicationHandler extends
>> 
>>   public static final String FILE_STREAM = "filestream";
>> 
>> +  public static final String POLL_INTERVAL = "pollInterval";
>> +
>> +  public static final String INTERVAL_ERR_MSG = "The " + POLL_INTERVAL + " 
>> must be in this format 'HH:mm:ss'";
>> +
>> +  private static final Pattern INTERVAL_PATTERN = 
>> Pattern.compile("(\\d*?):(\\d*?):(\\d*)");
>> +
>>   public static final int PACKET_SZ = 1024 * 1024; // 1MB
>> 
>>   public static final String RESERVE = "commitReserveDuration";
>> 
>> Modified: 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapShooter.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapShooter.java 
>> (original)
>> +++ 
>> lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SnapShooter.java 
>> Wed Mar  4 19:45:09 2015
>> @@ -144,7 +144,7 @@ public class SnapShooter {
>>       details.add("snapshotName", snapshotName);
>>       LOG.info("Done creating backup snapshot: " + (snapshotName == null ? 
>> "<not named>" : snapshotName));
>>     } catch (Exception e) {
>> -      SnapPuller.delTree(snapShotDir);
>> +      IndexFetcher.delTree(snapShotDir);
>>       LOG.error("Exception while creating snapshot", e);
>>       details.add("snapShootException", e.getMessage());
>>     } finally {
>> @@ -170,7 +170,7 @@ public class SnapShooter {
>>     int i=1;
>>     for (OldBackupDirectory dir : dirs) {
>>       if (i++ > numberToKeep) {
>> -        SnapPuller.delTree(dir.dir);
>> +        IndexFetcher.delTree(dir.dir);
>>       }
>>     }
>>   }
>> @@ -181,7 +181,7 @@ public class SnapShooter {
>>     NamedList<Object> details = new NamedList<>();
>>     boolean isSuccess;
>>     File f = new File(snapDir, "snapshot." + snapshotName);
>> -    isSuccess = SnapPuller.delTree(f);
>> +    isSuccess = IndexFetcher.delTree(f);
>> 
>>     if(isSuccess) {
>>       details.add("status", "success");
>> 
>> Modified: lucene/dev/trunk/solr/core/src/test-files/log4j.properties
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test-files/log4j.properties?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- lucene/dev/trunk/solr/core/src/test-files/log4j.properties (original)
>> +++ lucene/dev/trunk/solr/core/src/test-files/log4j.properties Wed Mar  4 
>> 19:45:09 2015
>> @@ -25,7 +25,7 @@ log4j.logger.org.apache.solr.hadoop=INFO
>> #log4j.logger.org.apache.solr.cloud.ChaosMonkey=DEBUG
>> #log4j.logger.org.apache.solr.update.TransactionLog=DEBUG
>> #log4j.logger.org.apache.solr.handler.ReplicationHandler=DEBUG
>> -#log4j.logger.org.apache.solr.handler.SnapPuller=DEBUG
>> +#log4j.logger.org.apache.solr.handler.IndexFetcher=DEBUG
>> 
>> #log4j.logger.org.apache.solr.common.cloud.ClusterStateUtil=DEBUG
>> #log4j.logger.org.apache.solr.cloud.OverseerAutoReplicaFailoverThread=DEBUG
>> \ No newline at end of file
>> 
>> Modified: 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java
>>  (original)
>> +++ 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/core/TestArbitraryIndexDir.java
>>  Wed Mar  4 19:45:09 2015
>> @@ -36,7 +36,7 @@ import org.apache.lucene.store.Directory
>> import org.apache.lucene.util.IOUtils;
>> import org.apache.solr.common.SolrException;
>> import org.apache.solr.common.params.CommonParams;
>> -import org.apache.solr.handler.SnapPuller;
>> +import org.apache.solr.handler.IndexFetcher;
>> import org.apache.solr.util.AbstractSolrTestCase;
>> import org.apache.solr.util.TestHarness;
>> import org.junit.AfterClass;
>> @@ -93,7 +93,7 @@ public class TestArbitraryIndexDir exten
>>     assertU(adoc("id", String.valueOf(1),
>>         "name", "name"+String.valueOf(1)));
>>     //create a new index dir and index.properties file
>> -    File idxprops = new File(h.getCore().getDataDir() + 
>> SnapPuller.INDEX_PROPERTIES);
>> +    File idxprops = new File(h.getCore().getDataDir() + 
>> IndexFetcher.INDEX_PROPERTIES);
>>     Properties p = new Properties();
>>     File newDir = new File(h.getCore().getDataDir() + "index_temp");
>>     newDir.mkdirs();
>> @@ -104,7 +104,7 @@ public class TestArbitraryIndexDir exten
>>       p.store(os, "index properties");
>>     } catch (Exception e) {
>>       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
>> -          "Unable to write " + SnapPuller.INDEX_PROPERTIES, e);
>> +          "Unable to write " + IndexFetcher.INDEX_PROPERTIES, e);
>>     } finally {
>>       IOUtils.closeWhileHandlingException(os);
>>     }
>> 
>> Modified: 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
>>  (original)
>> +++ 
>> lucene/dev/trunk/solr/core/src/test/org/apache/solr/handler/TestReplicationHandler.java
>>  Wed Mar  4 19:45:09 2015
>> @@ -172,17 +172,13 @@ public class TestReplicationHandler exte
>>   }
>> 
>>   NamedList query(String query, SolrClient s) throws SolrServerException, 
>> IOException {
>> -    NamedList res = new SimpleOrderedMap();
>>     ModifiableSolrParams params = new ModifiableSolrParams();
>> 
>>     params.add("q", query);
>>     params.add("sort","id desc");
>> 
>>     QueryResponse qres = s.query(params);
>> -
>> -    res = qres.getResponse();
>> -
>> -    return res;
>> +    return qres.getResponse();
>>   }
>> 
>>   /** will sleep up to 30 seconds, looking for expectedDocCount */
>> @@ -304,7 +300,7 @@ public class TestReplicationHandler exte
>>       assertNotNull("slave has slave section", 
>>                     details.get("slave"));
>>       // SOLR-2677: assert not false negatives
>> -      Object timesFailed = 
>> ((NamedList)details.get("slave")).get(SnapPuller.TIMES_FAILED);
>> +      Object timesFailed = 
>> ((NamedList)details.get("slave")).get(IndexFetcher.TIMES_FAILED);
>>       assertEquals("slave has fetch error count",
>>                    null, timesFailed);
>> 
>> @@ -513,7 +509,7 @@ public class TestReplicationHandler exte
>>     slaveClient.close();
>>     slaveClient = createNewSolrClient(slaveJetty.getLocalPort());
>> 
>> -    //add a doc with new field and commit on master to trigger snappull 
>> from slave.
>> +    //add a doc with new field and commit on master to trigger index fetch 
>> from slave.
>>     index(masterClient, "id", "2000", "name", "name = " + 2000, "newname", 
>> "newname = " + 2000);
>>     masterClient.commit();
>> 
>> @@ -581,7 +577,7 @@ public class TestReplicationHandler exte
>>   }
>> 
>>   @Test
>> -  public void doTestSnapPullWithMasterUrl() throws Exception {
>> +  public void doTestIndexFetchWithMasterUrl() throws Exception {
>>     //change solrconfig on slave
>>     //this has no entry for pollinginterval
>>     slave.copyConfigFile(CONF_DIR + "solrconfig-slave1.xml", 
>> "solrconfig.xml");
>> @@ -608,7 +604,7 @@ public class TestReplicationHandler exte
>>     SolrDocumentList masterQueryResult = (SolrDocumentList) 
>> masterQueryRsp.get("response");
>>     assertEquals(nDocs, masterQueryResult.getNumFound());
>> 
>> -    // snappull
>> +    // index fetch
>>     String masterUrl = buildUrl(slaveJetty.getLocalPort()) + "/" + 
>> DEFAULT_TEST_CORENAME + "/replication?command=fetchindex&masterUrl=";
>>     masterUrl += buildUrl(masterJetty.getLocalPort()) + "/" + 
>> DEFAULT_TEST_CORENAME + "/replication";
>>     URL url = new URL(masterUrl);
>> @@ -623,7 +619,7 @@ public class TestReplicationHandler exte
>>     String cmp = BaseDistributedSearchTestCase.compare(masterQueryResult, 
>> slaveQueryResult, 0, null);
>>     assertEquals(null, cmp);
>> 
>> -    // snappull from the slave to the master
>> +    // index fetch from the slave to the master
>> 
>>     for (int i = nDocs; i < nDocs + 3; i++)
>>       index(slaveClient, "id", i, "name", "name = " + i);
>> @@ -765,7 +761,7 @@ public class TestReplicationHandler exte
>>             .get("response");
>>         assertEquals(totalDocs, masterQueryResult.getNumFound());
>> 
>> -        // snappull
>> +        // index fetch
>>         Date slaveCoreStart = watchCoreStartAt(slaveClient, 30*1000, null);
>>         pullFromMasterToSlave();
>>         if (confCoreReload) {
>> @@ -1219,7 +1215,7 @@ public class TestReplicationHandler exte
>>     // record collection1's start time on slave
>>     final Date slaveStartTime = watchCoreStartAt(slaveClient, 30*1000, null);
>> 
>> -    //add a doc with new field and commit on master to trigger snappull 
>> from slave.
>> +    //add a doc with new field and commit on master to trigger index fetch 
>> from slave.
>>     index(masterClient, "id", "2000", "name", "name = " + 2000, "newname", 
>> "n2000");
>>     masterClient.commit();
>>     rQuery(1, "newname:n2000", masterClient);  // sanity check
>> 
>> Modified: 
>> lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
>> URL: 
>> http://svn.apache.org/viewvc/lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java?rev=1664126&r1=1664125&r2=1664126&view=diff
>> ==============================================================================
>> --- 
>> lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
>>  (original)
>> +++ 
>> lucene/dev/trunk/solr/test-framework/src/java/org/apache/solr/core/MockDirectoryFactory.java
>>  Wed Mar  4 19:45:09 2015
>> @@ -69,7 +69,7 @@ public class MockDirectoryFactory extend
>>       // already been created.
>>       mockDirWrapper.setPreventDoubleWrite(false);
>> 
>> -      // snappuller & co don't seem ready for this:
>> +      // IndexFetcher & co don't seem ready for this:
>>       mockDirWrapper.setEnableVirusScanner(false);
>> 
>>       if (allowReadingFilesStillOpenForWrite) {
>> 
>> 
> 
> 
> 
> 
> -- 
> Not sent from my iPhone or my Blackberry or anyone else's
> 

Reply via email to