Changeset 741 in code for trunk


Ignore:
Timestamp:
Dec 2, 2021, 10:52:29 PM (4 years ago)
Author:
contact
Message:

Use golang.org/x/time/rate

Instead of hand-rolling our own rate-limiter based on goroutines,
use golang.org/x/time/rate.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/conn.go

    r703 r741  
    1111        "unicode"
    1212
     13        "golang.org/x/time/rate"
    1314        "gopkg.in/irc.v3"
    1415        "nhooyr.io/websocket"
     
    119120}
    120121
    121 type rateLimiter struct {
    122         C       <-chan struct{}
    123         ticker  *time.Ticker
    124         stopped chan struct{}
    125 }
    126 
    127 func newRateLimiter(delay time.Duration, burst int) *rateLimiter {
    128         ch := make(chan struct{}, burst)
    129         for i := 0; i < burst; i++ {
    130                 ch <- struct{}{}
    131         }
    132         ticker := time.NewTicker(delay)
    133         stopped := make(chan struct{})
    134         go func() {
    135                 for {
    136                         select {
    137                         case <-ticker.C:
    138                                 select {
    139                                 case ch <- struct{}{}:
    140                                         // This space is intentionally left blank
    141                                 case <-stopped:
    142                                         return
    143                                 }
    144                         case <-stopped:
    145                                 return
    146                         }
    147                 }
    148         }()
    149         return &rateLimiter{
    150                 C:       ch,
    151                 ticker:  ticker,
    152                 stopped: stopped,
    153         }
    154 }
    155 
    156 func (rl *rateLimiter) Stop() {
    157         rl.ticker.Stop()
    158         close(rl.stopped)
    159 }
    160 
    161122type connOptions struct {
    162123        Logger         Logger
     
    187148
    188149        go func() {
    189                 var rl *rateLimiter
    190                 if options.RateLimitDelay > 0 && options.RateLimitBurst > 0 {
    191                         rl = newRateLimiter(options.RateLimitDelay, options.RateLimitBurst)
    192                         defer rl.Stop()
    193                 }
    194 
     150                ctx, cancel := c.NewContext(context.Background())
     151                defer cancel()
     152
     153                rl := rate.NewLimiter(rate.Every(options.RateLimitDelay), options.RateLimitBurst)
    195154                for msg := range outgoing {
    196                         if rl != nil {
    197                                 <-rl.C
     155                        if err := rl.Wait(ctx); err != nil {
     156                                break
    198157                        }
    199158
  • trunk/go.mod

    r714 r741  
    1919        golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c // indirect
    2020        golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
     21        golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11
    2122        google.golang.org/protobuf v1.27.1 // indirect
    2223        gopkg.in/irc.v3 v3.1.4
  • trunk/go.sum

    r714 r741  
    380380golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    381381golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     382golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M=
     383golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    382384golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    383385golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Note: See TracChangeset for help on using the changeset viewer.