From dbeb877d6c4cc9e8a0af3ae3244abb79f17b7d45 Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Sat, 13 Apr 2024 00:26:21 +0200 Subject: [PATCH] Update go-randomx, bump dependencies and use hashicorp LRU to remove golang.org/x/text, github.com/bahlo/generic-list-go dependencies --- go.mod | 8 +++----- go.sum | 16 ++++++---------- monero/client/client.go | 18 ++++++++++++------ p2pool/api/p2poolapi.go | 10 +++++++--- utils/cache.go | 16 ++++++++++------ 5 files changed, 38 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index de57501..4e81b64 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,14 @@ go 1.22 require ( git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20240405085108-e2f706cb5c00 - git.gammaspectra.live/P2Pool/go-randomx/v2 v2.0.0 + git.gammaspectra.live/P2Pool/go-randomx/v2 v2.1.0 git.gammaspectra.live/P2Pool/monero-base58 v1.0.0 git.gammaspectra.live/P2Pool/randomx-go-bindings v1.0.0 git.gammaspectra.live/P2Pool/sha3 v0.17.0 github.com/dolthub/swiss v0.2.2-0.20240312182618-f4b2babd2bc1 - github.com/floatdrop/lru v1.3.0 github.com/go-zeromq/zmq4 v0.16.1-0.20240124085909-e75c615ba1b3 github.com/goccy/go-json v0.10.2 + github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc golang.org/x/sync v0.7.0 golang.org/x/sys v0.19.0 @@ -19,12 +19,10 @@ require ( ) require ( - github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/dolthub/maphash v0.1.0 // indirect golang.org/x/crypto v0.22.0 // indirect - golang.org/x/text v0.14.0 // indirect ) replace github.com/goccy/go-json => github.com/WeebDataHoarder/go-json v0.0.0-20230730135821-d8f6463bb887 -replace github.com/go-zeromq/zmq4 => git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240407153747-7f7d531f586e +replace github.com/go-zeromq/zmq4 => git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240412221749-a35fa84ca9f4 diff --git a/go.sum b/go.sum index 9486454..97e0c8f 100644 --- a/go.sum +++ b/go.sum @@ -1,27 +1,25 @@ git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20240405085108-e2f706cb5c00 h1:mDQY337iKB+kle5RYWL5CoAz+3DmnkAh/B2XD8B+PFk= git.gammaspectra.live/P2Pool/edwards25519 v0.0.0-20240405085108-e2f706cb5c00/go.mod h1:FZsrMWGucMP3SZamzrd7m562geIs5zp1O/9MGoiAKH0= -git.gammaspectra.live/P2Pool/go-randomx/v2 v2.0.0 h1:lHi2z8Nz3H1Xpu1p53TYccz072BDhbJGNHquiX9orCM= -git.gammaspectra.live/P2Pool/go-randomx/v2 v2.0.0/go.mod h1:vNmHlEIRAcU/bA85mxbUKEiBYtrtS4MVwozf29KmoHM= +git.gammaspectra.live/P2Pool/go-randomx/v2 v2.1.0 h1:L1fV2XBYFmpFU+JKP/7fsgDm2Lfh9yFlS+800v+3OsM= +git.gammaspectra.live/P2Pool/go-randomx/v2 v2.1.0/go.mod h1:vNmHlEIRAcU/bA85mxbUKEiBYtrtS4MVwozf29KmoHM= git.gammaspectra.live/P2Pool/monero-base58 v1.0.0 h1:s8LZxVNc93YEs2NCCNWZ7CKr8RbEb031y6Wkvhn+TS4= git.gammaspectra.live/P2Pool/monero-base58 v1.0.0/go.mod h1:WWEJy/AdWKxKAruvlKI82brw+DtVlePy0ct3ZiBlc68= git.gammaspectra.live/P2Pool/randomx-go-bindings v1.0.0 h1:tajr4QFSPrb8NtHmU14JaXdhr+z+0RbOBLIgUDI5Tow= git.gammaspectra.live/P2Pool/randomx-go-bindings v1.0.0/go.mod h1:S17NNidG5hxqaVLsSykKqDBg/hTPSzP0KcSwXfH8WIA= git.gammaspectra.live/P2Pool/sha3 v0.17.0 h1:CZpB466LPbNVQrUNjQTtQScGDc30xSMkZ6Bmw0W9VuM= git.gammaspectra.live/P2Pool/sha3 v0.17.0/go.mod h1:HmrrYa97BZTKklUk2n/wAY+wrY0gHhoSGRd2+lIqXq8= -git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240407153747-7f7d531f586e h1:U6zpCbwIW1Pr4wyLjbbRNa3aJcCXwnWOPsJmiHGFKsY= -git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240407153747-7f7d531f586e/go.mod h1:AOWpIfDC+phUiEeiZRXf5oth8YLsfLtflF+6BJNagi4= +git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240412221749-a35fa84ca9f4 h1:K34kPogf+BpaLkUYQJSM1icWU69TL2ISrmx9u977zvw= +git.gammaspectra.live/P2Pool/zmq4 v0.16.1-0.20240412221749-a35fa84ca9f4/go.mod h1:G/caphb5HAHcnNIIDDgOqJ3HN6r4rnTP14Q621H4rK4= github.com/WeebDataHoarder/go-json v0.0.0-20230730135821-d8f6463bb887 h1:P01nqSM+0b6zlPasOFYsqnQSP2dTRVZkanAnY9q/Bcc= github.com/WeebDataHoarder/go-json v0.0.0-20230730135821-d8f6463bb887/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= -github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dolthub/maphash v0.1.0 h1:bsQ7JsF4FkkWyrP3oCnFJgrCUAFbFf3kOl4L/QxPDyQ= github.com/dolthub/maphash v0.1.0/go.mod h1:gkg4Ch4CdCDu5h6PMriVLawB7koZ+5ijb9puGMV50a4= github.com/dolthub/swiss v0.2.2-0.20240312182618-f4b2babd2bc1 h1:F7u1ZVCidajlPuJJzdL5REPHfLO/O6xLQRUw/YMxrkM= github.com/dolthub/swiss v0.2.2-0.20240312182618-f4b2babd2bc1/go.mod h1:8AhKZZ1HK7g18j7v7k6c5cYIGEZJcPn0ARsai8cUrh0= -github.com/floatdrop/lru v1.3.0 h1:83abtaKjXcWrPmtzTAk2Ggq8DUKqI29YzrTrB8+vu0c= -github.com/floatdrop/lru v1.3.0/go.mod h1:83zlXKA06Bm32JImNINCiTr0ldadvdAjUe5jSwIaw0s= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= @@ -34,8 +32,6 @@ golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= diff --git a/monero/client/client.go b/monero/client/client.go index 4c9f948..355c708 100644 --- a/monero/client/client.go +++ b/monero/client/client.go @@ -9,7 +9,7 @@ import ( "git.gammaspectra.live/P2Pool/consensus/v3/monero/transaction" "git.gammaspectra.live/P2Pool/consensus/v3/types" "git.gammaspectra.live/P2Pool/consensus/v3/utils" - "github.com/floatdrop/lru" + "github.com/hashicorp/golang-lru/v2" "sync" "sync/atomic" "time" @@ -55,7 +55,7 @@ type Client struct { c *rpc.Client d *daemon.Client - coinbaseTransactionCache *lru.LRU[types.Hash, *transaction.CoinbaseTransaction] + coinbaseTransactionCache *lru.Cache[types.Hash, *transaction.CoinbaseTransaction] throttler <-chan time.Time } @@ -65,10 +65,16 @@ func NewClient(address string) (*Client, error) { if err != nil { return nil, err } + + cache, err := lru.New[types.Hash, *transaction.CoinbaseTransaction](1024) + if err != nil { + return nil, err + } + return &Client{ c: c, d: daemon.NewClient(c), - coinbaseTransactionCache: lru.New[types.Hash, *transaction.CoinbaseTransaction](1024), + coinbaseTransactionCache: cache, throttler: time.Tick(time.Second / 8), }, nil } @@ -126,7 +132,7 @@ func (c *Client) GetTransactions(txIds ...types.Hash) (data [][]byte, jsonTx []* } func (c *Client) GetCoinbaseTransaction(txId types.Hash) (*transaction.CoinbaseTransaction, error) { - if tx := c.coinbaseTransactionCache.Get(txId); tx == nil { + if tx, ok := c.coinbaseTransactionCache.Get(txId); !ok || tx == nil { <-c.throttler if result, err := c.d.GetTransactions(context.Background(), []types.Hash{txId}); err != nil { return nil, err @@ -144,12 +150,12 @@ func (c *Client) GetCoinbaseTransaction(txId types.Hash) (*transaction.CoinbaseT return nil, fmt.Errorf("expected %s, got %s", txId.String(), tx.CalculateId().String()) } - c.coinbaseTransactionCache.Set(txId, tx) + c.coinbaseTransactionCache.Add(txId, tx) return tx, nil } } else { - return *tx, nil + return tx, nil } } diff --git a/p2pool/api/p2poolapi.go b/p2pool/api/p2poolapi.go index 3bfdbf7..3461165 100644 --- a/p2pool/api/p2poolapi.go +++ b/p2pool/api/p2poolapi.go @@ -9,7 +9,7 @@ import ( p2pooltypes "git.gammaspectra.live/P2Pool/consensus/v3/p2pool/types" "git.gammaspectra.live/P2Pool/consensus/v3/types" "git.gammaspectra.live/P2Pool/consensus/v3/utils" - "github.com/floatdrop/lru" + "github.com/hashicorp/golang-lru/v2" "io" "net/http" "net/netip" @@ -24,17 +24,21 @@ type P2PoolApi struct { Client *http.Client consensus atomic.Pointer[sidechain.Consensus] derivationCache sidechain.DerivationCacheInterface - difficultyByHeightCache *lru.LRU[uint64, types.Difficulty] + difficultyByHeightCache *lru.Cache[uint64, types.Difficulty] } func NewP2PoolApi(host string) *P2PoolApi { + cache, err := lru.New[uint64, types.Difficulty](1024) + if err != nil { + return nil + } return &P2PoolApi{ Host: host, Client: &http.Client{ Timeout: time.Second * 15, }, derivationCache: sidechain.NewDerivationLRUCache(), - difficultyByHeightCache: lru.New[uint64, types.Difficulty](1024), + difficultyByHeightCache: cache, } } diff --git a/utils/cache.go b/utils/cache.go index ee9e00f..c20cae8 100644 --- a/utils/cache.go +++ b/utils/cache.go @@ -1,7 +1,7 @@ package utils import ( - "github.com/floatdrop/lru" + "github.com/hashicorp/golang-lru/v2" "sync" "sync/atomic" ) @@ -15,7 +15,7 @@ type Cache[K comparable, T any] interface { } type LRUCache[K comparable, T any] struct { - values atomic.Pointer[lru.LRU[K, T]] + values atomic.Pointer[lru.Cache[K, T]] hits, misses atomic.Uint64 size int } @@ -29,9 +29,9 @@ func NewLRUCache[K comparable, T any](size int) *LRUCache[K, T] { } func (c *LRUCache[K, T]) Get(key K) (value T, ok bool) { - if v := c.values.Load().Get(key); v != nil { + if value, ok = c.values.Load().Get(key); !ok { c.hits.Add(1) - return *v, true + return value, true } else { c.misses.Add(1) return value, false @@ -39,7 +39,7 @@ func (c *LRUCache[K, T]) Get(key K) (value T, ok bool) { } func (c *LRUCache[K, T]) Set(key K, value T) { - c.values.Load().Set(key, value) + c.values.Load().Add(key, value) } func (c *LRUCache[K, T]) Delete(key K) { @@ -47,7 +47,11 @@ func (c *LRUCache[K, T]) Delete(key K) { } func (c *LRUCache[K, T]) Clear() { - c.values.Store(lru.New[K, T](c.size)) + cache, err := lru.New[K, T](c.size) + if err != nil { + panic(err) + } + c.values.Store(cache) } func (c *LRUCache[K, T]) Stats() (hits, misses uint64) {