Beispiel #1
0
        /// <inheritdoc/>
        public async Task <ILock> AcquireAsync(
            string resource,
            TimeSpan?timeUntilExpires,
            bool releaseOnDispose,
            CancellationToken cancellationToken)
        {
            var attemptStarted = DateTime.UtcNow;

            var mutex = await _couchbaseCollection.RequestMutexAsync(
                resource,
                timeUntilExpires ?? TimeSpan.FromMinutes(1),
                cancellationToken)
                        .ConfigureAwait(false);

            var dateTimeAquired = DateTime.UtcNow;
            var timeWaited      = dateTimeAquired - attemptStarted;

            _ = _mutexDictionary.TryAdd(resource, mutex);

            return(new CouchbaseLock(mutex, resource, dateTimeAquired, timeWaited));
        }
 /// <summary>
 /// Request a distributed Couchbase Mutex that expires after <paramref name="expiration"/>.
 /// </summary>
 /// <remarks>
 /// Uses the default holder from <see cref="LockHolder"/>.
 ///
 /// The <see cref="ICouchbaseMutex"/> should be disposed once the lock is no longer needed.
 /// </remarks>
 /// <param name="collection">Couchbase collection.</param>
 /// <param name="name">Name of the lock.</param>
 /// <param name="expiration">Time until mutex expires, if not renewed.</param>
 /// <param name="cancellationToken">Cancellation token.</param>
 /// <returns>The <see cref="ICouchbaseMutex"/>.</returns>
 /// <exception cref="CouchbaseLockUnavailableException">Thrown if the lock could not be acquired.</exception>
 /// <exception cref="CouchbaseException">Thrown on general Couchbase communication errors.</exception>
 /// <exception cref="ArgumentNullException">Thrown if bucket is null.</exception>
 /// <exception cref="ArgumentException">Thrown for invalid name.</exception>
 /// <exception cref="ArgumentOutOfRangeException">Thrown for non-positive expiration.</exception>
 public static Task <ICouchbaseMutex> RequestMutexAsync(this ICouchbaseCollection collection, string name, TimeSpan expiration,
                                                        CancellationToken cancellationToken = default)
 {
     return(collection.RequestMutexAsync(name, LockHolder.Default, expiration, cancellationToken));
 }