MCPcopy Create free account
hub / github.com/CPChain/chain / processFastSyncContent

Method processFastSyncContent

protocols/cpc/syncer/sync_state.go:17–88  ·  view source on GitHub ↗

sync state data

(hash common.Hash)

Source from the content-addressed store, hash-verified

15
16// sync state data
17func (s *Synchronizer) processFastSyncContent(hash common.Hash) error {
18 var (
19 batch = MaxStateFetch
20 sched *trie.Sync
21 stats = struct {
22 start time.Time
23 }{}
24 )
25 callback := func(leaf []byte, parent common.Hash) error {
26 var obj state_object.Account
27 if err := rlp.Decode(bytes.NewReader(leaf), &obj); err != nil {
28 return err
29 }
30 sched.AddSubTrie(obj.Root, 64, parent, nil)
31 sched.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent)
32 return nil
33 }
34 _ = callback
35 sched = trie.NewSync(hash, s.blockchain.Database(), callback)
36 queue := append([]common.Hash{}, sched.Missing(batch)...)
37
38 // fetch data
39
40 for len(queue) > 0 {
41 log.Debug("Queue", "len", len(queue))
42 var results []trie.SyncResult
43 stats.start = time.Now()
44
45 s.syncRequestStateDataCh <- queue
46 timer := time.NewTimer(SyncStateTimeout)
47
48 select {
49 case data := <-s.syncStateDataCh:
50 // wait state data
51 log.Debug("received state data", "len", len(data))
52 results = make([]trie.SyncResult, len(data))
53 if len(queue) < len(data) {
54 log.Error("len(queue) != len(data)", "queue", len(queue), "data", len(data))
55 return errors.New("sync state error")
56 }
57 for i, item := range data {
58 results[i] = trie.SyncResult{Hash: queue[i], Data: item}
59 }
60 case <-timer.C:
61 s.stateSyncErrCh <- ErrTimeout
62 log.Error("state sync timeout error")
63 return ErrTimeout
64 case <-s.cancelCh:
65 s.processFastSyncContentCh <- struct{}{}
66 return errCanceled
67 case <-s.quitCh:
68 return errQuitSync
69 }
70
71 // push the results to sched
72 if _, _, err := sched.Process(results); err != nil {
73 s.stateSyncErrCh <- err
74 return err

Callers 1

synchroniseMethod · 0.95

Calls 7

DebugMethod · 0.80
DatabaseMethod · 0.65
NowMethod · 0.65
ErrorMethod · 0.65
ProcessMethod · 0.65
CommitMethod · 0.65
InfoMethod · 0.65

Tested by

no test coverage detected