Search in sources :

Example 6 with StreamUnavailableException

use of com.twitter.distributedlog.exceptions.StreamUnavailableException in project distributedlog by twitter.

the class StreamImpl method acquireStream.

Future<Boolean> acquireStream() {
    // Reset this flag so the acquire thread knows whether re-acquire is needed.
    writeSinceLastAcquire = false;
    final Stopwatch stopwatch = Stopwatch.createStarted();
    final Promise<Boolean> acquirePromise = new Promise<Boolean>();
    manager.openAsyncLogWriter().addEventListener(FutureUtils.OrderedFutureEventListener.of(new FutureEventListener<AsyncLogWriter>() {

        @Override
        public void onSuccess(AsyncLogWriter w) {
            synchronized (txnLock) {
                sequencer.setLastId(w.getLastTxId());
            }
            AsyncLogWriter oldWriter;
            Queue<StreamOp> oldPendingOps;
            boolean success;
            synchronized (StreamImpl.this) {
                oldWriter = setStreamStatus(StreamStatus.INITIALIZED, StreamStatus.INITIALIZING, w, null, null);
                oldPendingOps = pendingOps;
                pendingOps = new ArrayDeque<StreamOp>();
                success = true;
            }
            // check if the stream is allowed to be acquired
            if (!streamManager.allowAcquire(StreamImpl.this)) {
                if (null != oldWriter) {
                    Abortables.asyncAbort(oldWriter, true);
                }
                int maxAcquiredPartitions = dynConf.getMaxAcquiredPartitionsPerProxy();
                StreamUnavailableException sue = new StreamUnavailableException("Stream " + partition.getStream() + " is not allowed to acquire more than " + maxAcquiredPartitions + " partitions");
                countException(sue, exceptionStatLogger);
                logger.error("Failed to acquire stream {} because it is unavailable : {}", name, sue.getMessage());
                synchronized (this) {
                    oldWriter = setStreamStatus(StreamStatus.ERROR, StreamStatus.INITIALIZED, null, null, sue);
                    // we don't switch the pending ops since they are already switched
                    // when setting the status to initialized
                    success = false;
                }
            }
            processPendingRequestsAfterOpen(success, oldWriter, oldPendingOps);
        }

        @Override
        public void onFailure(Throwable cause) {
            AsyncLogWriter oldWriter;
            Queue<StreamOp> oldPendingOps;
            boolean success;
            if (cause instanceof AlreadyClosedException) {
                countException(cause, streamExceptionStatLogger);
                handleAlreadyClosedException((AlreadyClosedException) cause);
                return;
            } else if (cause instanceof OwnershipAcquireFailedException) {
                OwnershipAcquireFailedException oafe = (OwnershipAcquireFailedException) cause;
                logger.warn("Failed to acquire stream ownership for {}, current owner is {} : {}", new Object[] { name, oafe.getCurrentOwner(), oafe.getMessage() });
                synchronized (StreamImpl.this) {
                    oldWriter = setStreamStatus(StreamStatus.BACKOFF, StreamStatus.INITIALIZING, null, oafe.getCurrentOwner(), oafe);
                    oldPendingOps = pendingOps;
                    pendingOps = new ArrayDeque<StreamOp>();
                    success = false;
                }
            } else if (cause instanceof InvalidStreamNameException) {
                InvalidStreamNameException isne = (InvalidStreamNameException) cause;
                countException(isne, streamExceptionStatLogger);
                logger.error("Failed to acquire stream {} due to its name is invalid", name);
                synchronized (StreamImpl.this) {
                    oldWriter = setStreamStatus(StreamStatus.ERROR, StreamStatus.INITIALIZING, null, null, isne);
                    oldPendingOps = pendingOps;
                    pendingOps = new ArrayDeque<StreamOp>();
                    success = false;
                }
            } else {
                countException(cause, streamExceptionStatLogger);
                logger.error("Failed to initialize stream {} : ", name, cause);
                synchronized (StreamImpl.this) {
                    oldWriter = setStreamStatus(StreamStatus.FAILED, StreamStatus.INITIALIZING, null, null, cause);
                    oldPendingOps = pendingOps;
                    pendingOps = new ArrayDeque<StreamOp>();
                    success = false;
                }
            }
            processPendingRequestsAfterOpen(success, oldWriter, oldPendingOps);
        }

        void processPendingRequestsAfterOpen(boolean success, AsyncLogWriter oldWriter, Queue<StreamOp> oldPendingOps) {
            if (success) {
                streamAcquireStat.registerSuccessfulEvent(stopwatch.elapsed(TimeUnit.MICROSECONDS));
            } else {
                streamAcquireStat.registerFailedEvent(stopwatch.elapsed(TimeUnit.MICROSECONDS));
            }
            for (StreamOp op : oldPendingOps) {
                executeOp(op, success);
                pendingOpsCounter.dec();
            }
            Abortables.asyncAbort(oldWriter, true);
            FutureUtils.setValue(acquirePromise, success);
        }
    }, scheduler, getStreamName()));
    return acquirePromise;
}
Also used : StreamUnavailableException(com.twitter.distributedlog.exceptions.StreamUnavailableException) OwnershipAcquireFailedException(com.twitter.distributedlog.exceptions.OwnershipAcquireFailedException) InvalidStreamNameException(com.twitter.distributedlog.exceptions.InvalidStreamNameException) Stopwatch(com.google.common.base.Stopwatch) AsyncLogWriter(com.twitter.distributedlog.AsyncLogWriter) AlreadyClosedException(com.twitter.distributedlog.exceptions.AlreadyClosedException) ArrayDeque(java.util.ArrayDeque) Promise(com.twitter.util.Promise) FutureEventListener(com.twitter.util.FutureEventListener) Queue(java.util.Queue)

Example 7 with StreamUnavailableException

use of com.twitter.distributedlog.exceptions.StreamUnavailableException in project distributedlog by twitter.

the class StreamImpl method delete.

@Override
public void delete() throws IOException {
    if (null != writer) {
        Utils.close(writer);
        synchronized (this) {
            writer = null;
            lastException = new StreamUnavailableException("Stream was deleted");
        }
    }
    if (null == manager) {
        throw new UnexpectedException("No stream " + name + " to delete");
    }
    manager.delete();
}
Also used : StreamUnavailableException(com.twitter.distributedlog.exceptions.StreamUnavailableException) UnexpectedException(com.twitter.distributedlog.exceptions.UnexpectedException)

Aggregations

StreamUnavailableException (com.twitter.distributedlog.exceptions.StreamUnavailableException)7 Stream (com.twitter.distributedlog.service.stream.Stream)2 Stopwatch (com.google.common.base.Stopwatch)1 AsyncLogWriter (com.twitter.distributedlog.AsyncLogWriter)1 DistributedLogConfiguration (com.twitter.distributedlog.DistributedLogConfiguration)1 DynamicDistributedLogConfiguration (com.twitter.distributedlog.config.DynamicDistributedLogConfiguration)1 AlreadyClosedException (com.twitter.distributedlog.exceptions.AlreadyClosedException)1 InvalidStreamNameException (com.twitter.distributedlog.exceptions.InvalidStreamNameException)1 OverCapacityException (com.twitter.distributedlog.exceptions.OverCapacityException)1 OwnershipAcquireFailedException (com.twitter.distributedlog.exceptions.OwnershipAcquireFailedException)1 RegionUnavailableException (com.twitter.distributedlog.exceptions.RegionUnavailableException)1 ServiceUnavailableException (com.twitter.distributedlog.exceptions.ServiceUnavailableException)1 StreamNotReadyException (com.twitter.distributedlog.exceptions.StreamNotReadyException)1 TooManyStreamsException (com.twitter.distributedlog.exceptions.TooManyStreamsException)1 UnexpectedException (com.twitter.distributedlog.exceptions.UnexpectedException)1 ServerConfiguration (com.twitter.distributedlog.service.config.ServerConfiguration)1 WriteOp (com.twitter.distributedlog.service.stream.WriteOp)1 WriteOpWithPayload (com.twitter.distributedlog.service.stream.WriteOpWithPayload)1 Partition (com.twitter.distributedlog.service.streamset.Partition)1 ResponseHeader (com.twitter.distributedlog.thrift.service.ResponseHeader)1