@Override public SortedIterator<ByteBuffer> scan( byte[] from, boolean fromInclusive, byte[] to, boolean toInclusive, boolean ascending, MetadataFilter filter) throws IOException { SerializedComparator sc = factory.getConfiguration().getComparator(); sc = ascending ? sc : ReversingSerializedComparator.reverse(sc); List<SortedIterator<ByteBuffer>> scans = new ArrayList<SortedIterator<ByteBuffer>>(); Collection<TrackedReference<SortedOplogReader>> soplogs; rwlock.readLock().lock(); try { scans.add(getCurrent().scan(from, fromInclusive, to, toInclusive, ascending, filter)); for (SortedBuffer<Integer> sb : unflushed) { scans.add(sb.scan(from, fromInclusive, to, toInclusive, ascending, filter)); } soplogs = compactor.getActiveReaders(from, to); } finally { rwlock.readLock().unlock(); } for (TrackedReference<SortedOplogReader> tr : soplogs) { scans.add(tr.get().scan(from, fromInclusive, to, toInclusive, ascending, filter)); } return new MergedIterator(sc, soplogs, scans); }
@Override public synchronized void clear() throws IOException { for (TrackedReference<SortedOplogReader> tr : readers) { tr.get().close(); readers.remove(tr); } }
protected void markAsInactive(Iterable<TrackedReference<SortedOplogReader>> snapshot, T attach) throws IOException { for (Iterator<TrackedReference<SortedOplogReader>> iter = snapshot.iterator(); iter.hasNext(); ) { TrackedReference<SortedOplogReader> tr = iter.next(); if (logger.fineEnabled()) { logger.fine(String.format("Marking %s as inactive", tr)); } inactive.add(tr); tracker.fileRemoved(tr.get().getFile(), attach); factory.getConfiguration().getStatistics().incActiveFiles(-1); factory.getConfiguration().getStatistics().incInactiveFiles(1); } }
List<SortedIterator<ByteBuffer>> iters = new ArrayList<SortedIterator<ByteBuffer>>(); for (TrackedReference<SortedOplogReader> tr : readers) { iters.add(tr.get().scan()); sc = tr.get().getComparator();
SortedReader<ByteBuffer> rdr = rev.createReader().withAscending(false); SortedIterator<ByteBuffer> iter = rdr.scan( SortedReaderTestCase.wrapInt(20000), true,
SortedReader<ByteBuffer> rdr = rev.createReader().withAscending(false); SortedIterator<ByteBuffer> iter = rdr.scan(); try {
protected EnumMap<Metadata, byte[]> mergeMetadata( Collection<TrackedReference<SortedOplogReader>> readers) throws IOException { // merge the metadata into the compacted file EnumMap<Metadata, byte[]> metadata = new EnumMap<Metadata, byte[]>(Metadata.class); for (Metadata meta : Metadata.values()) { byte[] val = null; for (TrackedReference<SortedOplogReader> tr : readers) { byte[] tmp = tr.get().getMetadata(meta); if (val == null) { val = tmp; } else if (tmp != null) { val = factory.getConfiguration().getMetadataCompactor(meta).compact(val, tmp); } } if (val != null) { metadata.put(meta, val); } } return metadata; }
@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); }
@Override protected synchronized void clear() throws IOException { for (TrackedReference<SortedOplogReader> tr : soplogs) { tr.get().close(); } markAsInactive(soplogs, level); soplogs.clear(); }
@Override protected void add(SortedOplog soplog) throws IOException { SortedOplogReader rdr = soplog.createReader(); synchronized (this) { soplogs.addFirst(new TrackedReference<SortedOplogReader>(rdr)); } if (logger.fineEnabled()) { logger.fine(String.format("Added file %s to level %d", rdr, level)); } tracker.fileAdded(rdr.getFile(), level); factory.getConfiguration().getStatistics().incActiveFiles(1); }
@Override protected synchronized void close() throws IOException { for (TrackedReference<SortedOplogReader> tr : soplogs) { tr.get().close(); factory.getConfiguration().getStatistics().incActiveFiles(-1); } soplogs.clear(); }
private void validate(SortedOplogReader soplog, int start, int count) throws IOException { int i = 0; for (SortedIterator<ByteBuffer> iter = soplog.scan(); iter.hasNext(); i++) { iter.next(); assertEquals(i, iter.key().getInt()); assertEquals(i, iter.value().getInt()); } assertEquals(count, i); } }
private void deleteInactive(TrackedReference<SortedOplogReader> tr) throws IOException { tr.get().close(); if (tr.get().getFile().delete()) { if (logger.fineEnabled()) { logger.fine("Deleted inactive soplog " + tr.get().getFile()); } tracker.fileDeleted(tr.get().getFile()); factory.getConfiguration().getStatistics().incInactiveFiles(-1); } }
private boolean readerIsClosed() { for (TrackedReference<SortedOplogReader> tr : soplogs) { if (tr.get().isClosed()) { return true; } } return false; } }