mirror of
https://github.com/jsiebens/ionscale.git
synced 2026-03-31 15:07:49 +01:00
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
"github.com/jsiebens/ionscale/internal/domain"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
ticker = 10 * time.Minute
|
|
inactivityTimeout = 30 * time.Minute
|
|
)
|
|
|
|
func StartWorker(repository domain.Repository, sessionManager PollMapSessionManager) {
|
|
r := &worker{
|
|
sessionManager: sessionManager,
|
|
repository: repository,
|
|
}
|
|
|
|
go r.start()
|
|
}
|
|
|
|
type worker struct {
|
|
sessionManager PollMapSessionManager
|
|
repository domain.Repository
|
|
}
|
|
|
|
func (r *worker) start() {
|
|
r.deleteInactiveEphemeralNodes()
|
|
t := time.NewTicker(ticker)
|
|
for range t.C {
|
|
r.deleteInactiveEphemeralNodes()
|
|
}
|
|
}
|
|
|
|
func (r *worker) deleteInactiveEphemeralNodes() {
|
|
ctx := context.Background()
|
|
|
|
now := time.Now().UTC()
|
|
checkpoint := now.Add(-inactivityTimeout)
|
|
machines, err := r.repository.ListInactiveEphemeralMachines(ctx, checkpoint)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var removedNodes = make(map[uint64][]uint64)
|
|
for _, m := range machines {
|
|
if now.After(m.LastSeen.Add(inactivityTimeout)) {
|
|
ok, err := r.repository.DeleteMachine(ctx, m.ID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if ok {
|
|
removedNodes[m.TailnetID] = append(removedNodes[m.TailnetID], m.ID)
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(removedNodes) != 0 {
|
|
for i, _ := range removedNodes {
|
|
r.sessionManager.NotifyAll(i)
|
|
}
|
|
}
|
|
}
|