public ReferenceCountingSegment getIncrementedSegment() { ReferenceCountingSegment segment = adapter.get(); while (true) { if (segment.increment()) { return segment; } // segment.increment() returned false, means it is closed. Since close() in swapSegment() happens after segment // swap, the new segment should already be visible. ReferenceCountingSegment newSegment = adapter.get(); if (segment == newSegment) { throw new ISE("segment.close() is called somewhere outside FireHydrant.swapSegment()"); } if (newSegment == null) { throw new ISE("FireHydrant was 'closed' by swapping segment to null while acquiring a segment"); } segment = newSegment; // Spin loop. } }
@Override public Sequence<T> run(final QueryPlus<T> queryPlus, Map<String, Object> responseContext) { if (adapter.increment()) { try { final Sequence<T> baseSequence = factory.createRunner(adapter).run(queryPlus, responseContext); return Sequences.withBaggage(baseSequence, adapter.decrementOnceCloseable()); } catch (Throwable t) { try { adapter.decrement(); } catch (Exception e) { t.addSuppressed(e); } throw t; } } else { // Segment was closed before we had a chance to increment the reference count return new ReportTimelineMissingSegmentQueryRunner<T>(descriptor).run(queryPlus, responseContext); } } }
public ReferenceCountingSegment getIncrementedSegment() { ReferenceCountingSegment segment = adapter.get(); while (true) { if (segment.increment()) { return segment; } // segment.increment() returned false, means it is closed. Since close() in swapSegment() happens after segment // swap, the new segment should already be visible. ReferenceCountingSegment newSegment = adapter.get(); if (segment == newSegment) { throw new ISE("segment.close() is called somewhere outside FireHydrant.swapSegment()"); } if (newSegment == null) { throw new ISE("FireHydrant was 'closed' by swapping segment to null while acquiring a segment"); } segment = newSegment; // Spin loop. } }
@Override public Sequence<T> run(final QueryPlus<T> queryPlus, Map<String, Object> responseContext) { if (adapter.increment()) { try { final Sequence<T> baseSequence = factory.createRunner(adapter).run(queryPlus, responseContext); return Sequences.withBaggage(baseSequence, adapter.decrementOnceCloseable()); } catch (Throwable t) { try { adapter.decrement(); } catch (Exception e) { t.addSuppressed(e); } throw t; } } else { // Segment was closed before we had a chance to increment the reference count return new ReportTimelineMissingSegmentQueryRunner<T>(descriptor).run(queryPlus, responseContext); } } }