sync state data
(hash common.Hash)
| 15 | |
| 16 | // sync state data |
| 17 | func (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 |