les: implement lespay client side

This commit is contained in:
Zsolt Felfoldi 2019-11-25 00:56:56 +01:00
parent 6ac3b2b81b
commit ab4a4af71a

View file

@ -40,6 +40,9 @@ type clientHandler struct {
downloader *downloader.Downloader downloader *downloader.Downloader
backend *LightEthereum backend *LightEthereum
lespayReplyHandlers map[uint64]func([][]byte) bool
lespayReplyLock sync.Mutex
closeCh chan struct{} closeCh chan struct{}
wg sync.WaitGroup // WaitGroup used to track all connected peers. wg sync.WaitGroup // WaitGroup used to track all connected peers.
syncDone func() // Test hooks when syncing is done. syncDone func() // Test hooks when syncing is done.
@ -50,6 +53,7 @@ func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.T
checkpoint: checkpoint, checkpoint: checkpoint,
backend: backend, backend: backend,
closeCh: make(chan struct{}), closeCh: make(chan struct{}),
lespayReplyHandlers: make(map[uint64]func([][]byte) bool),
} }
if ulcServers != nil { if ulcServers != nil {
ulc, err := newULC(ulcServers, ulcFraction) ulc, err := newULC(ulcServers, ulcFraction)
@ -156,7 +160,10 @@ func (h *clientHandler) handleMsg(p *peer) error {
} }
defer msg.Discard() defer msg.Discard()
var deliverMsg *Msg var (
deliverMsg *Msg
responseError bool
)
// Handle the message depending on its contents // Handle the message depending on its contents
switch msg.Code { switch msg.Code {
@ -308,6 +315,24 @@ func (h *clientHandler) handleMsg(p *peer) error {
p.fcServer.ResumeFreeze(bv) p.fcServer.ResumeFreeze(bv)
p.freezeServer(false) p.freezeServer(false)
p.Log().Debug("Service resumed") p.Log().Debug("Service resumed")
case LespayReplyMsg:
p.Log().Trace("Received tx status response")
var resp struct {
ReqID uint64
Replies [][]byte
}
if err := msg.Decode(&resp); err != nil {
return errResp(ErrDecode, "msg %v: %v", msg, err)
}
h.lespayReplyLock.Lock()
if handler := h.lespayReplyHandlers[resp.ReqID]; handler != nil {
delete(h.lespayReplyHandlers, resp.ReqID)
responseError = !handler(resp.Replies)
} else {
responseError = true
}
h.lespayReplyLock.Unlock()
default: default:
p.Log().Trace("Received invalid message", "code", msg.Code) p.Log().Trace("Received invalid message", "code", msg.Code)
return errResp(ErrInvalidMsgCode, "%v", msg.Code) return errResp(ErrInvalidMsgCode, "%v", msg.Code)
@ -315,15 +340,37 @@ func (h *clientHandler) handleMsg(p *peer) error {
// Deliver the received response to retriever. // Deliver the received response to retriever.
if deliverMsg != nil { if deliverMsg != nil {
if err := h.backend.retriever.deliver(p, deliverMsg); err != nil { if err := h.backend.retriever.deliver(p, deliverMsg); err != nil {
responseError = true
}
}
if responseError {
p.responseErrors++ p.responseErrors++
if p.responseErrors > maxResponseErrors { if p.responseErrors > maxResponseErrors {
return err return err
} }
} }
}
return nil return nil
} }
func (h *clientHandler) sendLespayCommands(p *peer, cmds [][]byte, handler func([][]byte) bool) func() bool {
reqID := genReqID()
if p.SendLespay(reqID, cmds) != nil {
return nil
}
return func() bool {
h.lespayReplyLock.Lock()
cancel := h.lespayReplyHandlers[reqID] != nil
if cancel {
delete(h.lespayReplyHandlers, reqID)
}
h.lespayReplyLock.Unlock()
if cancel {
handler(nil)
}
return cancel
}
}
func (h *clientHandler) removePeer(id string) { func (h *clientHandler) removePeer(id string) {
h.backend.peers.Unregister(id) h.backend.peers.Unregister(id)
} }