Skip to content

Commit

Permalink
Replace ristretto with more simple, generic cache, use singleflightx …
Browse files Browse the repository at this point in the history
…for generics, and some other small changes
  • Loading branch information
jlelse committed Aug 3, 2024
1 parent 0346816 commit 0fd2ee2
Show file tree
Hide file tree
Showing 18 changed files with 654 additions and 151 deletions.
17 changes: 9 additions & 8 deletions app.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@ import (

shutdowner "git.jlel.se/jlelse/go-shutdowner"
ts "git.jlel.se/jlelse/template-strings"
"github.com/dgraph-io/ristretto"
ct "github.com/elnormous/contenttype"
apc "github.com/go-ap/client"
"github.com/go-fed/httpsig"
"github.com/kaorimatz/go-opml"
rotatelogs "github.com/lestrrat-go/file-rotatelogs"
"github.com/samber/go-singleflightx"
"github.com/yuin/goldmark"
c "go.goblog.app/app/pkgs/cache"
"go.goblog.app/app/pkgs/minify"
"go.goblog.app/app/pkgs/plugins"
"go.hacdias.com/indielib/indieauth"
"golang.org/x/crypto/acme/autocert"
"golang.org/x/sync/singleflight"
)

type goBlog struct {
Expand All @@ -39,9 +40,9 @@ type goBlog struct {
autocertManager *autocert.Manager
autocertInit sync.Once
// Blogroll
blogrollCacheGroup singleflight.Group
blogrollCacheGroup singleflightx.Group[string, []*opml.Outline]
// Blogstats
blogStatsCacheGroup singleflight.Group
blogStatsCacheGroup singleflightx.Group[string, *blogStatsData]
// Cache
cache *cache
// Config
Expand Down Expand Up @@ -81,7 +82,7 @@ type goBlog struct {
mediaStorage mediaStorage
// Microformats
mfInit sync.Once
mfCache *ristretto.Cache
mfCache *c.Cache[string, []byte]
// Micropub
mpImpl *micropubImplementation
// Minify
Expand All @@ -90,11 +91,11 @@ type goBlog struct {
pluginHost *plugins.PluginHost
// Profile image
profileImageHashString string
profileImageHashGroup singleflight.Group
profileImageHashGroup *sync.Once
// Reactions
reactionsInit sync.Once
reactionsCache *ristretto.Cache
reactionsSfg singleflight.Group
reactionsCache *c.Cache[string, string]
reactionsSfg singleflightx.Group[string, string]
// Regex Redirects
regexRedirects []*regexRedirect
// Sessions
Expand Down
8 changes: 4 additions & 4 deletions blogroll.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func (bc *configBlog) getBlogrollPath() (bool, string) {

func (a *goBlog) serveBlogroll(w http.ResponseWriter, r *http.Request) {
blog, bc := a.getBlog(r)
outlines, err, _ := a.blogrollCacheGroup.Do(blog, func() (any, error) {
outlines, err, _ := a.blogrollCacheGroup.Do(blog, func() ([]*opml.Outline, error) {
return a.getBlogrollOutlines(blog)
})
if err != nil {
Expand All @@ -48,7 +48,7 @@ func (a *goBlog) serveBlogroll(w http.ResponseWriter, r *http.Request) {
Data: &blogrollRenderData{
title: c.Title,
description: c.Description,
outlines: outlines.([]*opml.Outline),
outlines: outlines,
download: can + blogrollDownloadFile,
refresh: can + blogrollRefreshSubpath,
},
Expand All @@ -57,7 +57,7 @@ func (a *goBlog) serveBlogroll(w http.ResponseWriter, r *http.Request) {

func (a *goBlog) serveBlogrollExport(w http.ResponseWriter, r *http.Request) {
blog, _ := a.getBlog(r)
outlines, err, _ := a.blogrollCacheGroup.Do(blog, func() (any, error) {
outlines, err, _ := a.blogrollCacheGroup.Do(blog, func() ([]*opml.Outline, error) {
return a.getBlogrollOutlines(blog)
})
if err != nil {
Expand All @@ -70,7 +70,7 @@ func (a *goBlog) serveBlogrollExport(w http.ResponseWriter, r *http.Request) {
_ = pw.CloseWithError(opml.Render(pw, &opml.OPML{
Version: "2.0",
DateCreated: time.Now().UTC(),
Outlines: outlines.([]*opml.Outline),
Outlines: outlines,
}))
}()
w.Header().Set(contentType, contenttype.XMLUTF8)
Expand Down
6 changes: 3 additions & 3 deletions blogstats.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func (a *goBlog) serveBlogStats(w http.ResponseWriter, r *http.Request) {

func (a *goBlog) serveBlogStatsTable(w http.ResponseWriter, r *http.Request) {
blog, _ := a.getBlog(r)
data, err, _ := a.blogStatsCacheGroup.Do(blog, func() (any, error) {
data, err, _ := a.blogStatsCacheGroup.Do(blog, func() (*blogStatsData, error) {
return a.db.getBlogStats(blog)
})
if err != nil {
Expand Down Expand Up @@ -127,8 +127,8 @@ func (db *database) getBlogStats(blog string) (data *blogStatsData, err error) {
return stats, nil
}
// Prevent creating posts while getting stats
db.pcm.Lock()
defer db.pcm.Unlock()
db.pcm.RLock()
defer db.pcm.RUnlock()
// Scan objects
currentStats := blogStatsRow{}
var currentMonth, currentYear string
Expand Down
40 changes: 8 additions & 32 deletions cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import (
"sort"
"time"

"github.com/dgraph-io/ristretto"
"github.com/samber/go-singleflightx"
"go.goblog.app/app/pkgs/bodylimit"
"go.goblog.app/app/pkgs/bufferpool"
"golang.org/x/sync/singleflight"
c "go.goblog.app/app/pkgs/cache"
)

const (
Expand All @@ -20,41 +20,19 @@ const (
)

type cache struct {
g singleflight.Group
c *ristretto.Cache
g singleflightx.Group[string, *cacheItem]
c *c.Cache[string, *cacheItem]
}

func (a *goBlog) initCache() error {
a.cache = &cache{}
if a.cfg.Cache != nil && !a.cfg.Cache.Enable {
return nil // Cache disabled
}

c, err := ristretto.NewCache(&ristretto.Config{
NumCounters: 40000,
MaxCost: 20 * bodylimit.MB,
BufferItems: 64,
Metrics: true,
})
if err != nil {
return err
}

a.cache.c = c
go a.logCacheMetrics()
a.cache.c = c.New[string, *cacheItem](time.Minute, 20*bodylimit.MB)
return nil
}

func (a *goBlog) logCacheMetrics() {
ticker := time.NewTicker(15 * time.Minute)
defer ticker.Stop()

for range ticker.C {
met := a.cache.c.Metrics
a.info("Cache metrics", "metrics", met.String())
}
}

func cacheLoggedIn(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := context.WithValue(r.Context(), cacheLoggedInKey, true)
Expand All @@ -70,11 +48,10 @@ func (a *goBlog) cacheMiddleware(next http.Handler) http.Handler {
}

key := generateCacheKey(r)
cacheInterface, _, _ := a.cache.g.Do(key, func() (interface{}, error) {
ci, _, _ := a.cache.g.Do(key, func() (*cacheItem, error) {
return a.cache.getOrCreateCache(key, next, r), nil
})

ci := cacheInterface.(*cacheItem)
a.serveCachedResponse(w, r, ci)
})
}
Expand Down Expand Up @@ -153,7 +130,7 @@ func (a *goBlog) setCacheHeaders(w http.ResponseWriter, cache *cacheItem) {

func (c *cache) getOrCreateCache(key string, next http.Handler, r *http.Request) *cacheItem {
if rItem, ok := c.c.Get(key); ok {
return rItem.(*cacheItem)
return rItem
}

// Remove original timeout, add new one
Expand Down Expand Up @@ -201,8 +178,7 @@ func (c *cache) saveCache(key string, item *cacheItem) {
if item.expiration > 0 {
ttl = time.Duration(item.expiration) * time.Second
}
c.c.SetWithTTL(key, item, item.cost(), ttl)
c.c.Wait()
c.c.Set(key, item, ttl, item.cost())
}

func (c *cache) purge() {
Expand Down
10 changes: 4 additions & 6 deletions cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import (
"net/http/httptest"
"strconv"
"testing"
"time"

"github.com/dgraph-io/ristretto"
"github.com/stretchr/testify/assert"
"go.goblog.app/app/pkgs/bodylimit"
cpkg "go.goblog.app/app/pkgs/cache"
)

func Benchmark_cacheItem_cost(b *testing.B) {
Expand Down Expand Up @@ -53,11 +55,7 @@ func Benchmark_cacheKey(b *testing.B) {

func Benchmark_cache_getCache(b *testing.B) {
c := &cache{}
c.c, _ = ristretto.NewCache(&ristretto.Config{
NumCounters: 40 * 1000,
MaxCost: 20 * 1000 * 1000,
BufferItems: 64,
})
c.c = cpkg.New[string, *cacheItem](time.Minute, 10*bodylimit.MB)
req := httptest.NewRequest(http.MethodGet, "/abc?abc=def&hij=klm", nil)
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = io.WriteString(w, "abcdefghijklmnopqrstuvwxyz")
Expand Down
10 changes: 2 additions & 8 deletions check.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import (
"time"

"github.com/carlmjohnson/requests"
"github.com/dgraph-io/ristretto"
"github.com/klauspost/compress/gzhttp"
"github.com/samber/lo"
"github.com/sourcegraph/conc/pool"
"go.goblog.app/app/pkgs/bodylimit"
cpkg "go.goblog.app/app/pkgs/cache"
"go.goblog.app/app/pkgs/httpcachetransport"
)

Expand Down Expand Up @@ -46,14 +46,8 @@ func (a *goBlog) checkLinks(posts ...*post) error {
cancelFunc()
fmt.Println("Cancelled link check")
})
// Create HTTP cache
cache, err := ristretto.NewCache(&ristretto.Config{
NumCounters: 50000, MaxCost: 5000, BufferItems: 64, IgnoreInternalCost: true,
})
if err != nil {
return err
}
// Create HTTP client
cache := cpkg.New[string, []byte](time.Minute, 5000)
client := &http.Client{
Timeout: 30 * time.Second,
Transport: httpcachetransport.NewHttpCacheTransportNoBody(gzhttp.Transport(&http.Transport{
Expand Down
8 changes: 4 additions & 4 deletions database.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ import (

"github.com/google/uuid"
sqlite "github.com/mattn/go-sqlite3"
"github.com/samber/go-singleflightx"
"github.com/schollz/sqlite3dump"
"golang.org/x/sync/singleflight"
)

type database struct {
a *goBlog
db *sql.DB
// Other things
pc singleflight.Group // persistant cache
pcm sync.Mutex // post creation
sp sync.Mutex // short path creation
pc singleflightx.Group[string, []byte] // persistant cache
pcm sync.RWMutex // post creation
sp sync.Mutex // short path creation
debug bool
}

Expand Down
7 changes: 2 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@ require (
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
github.com/carlmjohnson/requests v0.24.1
github.com/dchest/captcha v1.0.0
github.com/dgraph-io/ristretto v0.1.1
github.com/disintegration/imaging v1.6.2
github.com/dmulholl/mp3lib v1.0.0
github.com/elnormous/contenttype v1.0.4
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43
github.com/emersion/go-smtp v0.21.3
github.com/go-ap/activitypub v0.0.0-20240408091739-ba76b44c2594
github.com/go-ap/client v0.0.0-20240710145250-eec2de3441ed
github.com/go-ap/client v0.0.0-20240801112518-4c25c5a0156a
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
github.com/go-chi/chi/v5 v5.1.0
github.com/go-fed/httpsig v1.1.0
Expand All @@ -42,6 +41,7 @@ require (
github.com/paulmach/go.geojson v1.5.0
github.com/posener/wstest v1.2.0
github.com/pquerna/otp v1.4.0
github.com/samber/go-singleflightx v0.3.1
github.com/samber/lo v1.46.0
github.com/schollz/sqlite3dump v1.3.1
github.com/snabb/sitemap v1.0.4
Expand Down Expand Up @@ -76,14 +76,11 @@ require (
github.com/andybalholm/cascadia v1.3.2 // indirect
github.com/aymerick/douceur v0.2.0 // indirect
github.com/boombuler/barcode v1.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dlclark/regexp2 v1.11.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-ap/errors v0.0.0-20240304112515-6077fa9c17b0 // indirect
github.com/golang/glog v1.2.2 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/gorilla/securecookie v1.1.2 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
Expand Down
20 changes: 4 additions & 16 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500 h1:6lhrsTEnloDPXye
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M=
github.com/carlmjohnson/requests v0.24.1 h1:M8hmzyJr3A9D3u96MjCNuUVLd7Z3hQb7UjP5DsBp3lE=
github.com/carlmjohnson/requests v0.24.1/go.mod h1:duYA/jDnyZ6f3xbcF5PpZ9N8clgopubP2nK5i6MVMhU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -47,19 +44,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/dlclark/regexp2 v1.11.2 h1:/u628IuisSTwri5/UKloiIsH8+qF2Pu7xEQX+yIKg68=
github.com/dlclark/regexp2 v1.11.2/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dmulholl/mp3lib v1.0.0 h1:PZq24kJBIk5zIxi/t6Qp8/EOAbAqThyrUCpkUKLBeWQ=
github.com/dmulholl/mp3lib v1.0.0/go.mod h1:4RoA+iht/khfwxmH1ieoxZTzYVbb0am/zdvFkyGRr6I=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/elnormous/contenttype v1.0.4 h1:FjmVNkvQOGqSX70yvocph7keC8DtmJaLzTTq6ZOQCI8=
github.com/elnormous/contenttype v1.0.4/go.mod h1:5KTOW8m1kdX1dLMiUJeN9szzR2xkngiv2K+RVZwWBbI=
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
Expand All @@ -75,8 +65,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
github.com/go-ap/activitypub v0.0.0-20240408091739-ba76b44c2594 h1:er3GvGCm7bJwHostjZlsRy7uiUuCquUVF9Fe0TrwiPI=
github.com/go-ap/activitypub v0.0.0-20240408091739-ba76b44c2594/go.mod h1:yRUfFCoZY6C1CWalauqEQ5xYgSckzEBEO/2MBC6BOME=
github.com/go-ap/client v0.0.0-20240710145250-eec2de3441ed h1:3KG6nQMhTqxvnCT+Cav4cQi03isE66N2mxvIocSO+20=
github.com/go-ap/client v0.0.0-20240710145250-eec2de3441ed/go.mod h1:xk8Lh1zbW/ZpLuPd5bIYhFu27Fo5Y2SsPgZfw75aDSg=
github.com/go-ap/client v0.0.0-20240801112518-4c25c5a0156a h1:UrZzmoqFbrR/pOWRFcbxdhE7QNM4R0a2Rru8RJFHlvI=
github.com/go-ap/client v0.0.0-20240801112518-4c25c5a0156a/go.mod h1:Mzm41jnI+F2Fp3cKWg3A2GzwnHNv6alHHhPl0y8w5rI=
github.com/go-ap/errors v0.0.0-20240304112515-6077fa9c17b0 h1:H9MGShwybHLSln6K8RxHPMHiLcD86Lru+5TVW2TcXHY=
github.com/go-ap/errors v0.0.0-20240304112515-6077fa9c17b0/go.mod h1:5x8a6P/dhmMGFxWLcyYlyOuJ2lRNaHGhRv+yu8BaTSI=
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73 h1:GMKIYXyXPGIp+hYiWOhfqK4A023HdgisDT4YGgf99mw=
Expand All @@ -90,9 +80,6 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY=
github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
Expand Down Expand Up @@ -218,6 +205,8 @@ github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3
github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/samber/go-singleflightx v0.3.1 h1:D9NAWs1t2TKf4wpkxRw6MIXqpDt2bXb5ZZyT2QuvybY=
github.com/samber/go-singleflightx v0.3.1/go.mod h1:X2BR+oheHIYc73PvxRMlcASg6KYYTQyUYpdVU7t/ux4=
github.com/samber/lo v1.46.0 h1:w8G+oaCPgz1PoCJztqymCFaKwXt+5cCXn51uPxExFfQ=
github.com/samber/lo v1.46.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=
Expand Down Expand Up @@ -340,7 +329,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
Loading

0 comments on commit 0fd2ee2

Please sign in to comment.