package org.krakenapps.logstorage.engine; import java.io.File; import java.util.HashSet; import java.util.Set; import java.util.regex.Pattern; import org.apache.felix.ipojo.annotations.Component; import org.apache.felix.ipojo.annotations.Provides; import org.apache.felix.ipojo.annotations.Requires; import org.krakenapps.logstorage.LogRestoreService; import org.krakenapps.logstorage.LogTableRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Component(name = "logstorage-restore-service") @Provides public class LogRestoreServiceImpl implements LogRestoreService { private Logger logger = LoggerFactory.getLogger(LogRestoreServiceImpl.class); private File logDir = new File(System.getProperty("kraken.data.dir"), "kraken-logstorage/log"); @Requires private LogTableRegistry tableRegistry; @Override public void restoreByDelete() { for (String tableName : tableRegistry.getTableNames()) restoreByDelete(tableName); } @Override public void restoreByDelete(String tableName) { if (!logDir.exists() || !logDir.isDirectory()) throw new IllegalStateException("does not exist log directory, path[" + logDir.getAbsolutePath() + "]"); File tableDir = new File(logDir, Integer.toString(tableRegistry.getTableId(tableName))); if (!tableDir.exists()) return; String pattern = "\\d{4}[-]\\d{2}[-]\\d{2}\\.(dat|idx)"; Set<String> removeFileNames = new HashSet<String>(); for (File f : tableDir.listFiles()) { // check log file name format if (!Pattern.matches(pattern, f.getName())) continue; // check log file size if (f.length() > 40) continue; removeFileNames.add(f.getName().substring(0, 10)); } if (removeFileNames.size() == 0) { logger.trace("kraken logstorage: cannot find invalid log file, table name[{}]", tableName); return; } for (String fileName : removeFileNames) { File removeIdxFile = new File(tableDir, fileName + ".idx"); if (removeIdxFile.exists()) { logger.info("kraken logstorage: remove invalid log index file [{}]", removeIdxFile.getName()); removeIdxFile.delete(); } File removeDatFile = new File(tableDir, fileName + ".dat"); if (removeDatFile.exists()) { logger.info("kraken logstorage: remove invalid log data file [{}]", removeDatFile.getName()); removeDatFile.delete(); } } } @Override public void restoreByFixHeader() { throw new UnsupportedOperationException(); } @Override public void restoreByFixHeader(String tableName) { throw new UnsupportedOperationException(); } }