Esempio n. 1
0
 /**
  * Purge the log up to and excluding the provided key.
  *
  * @param purgeKey the key up to which purging must happen
  * @return the oldest non purged record, or {@code null} if no record was purged
  * @throws ChangelogException if a database problem occurs.
  */
 public Record<K, V> purgeUpTo(final K purgeKey) throws ChangelogException {
   exclusiveLock.lock();
   try {
     if (isClosed) {
       return null;
     }
     final SortedMap<K, LogFile<K, V>> logFilesToPurge = logFiles.headMap(purgeKey);
     if (logFilesToPurge.isEmpty()) {
       return null;
     }
     final List<String> undeletableFiles = new ArrayList<>();
     final Iterator<LogFile<K, V>> entriesToPurge = logFilesToPurge.values().iterator();
     while (entriesToPurge.hasNext()) {
       final LogFile<K, V> logFile = entriesToPurge.next();
       try {
         abortCursorsOpenOnLogFile(logFile);
         logFile.close();
         logFile.delete();
         entriesToPurge.remove();
       } catch (ChangelogException e) {
         // The deletion of log file on file system has failed
         undeletableFiles.add(logFile.getFile().getPath());
       }
     }
     if (!undeletableFiles.isEmpty()) {
       throw new ChangelogException(
           ERR_CHANGELOG_UNABLE_TO_DELETE_LOG_FILE_WHILE_PURGING.get(
               Utils.joinAsString(", ", undeletableFiles)));
     }
     return getOldestRecord();
   } finally {
     exclusiveLock.unlock();
   }
 }