1// Copyright 2019 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package setting
5
6import (
7 "strings"
8 "time"
9
10 "forgejo.org/modules/log"
11)
12
13// Cache represents cache settings
14type Cache struct {
15 Adapter string
16 Interval int
17 Conn string
18 TTL time.Duration `ini:"ITEM_TTL"`
19}
20
21// CacheService the global cache
22var CacheService = struct {
23 Cache `ini:"cache"`
24
25 LastCommit struct {
26 TTL time.Duration `ini:"ITEM_TTL"`
27 CommitsCount int64
28 } `ini:"cache.last_commit"`
29}{
30 Cache: Cache{
31 Adapter: "memory",
32 Interval: 60,
33 TTL: 16 * time.Hour,
34 },
35 LastCommit: struct {
36 TTL time.Duration `ini:"ITEM_TTL"`
37 CommitsCount int64
38 }{
39 TTL: 8760 * time.Hour,
40 CommitsCount: 1000,
41 },
42}
43
44// MemcacheMaxTTL represents the maximum memcache TTL
45const MemcacheMaxTTL = 30 * 24 * time.Hour
46
47func loadCacheFrom(rootCfg ConfigProvider) {
48 sec := rootCfg.Section("cache")
49 if err := sec.MapTo(&CacheService); err != nil {
50 log.Fatal("Failed to map Cache settings: %v", err)
51 }
52
53 CacheService.Adapter = sec.Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache", "twoqueue"})
54 switch CacheService.Adapter {
55 case "memory":
56 case "redis", "memcache":
57 CacheService.Conn = strings.Trim(sec.Key("HOST").String(), "\" ")
58 case "twoqueue":
59 CacheService.Conn = strings.TrimSpace(sec.Key("HOST").String())
60 if CacheService.Conn == "" {
61 CacheService.Conn = "50000"
62 }
63 default:
64 log.Fatal("Unknown cache adapter: %s", CacheService.Adapter)
65 }
66
67 sec = rootCfg.Section("cache.last_commit")
68 CacheService.LastCommit.CommitsCount = sec.Key("COMMITS_COUNT").MustInt64(1000)
69}
70
71// TTLSeconds returns the TTLSeconds or unix timestamp for memcache
72func (c Cache) TTLSeconds() int64 {
73 if c.Adapter == "memcache" && c.TTL > MemcacheMaxTTL {
74 return time.Now().Add(c.TTL).Unix()
75 }
76 return int64(c.TTL.Seconds())
77}
78
79// LastCommitCacheTTLSeconds returns the TTLSeconds or unix timestamp for memcache
80func LastCommitCacheTTLSeconds() int64 {
81 if CacheService.Adapter == "memcache" && CacheService.LastCommit.TTL > MemcacheMaxTTL {
82 return time.Now().Add(CacheService.LastCommit.TTL).Unix()
83 }
84 return int64(CacheService.LastCommit.TTL.Seconds())
85}