public void start() { int currentLocal = 0; this.directoryProviderLock = this.context.getDirectoryProviderLock(this); this.context = null; try { // copy to source if (new File(sourceDir, CURRENT1).exists()) { currentLocal = 2; } else if (new File(sourceDir, CURRENT2).exists()) { currentLocal = 1; } else { log.debugf("Source directory for '%s' will be initialized", indexName); currentLocal = 1; } String currentString = Integer.valueOf(currentLocal).toString(); File subDir = new File(sourceDir, currentString); FileHelper.synchronize(indexDir, subDir, true, copyChunkSize); new File(sourceDir, CURRENT1).delete(); new File(sourceDir, CURRENT2).delete(); // TODO small hole, no file can be found here new File(sourceDir, CURRENT_DIR_NAME[currentLocal]).createNewFile(); log.debugf("Current directory: %d", currentLocal); } catch (IOException e) { throw new SearchException("Unable to initialize index: " + directoryProviderName, e); } task = new FSMasterDirectoryProvider.TriggerTask(indexDir, sourceDir); long period = DirectoryProviderHelper.getRefreshPeriod(properties, directoryProviderName); timer.scheduleAtFixedRate(task, period, period); this.current = currentLocal; // write to volatile to publish all state }