kopia lustrzana https://github.com/bugout-dev/moonstream
Go routine cleaning access id cache
rodzic
30f2457ed1
commit
dc0dfdfab0
|
@ -39,19 +39,18 @@ func CreateAccessCache() {
|
||||||
|
|
||||||
// Get access id from cache if exists
|
// Get access id from cache if exists
|
||||||
func (ac *AccessCache) FindAccessIdInCache(accessId string) string {
|
func (ac *AccessCache) FindAccessIdInCache(accessId string) string {
|
||||||
// tsNow = time.Now().Unix()
|
var detectedId string
|
||||||
var searchAccessId string
|
|
||||||
|
|
||||||
ac.mux.RLock()
|
ac.mux.RLock()
|
||||||
for id, _ := range ac.accessIds {
|
for id := range ac.accessIds {
|
||||||
if id == accessId {
|
if id == accessId {
|
||||||
searchAccessId = id
|
detectedId = id
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ac.mux.RUnlock()
|
ac.mux.RUnlock()
|
||||||
|
|
||||||
return searchAccessId
|
return detectedId
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update last call access timestamp and datasource for access id
|
// Update last call access timestamp and datasource for access id
|
||||||
|
@ -84,6 +83,38 @@ func (ac *AccessCache) AddAccessIdToCache(clientResourceData ClientResourceData,
|
||||||
ac.mux.Unlock()
|
ac.mux.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check each access id in cache if it exceeds lifetime
|
||||||
|
func (ac *AccessCache) Cleanup() (int64, int64) {
|
||||||
|
var removedAccessIds, totalAccessIds int64
|
||||||
|
tsNow := time.Now().Unix()
|
||||||
|
ac.mux.Lock()
|
||||||
|
for aId, aData := range ac.accessIds {
|
||||||
|
fmt.Println(tsNow, aData.LastAccessTs, configs.NB_CACHE_ACCESS_ID_LIFETIME)
|
||||||
|
if tsNow-aData.LastAccessTs > configs.NB_CACHE_ACCESS_ID_LIFETIME {
|
||||||
|
delete(ac.accessIds, aId)
|
||||||
|
removedAccessIds++
|
||||||
|
} else {
|
||||||
|
totalAccessIds++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ac.mux.Unlock()
|
||||||
|
return removedAccessIds, totalAccessIds
|
||||||
|
}
|
||||||
|
|
||||||
|
func initCacheCleaning(debug bool) {
|
||||||
|
t := time.NewTicker(configs.NB_CACHE_CLEANING_INTERVAL)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
removedAccessIds, totalAccessIds := accessIdCache.Cleanup()
|
||||||
|
if debug {
|
||||||
|
log.Printf("Removed %d elements from access id cache", removedAccessIds)
|
||||||
|
}
|
||||||
|
log.Printf("Elements in access id cache: %d", totalAccessIds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Extract access_id from header and query. Query takes precedence over header.
|
// Extract access_id from header and query. Query takes precedence over header.
|
||||||
func extractAccessID(r *http.Request) string {
|
func extractAccessID(r *http.Request) string {
|
||||||
var accessID string
|
var accessID string
|
||||||
|
@ -210,7 +241,6 @@ func accessMiddleware(next http.Handler) http.Handler {
|
||||||
if stateCLI.enableDebugFlag {
|
if stateCLI.enableDebugFlag {
|
||||||
log.Printf("Access id found in cache")
|
log.Printf("Access id found in cache")
|
||||||
}
|
}
|
||||||
// Access id found in cache
|
|
||||||
currentClientAccess = accessIdCache.accessIds[accessID]
|
currentClientAccess = accessIdCache.accessIds[accessID]
|
||||||
currentClientAccess.dataSource = dataSource
|
currentClientAccess.dataSource = dataSource
|
||||||
accessIdCache.UpdateAccessIdAtCache(accessID, dataSource)
|
accessIdCache.UpdateAccessIdAtCache(accessID, dataSource)
|
||||||
|
|
|
@ -222,6 +222,9 @@ func Server() {
|
||||||
go initHealthCheck(stateCLI.enableDebugFlag)
|
go initHealthCheck(stateCLI.enableDebugFlag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Start access id cache cleaning
|
||||||
|
go initCacheCleaning(stateCLI.enableDebugFlag)
|
||||||
|
|
||||||
log.Printf("Starting node load balancer HTTP server at %s:%s\n", stateCLI.listeningAddrFlag, stateCLI.listeningPortFlag)
|
log.Printf("Starting node load balancer HTTP server at %s:%s\n", stateCLI.listeningAddrFlag, stateCLI.listeningPortFlag)
|
||||||
err = server.ListenAndServe()
|
err = server.ListenAndServe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -23,6 +23,9 @@ var (
|
||||||
NB_HEALTH_CHECK_INTERVAL = time.Second * 5
|
NB_HEALTH_CHECK_INTERVAL = time.Second * 5
|
||||||
NB_HEALTH_CHECK_CALL_TIMEOUT = time.Second * 2
|
NB_HEALTH_CHECK_CALL_TIMEOUT = time.Second * 2
|
||||||
|
|
||||||
|
NB_CACHE_CLEANING_INTERVAL = time.Second * 10
|
||||||
|
NB_CACHE_ACCESS_ID_LIFETIME = int64(120)
|
||||||
|
|
||||||
// Client configuration
|
// Client configuration
|
||||||
NB_CLIENT_NODE_KEEP_ALIVE = int64(5) // How long to store node in hot list for client in seconds
|
NB_CLIENT_NODE_KEEP_ALIVE = int64(5) // How long to store node in hot list for client in seconds
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue