2023-10-12 12:29:21 -07:00
|
|
|
package ccq
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
gossipv1 "github.com/certusone/wormhole/node/pkg/proto/gossip/v1"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PendingResponse struct {
|
|
|
|
req *gossipv1.SignedQueryRequest
|
|
|
|
ch chan *SignedResponse
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewPendingResponse(req *gossipv1.SignedQueryRequest) *PendingResponse {
|
|
|
|
return &PendingResponse{
|
|
|
|
req: req,
|
|
|
|
ch: make(chan *SignedResponse),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type PendingResponses struct {
|
|
|
|
pendingResponses map[string]*PendingResponse
|
|
|
|
mu sync.RWMutex
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewPendingResponses() *PendingResponses {
|
|
|
|
return &PendingResponses{
|
2023-11-06 12:16:43 -08:00
|
|
|
// Make this channel bigger than the number of responses we ever expect to get for a query.
|
|
|
|
pendingResponses: make(map[string]*PendingResponse, 100),
|
2023-10-12 12:29:21 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PendingResponses) Add(r *PendingResponse) bool {
|
|
|
|
signature := hex.EncodeToString(r.req.Signature)
|
|
|
|
p.mu.Lock()
|
|
|
|
defer p.mu.Unlock()
|
|
|
|
if _, ok := p.pendingResponses[signature]; ok {
|
|
|
|
// the request w/ this signature is already being handled
|
|
|
|
// don't overwrite
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
p.pendingResponses[signature] = r
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PendingResponses) Get(signature string) *PendingResponse {
|
|
|
|
p.mu.RLock()
|
|
|
|
defer p.mu.RUnlock()
|
|
|
|
if r, ok := p.pendingResponses[signature]; ok {
|
|
|
|
return r
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PendingResponses) Remove(r *PendingResponse) {
|
|
|
|
signature := hex.EncodeToString(r.req.Signature)
|
|
|
|
p.mu.Lock()
|
|
|
|
defer p.mu.Unlock()
|
|
|
|
delete(p.pendingResponses, signature)
|
|
|
|
}
|
2023-12-11 14:00:46 -08:00
|
|
|
|
|
|
|
func (p *PendingResponses) NumPending() int {
|
|
|
|
p.mu.Lock()
|
|
|
|
defer p.mu.Unlock()
|
|
|
|
return len(p.pendingResponses)
|
|
|
|
}
|