...
1 package updater
2
3 import (
4 "context"
5 "math/rand"
6 "sync"
7 "time"
8
9 "github.com/letsencrypt/boulder/crl"
10 "github.com/letsencrypt/boulder/issuance"
11 )
12
13
14
15
16 func (cu *crlUpdater) Run(ctx context.Context) error {
17 var wg sync.WaitGroup
18
19 shardWorker := func(issuerNameID issuance.IssuerNameID, shardIdx int) {
20 defer wg.Done()
21
22
23
24 waitTimer := time.NewTimer(time.Duration(rand.Int63n(cu.updatePeriod.Nanoseconds())))
25 defer waitTimer.Stop()
26 select {
27 case <-waitTimer.C:
28
29 case <-ctx.Done():
30 return
31 }
32
33
34 ticker := time.NewTicker(cu.updatePeriod)
35 defer ticker.Stop()
36 for {
37
38
39 if ctx.Err() != nil {
40 return
41 }
42
43 atTime := cu.clk.Now()
44 err := cu.updateShardWithRetry(ctx, atTime, issuerNameID, shardIdx, nil)
45 if err != nil {
46
47
48 cu.log.AuditErrf(
49 "Generating CRL failed: id=[%s] err=[%s]",
50 crl.Id(issuerNameID, shardIdx, crl.Number(atTime)), err)
51 }
52
53 select {
54 case <-ticker.C:
55 continue
56 case <-ctx.Done():
57 return
58 }
59 }
60 }
61
62
63 for _, issuer := range cu.issuers {
64 for i := 1; i <= cu.numShards; i++ {
65 wg.Add(1)
66 go shardWorker(issuer.NameID(), i)
67 }
68 }
69
70
71
72 wg.Wait()
73 return ctx.Err()
74 }
75
View as plain text