@Override protected SortedReader<ByteBuffer> createReader(NavigableMap<byte[], byte[]> data) { SortedOplogConfiguration config = new SortedOplogConfiguration("test"); SortedBuffer<Integer> sb = new SortedBuffer<Integer>(config, 0); for (Entry<byte[], byte[]> entry : data.entrySet()) { sb.put(entry.getKey(), entry.getValue()); } return sb; } }
private void unsetCurrent() { rwlock.writeLock().lock(); try { SortedBuffer<Integer> tmp = current.getAndSet(null); if (tmp != null) { tmp.clear(); } } finally { rwlock.writeLock().unlock(); } }
@Override public long unflushedSize() { long size = 0; rwlock.readLock().lock(); try { for (SortedBuffer<Integer> sb : unflushed) { size += sb.dataSize(); } } finally { rwlock.readLock().unlock(); } return size; }
while (tail != null && tail.isDeferred() && !aborted.get()) { tail.complete(); tail = unflushed.peekLast(); buffer.defer(action);
private SortedBuffer<Integer> flipBuffer() { final SortedBuffer<Integer> sb; sb = getCurrent(); SortedBuffer<Integer> next = new SortedBuffer<Integer>( factory.getConfiguration(), bufferCount.incrementAndGet()); current.set(next); if (logger.fineEnabled()) { logger.fine(String.format("Switching from buffer %s to %s", sb, next)); } return sb; }
for (Entry<byte[], byte[]> entry : sb.entries()) { if (aborted.get()) { writer.closeAndDelete(); writer.close(buffer.getMetadata()); return so;
if (sb.count() == 0) { if (logger.fineEnabled()) { logger.fine("Skipping flush of empty buffer " + sb); sb.setMetadata(metadata); unflushed.addFirst(sb);
@Override public void put(byte[] key, byte[] value) { assert key != null; assert value != null; long start = factory.getConfiguration().getStatistics().getPut().begin(); getCurrent().put(key, value); factory.getConfiguration().getStatistics().getPut().end(value.length, start); }
@Override public SortedStatistics getStatistics() throws IOException { List<SortedStatistics> stats = new ArrayList<SortedStatistics>(); Collection<TrackedReference<SortedOplogReader>> soplogs; // snapshot, this is expensive rwlock.readLock().lock(); try { stats.add(getCurrent().getStatistics()); for (SortedBuffer<Integer> sb : unflushed) { stats.add(sb.getStatistics()); } soplogs = compactor.getActiveReaders(null, null); } finally { rwlock.readLock().unlock(); } for (TrackedReference<SortedOplogReader> tr : soplogs) { stats.add(tr.get().getStatistics()); } return new MergedStatistics(stats, soplogs); }
public SortedOplogSetImpl(final SortedOplogFactory factory, Executor exec, Compactor ctor) throws IOException { this.factory = factory; this.flusher = new AbortableTaskService(exec); this.compactor = ctor; rwlock = new ReentrantReadWriteLock(); bufferCount = new AtomicInteger(0); unflushed = new ArrayDeque<SortedBuffer<Integer>>(); current = new AtomicReference<SortedBuffer<Integer>>( new SortedBuffer<Integer>(factory.getConfiguration(), 0)); logger = ComponentLogWriter.getSoplogLogWriter(factory.getConfiguration().getName(), LogService.logger()); if (logger.fineEnabled()) { logger.fine("Creating soplog set"); } }
@Override public long bufferSize() { return getCurrent().dataSize(); }
@Override public void run() { try { compactor.add(soplog); compactor.compact(false, null); unflushed.removeFirstOccurrence(buffer); // TODO need to invoke this while NOT holding write lock handler.complete(); factory.getConfiguration().getStatistics().getFlush().end(buffer.dataSize(), start); } catch (Exception e) { handleError(e, aborted); return; } } };