예제 #1
0
        //
        private async Task SearchTaskBody(CancellationToken token)
        {
            using (var cts = CancellationTokenSource.CreateLinkedTokenSource(token, this.onDisposeCancelSource.Token))
            {
                //
                var cancellationToken = cts.Token;

                while (!cancellationToken.IsCancellationRequested)
                {
                    try
                    {
                        lock (this.sync)
                        {
                            // резервируем бд
                            if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease())
                            {
                                // lease найдена и действует
                                var leaseLostToken = this.dbServices.LockObject.GetLoseLeaseToken();
                                // ждём потери или завершения
                                WaitHandle.WaitAny(new WaitHandle[] { leaseLostToken.WaitHandle, cancellationToken.WaitHandle });
                                continue;
                            }
                            else
                            {
                                // lease НЕ найдена или НЕ действует
                                this.dbServices?.Dispose();
                                this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken);
                            }
                        }

                        cancellationToken.ThrowIfCancellationRequested();

                        // lease не зарезервировалась
                        await Task.Delay(this.settings.SearchDbTimeout, cancellationToken);
                    }
                    catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested)
                    {
                        // завершаем
                        return;
                    }
                    catch (Exception)
                    {
                        // ignore ??
                    }
                }
            }
        }
예제 #2
0
        public async Task <ReserveResult> RenewLeaseAsync(CancellationToken token)
        {
            if (this.isDisposed)
            {
                throw new ObjectDisposedException("dbServices");
            }

            lock (this.sync)
            {
                if (this.isDisposed)
                {
                    throw new ObjectDisposedException("dbServices");
                }

                using (var cts = CancellationTokenSource.CreateLinkedTokenSource(token, this.onDisposeCancelSource.Token))
                {
                    //
                    cts.CancelAfter(settings.LostDbTimeout);

                    var cancellationToken = cts.Token;

                    while (!cancellationToken.IsCancellationRequested)
                    {
                        try
                        {
                            // резервируем бд
                            if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease())
                            {
                                return(ReserveResult.FromValueResult(true, new[] { this.dbServices }));
                            }
                            else
                            {
                                // lease НЕ найдена или НЕ действует
                                this.dbServices?.Dispose();
                                this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken);
                            }

                            // резервируем бд
                            if (this.dbServices != null && this.dbServices.LockObject.CheckAndUpdateLease())
                            {
                                // lease найдена и действует
                            }
                            else
                            {
                                // lease НЕ найдена или НЕ действует

                                // lease потеряна, попробуем восстановить
                                if (this.dbServices?.LockObject.CheckAndUpdateOrAcquireLease(cancellationToken) == true)
                                {
                                }
                                else
                                {
                                    // lease не востановлена или была не найдена, попробуем зарезервировать
                                    this.dbServices?.Dispose();
                                    this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(dbClusterParameters, cancellationToken);
                                }
                            }

                            //// резервируем бд
                            //if (this.dbServices != null)
                            //{
                            //    if (this.dbServices.LockObject.CheckIfHasLease())
                            //    {
                            //        // lease ещё действует
                            //        return ReserveResult.SuccessResult(this.dbServices);
                            //    }
                            //    else
                            //    {
                            //        // lease потеряна, попробуем восстановить
                            //        if (!this.dbServices.LockObject.CheckAndUpdateOrAcquireLease(cancellationToken))
                            //        {
                            //            // lease потеряна, ищем новую
                            //            this.dbServices?.Dispose();
                            //            this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(this.dbClusterParameters, cancellationToken);
                            //        }
                            //        else
                            //        {
                            //            // lease действует
                            //        }
                            //    }
                            //}
                            //else
                            //{
                            //    // lease ещё не резервировалась
                            //    this.dbServices = this.dbClusterService.AcquireServicesForAnyUrlsOrDefault(this.dbClusterParameters, cancellationToken);
                            //}

                            // lease не зарезервировалась
                            if (this.dbServices == null)
                            {
                                var searchDelay = this.settings.SearchDbTimeout;

                                //
                                Task.Delay(searchDelay, cancellationToken).Wait(cancellationToken);

                                if (cancellationToken.IsCancellationRequested)
                                {
                                    return(ReserveResult.FailResult());
                                }

                                continue;
                            }
                            else
                            {
                                return(ReserveResult.FromValueResult(this.dbServices.LockObject.CheckAndUpdateLease(), new[] { this.dbServices }));
                            }
                        }
                        catch (OperationCanceledException)
                        {
                            return(ReserveResult.FailResult());
                        }
                        catch (Exception)
                        {
                            // ignore ??
                        }
                    }

                    return(ReserveResult.FailResult());
                }
            }
        }