Skip to content

Commit a7ced3b

Browse files
author
Jeff Yanta
committed
Remove deprecated random nonce selection logic
1 parent e2347ff commit a7ced3b

File tree

8 files changed

+0
-631
lines changed

8 files changed

+0
-631
lines changed

pkg/code/data/internal.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ type DatabaseData interface {
135135
GetNonceCountByState(ctx context.Context, env nonce.Environment, instance string, state nonce.State) (uint64, error)
136136
GetNonceCountByStateAndPurpose(ctx context.Context, env nonce.Environment, instance string, state nonce.State, purpose nonce.Purpose) (uint64, error)
137137
GetAllNonceByState(ctx context.Context, env nonce.Environment, instance string, state nonce.State, opts ...query.Option) ([]*nonce.Record, error)
138-
GetRandomAvailableNonceByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose) (*nonce.Record, error)
139138
BatchClaimAvailableNoncesByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose, limit int, nodeID string, minExpireAt, maxExpireAt time.Time) ([]*nonce.Record, error)
140139
SaveNonce(ctx context.Context, record *nonce.Record) error
141140

@@ -530,9 +529,6 @@ func (dp *DatabaseProvider) GetAllNonceByState(ctx context.Context, env nonce.En
530529

531530
return dp.nonces.GetAllByState(ctx, env, instance, state, req.Cursor, req.Limit, req.SortBy)
532531
}
533-
func (dp *DatabaseProvider) GetRandomAvailableNonceByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose) (*nonce.Record, error) {
534-
return dp.nonces.GetRandomAvailableByPurpose(ctx, env, instance, purpose)
535-
}
536532
func (dp *DatabaseProvider) BatchClaimAvailableNoncesByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose, limit int, nodeID string, minExpireAt, maxExpireAt time.Time) ([]*nonce.Record, error) {
537533
return dp.nonces.BatchClaimAvailableByPurpose(ctx, env, instance, purpose, limit, nodeID, minExpireAt, maxExpireAt)
538534
}

pkg/code/data/nonce/memory/store.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -232,22 +232,6 @@ func (s *store) GetAllByState(ctx context.Context, env nonce.Environment, instan
232232
return nil, nonce.ErrNonceNotFound
233233
}
234234

235-
func (s *store) GetRandomAvailableByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose) (*nonce.Record, error) {
236-
s.mu.Lock()
237-
defer s.mu.Unlock()
238-
239-
items := s.findByStateAndPurpose(env, instance, nonce.StateAvailable, purpose)
240-
items = append(items, s.findByStateAndPurpose(env, instance, nonce.StateClaimed, purpose)...)
241-
items = s.filterAvailableToClaim(items)
242-
if len(items) == 0 {
243-
return nil, nonce.ErrNonceNotFound
244-
}
245-
246-
index := rand.Intn(len(items))
247-
cloned := items[index].Clone()
248-
return &cloned, nil
249-
}
250-
251235
func (s *store) BatchClaimAvailableByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose, limit int, nodeID string, minExpireAt, maxExpireAt time.Time) ([]*nonce.Record, error) {
252236
s.mu.Lock()
253237
defer s.mu.Unlock()

pkg/code/data/nonce/postgres/model.go

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -201,53 +201,6 @@ func dbGetAllByState(ctx context.Context, db *sqlx.DB, env nonce.Environment, in
201201
return res, nil
202202
}
203203

204-
// todo: Implementation still isn't perfect, but better than no randomness. It's
205-
// sufficiently efficient, as long as our nonce pool is larger than the max offset.
206-
// todo: We may need to tune the offset based on pool size and environment, but it
207-
// should be sufficiently good enough for now.
208-
func dbGetRandomAvailableByPurpose(ctx context.Context, db *sqlx.DB, env nonce.Environment, instance string, purpose nonce.Purpose) (*nonceModel, error) {
209-
res := &nonceModel{}
210-
211-
// Signature null check is required because some legacy records didn't have this
212-
// set and causes this call to fail. This is a result of the field not being
213-
// defined at the time of record creation.
214-
//
215-
// todo: Fix said nonce records
216-
query := `SELECT
217-
id, address, authority, blockhash, environment, environment_instance, purpose, state, signature, claim_node_id, claim_expires_at, version
218-
FROM ` + nonceTableName + `
219-
WHERE environment = $1 AND environment_instance = $2 AND ((state = $3) OR (state = $4 AND claim_expires_at < $5)) AND purpose = $6 AND signature IS NOT NULL
220-
OFFSET FLOOR(RANDOM() * 100)
221-
LIMIT 1
222-
`
223-
fallbackQuery := `SELECT
224-
id, address, authority, blockhash, environment, environment_instance, purpose, state, signature, claim_node_id, claim_expires_at, version
225-
FROM ` + nonceTableName + `
226-
WHERE environment = $1 AND environment_instance = $2 AND ((state = $3) OR (state = $4 AND claim_expires_at < $5)) AND purpose = $6 AND signature IS NOT NULL
227-
LIMIT 1
228-
`
229-
230-
nowMs := time.Now().UnixMilli()
231-
err := db.GetContext(ctx, res, query, env, instance, nonce.StateAvailable, nonce.StateClaimed, nowMs, purpose)
232-
if err != nil {
233-
err = pgutil.CheckNoRows(err, nonce.ErrNonceNotFound)
234-
235-
// No nonces found. Because our query isn't perfect, fall back to a
236-
// strategy that will guarantee to select something if an available
237-
// nonce exists.
238-
if err == nonce.ErrNonceNotFound {
239-
err := db.GetContext(ctx, res, fallbackQuery, env, instance, nonce.StateAvailable, nonce.StateClaimed, nowMs, purpose)
240-
if err != nil {
241-
return nil, pgutil.CheckNoRows(err, nonce.ErrNonceNotFound)
242-
}
243-
return res, nil
244-
}
245-
246-
return nil, err
247-
}
248-
return res, nil
249-
}
250-
251204
func dbBatchClaimAvailableByPurpose(
252205
ctx context.Context,
253206
db *sqlx.DB,

pkg/code/data/nonce/postgres/store.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,6 @@ func (s *store) GetAllByState(ctx context.Context, env nonce.Environment, instan
7272
return nonces, nil
7373
}
7474

75-
func (s *store) GetRandomAvailableByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose) (*nonce.Record, error) {
76-
model, err := dbGetRandomAvailableByPurpose(ctx, s.db, env, instance, purpose)
77-
if err != nil {
78-
return nil, err
79-
}
80-
return fromNonceModel(model), nil
81-
}
82-
8375
func (s *store) BatchClaimAvailableByPurpose(ctx context.Context, env nonce.Environment, instance string, purpose nonce.Purpose, limit int, nodeID string, minExpireAt, maxExpireAt time.Time) ([]*nonce.Record, error) {
8476
models, err := dbBatchClaimAvailableByPurpose(ctx, s.db, env, instance, purpose, limit, nodeID, minExpireAt, maxExpireAt)
8577
if err != nil {

pkg/code/data/nonce/store.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@ type Store interface {
3333
// Returns ErrNotFound if no records are found.
3434
GetAllByState(ctx context.Context, env Environment, instance string, state State, cursor query.Cursor, limit uint64, direction query.Ordering) ([]*Record, error)
3535

36-
// GetRandomAvailableByPurpose gets a random available nonce for a purpose within
37-
// an environment instance.
38-
//
39-
// Returns ErrNotFound if no records are found.
40-
//
41-
// Deprecated in favour of BatchClaimAvailableByPurpose
42-
GetRandomAvailableByPurpose(ctx context.Context, env Environment, instance string, purpose Purpose) (*Record, error)
43-
4436
// BatchClaimAvailableByPurpose batch claims up to the specified limit.
4537
//
4638
// The returned nonces will be marked as claimed by the current node, with

pkg/code/data/nonce/tests/tests.go

Lines changed: 0 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ func RunTests(t *testing.T, s nonce.Store, teardown func()) {
2323
testUpdate,
2424
testGetAllByState,
2525
testGetCount,
26-
testGetRandomAvailableByPurpose,
2726
testBatchClaimAvailableByPurpose,
2827
testBatchClaimAvailableByPurposeExpirationRandomness,
2928
} {
@@ -285,105 +284,6 @@ func testGetCount(t *testing.T, s nonce.Store) {
285284
})
286285
}
287286

288-
func testGetRandomAvailableByPurpose(t *testing.T, s nonce.Store) {
289-
t.Run("testGetRandomAvailableByPurpose", func(t *testing.T) {
290-
ctx := context.Background()
291-
292-
_, err := s.GetRandomAvailableByPurpose(ctx, nonce.EnvironmentSolana, nonce.EnvironmentInstanceSolanaMainnet, nonce.PurposeClientTransaction)
293-
assert.Equal(t, nonce.ErrNonceNotFound, err)
294-
295-
for _, purpose := range []nonce.Purpose{
296-
nonce.PurposeClientTransaction,
297-
nonce.PurposeInternalServerProcess,
298-
} {
299-
for _, state := range []nonce.State{
300-
nonce.StateUnknown,
301-
nonce.StateAvailable,
302-
nonce.StateReserved,
303-
nonce.StateReleased,
304-
nonce.StateClaimed,
305-
} {
306-
for i := 0; i < 50; i++ {
307-
record := &nonce.Record{
308-
Address: fmt.Sprintf("nonce_%s_%s_%d", purpose, state, i),
309-
Authority: "authority",
310-
Blockhash: "bh",
311-
Environment: nonce.EnvironmentSolana,
312-
EnvironmentInstance: nonce.EnvironmentInstanceSolanaMainnet,
313-
Purpose: purpose,
314-
State: state,
315-
Signature: "",
316-
}
317-
if state == nonce.StateClaimed {
318-
record.ClaimNodeID = pointer.String("node_id")
319-
320-
if i < 25 {
321-
record.ClaimExpiresAt = pointer.Time(time.Now().Add(-time.Hour))
322-
} else {
323-
record.ClaimExpiresAt = pointer.Time(time.Now().Add(time.Hour))
324-
}
325-
}
326-
require.NoError(t, s.Save(ctx, record))
327-
}
328-
}
329-
}
330-
331-
for i := 0; i < 100; i++ {
332-
record := &nonce.Record{
333-
Address: fmt.Sprintf("nonce_devnet_%d", i),
334-
Authority: "authority",
335-
Blockhash: "bh",
336-
Environment: nonce.EnvironmentSolana,
337-
EnvironmentInstance: nonce.EnvironmentInstanceSolanaDevnet,
338-
Purpose: nonce.PurposeInternalServerProcess,
339-
State: nonce.StateAvailable,
340-
Signature: "",
341-
}
342-
require.NoError(t, s.Save(ctx, record))
343-
344-
record = &nonce.Record{
345-
Address: fmt.Sprintf("nonce_cvm_%d", i),
346-
Authority: "authority",
347-
Blockhash: "bh",
348-
Environment: nonce.EnvironmentCvm,
349-
EnvironmentInstance: "pubkey",
350-
Purpose: nonce.PurposeClientTransaction,
351-
State: nonce.StateClaimed,
352-
Signature: "",
353-
ClaimNodeID: pointer.String("node_id"),
354-
ClaimExpiresAt: pointer.Time(time.Now().Add(-time.Hour)),
355-
}
356-
require.NoError(t, s.Save(ctx, record))
357-
}
358-
359-
for _, purpose := range []nonce.Purpose{nonce.PurposeClientTransaction, nonce.PurposeInternalServerProcess} {
360-
availableState, claimedState := 0, 0
361-
selectedByAddress := make(map[string]struct{})
362-
for i := 0; i < 100; i++ {
363-
actual, err := s.GetRandomAvailableByPurpose(ctx, nonce.EnvironmentSolana, nonce.EnvironmentInstanceSolanaMainnet, purpose)
364-
require.NoError(t, err)
365-
assert.Equal(t, purpose, actual.Purpose)
366-
assert.Equal(t, nonce.EnvironmentSolana, actual.Environment)
367-
assert.Equal(t, nonce.EnvironmentInstanceSolanaMainnet, actual.EnvironmentInstance)
368-
assert.True(t, actual.IsAvailableToClaim())
369-
assert.True(t, actual.CanReserveWithSignature())
370-
switch actual.State {
371-
case nonce.StateAvailable:
372-
availableState++
373-
case nonce.StateClaimed:
374-
claimedState++
375-
assert.True(t, time.Now().After(*actual.ClaimExpiresAt))
376-
default:
377-
}
378-
selectedByAddress[actual.Address] = struct{}{}
379-
}
380-
assert.True(t, len(selectedByAddress) > 10)
381-
assert.NotZero(t, availableState)
382-
assert.NotZero(t, claimedState)
383-
}
384-
})
385-
}
386-
387287
func testBatchClaimAvailableByPurpose(t *testing.T, s nonce.Store) {
388288
t.Run("testBatchClaimAvailableByPurpose", func(t *testing.T) {
389289
ctx := context.Background()

0 commit comments

Comments
 (0)