2019-02-10 04:37:37 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-02-10 04:37:37 +03:00
package setting
import (
"strings"
"time"
"code.gitea.io/gitea/modules/log"
)
// Cache represents cache settings
type Cache struct {
2020-02-01 22:11:32 +03:00
Enabled bool
2019-02-10 04:37:37 +03:00
Adapter string
Interval int
Conn string
2020-02-01 22:11:32 +03:00
TTL time . Duration ` ini:"ITEM_TTL" `
2019-02-10 04:37:37 +03:00
}
2022-01-20 20:46:10 +03:00
// CacheService the global cache
var CacheService = struct {
Cache ` ini:"cache" `
2020-02-01 22:11:32 +03:00
2022-01-20 20:46:10 +03:00
LastCommit struct {
Enabled bool
TTL time . Duration ` ini:"ITEM_TTL" `
CommitsCount int64
} ` ini:"cache.last_commit" `
} {
Cache : Cache {
Enabled : true ,
Adapter : "memory" ,
Interval : 60 ,
TTL : 16 * time . Hour ,
} ,
LastCommit : struct {
Enabled bool
TTL time . Duration ` ini:"ITEM_TTL" `
CommitsCount int64
2020-02-01 22:11:32 +03:00
} {
2022-01-20 20:46:10 +03:00
Enabled : true ,
TTL : 8760 * time . Hour ,
CommitsCount : 1000 ,
} ,
}
2019-02-10 04:37:37 +03:00
2021-02-10 01:29:03 +03:00
// MemcacheMaxTTL represents the maximum memcache TTL
const MemcacheMaxTTL = 30 * 24 * time . Hour
2023-02-19 19:12:01 +03:00
func loadCacheFrom ( rootCfg ConfigProvider ) {
sec := rootCfg . Section ( "cache" )
2020-02-01 22:11:32 +03:00
if err := sec . MapTo ( & CacheService ) ; err != nil {
log . Fatal ( "Failed to map Cache settings: %v" , err )
2019-02-10 04:37:37 +03:00
}
2020-02-01 22:11:32 +03:00
2021-07-11 00:54:15 +03:00
CacheService . Adapter = sec . Key ( "ADAPTER" ) . In ( "memory" , [ ] string { "memory" , "redis" , "memcache" , "twoqueue" } )
2019-02-10 04:37:37 +03:00
switch CacheService . Adapter {
case "memory" :
case "redis" , "memcache" :
CacheService . Conn = strings . Trim ( sec . Key ( "HOST" ) . String ( ) , "\" " )
2021-07-11 00:54:15 +03:00
case "twoqueue" :
CacheService . Conn = strings . TrimSpace ( sec . Key ( "HOST" ) . String ( ) )
if CacheService . Conn == "" {
CacheService . Conn = "50000"
}
2020-02-01 22:11:32 +03:00
case "" : // disable cache
CacheService . Enabled = false
2019-02-10 04:37:37 +03:00
default :
2019-04-02 10:48:31 +03:00
log . Fatal ( "Unknown cache adapter: %s" , CacheService . Adapter )
2019-02-10 04:37:37 +03:00
}
2020-02-01 22:11:32 +03:00
if CacheService . Enabled {
log . Info ( "Cache Service Enabled" )
2021-01-27 17:56:54 +03:00
} else {
log . Warn ( "Cache Service Disabled so that captcha disabled too" )
// captcha depends on cache service
Service . EnableCaptcha = false
2020-02-01 22:11:32 +03:00
}
2023-02-19 19:12:01 +03:00
sec = rootCfg . Section ( "cache.last_commit" )
2020-02-01 22:11:32 +03:00
if ! CacheService . Enabled {
CacheService . LastCommit . Enabled = false
}
CacheService . LastCommit . CommitsCount = sec . Key ( "COMMITS_COUNT" ) . MustInt64 ( 1000 )
if CacheService . LastCommit . Enabled {
log . Info ( "Last Commit Cache Service Enabled" )
}
2019-02-10 04:37:37 +03:00
}
2021-02-10 01:29:03 +03:00
// TTLSeconds returns the TTLSeconds or unix timestamp for memcache
func ( c Cache ) TTLSeconds ( ) int64 {
if c . Adapter == "memcache" && c . TTL > MemcacheMaxTTL {
return time . Now ( ) . Add ( c . TTL ) . Unix ( )
}
return int64 ( c . TTL . Seconds ( ) )
}
// LastCommitCacheTTLSeconds returns the TTLSeconds or unix timestamp for memcache
func LastCommitCacheTTLSeconds ( ) int64 {
if CacheService . Adapter == "memcache" && CacheService . LastCommit . TTL > MemcacheMaxTTL {
return time . Now ( ) . Add ( CacheService . LastCommit . TTL ) . Unix ( )
}
return int64 ( CacheService . LastCommit . TTL . Seconds ( ) )
}