/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.handler; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.io.IOUtils; import org.apache.lucene.index.IndexCommit; import org.apache.lucene.store.Lock; import org.apache.lucene.store.SimpleFSLockFactory; import org.apache.solr.common.util.NamedList; import org.apache.solr.core.IndexDeletionPolicyWrapper; import org.apache.solr.core.SolrCore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * <p/> Provides functionality equivalent to the snapshooter script </p> * * @version $Id: SnapShooter.java 1203003 2011-11-17 01:50:33Z hossman $ * @since solr 1.4 */ public class SnapShooter { } // //public class SnapShooter { // private static final Logger LOG = LoggerFactory.getLogger(SnapShooter.class.getName()); // private String snapDir = null; // private SolrCore solrCore; // private SimpleFSLockFactory lockFactory; // // public SnapShooter(SolrCore core, String location) throws IOException { // solrCore = core; // if (location == null) snapDir = core.getDataDir(); // else { // File base = new File(core.getCoreDescriptor().getInstanceDir()); // snapDir = org.apache.solr.common.util.FileUtils.resolvePath(base, location).getAbsolutePath(); // File dir = new File(snapDir); // if (!dir.exists()) dir.mkdirs(); // } // lockFactory = new SimpleFSLockFactory(snapDir); // } // // void createSnapAsync(final IndexCommit indexCommit, final ReplicationHandler replicationHandler) { // createSnapAsync(indexCommit, Integer.MAX_VALUE, replicationHandler); // } // // void createSnapAsync(final IndexCommit indexCommit, final int numberToKeep, final ReplicationHandler replicationHandler) { // replicationHandler.core.getDeletionPolicy().saveCommitPoint(indexCommit.getVersion()); // // new Thread() { // @Override // public void run() { // createSnapshot(indexCommit, numberToKeep, replicationHandler); // } // }.start(); // } // // void createSnapshot(final IndexCommit indexCommit, int numberToKeep, ReplicationHandler replicationHandler) { // NamedList details = new NamedList(); // details.add("startTime", new Date().toString()); // File snapShotDir = null; // String directoryName = null; // Lock lock = null; // try { // if(numberToKeep<Integer.MAX_VALUE) { // deleteOldBackups(numberToKeep); // } // SimpleDateFormat fmt = new SimpleDateFormat(DATE_FMT, Locale.US); // directoryName = "snapshot." + fmt.format(new Date()); // lock = lockFactory.makeLock(directoryName + ".lock"); // if (lock.isLocked()) return; // snapShotDir = new File(snapDir, directoryName); // if (!snapShotDir.mkdir()) { // LOG.warn("Unable to create snapshot directory: " + snapShotDir.getAbsolutePath()); // return; // } // Collection<String> files = indexCommit.getFileNames(); // FileCopier fileCopier = new FileCopier(solrCore.getDeletionPolicy(), indexCommit); // fileCopier.copyFiles(files, snapShotDir); // // details.add("fileCount", files.size()); // details.add("status", "success"); // details.add("snapshotCompletedAt", new Date().toString()); // } catch (Exception e) { // SnapPuller.delTree(snapShotDir); // LOG.error("Exception while creating snapshot", e); // details.add("snapShootException", e.getMessage()); // } finally { // replicationHandler.core.getDeletionPolicy().releaseCommitPoint(indexCommit.getVersion()); // replicationHandler.snapShootDetails = details; // if (lock != null) { // try { // lock.release(); // } catch (IOException e) { // LOG.error("Unable to release snapshoot lock: " + directoryName + ".lock"); // } // } // } // } // private void deleteOldBackups(int numberToKeep) { // File[] files = new File(snapDir).listFiles(); // List<OldBackupDirectory> dirs = new ArrayList<OldBackupDirectory>(); // for(File f : files) { // OldBackupDirectory obd = new OldBackupDirectory(f); // if(obd.dir != null) { // dirs.add(obd); // } // } // Collections.sort(dirs); // int i=1; // for(OldBackupDirectory dir : dirs) { // if( i > numberToKeep-1 ) { // SnapPuller.delTree(dir.dir); // } // } // } // private class OldBackupDirectory implements Comparable<OldBackupDirectory>{ // File dir; // Date timestamp; // final Pattern dirNamePattern = Pattern.compile("^snapshot[.](.*)$"); // // OldBackupDirectory(File dir) { // if(dir.isDirectory()) { // Matcher m = dirNamePattern.matcher(dir.getName()); // if(m.find()) { // try { // this.dir = dir; // this.timestamp = new SimpleDateFormat(DATE_FMT).parse(m.group(1)); // } catch(Exception e) { // this.dir = null; // this.timestamp = null; // } // } // } // } // public int compareTo(OldBackupDirectory that) { // return that.timestamp.compareTo(this.timestamp); // } // } // // public static final String SNAP_DIR = "snapDir"; // public static final String DATE_FMT = "yyyyMMddHHmmss"; // // // private class FileCopier { // private static final int DEFAULT_BUFFER_SIZE = 32768; // private byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; // private IndexCommit indexCommit; // private IndexDeletionPolicyWrapper delPolicy; // // public FileCopier(IndexDeletionPolicyWrapper delPolicy, IndexCommit commit) { // this.delPolicy = delPolicy; // this.indexCommit = commit; // } // // public void copyFiles(Collection<String> files, File destDir) throws IOException { // for (String indexFile : files) { // File source = new File(solrCore.getIndexDir(), indexFile); // copyFile(source, new File(destDir, source.getName()), true); // } // } // // public void copyFile(File source, File destination, boolean preserveFileDate) // throws IOException { // // check source exists // if (!source.exists()) { // String message = "File " + source + " does not exist"; // throw new FileNotFoundException(message); // } // // // does destinations directory exist ? // if (destination.getParentFile() != null // && !destination.getParentFile().exists()) { // destination.getParentFile().mkdirs(); // } // // // make sure we can write to destination // if (destination.exists() && !destination.canWrite()) { // String message = "Unable to open file " + destination + " for writing."; // throw new IOException(message); // } // // FileInputStream input = null; // FileOutputStream output = null; // try { // input = new FileInputStream(source); // output = new FileOutputStream(destination); // // int count = 0; // int n = 0; // int rcnt = 0; // while (-1 != (n = input.read(buffer))) { // output.write(buffer, 0, n); // count += n; // rcnt++; // /*** // // reserve every 4.6875 MB // if (rcnt == 150) { // rcnt = 0; // delPolicy.setReserveDuration(indexCommit.getVersion(), reserveTime); // } // ***/ // } // } finally { // try { // IOUtils.closeQuietly(input); // } finally { // IOUtils.closeQuietly(output); // } // } // // if (source.length() != destination.length()) { // String message = "Failed to copy full contents from " + source + " to " // + destination; // throw new IOException(message); // } // // if (preserveFileDate) { // // file copy should preserve file date // destination.setLastModified(source.lastModified()); // } // } // } // // //}