@Override public void flush(EnumMap<Metadata, byte[]> metadata, FlushHandler handler) throws IOException { roll(true); }
public RecoverableSortedOplogSet(SortedOplogSet sos, long bufferSize, double memLimit) throws IOException { this.sos = sos; this.bufferSize = bufferSize; log = ComponentLogWriter.getSoplogLogWriter(sos.getFactory().getConfiguration().getName(), LogService.logger()); rollLock = new ReentrantLock(); writer = new AtomicReference<AppendLogWriter>(AppendLog.create(nextLogFile())); maxBufferMemory = Math.round(memLimit * ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getMax()); }
private void roll(boolean wait) throws IOException { boolean locked = true; if (wait) { rollLock.lock(); } else { locked = rollLock.tryLock(); } if (locked) { try { AppendLogWriter next = AppendLog.create(nextLogFile()); final AppendLogWriter old = writer.getAndSet(next); old.close(); if (log.fineEnabled()) { log.fine(String.format("Rolling from %s to %s", old.getFile(), next.getFile())); } sos.flush(null, new FlushHandler() { @Override public void complete() { old.getFile().delete(); } @Override public void error(Throwable t) { } }); } finally { rollLock.unlock(); } } }
@Override public void clear() throws IOException { rollLock.lock(); try { roll(true); sos.clear(); } finally { rollLock.unlock(); } }
@Override public void destroy() throws IOException { roll(true); sos.destroy(); }