Dragonfly2
79 строк · 1.6 Кб
1/*
2* Copyright 2020 The Dragonfly Authors
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17package gc
18
19import (
20"time"
21
22logger "d7y.io/dragonfly/v2/internal/dflog"
23)
24
25type GC interface {
26TryGC() (bool, error)
27}
28
29type Manager interface {
30Start()
31Stop()
32}
33
34type gcManager struct {
35interval time.Duration
36done chan bool
37}
38
39var _ Manager = (*gcManager)(nil)
40
41var allGCTasks = map[string]GC{}
42
43func Register(name string, gc GC) {
44allGCTasks[name] = gc
45}
46
47func NewManager(interval time.Duration) Manager {
48return &gcManager{
49interval: interval,
50done: make(chan bool),
51}
52}
53
54func (g gcManager) Start() {
55go func() {
56tick := time.NewTicker(g.interval)
57for {
58select {
59case <-tick.C:
60for name, gc := range allGCTasks {
61var log = logger.With("component", name)
62log.Debugf("start gc")
63_, err := gc.TryGC()
64if err != nil {
65log.Errorf("gc %s error: %s", name, err)
66}
67log.Debugf("gc done")
68}
69case <-g.done:
70logger.Infof("gc exited")
71return
72}
73}
74}()
75}
76
77func (g gcManager) Stop() {
78close(g.done)
79}
80