/// <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)); }