Skip to content

refactor: add-vote operation#558

Merged
shotonoff merged 19 commits intotd-115-fix-consensus-deadlockfrom
refactor-add-vote-operation
Feb 2, 2023
Merged

refactor: add-vote operation#558
shotonoff merged 19 commits intotd-115-fix-consensus-deadlockfrom
refactor-add-vote-operation

Conversation

@shotonoff
Copy link
Collaborator

@shotonoff shotonoff commented Jan 19, 2023

Issue being fixed or feature implemented

Implementation of AddVote operation has a bad design that leads in difficult reading and understanding this process.
In a discussion with @lklimek, we decided that this function must be refactored to make this process clear and maintainable

What was done?

The addVote operation was separated on several independent functions, which are used for prevote and precommit sets
A received vote is processed by the vote-set according to Vote.Type
Key design changes
there are 2 new types:

  • addVoteFunc func this type must be implemented by each function to be able to use in a add-vote set
  • addVoteMwFunc this type must be implemented by middleware function

The idea is to use middleware approach (or chain responsibility) where

  1. the process might be interrupted by a specific condition
  2. to follow the single responsibility principle

Voting has been split between these functions:

  • addVoteToLastPrecommitMw - either add a vote to last-precommit vote-set and break processing or move to the next item
  • addVoteValidateVoteMw - validate vote before to add and if a vote is valid to move to the next item
  • addVoteToVoteSet - this is the main function, it only has the logic of adding votes
  • addVoteUpdateValidBlockMw - updates state-data after successful adding vote and move to the next item
  • addVoteDispatchPrevoteMw - after successful added vote, executes the transition based on vote state for prevote and move to the next item
  • addVoteDispatchPrecommitMw - execute another transition based on vote state for precommit
  • addVoteVerifyVoteExtensionMw - before adding vote verify vote extensions if a vote is precommit
  • addVoteStatsMw - send msgInfo message to stats-queue
  • addVoteErrorMw - correct handle error
  • addVoteLoggingMw - write logs before and after adding the vote

How Has This Been Tested?

Unit-test / E2E test
Added a few new unit-tests for new code, need to add more

Breaking Changes

N/A

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

…e responsibility, use 2 sets (prevote and precommit) to process adding of vote
@shotonoff shotonoff changed the title refactor: separate TryAddVote.addVote logic on small function with on… refactor: add-vote operation Jan 19, 2023
@shotonoff shotonoff requested a review from lklimek January 24, 2023 16:47
Copy link
Collaborator Author

@shotonoff shotonoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please check the answers and changes according to the feedback

}
added, err := stateData.LastPrecommits.AddVote(vote)
if !added {
logger.Debug("vote not added to last precommits", logKeyValsWithError([]any(nil), err)...)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks like overkill

Suggested change
logger.Debug("vote not added to last precommits", logKeyValsWithError([]any(nil), err)...)
logger.Debug("vote not added to last precommits", "error", err)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, the idea is to add an error only if the error is not nil
your patch adds the error with nil value.
the empty (or nil) error leads difficult filtering the logs by error

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe add sme feature to our log package? to automatically skip error if it's nil. Like logger.Err(err).Debug()? (can be separate PR, to not increase scope of this one).

Copy link
Collaborator Author

@shotonoff shotonoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

applied changes by PR

}
added, err := stateData.LastPrecommits.AddVote(vote)
if !added {
logger.Debug("vote not added to last precommits", logKeyValsWithError([]any(nil), err)...)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, the idea is to add an error only if the error is not nil
your patch adds the error with nil value.
the empty (or nil) error leads difficult filtering the logs by error

}
added, err := stateData.LastPrecommits.AddVote(vote)
if !added {
logger.Debug("vote not added to last precommits", logKeyValsWithError([]any(nil), err)...)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe add sme feature to our log package? to automatically skip error if it's nil. Like logger.Err(err).Debug()? (can be separate PR, to not increase scope of this one).

@shotonoff shotonoff merged commit a251317 into td-115-fix-consensus-deadlock Feb 2, 2023
shotonoff added a commit that referenced this pull request Mar 17, 2023
* refactor: add sendMessage method to consensus.State

* refactor: modify sendMessage

* refactor: decompose WAL interface on a few small

* refactor: refactor an approach of message consuming for consensus state component

* refactor: add graceful stop for chanMsgReader

* refactor: consensus state priv-validator

* refactor: huge refactoring of consensus state, separate each state change task as a separate command, similar to state machine implementation

* refactor: add a stop function to a consensus to be able to stop receiveRoutine by a condition

* fix: remove block validating in finalizeCommit

* refactor: define Executor and VoteExtender interfaces, add executor mock, refactor return statement of Executor.ExtendVote

* test: add TestChanQueue, TestChanMsgSender, TestChanMsgReader

* test: generate PrivValidator mock

* refactor: move sending stats data from message handler

* refactor: add-vote operation (#558)

* refactor: separate TryAddVote.addVote logic on small function with one responsibility, use 2 sets (prevote and precommit) to process adding of vote
* refactor: replace peerID on proTxHash for peer catchup rounds in HeightVoteSet component
* fix: remove unused errors and StateData.validateVote

* refactor: EventSwitch implementation (#569)

* refactor: package lib/events rename on eventemitter and EventSwitch rename on EventEmitter, change EventEmitter api

* fix: add PeerManager.Unsubscribe method (#594)

* refactor: set and decide proposal operations (#565)

* refactor: set and decide proposal operations move to the separated component proposaler

* refactor: consensus peer gossip mechanism (#551)

* refactor: separate a gossip logic on implementation and a standard way of iterative handling a gossip condition

* chore: remove unless commented line

* refactor: remove custom "peerSyncErr" error

* refactor: add Gossiper interface, generate Gossiper mock struct, add unit test to queryMaj23GossipHandler

* refactor: peerGossipWorker implements service.Service

* refactor: blocksync module is refactored on using worker-pool

* test: replace custom assertError on tmrequire.Error

* refactor: add Now function into flowrate package, to obtain the current time

* fix: TestHandshakeErrorsIfAppReturnsWrongAppHash in replay_test.go

* refactor: move the logic wait-for blockchain sync from reactor to BlockPool

* fix: TestReactor_SyncTime

* test: change timing for test TestBlockPoolBasic

* chore: replace clock on clockwork

* refactor: replace reactor's consuming on separate consumer function in Channel, rename SetPeerRange on AddPeer

* test: add TestConsumeError

* chore: remove unused mustHexToBytes

* chore: add examples in promise/example_test.go and docs comments

* chore: change a package for MockValidatorSet from types on factory

* Update internal/blocksync/channel.go

* feat: create p2p/client package (#602)

* refactor: add internal/p2p/client implementation

* refactor: change blocksync module to support p2p client

* test: fix TestMakeHTTPDialerURL (#605)

* refactor: rename RandomNode on AnyNode as more specific name

* refactor: introduce p2p client in mempool module (#606)
@lklimek lklimek deleted the refactor-add-vote-operation branch February 1, 2024 13:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants