Skip to content

Commit b745415

Browse files
committed
refactor: trigger CRL update on timer and client update
This changes the CRL timer to run once per minute but only trigger the CRL update if the specified interval has elapsed since the last scheduled run or if the indexer has signaled that the CRL should be updated on the next timer tick. Fixes #167 Signed-off-by: Aurora Gaffney <aurora@blinklabs.io>
1 parent e8790ac commit b745415

4 files changed

Lines changed: 48 additions & 21 deletions

File tree

cmd/vpn-indexer/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ func main() {
160160
}
161161

162162
// Configure CRL
163-
_, err = crl.New(cfg, logger, db, ca)
163+
crl, err := crl.New(cfg, logger, db, ca)
164164
if err != nil {
165165
slog.Error(
166166
fmt.Sprintf("failed to configure CRL: %s", err),
@@ -169,7 +169,7 @@ func main() {
169169
}
170170

171171
// Start indexer
172-
if err := indexer.GetIndexer().Start(cfg, logger, db, ca); err != nil {
172+
if err := indexer.GetIndexer().Start(cfg, logger, db, ca, crl); err != nil {
173173
slog.Error(
174174
fmt.Sprintf("failed to start indexer: %s", err),
175175
)

internal/crl/crl.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"log/slog"
2323
"math/big"
24+
"sync"
2425
"time"
2526

2627
"github.com/blinklabs-io/vpn-indexer/internal/ca"
@@ -34,11 +35,13 @@ import (
3435
)
3536

3637
type Crl struct {
37-
ca *ca.Ca
38-
config *config.Config
39-
db *database.Database
40-
logger *slog.Logger
41-
timer *time.Timer
38+
ca *ca.Ca
39+
config *config.Config
40+
db *database.Database
41+
logger *slog.Logger
42+
nextScheduledUpdate time.Time
43+
needsUpdate bool
44+
needsUpdateMutex sync.Mutex
4245
}
4346

4447
func New(
@@ -61,6 +64,12 @@ func New(
6164
return crl, nil
6265
}
6366

67+
func (c *Crl) SetNeedsUpdate() {
68+
c.needsUpdateMutex.Lock()
69+
c.needsUpdate = true
70+
c.needsUpdateMutex.Unlock()
71+
}
72+
6473
func (c *Crl) k8sClient() (*kubernetes.Clientset, error) {
6574
config, err := rest.InClusterConfig()
6675
if err != nil {
@@ -74,20 +83,32 @@ func (c *Crl) k8sClient() (*kubernetes.Clientset, error) {
7483
}
7584

7685
func (c *Crl) scheduleUpdateConfigMap() {
77-
c.timer = time.AfterFunc(
78-
c.config.Crl.UpdateInterval,
79-
func() {
80-
if err := c.updateConfigMap(); err != nil {
81-
c.logger.Error(
82-
fmt.Sprintf(
83-
"failed to update CRL ConfigMap: %s",
84-
err,
85-
),
86-
)
86+
tickChan := time.Tick(1 * time.Minute)
87+
c.nextScheduledUpdate = time.Now().Add(c.config.Crl.UpdateInterval)
88+
go func() {
89+
for {
90+
_, ok := <-tickChan
91+
if !ok {
92+
return
8793
}
88-
c.scheduleUpdateConfigMap()
89-
},
90-
)
94+
c.needsUpdateMutex.Lock()
95+
if time.Now().After(c.nextScheduledUpdate) || c.needsUpdate {
96+
if err := c.updateConfigMap(); err != nil {
97+
c.logger.Error(
98+
fmt.Sprintf(
99+
"failed to update CRL ConfigMap: %s",
100+
err,
101+
),
102+
)
103+
}
104+
if !c.needsUpdate {
105+
c.nextScheduledUpdate = c.nextScheduledUpdate.Add(c.config.Crl.UpdateInterval)
106+
}
107+
c.needsUpdate = false
108+
}
109+
c.needsUpdateMutex.Unlock()
110+
}
111+
}()
91112
}
92113

93114
func (c *Crl) updateConfigMap() error {

internal/indexer/indexer.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/blinklabs-io/vpn-indexer/internal/ca"
3535
"github.com/blinklabs-io/vpn-indexer/internal/client"
3636
"github.com/blinklabs-io/vpn-indexer/internal/config"
37+
"github.com/blinklabs-io/vpn-indexer/internal/crl"
3738
"github.com/blinklabs-io/vpn-indexer/internal/database"
3839
"github.com/prometheus/client_golang/prometheus"
3940
"github.com/prometheus/client_golang/prometheus/promauto"
@@ -58,6 +59,7 @@ type Indexer struct {
5859
cfg *config.Config
5960
db *database.Database
6061
ca *ca.Ca
62+
crl *crl.Crl
6163
logger *slog.Logger
6264
pipeline *pipeline.Pipeline
6365
refTokenPolicyId lcommon.Blake2b224
@@ -76,10 +78,12 @@ func (i *Indexer) Start(
7678
logger *slog.Logger,
7779
db *database.Database,
7880
ca *ca.Ca,
81+
crl *crl.Crl,
7982
) error {
8083
i.cfg = cfg
8184
i.db = db
8285
i.ca = ca
86+
i.crl = crl
8387
i.logger = logger
8488
// Parse script address to determine client asset policy ID
8589
scriptAddr, err := lcommon.NewAddress(cfg.Indexer.ScriptAddress)
@@ -336,6 +340,8 @@ func (i *Indexer) handleEventClient(txOutput lcommon.Utxo) error {
336340
if err != nil {
337341
return err
338342
}
343+
// Trigger CRL update to unblock renewals
344+
i.crl.SetNeedsUpdate()
339345
i.logger.Info(
340346
"generated client",
341347
"client",

scripts/local-deploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ crl:
120120
configMapNamespace: vpn-test
121121
configMapName: test-crl
122122
configMapKey: crl.pem
123-
updateInterval: 1m
123+
updateInterval: 2m
124124
EOF
125125

126126
# Install helm chart

0 commit comments

Comments
 (0)