Skip to content

Commit 99b37ac

Browse files
authored
Merge pull request #4683 from Algo-devops-service/relstable3.11.2
2 parents e1b890a + b42c463 commit 99b37ac

File tree

27 files changed

+1273
-341
lines changed

27 files changed

+1273
-341
lines changed

buildnumber.dat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0
1+
2

cmd/goal/commands.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@ import (
2929
"github.com/spf13/cobra/doc"
3030
"golang.org/x/crypto/ssh/terminal"
3131

32-
algodclient "github.com/algorand/go-algorand/daemon/algod/api/client"
33-
kmdclient "github.com/algorand/go-algorand/daemon/kmd/client"
34-
3532
"github.com/algorand/go-algorand/config"
3633
"github.com/algorand/go-algorand/daemon/algod/api/spec/common"
3734
"github.com/algorand/go-algorand/data/bookkeeping"
@@ -381,7 +378,6 @@ func getGoalClient(dataDir string, clientType libgoal.ClientType) (client libgoa
381378
if err != nil {
382379
return
383380
}
384-
client.SetAPIVersionAffinity(algodclient.APIVersionV2, kmdclient.APIVersionV1)
385381
return
386382
}
387383

cmd/pingpong/runCmd.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ var pidFile string
7272
var cpuprofile string
7373
var randSeed int64
7474
var deterministicKeys bool
75-
var generatedAccountsCount uint32
75+
var generatedAccountsCount uint64
76+
var generatedAccountsOffset uint64
7677
var generatedAccountSampleMethod string
7778
var configPath string
7879

@@ -118,8 +119,9 @@ func init() {
118119
runCmd.Flags().StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to `file`")
119120
runCmd.Flags().Int64Var(&randSeed, "seed", 0, "input to math/rand.Seed(), defaults to time.Now().UnixNano()")
120121
runCmd.Flags().BoolVar(&deterministicKeys, "deterministicKeys", false, "Draw from set of netgoal-created accounts using deterministic keys")
121-
runCmd.Flags().Uint32Var(&generatedAccountsCount, "genaccounts", 0, "The total number of accounts pre-generated by netgoal")
122-
runCmd.Flags().StringVar(&generatedAccountSampleMethod, "gensamplemethod", "random", "The method of sampling from the total # of pre-generated accounts")
122+
runCmd.Flags().Uint64Var(&generatedAccountsCount, "genaccounts", 0, "The total number of accounts pre-generated by netgoal")
123+
runCmd.Flags().Uint64Var(&generatedAccountsOffset, "genaccountsoffset", 0, "The initial offset for sampling from the total # of pre-generated accounts")
124+
runCmd.Flags().StringVar(&generatedAccountSampleMethod, "gensamplemethod", "", "The method of sampling from the total # of pre-generated accounts")
123125
}
124126

125127
var runCmd = &cobra.Command{
@@ -378,16 +380,23 @@ var runCmd = &cobra.Command{
378380
if !deterministicKeys && generatedAccountsCount > 0 {
379381
reportErrorf("generatedAccountsCount requires deterministicKeys=true")
380382
}
381-
if deterministicKeys && numAccounts > generatedAccountsCount {
383+
if deterministicKeys && uint64(numAccounts) > generatedAccountsCount {
382384
reportErrorf("numAccounts must be <= generatedAccountsCount")
383385
}
384386
cfg.DeterministicKeys = deterministicKeys || cfg.DeterministicKeys
385387
if generatedAccountsCount != 0 {
386388
cfg.GeneratedAccountsCount = generatedAccountsCount
387389
}
390+
if generatedAccountsOffset != 0 {
391+
cfg.GeneratedAccountsOffset = generatedAccountsOffset
392+
}
388393
if generatedAccountSampleMethod != "" {
389394
cfg.GeneratedAccountSampleMethod = generatedAccountSampleMethod
390395
}
396+
// check if numAccounts is greater than the length of the mnemonic list, if provided
397+
if cfg.DeterministicKeys && cfg.NumPartAccounts > uint32(len(cfg.GeneratedAccountsMnemonics)) {
398+
reportErrorf("numAccounts is greater than number of account mnemonics provided")
399+
}
391400

392401
cfg.SetDefaultWeights()
393402
err = cfg.Check()

config/localTemplate.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type Local struct {
4141
// Version tracks the current version of the defaults so we can migrate old -> new
4242
// This is specifically important whenever we decide to change the default value
4343
// for an existing parameter. This field tag must be updated any time we add a new version.
44-
Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19" version[20]:"20" version[21]:"21" version[22]:"22" version[23]:"23"`
44+
Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19" version[20]:"20" version[21]:"21" version[22]:"22" version[23]:"23" version[24]:"24"`
4545

4646
// environmental (may be overridden)
4747
// When enabled, stores blocks indefinitely, otherwise, only the most recent blocks
@@ -71,7 +71,7 @@ type Local struct {
7171
// Logging
7272
BaseLoggerDebugLevel uint32 `version[0]:"1" version[1]:"4"`
7373
// if this is 0, do not produce agreement.cadaver
74-
CadaverSizeTarget uint64 `version[0]:"1073741824"`
74+
CadaverSizeTarget uint64 `version[0]:"1073741824" version[24]:"0"`
7575

7676
// IncomingConnectionsLimit specifies the max number of long-lived incoming
7777
// connections. 0 means no connections allowed. Must be non-negative.

config/local_defaults.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
package config
2121

2222
var defaultLocal = Local{
23-
Version: 23,
23+
Version: 24,
2424
AccountUpdatesStatsInterval: 5000000000,
2525
AccountsRebuildSynchronousMode: 1,
2626
AgreementIncomingBundlesQueueLength: 7,
@@ -31,7 +31,7 @@ var defaultLocal = Local{
3131
BaseLoggerDebugLevel: 4,
3232
BlockServiceCustomFallbackEndpoints: "",
3333
BroadcastConnectionsLimit: -1,
34-
CadaverSizeTarget: 1073741824,
34+
CadaverSizeTarget: 0,
3535
CatchpointFileHistoryLength: 365,
3636
CatchpointInterval: 10000,
3737
CatchpointTracking: 0,

crypto/batchverifier.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ package crypto
3838
import "C"
3939
import (
4040
"errors"
41+
"runtime"
4142
"unsafe"
4243
)
4344

@@ -172,6 +173,10 @@ func batchVerificationImpl(messages [][]byte, publicKeys []SignatureVerifier, si
172173
C.size_t(len(messages)),
173174
(*C.int)(unsafe.Pointer(valid)))
174175

176+
runtime.KeepAlive(messages)
177+
runtime.KeepAlive(publicKeys)
178+
runtime.KeepAlive(signatures)
179+
175180
failed = make([]bool, numberOfSignatures)
176181
for i := 0; i < numberOfSignatures; i++ {
177182
cint := *(*C.int)(unsafe.Pointer(uintptr(valid) + uintptr(i*C.sizeof_int)))

crypto/batchverifier_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package crypto
1818

1919
import (
2020
"math/rand"
21+
"runtime"
2122
"testing"
2223

2324
"github.com/stretchr/testify/require"
@@ -193,3 +194,29 @@ func TestBatchVerifierIndividualResultsAllValid(t *testing.T) {
193194
}
194195
}
195196
}
197+
198+
func TestBatchVerifierGC(t *testing.T) {
199+
partitiontest.PartitionTest(t)
200+
201+
const n = 128
202+
for i := 0; i < 100; i++ {
203+
t.Run("", func(t *testing.T) {
204+
t.Parallel()
205+
206+
bv := MakeBatchVerifierWithHint(n)
207+
var s Seed
208+
209+
for i := 0; i < n; i++ {
210+
msg := randString()
211+
RandBytes(s[:])
212+
sigSecrets := GenerateSignatureSecrets(s)
213+
sig := sigSecrets.Sign(msg)
214+
bv.EnqueueSignature(sigSecrets.SignatureVerifier, msg, sig)
215+
}
216+
require.NoError(t, bv.Verify())
217+
218+
runtime.GC()
219+
})
220+
}
221+
222+
}

daemon/algod/api/client/restClient.go

Lines changed: 10 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,6 @@ const (
4646
maxRawResponseBytes = 50e6
4747
)
4848

49-
// APIVersion is used to define which server side API version would be used when making http requests to the server
50-
type APIVersion string
51-
52-
const (
53-
// APIVersionV1 suggests that the RestClient would use v1 calls whenever it's available for the given request.
54-
APIVersionV1 APIVersion = "v1"
55-
// APIVersionV2 suggests that the RestClient would use v2 calls whenever it's available for the given request.
56-
APIVersionV2 APIVersion = "v2"
57-
)
58-
5949
// rawRequestPaths is a set of paths where the body should not be urlencoded
6050
var rawRequestPaths = map[string]bool{
6151
"/v1/transactions": true,
@@ -91,27 +81,18 @@ func (e HTTPError) Error() string {
9181

9282
// RestClient manages the REST interface for a calling user.
9383
type RestClient struct {
94-
serverURL url.URL
95-
apiToken string
96-
versionAffinity APIVersion
84+
serverURL url.URL
85+
apiToken string
9786
}
9887

9988
// MakeRestClient is the factory for constructing a RestClient for a given endpoint
10089
func MakeRestClient(url url.URL, apiToken string) RestClient {
10190
return RestClient{
102-
serverURL: url,
103-
apiToken: apiToken,
104-
versionAffinity: APIVersionV1,
91+
serverURL: url,
92+
apiToken: apiToken,
10593
}
10694
}
10795

108-
// SetAPIVersionAffinity sets the client affinity to use a specific version of the API
109-
func (client *RestClient) SetAPIVersionAffinity(affinity APIVersion) (previousAffinity APIVersion) {
110-
previousAffinity = client.versionAffinity
111-
client.versionAffinity = affinity
112-
return
113-
}
114-
11596
// filterASCII filter out the non-ascii printable characters out of the given input string.
11697
// It's used as a security qualifier before adding network provided data into an error message.
11798
// The function allows only characters in the range of [32..126], which excludes all the
@@ -251,31 +232,13 @@ func (client RestClient) post(response interface{}, path string, request interfa
251232
// the StatusResponse includes data like the consensus version and current round
252233
// Not supported
253234
func (client RestClient) Status() (response generatedV2.NodeStatusResponse, err error) {
254-
switch client.versionAffinity {
255-
case APIVersionV2:
256-
err = client.get(&response, "/v2/status", nil)
257-
default:
258-
var nodeStatus v1.NodeStatus
259-
err = client.get(&nodeStatus, "/v1/status", nil)
260-
if err == nil {
261-
response = fillNodeStatusResponse(nodeStatus)
262-
}
263-
}
235+
err = client.get(&response, "/v2/status", nil)
264236
return
265237
}
266238

267239
// WaitForBlock returns the node status after waiting for the given round.
268240
func (client RestClient) WaitForBlock(round basics.Round) (response generatedV2.NodeStatusResponse, err error) {
269-
switch client.versionAffinity {
270-
case APIVersionV2:
271-
err = client.get(&response, fmt.Sprintf("/v2/status/wait-for-block-after/%d/", round), nil)
272-
default:
273-
var nodeStatus v1.NodeStatus
274-
err = client.get(&nodeStatus, fmt.Sprintf("/v1/status/wait-for-block-after/%d/", round), nil)
275-
if err == nil {
276-
response = fillNodeStatusResponse(nodeStatus)
277-
}
278-
}
241+
err = client.get(&response, fmt.Sprintf("/v2/status/wait-for-block-after/%d/", round), nil)
279242
return
280243
}
281244

@@ -302,17 +265,7 @@ func fillNodeStatusResponse(nodeStatus v1.NodeStatus) generatedV2.NodeStatusResp
302265
// blocks on the node end
303266
// Not supported
304267
func (client RestClient) StatusAfterBlock(blockNum uint64) (response generatedV2.NodeStatusResponse, err error) {
305-
switch client.versionAffinity {
306-
case APIVersionV2:
307-
err = client.get(&response, fmt.Sprintf("/v2/status/wait-for-block-after/%d", blockNum), nil)
308-
default:
309-
var nodeStatus v1.NodeStatus
310-
err = client.get(&nodeStatus, fmt.Sprintf("/v1/status/wait-for-block-after/%d", blockNum), nil)
311-
if err == nil {
312-
response = fillNodeStatusResponse(nodeStatus)
313-
}
314-
}
315-
268+
err = client.get(&response, fmt.Sprintf("/v2/status/wait-for-block-after/%d", blockNum), nil)
316269
return
317270
}
318271

@@ -546,16 +499,9 @@ func (client RestClient) Block(round uint64) (response v1.Block, err error) {
546499

547500
// RawBlock gets the encoded, raw msgpack block for the given round
548501
func (client RestClient) RawBlock(round uint64) (response []byte, err error) {
549-
switch client.versionAffinity {
550-
case APIVersionV2:
551-
var blob Blob
552-
err = client.getRaw(&blob, fmt.Sprintf("/v2/blocks/%d", round), rawFormat{Format: "msgpack"})
553-
response = blob
554-
default:
555-
var raw v1.RawBlock
556-
err = client.getRaw(&raw, fmt.Sprintf("/v1/block/%d", round), rawblockParams{1})
557-
response = raw
558-
}
502+
var blob Blob
503+
err = client.getRaw(&blob, fmt.Sprintf("/v2/blocks/%d", round), rawFormat{Format: "msgpack"})
504+
response = blob
559505
return
560506
}
561507

daemon/kmd/client/client.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,6 @@ const (
2525
timeoutSecs = 120
2626
)
2727

28-
// APIVersion is used to define which server side API version would be used when making http requests to the server
29-
type APIVersion string
30-
31-
const (
32-
// APIVersionV1 suggests that the RestClient would use v1 calls whenever it's available for the given request.
33-
APIVersionV1 APIVersion = "v1"
34-
)
35-
3628
// KMDClient is the client used to interact with the kmd API over its socket
3729
type KMDClient struct {
3830
httpClient http.Client

0 commit comments

Comments
 (0)