@Override public boolean exists(String streamSegmentName) { ensurePreconditions(); synchronized (this.lock) { return this.streamSegments.containsKey(streamSegmentName); } }
@Override public SegmentHandle openRead(String streamSegmentName) throws StreamSegmentNotExistsException { ensurePreconditions(); return getStreamSegmentData(streamSegmentName).openRead(); }
@Override public SegmentHandle openWrite(String streamSegmentName) throws StreamSegmentNotExistsException { ensurePreconditions(); return getStreamSegmentData(streamSegmentName).openWrite(); }
@Override public SegmentHandle create(String streamSegmentName) throws StreamSegmentException { ensurePreconditions(); synchronized (this.lock) { if (this.streamSegments.containsKey(streamSegmentName)) { throw new StreamSegmentExistsException(streamSegmentName); } StreamSegmentData data = new StreamSegmentData(streamSegmentName, this.syncContext); this.streamSegments.put(streamSegmentName, data); return data.openWrite(); } }
@Override public SegmentProperties getStreamSegmentInfo(String streamSegmentName) throws StreamSegmentNotExistsException { ensurePreconditions(); return getStreamSegmentData(streamSegmentName).getInfo(); }
/** * Appends the given data to the end of the StreamSegment. * Note: since this is a custom operation exposed only on InMemoryStorage, there is no need to make it return a Future. * * @param handle A read-write handle for the segment to append to. * @param data An InputStream representing the data to append. * @param length The length of the data to append. */ @SneakyThrows(StreamSegmentException.class) public void append(SegmentHandle handle, InputStream data, int length) { ensurePreconditions(); Preconditions.checkArgument(!handle.isReadOnly(), "Cannot append using a read-only handle."); getStreamSegmentData(handle.getSegmentName()).append(data, length); }
@Override public void write(SegmentHandle handle, long offset, InputStream data, int length) throws BadOffsetException, StreamSegmentNotExistsException, StreamSegmentSealedException { ensurePreconditions(); Preconditions.checkArgument(!handle.isReadOnly(), "Cannot write using a read-only handle."); getStreamSegmentData(handle.getSegmentName()).write(offset, data, length); }
@Override public void seal(SegmentHandle handle) throws StreamSegmentNotExistsException { ensurePreconditions(); Preconditions.checkArgument(!handle.isReadOnly(), "Cannot seal using a read-only handle."); getStreamSegmentData(handle.getSegmentName()).markSealed(); }
@Override public void unseal(SegmentHandle handle) throws StreamSegmentException { ensurePreconditions(); getStreamSegmentData(handle.getSegmentName()).markUnsealed(); }
@Override public int read(SegmentHandle handle, long offset, byte[] buffer, int bufferOffset, int length) throws StreamSegmentNotExistsException { ensurePreconditions(); return getStreamSegmentData(handle.getSegmentName()).read(offset, buffer, bufferOffset, length); }
@Override public void delete(SegmentHandle handle) throws StreamSegmentNotExistsException { ensurePreconditions(); // If we are given a read-only handle, we must ensure the segment is sealed. If the segment can accept modifications // (it is not sealed), then we require a read-write handle. boolean canDelete = !handle.isReadOnly(); if (!canDelete) { synchronized (this.lock) { if (this.streamSegments.containsKey(handle.getSegmentName())) { canDelete = this.streamSegments.get(handle.getSegmentName()).isSealed(); } } } Preconditions.checkArgument(canDelete, "Cannot delete using a read-only handle, unless the segment is sealed."); deleteInternal(handle); }
@Override public void concat(SegmentHandle targetHandle, long offset, String sourceSegment) throws StreamSegmentException { ensurePreconditions(); Preconditions.checkArgument(!targetHandle.isReadOnly(), "Cannot concat using a read-only handle."); AtomicLong newLength = new AtomicLong(); StreamSegmentData sourceData = getStreamSegmentData(sourceSegment); StreamSegmentData targetData = getStreamSegmentData(targetHandle.getSegmentName()); targetData.concat(sourceData, offset); deleteInternal(new InMemorySegmentHandle(sourceSegment, false)); newLength.set(targetData.getInfo().getLength()); }