Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[actpool] Improve actqueue efficiency #3377

Merged
merged 7 commits into from
Jan 5, 2023

Conversation

Liuhaai
Copy link
Member

@Liuhaai Liuhaai commented May 4, 2022

Description

To enhance the throughput of the actpool module, multiple queueworkers are introduced to handle actions parallelly.
fix #3474

Type of change

  • Bug fix (non-breaking change which fixes an issue)

How Has This Been Tested?

make test

Checklist:

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published in downstream modules

@Liuhaai Liuhaai marked this pull request as ready for review May 18, 2022 05:43
@Liuhaai Liuhaai requested a review from a team as a code owner May 18, 2022 05:43
@codecov
Copy link

codecov bot commented May 18, 2022

Codecov Report

Merging #3377 (888de0f) into master (263ff82) will increase coverage by 0.68%.
The diff coverage is 81.33%.

@@            Coverage Diff             @@
##           master    #3377      +/-   ##
==========================================
+ Coverage   74.47%   75.15%   +0.68%     
==========================================
  Files         269      298      +29     
  Lines       23925    25110    +1185     
==========================================
+ Hits        17818    18872    +1054     
- Misses       5174     5262      +88     
- Partials      933      976      +43     
Impacted Files Coverage Δ
action/actctx.go 90.62% <ø> (+6.25%) ⬆️
action/action.go 82.35% <ø> (ø)
action/action_deserializer.go 57.14% <ø> (ø)
action/candidate_update.go 88.88% <0.00%> (-4.14%) ⬇️
action/consignment_transfer.go 90.41% <ø> (ø)
action/const.go 100.00% <ø> (ø)
action/execution.go 83.78% <ø> (ø)
action/grantreward.go 68.57% <ø> (ø)
action/protocol/account/protocol.go 86.90% <ø> (ø)
action/protocol/account/transfer.go 84.61% <ø> (ø)
... and 275 more

📣 We’re building smart automated test selection to slash your CI/CD build times. Learn more

@Liuhaai Liuhaai force-pushed the removePendingBalance branch 2 times, most recently from d9bc77b to b8a515b Compare May 18, 2022 18:23
}

// PendingNonce returns the current pending nonce of the queue
func (q *actQueue) PendingNonce() uint64 {
return q.pendingNonce
}

// ConfirmedNonce returns the current confirmed nonce of the queue
func (q *actQueue) ConfirmedNonce() uint64 {
Copy link
Member

Choose a reason for hiding this comment

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

seems this is never used, can remove?

Copy link
Member Author

Choose a reason for hiding this comment

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

this change will be used in #3343

q.pendingNonce = nonce
func (q *actQueue) SetConfirmedNonce(nonce uint64) {
q.confirmedNonce = nonce
q.pendingNonce = nonce + 1
}

// PendingNonce returns the current pending nonce of the queue
func (q *actQueue) PendingNonce() uint64 {
Copy link
Member

Choose a reason for hiding this comment

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

this seems also never used with the change

@@ -465,7 +465,7 @@ func (ws *workingSet) pickAndRunActions(
// do nothing
case action.ErrChainID, errUnsupportWeb3Staking:
continue
case action.ErrGasLimit:
case action.ErrGasLimit, action.ErrInsufficientFunds, state.ErrNotEnoughBalance:
Copy link
Member

Choose a reason for hiding this comment

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

we should not change this? this changes block generation logic

UpdateQueue(uint64) []action.SealedEnvelope
SetPendingNonce(uint64)
UpdateQueue() []action.SealedEnvelope
ConfirmedNonce() uint64
Copy link
Collaborator

Choose a reason for hiding this comment

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

don't introduce this concept, especially for "Read"

@Liuhaai
Copy link
Member Author

Liuhaai commented May 23, 2022

@Liuhaai Liuhaai added the pending label Jun 8, 2022
@Liuhaai Liuhaai changed the title [actpool] Remove pendingBalance [actpool] Improve actqueue efficiency Jun 9, 2022
@Liuhaai Liuhaai removed the pending label Jun 9, 2022
// SetPendingBalance sets pending balance for the queue
func (q *actQueue) SetPendingBalance(balance *big.Int) {
q.pendingBalance = balance
func (q *actQueue) SetAccountBalance(balance *big.Int) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

function name is inconsistent

}

// PendingBalance returns the current pending balance of the queue
func (q *actQueue) PendingBalance() *big.Int {
return q.pendingBalance
func (q *actQueue) AccountBalance() *big.Int {
Copy link
Collaborator

Choose a reason for hiding this comment

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

not consistent

}
}

func (worker *queueWorker) Start() {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Start(context.Contex) error with a goroutine inside
also add a Stop(context.Context) error function


func (worker *queueWorker) Start() {
if worker.queue == nil || worker.ap == nil {
panic("worker is invalid")
Copy link
Collaborator

Choose a reason for hiding this comment

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

return error

actpool/queueworker.go Outdated Show resolved Hide resolved
}
}

func (worker *queueWorker) Handle(job workerJob) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Handle(job) error

Copy link
Member Author

@Liuhaai Liuhaai Jun 27, 2022

Choose a reason for hiding this comment

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

it is fixed in prev pr, and is not included in f6be2f5

@Liuhaai Liuhaai force-pushed the removePendingBalance branch 2 times, most recently from e022a51 to 6b0a5f3 Compare July 17, 2022 06:02
actpool/actpool.go Outdated Show resolved Hide resolved
actpool/queueworker.go Outdated Show resolved Hide resolved
queue := worker.accountActs[sender]
worker.mu.RUnlock()

if queue == nil {
Copy link
Collaborator

Choose a reason for hiding this comment

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

is it possible that two actions from the same user are put into queue at the same time when the queue is nil, as a result, one of the action is actually abandoned?

Copy link
Member Author

@Liuhaai Liuhaai Sep 19, 2022

Choose a reason for hiding this comment

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

actpool/queueworker.go Outdated Show resolved Hide resolved
actpool/queueworker.go Show resolved Hide resolved
chainservice/chainservice.go Outdated Show resolved Hide resolved
@sonarcloud
Copy link

sonarcloud bot commented Sep 22, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 2 Code Smells

No Coverage information No Coverage information
0.5% 0.5% Duplication

actpool/actpool.go Outdated Show resolved Hide resolved
defer des.mu.Unlock()
destn, _ := act.Destination()
actHash, _ := act.Hash()
if desMap := des.acts[destn]; desMap == nil {
Copy link
Collaborator

Choose a reason for hiding this comment

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

if _, ok := ...; !ok {

Copy link
Member Author

Choose a reason for hiding this comment

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

good suggestion

@Liuhaai Liuhaai mentioned this pull request Dec 29, 2022
14 tasks

// func (ap *actPool) Stop() {
// }

Copy link
Member

Choose a reason for hiding this comment

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

remove if not needed

Copy link
Member

@dustinxie dustinxie Dec 29, 2022

Choose a reason for hiding this comment

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

or should put L156 ap.worker[i].Start() in Start() here?

Copy link
Member Author

Choose a reason for hiding this comment

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

add as a todo task

pendingActs := ap.accountActs[caller.String()].AllActs()
ap.removeInvalidActs(pendingActs)
delete(ap.accountActs, caller.String())
worker := ap.worker[ap.allocatedWorker(caller)]
Copy link
Member

Choose a reason for hiding this comment

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

worker is guaranteed != nil?

Copy link
Member Author

@Liuhaai Liuhaai Jan 4, 2023

Choose a reason for hiding this comment

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

ap.worker is a slice, and func allocatedWorker assures the worker is always available.

return action.ErrAddress
for _, ev := range ap.actionEnvelopeValidators {
span.AddEvent("ev.Validate")
if err := ev.Validate(ctx, *selp); err != nil {
Copy link
Member

Choose a reason for hiding this comment

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

is it possible to become Validate(ctx, selp)? maybe can be something to improve in future

Copy link
Member Author

Choose a reason for hiding this comment

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

you could add an todo for it.

dispatcher/dispatcher.go Outdated Show resolved Hide resolved
@sonarcloud
Copy link

sonarcloud bot commented Jan 5, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 1 Code Smell

No Coverage information No Coverage information
0.5% 0.5% Duplication

@Liuhaai Liuhaai merged commit 902ebe7 into iotexproject:master Jan 5, 2023
envestcc added a commit that referenced this pull request Jan 12, 2023
* move IsValidCandidateName to action package (#3706)

* move IsValidCandidateName to action package

* move IsValidCandidateName to action package

* delete validations.go

* update tests

* delete ErrInvalidAmount in staking

* Remove stale comment "This is an alpha release and is not ...." in all files (#3713)

* remove stale comment

* remove stale comment

* remove nonce field (#3714)

Co-authored-by: dustinxie <dahuaxie@gmail.com>

* [evm] proper handle refundSnapshot and upgrade go-ethereum release (#3715)

* [ioctl] modify did command parameters (#3668)

* modify action.Read default parameters

* use constant

* use config.GasStation instead of config.API #3718 (#3721)

Co-authored-by: dustinxie <dahuaxie@gmail.com>

* [genesis] set Okhotsk to activate at 01-11-2023 12am UTC (#3720)

* [tests] add more cases for gas refund (#3707)

* add more cases for gas refund

* remove debug flag

Co-authored-by: dustinxie <dahuaxie@gmail.com>

* [api] web3 rewarding action (#3691)

* add rewarding execute action

* add rewarding execute test

* add commmet for public type

* add builder test

* complete web3 rewarding read

* complete web3 rewarding read test

* remove read api and receive create rewarding action enterance

* add test to rlp tx test

* change name

* revert fix amount bug for deposit cost bug

* change check error style

* add entrance for web3 rewarding

Co-authored-by: dustinxie <dahuaxie@gmail.com>

* update mockgen (#3733)

* [ioctl] use candidate.OperatorAddress to show probated delegates (#3727)

Co-authored-by: dustinxie <dahuaxie@gmail.com>

* [config] move config.Consensus to consensus package (#3735)

* [action] validate candidate name  (#3705)

* Update release.yaml

* [config] move config.Blocksync to blocksync package (#3736)

* move config.BlockSync to blocksync package

* remove def of BlockSync in config

* rename newBlockSyncer to newBlockSyncerForTest

* [ioctl] Build contract deploy command line into new ioctl (#3708)

* [ioctl] build contract deploy command line into new ioctl

* build unittest to cover the modification1~

* group iotex-core packages

* remove stale comments

Co-authored-by: huofei <68298506@qq.com>

* [ioctl] Build contract invoke command line into new ioctl (#3709)

* [ioctl] build contract invoke command line into new ioctl

* build unittest to cover the modification1~

* remove stale comments

Co-authored-by: huofei <68298506@qq.com>

* [github] Update codeowner (#3742)

* [ioctl] Build contract compile command line into new ioctl (#3676)

* [ioctl] build contract compile command line into new ioctl

Co-authored-by: huof6890 <68298506@qq.com>

* [config] move config.API to api package (#3739)

* move config.GasStation to gasstation package

* move config.API to api package

* make fields of testConfig  to be private

Co-authored-by: CoderZhi <thecoderzhi@gmail.com>

* complete web3 intergrity test (#3743)

* complete tests

* complete requires

* format

* init monitor message framework

* [ioctl/newcmd] fix node delegate run failed  (#3729)

* fix grpc error and show right datas

* check chainMeta.Epoch

* modify as currEpochNum

* init broadcast framework

* update broadcast framework

* update broadcast framework

* [ioctl] Build contract test bytecode command line into new ioctl (#3738)

* [ioctl] build contract test bytecode command line into new ioctl

* build unittest to cover the modification

* format

Co-authored-by: huofei <68298506@qq.com>

* [ioctl] Build contract prepare command line into new ioctl (#3737)

* [ioctl] build contract prepare command line into new ioctl

* build unittest to cover the modification

* fix commit

* update assert message

* update solc version

* update solc message version

* format

* brew install solidity

Co-authored-by: huofei <68298506@qq.com>

* add node package to handle node info manager

* update

* Update release.yaml

* Revert "adding .dockerignore file to fix git submodule builds (#3689)" (#3750)

This reverts commit c14dcca.

Co-authored-by: Jeremi [IoTeX] Rynkiewicz JRPC <63042547+jrynkiew@users.noreply.github.com>

* update docker build command (#3751)

* [actpool] Improve actqueue efficiency (#3377)

* opt actpool.Add()

* improve actqueue efficiency

* add node info request and response message

* remove delegate manager dependency

* add message sign

* add sign for node info message

* fix unittest error

* Update CODEOWNERS (#3754)

* [rewarding] add active web3 rewarding settings (#3740)

* add active web3 rewarding settings

* check active when encoding is web3

* check active with deposit action

* remove check logic to workingset

* add check in API module

* fix check validte web3 rewarding bug

Co-authored-by: Haaai <55118568+Liuhaai@users.noreply.github.com>

* add unittest for node

* add pubkey in nodeinfo message

* fix compile error

* update go.mod

Co-authored-by: millken <millken@gmail.com>
Co-authored-by: huofei <68298506@qq.com>
Co-authored-by: dustinxie <dahuaxie@gmail.com>
Co-authored-by: Xueping Yang <xueping.yang@gmail.com>
Co-authored-by: xianhuawei <258022429@qq.com>
Co-authored-by: Jeremy Chou <lucky90322@gmail.com>
Co-authored-by: Haaai <55118568+Liuhaai@users.noreply.github.com>
Co-authored-by: CoderZhi <thecoderzhi@gmail.com>
Co-authored-by: Jeremi [IoTeX] Rynkiewicz JRPC <63042547+jrynkiew@users.noreply.github.com>
Liuhaai added a commit to Liuhaai/iotex-core that referenced this pull request Feb 13, 2023
* opt actpool.Add()

* improve actqueue efficiency
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Actpool improvement
4 participants