@Override public void close() throws IOException { out.close(); meta.close(); }
@Override public void close() throws TxnFailedException { flush(); try { out.close(); } catch (SegmentSealedException e) { throw new TxnFailedException(e); } }
@Override public void closeAndSeal() throws IOException { out.close(); meta.sealSegment(); meta.close(); }
@Synchronized private List<PendingEvent> updateSegments(StreamSegments newSteamSegments, Consumer<Segment> segmentSealedCallBack) { currentSegments = newSteamSegments; createMissingWriters(segmentSealedCallBack, newSteamSegments.getDelegationToken()); List<PendingEvent> toResend = new ArrayList<>(); Iterator<Entry<Segment, SegmentOutputStream>> iter = writers.entrySet().iterator(); while (iter.hasNext()) { Entry<Segment, SegmentOutputStream> entry = iter.next(); if (!currentSegments.getSegments().contains(entry.getKey())) { SegmentOutputStream writer = entry.getValue(); log.info("Closing writer {} on segment {} during segment refresh", writer, entry.getKey()); iter.remove(); try { writer.close(); } catch (SegmentSealedException e) { log.info("Caught segment sealed while refreshing on segment {}", entry.getKey()); } toResend.addAll(writer.getUnackedEventsOnSeal()); } } return toResend; }
@Override public void close() { synchronized (lock) { try { out.close(); } catch (SegmentSealedException e) { log.warn("Error closing segment writer {}", out); } conditional.close(); meta.close(); in.close(); } } }
@Override public void close() { if (closed.getAndSet(true)) { return; } pinger.close(); synchronized (writeFlushLock) { boolean success = false; while (!success) { success = true; for (SegmentOutputStream writer : selector.getWriters()) { try { writer.close(); } catch (SegmentSealedException e) { // Segment sealed exception observed during a close. Re-run close on all the available writers. success = false; log.warn("Close failed due to {}, it will be retried.", e.getMessage()); } } } } ExecutorServiceHelpers.shutdown(retransmitPool); }
@Test public void testFailOnClose() throws SegmentSealedException { String scope = "scope"; String streamName = "stream"; StreamImpl stream = new StreamImpl(scope, streamName); Segment segment = new Segment(scope, streamName, 0); EventWriterConfig config = EventWriterConfig.builder().build(); SegmentOutputStreamFactory streamFactory = Mockito.mock(SegmentOutputStreamFactory.class); Controller controller = Mockito.mock(Controller.class); Mockito.when(controller.getCurrentSegments(scope, streamName)).thenReturn(getSegmentsFuture(segment)); SegmentOutputStream outputStream = Mockito.mock(SegmentOutputStream.class); Mockito.when(streamFactory.createOutputStreamForSegment(eq(segment), any(), any(), any())).thenReturn(outputStream); EventStreamWriter<String> writer = new EventStreamWriterImpl<>(stream, controller, streamFactory, new JavaSerializer<>(), config, executorService()); Mockito.doThrow(new RuntimeException("Intentional exception")).when(outputStream).close(); writer.writeEvent("Foo"); writer.writeEvent("Bar"); try { writer.close(); fail(); } catch (RuntimeException e) { // expected. } try { writer.writeEvent("fail"); fail(); } catch (IllegalStateException e) { // expected } }