protected virtual bool TryRefresh(Object key)
        {
            AutoScaleEntry entry = GetEntry(key);

            if (!NeedRefresh(entry))
            {
                return(false);
            }

            lock (key)
            {
                entry = GetEntry(key);
                if (!NeedRefresh(entry))
                {
                    return(false);
                }

                if (entry.Status == AutoScaleEntry.EntryStatus.Available)
                {
                    return(TryRefresh(entry));
                }

                entry.Status = AutoScaleEntry.EntryStatus.PendingRefresh;
                return(false);
            }
        }
        protected override ObjectPool <T> .Entry DoAcquire(Object key)
        {
            lock (key)
            {
                AutoScaleEntry entry = GetEntry(key);
                if (entry == null)
                {
                    return(null);
                }

                base.DoAcquire(entry);

                if (!NeedRefresh(entry))
                {
                    entry.Renew();
                    return(entry);
                }
                else
                {
                    entry.Status = AutoScaleEntry.EntryStatus.PendingRefresh;
                }
            }

            ReleaseKey(key);
            return(null);
        }
 protected virtual void ScaleIn(AutoScaleEntry entry)
 {
     lock (AddLock)
     {
         _entries.TryRemove(entry.Key, out IEntry <T> value);
         Close(entry);
         _logger.Info("scaled in an object: {0}", entry.Object);
     }
 }
 protected virtual bool IsStale(AutoScaleEntry entry)
 {
     try
     {
         return(Config.StaleChecker(entry.Object));
     }
     catch (Exception e)
     {
         _logger.Error(e, "staleChecker failed, ignore");
         return(false);
     }
 }
        protected virtual bool TryRefresh(AutoScaleEntry entry)
        {
            AutoScaleEntry newEntry = null;

            try
            {
                newEntry = NewPoolEntry(entry.Key);
            }
            catch (Exception e)
            {
                _logger.Error(e, "failed to refresh object: {0}, still use it", entry.Object);
                return(false);
            }

            Close(entry);
            _entries.TryAdd(entry.Key, newEntry);

            _logger.Info("refreshed an object, old: {0}, new: {1}", entry.Object, newEntry.Object);
            return(true);
        }
        protected virtual bool TryScaleIn(Object key)
        {
            AutoScaleEntry entry = GetEntry(key);

            if (!NeedScaleIn(entry))
            {
                return(false);
            }

            lock (key)
            {
                entry = GetEntry(key);
                if (!NeedScaleIn(entry))
                {
                    return(false);
                }

                ScaleIn(entry);
                return(true);
            }
        }
        protected virtual void DoReleaseKey(Object key)
        {
            lock (key)
            {
                AutoScaleEntry entry = GetEntry(key);
                if (entry.Status == AutoScaleEntry.EntryStatus.PendingRefresh)
                {
                    if (!TryRefresh(entry))
                    {
                        ScaleIn(entry);
                        return;
                    }
                }
                else
                {
                    entry.Renew();
                }

                base.ReleaseKey(key);
            }
        }
 protected virtual bool NeedScaleIn(AutoScaleEntry entry)
 {
     return(entry.Status == AutoScaleEntry.EntryStatus.Available &&
            entry.LastUsedTime <= CurrentTimeMillis - Config.MaxIdleTime &&
            Size > Config.MinSize);
 }
 protected virtual bool IsExpired(AutoScaleEntry entry)
 {
     return(entry.CreationTime <= CurrentTimeMillis - Config.ObjectTtl);
 }
 protected virtual bool NeedRefresh(AutoScaleEntry entry)
 {
     return(IsExpired(entry) || IsStale(entry));
 }