diff options
author | John Lee <64482439+algojohnlee@users.noreply.github.com> | 2021-12-13 07:05:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-13 07:05:09 -0500 |
commit | 97e8068037c429f8ac866b0eae899593f9aa5d13 (patch) | |
tree | 198bec61bd20f2fb0f22890b610af9da32909a46 | |
parent | b6cbbf34a8837b9f8161cd29b0b034ee0b4e4942 (diff) | |
parent | 34b3ecac5a84797f28fc3cb831d12b021b3b458b (diff) |
Merge pull request #3305 from Algo-devops-service/relstable3.2.2v3.2.2-stable
go-algorand 3.2.2-stable
-rw-r--r-- | buildnumber.dat | 2 | ||||
-rw-r--r-- | catchup/service.go | 14 | ||||
-rw-r--r-- | cmd/goal/account.go | 55 |
3 files changed, 62 insertions, 9 deletions
diff --git a/buildnumber.dat b/buildnumber.dat index d00491fd7..0cfbf0888 100644 --- a/buildnumber.dat +++ b/buildnumber.dat @@ -1 +1 @@ -1 +2 diff --git a/catchup/service.go b/catchup/service.go index 27ce957ba..de4a52a94 100644 --- a/catchup/service.go +++ b/catchup/service.go @@ -241,8 +241,10 @@ func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool, if err != nil { if err == errLedgerAlreadyHasBlock { - // ledger already has the block, no need to request this block from anyone. - return true + // ledger already has the block, no need to request this block. + // only the agreement could have added this block into the ledger, catchup is complete + s.log.Infof("fetchAndWrite(%d): the block is already in the ledger. The catchup is complete", r) + return false } s.log.Debugf("fetchAndWrite(%v): Could not fetch: %v (attempt %d)", r, err, i) peerSelector.rankPeer(psp, peerRankDownloadFailed) @@ -353,8 +355,10 @@ func (s *Service) fetchAndWrite(r basics.Round, prevFetchCompleteChan chan bool, s.log.Infof("fetchAndWrite(%d): no need to re-evaluate historical block", r) return true case ledgercore.BlockInLedgerError: - s.log.Infof("fetchAndWrite(%d): block already in ledger", r) - return true + // the block was added to the ledger from elsewhere after fetching it here + // only the agreement could have added this block into the ledger, catchup is complete + s.log.Infof("fetchAndWrite(%d): after fetching the block, it is already in the ledger. The catchup is complete", r) + return false case protocol.Error: if !s.protocolErrorLogged { logging.Base().Errorf("fetchAndWrite(%v): unrecoverable protocol error detected: %v", r, err) @@ -387,7 +391,7 @@ func (s *Service) pipelineCallback(r basics.Round, thisFetchComplete chan bool, thisFetchComplete <- fetchResult if !fetchResult { - s.log.Infof("failed to fetch block %v", r) + s.log.Infof("pipelineCallback(%d): did not fetch or write the block", r) return 0 } return r diff --git a/cmd/goal/account.go b/cmd/goal/account.go index 7d20af38f..ccc37f227 100644 --- a/cmd/goal/account.go +++ b/cmd/goal/account.go @@ -59,7 +59,7 @@ var ( partKeyOutDir string partKeyFile string partKeyDeleteInput bool - listpartkeyCompat bool + partkeyCompat bool importDefault bool mnemonic string dumpOutFile string @@ -167,7 +167,10 @@ func init() { installParticipationKeyCmd.Flags().BoolVar(&partKeyDeleteInput, "delete-input", false, "Acknowledge that installpartkey will delete the input key file") // listpartkey flags - listParticipationKeysCmd.Flags().BoolVarP(&listpartkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.") + listParticipationKeysCmd.Flags().BoolVarP(&partkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.") + + // partkeyinfo flags + partkeyInfoCmd.Flags().BoolVarP(&partkeyCompat, "compatibility", "c", false, "Print output in compatibility mode. This option will be removed in a future release, please use REST API for tooling.") // import flags importCmd.Flags().BoolVarP(&importDefault, "default", "f", false, "Set this account as the default one") @@ -1069,6 +1072,7 @@ func uintToStr(number uint64) string { // legacyListParticipationKeysCommand prints key information in the same // format as earlier versions of goal. Some users are using this information // in scripts and need some extra time to migrate to the REST API. +// DEPRECATED func legacyListParticipationKeysCommand() { dataDir := ensureSingleDataDir() @@ -1118,7 +1122,7 @@ var listParticipationKeysCmd = &cobra.Command{ Long: `List all participation keys tracked by algod along with summary of additional information. For detailed key information use 'partkeyinfo'.`, Args: validateNoPosArgsFn, Run: func(cmd *cobra.Command, args []string) { - if listpartkeyCompat { + if partkeyCompat { legacyListParticipationKeysCommand() return } @@ -1364,12 +1368,57 @@ func strOrNA(value *uint64) string { return uintToStr(*value) } +// legacyPartkeyInfoCommand prints key information in the same +// format as earlier versions of goal. Some users are using this information +// in scripts and need some extra time to migrate to alternatives. +// DEPRECATED +func legacyPartkeyInfoCommand() { + type partkeyInfo struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + Address string `codec:"acct"` + FirstValid basics.Round `codec:"first"` + LastValid basics.Round `codec:"last"` + VoteID crypto.OneTimeSignatureVerifier `codec:"vote"` + SelectionID crypto.VRFVerifier `codec:"sel"` + VoteKeyDilution uint64 `codec:"voteKD"` + } + + onDataDirs(func(dataDir string) { + fmt.Printf("Dumping participation key info from %s...\n", dataDir) + client := ensureGoalClient(dataDir, libgoal.DynamicClient) + + // Make sure we don't already have a partkey valid for (or after) specified roundLastValid + parts, err := client.ListParticipationKeyFiles() + if err != nil { + reportErrorf(errorRequestFail, err) + } + + for filename, part := range parts { + fmt.Println("------------------------------------------------------------------") + info := partkeyInfo{ + Address: part.Address().String(), + FirstValid: part.FirstValid, + LastValid: part.LastValid, + VoteID: part.VotingSecrets().OneTimeSignatureVerifier, + SelectionID: part.VRFSecrets().PK, + VoteKeyDilution: part.KeyDilution, + } + infoString := protocol.EncodeJSON(&info) + fmt.Printf("File: %s\n%s\n", filename, string(infoString)) + } + }) +} + var partkeyInfoCmd = &cobra.Command{ Use: "partkeyinfo", Short: "Output details about all available part keys", Long: `Output details about all available part keys in the specified data directory(ies), such as key validity period.`, Args: validateNoPosArgsFn, Run: func(cmd *cobra.Command, args []string) { + if partkeyCompat { + legacyPartkeyInfoCommand() + return + } onDataDirs(func(dataDir string) { fmt.Printf("Dumping participation key info from %s...\n", dataDir) |