// Get returns the cached resolver, first updating the cached // value if it's stale. If reloading fails, the previous value // is used. func (dns *DNSResolver) Get() net.IP { // Every UDP DNS port forward frequently calls Get(), so this code // is intended to minimize blocking. Most callers will hit just the // atomic.LoadInt64 reload time check and the RLock (an atomic.AddInt32 // when no write lock is pending). An atomic.CompareAndSwapInt32 is // used to ensure only one goroutine enters Reload() and blocks on // its write lock. Finally, since since ReloadableFile.Reload // checks whether the underlying file has changed _before_ aquiring a // write lock, we only incur write lock blocking when "/etc/resolv.conf" // has actually changed. lastReloadTime := monotime.Time(atomic.LoadInt64(&dns.lastReloadTime)) stale := monotime.Now().After(lastReloadTime.Add(DNS_SYSTEM_CONFIG_RELOAD_PERIOD)) if stale { isReloader := atomic.CompareAndSwapInt32(&dns.isReloading, 0, 1) if isReloader { // Unconditionally set last reload time. Even on failure only // want to retry after another DNS_SYSTEM_CONFIG_RELOAD_PERIOD. atomic.StoreInt64(&dns.lastReloadTime, time.Now().Unix()) _, err := dns.Reload() if err != nil { log.WithContextFields( LogFields{"err": err}).Info( "failed to reload system DNS resolver") } atomic.StoreInt32(&dns.isReloading, 0) } } dns.ReloadableFile.RLock() defer dns.ReloadableFile.RUnlock() return dns.resolver }
func (session *meekSession) expired() bool { lastActivity := monotime.Time(atomic.LoadInt64(&session.lastActivity)) return monotime.Since(lastActivity) > MEEK_MAX_SESSION_STALENESS }
// GetLastActivityTime returns the arbitrary monotonic time of the last Read. func (conn *ActivityMonitoredConn) GetLastActivityMonotime() monotime.Time { return monotime.Time(atomic.LoadInt64(&conn.lastReadActivityTime)) }