parent
ca05f3f10f
commit
9ec0272261
@ -0,0 +1,127 @@ |
||||
package stagedstreamsync |
||||
|
||||
import ( |
||||
"sync" |
||||
|
||||
"github.com/ethereum/go-ethereum/common" |
||||
"github.com/ethereum/go-ethereum/crypto" |
||||
"github.com/ethereum/go-ethereum/trie" |
||||
"github.com/harmony-one/harmony/core" |
||||
"github.com/harmony-one/harmony/core/rawdb" |
||||
"github.com/harmony-one/harmony/core/state" |
||||
sttypes "github.com/harmony-one/harmony/p2p/stream/types" |
||||
"github.com/ledgerwatch/erigon-lib/kv" |
||||
"github.com/rs/zerolog" |
||||
"golang.org/x/crypto/sha3" |
||||
) |
||||
|
||||
// trieTask represents a single trie node download task, containing a set of
|
||||
// peers already attempted retrieval from to detect stalled syncs and abort.
|
||||
type trieTask struct { |
||||
hash common.Hash |
||||
path [][]byte |
||||
attempts map[string]struct{} |
||||
} |
||||
|
||||
// codeTask represents a single byte code download task, containing a set of
|
||||
// peers already attempted retrieval from to detect stalled syncs and abort.
|
||||
type codeTask struct { |
||||
attempts map[string]struct{} |
||||
} |
||||
|
||||
type task struct { |
||||
trieTasks map[string]*trieTask // Set of trie node tasks currently queued for retrieval, indexed by path
|
||||
codeTasks map[common.Hash]*codeTask // Set of byte code tasks currently queued for retrieval, indexed by hash
|
||||
} |
||||
|
||||
func newTask() *task { |
||||
return &task{ |
||||
trieTasks: make(map[string]*trieTask), |
||||
codeTasks: make(map[common.Hash]*codeTask), |
||||
} |
||||
} |
||||
|
||||
func (t *task) addCodeTask(h common.Hash, ct *codeTask) { |
||||
t.codeTasks[h] = &codeTask{ |
||||
attempts: ct.attempts, |
||||
} |
||||
} |
||||
|
||||
func (t *task) getCodeTask(h common.Hash) *codeTask { |
||||
return t.codeTasks[h] |
||||
} |
||||
|
||||
func (t *task) addNewCodeTask(h common.Hash) { |
||||
t.codeTasks[h] = &codeTask{ |
||||
attempts: make(map[string]struct{}), |
||||
} |
||||
} |
||||
|
||||
func (t *task) deleteCodeTask(hash common.Hash) { |
||||
delete(t.codeTasks, hash) |
||||
} |
||||
|
||||
func (t *task) addTrieTask(hash common.Hash, path string) { |
||||
t.trieTasks[path] = &trieTask{ |
||||
hash: hash, |
||||
path: trie.NewSyncPath([]byte(path)), |
||||
attempts: make(map[string]struct{}), |
||||
} |
||||
} |
||||
|
||||
func (t *task) setTrieTask(path string, tt *trieTask) { |
||||
t.trieTasks[path] = &trieTask{ |
||||
hash: tt.hash, |
||||
path: tt.path, |
||||
attempts: tt.attempts, |
||||
} |
||||
} |
||||
|
||||
func (t *task) getTrieTask(path string) *trieTask { |
||||
return t.trieTasks[path] |
||||
} |
||||
|
||||
func (t *task) deleteTrieTask(path string) { |
||||
delete(t.trieTasks, path) |
||||
} |
||||
|
||||
// StateDownloadManager is the helper structure for get blocks request management
|
||||
type StateDownloadManager struct { |
||||
bc core.BlockChain |
||||
tx kv.RwTx |
||||
|
||||
protocol syncProtocol |
||||
root common.Hash // State root currently being synced
|
||||
sched *trie.Sync // State trie sync scheduler defining the tasks
|
||||
keccak crypto.KeccakState // Keccak256 hasher to verify deliveries with
|
||||
concurrency int |
||||
logger zerolog.Logger |
||||
lock sync.Mutex |
||||
|
||||
tasks *task |
||||
requesting *task |
||||
processing *task |
||||
retries *task |
||||
} |
||||
|
||||
func newStateDownloadManager(tx kv.RwTx, |
||||
bc core.BlockChain, |
||||
root common.Hash, |
||||
concurrency int, |
||||
logger zerolog.Logger) *StateDownloadManager { |
||||
|
||||
return &StateDownloadManager{ |
||||
bc: bc, |
||||
tx: tx, |
||||
root: root, |
||||
sched: state.NewStateSync(root, bc.ChainDb(), nil, rawdb.HashScheme), |
||||
keccak: sha3.NewLegacyKeccak256().(crypto.KeccakState), |
||||
concurrency: concurrency, |
||||
logger: logger, |
||||
tasks: newTask(), |
||||
requesting: newTask(), |
||||
processing: newTask(), |
||||
retries: newTask(), |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue