addRequester now called when protocol addRetreiveRequest is called

- on a newly created chunk, newRequestStatus is called
- newRequestStatus: C ready channel and requesters map initialised
- fix logmessage bug by checking is request.peer is nil (outgoing request)
This commit is contained in:
zelig 2015-05-24 19:19:17 +01:00
parent 12d3bc019e
commit b06226678e
3 changed files with 36 additions and 13 deletions

View file

@ -130,7 +130,7 @@ func (self *NetStore) addStoreRequest(req *storeRequestMsgData) {
} else { } else {
return return
} }
chunk.source = &req.peer chunk.source = req.peer
self.put(chunk) self.put(chunk)
} }
@ -170,12 +170,18 @@ func (self *NetStore) get(key Key) (chunk *Chunk) {
} }
if chunk.req == nil { if chunk.req == nil {
chunk.req = new(requestStatus) chunk.req = newRequestStatus()
chunk.req.C = make(chan bool)
} }
return return
} }
func newRequestStatus() *requestStatus {
return &requestStatus{
requesters: make(map[int64][]*retrieveRequestMsgData),
C: make(chan bool),
}
}
func (self *NetStore) addRetrieveRequest(req *retrieveRequestMsgData) { func (self *NetStore) addRetrieveRequest(req *retrieveRequestMsgData) {
self.lock.Lock() self.lock.Lock()
@ -214,6 +220,7 @@ func (self *NetStore) startSearch(chunk *Chunk, id int64, timeout *time.Time) {
} }
for _, peer := range peers { for _, peer := range peers {
dpaLogger.Debugf("NetStore.startSearch: sending retrieveRequests to peer [%064x]", req.Key) dpaLogger.Debugf("NetStore.startSearch: sending retrieveRequests to peer [%064x]", req.Key)
dpaLogger.Debugf("req.requesters: %v", chunk.req.requesters)
var requester bool var requester bool
OUT: OUT:
for _, recipients := range chunk.req.requesters { for _, recipients := range chunk.req.requesters {
@ -238,7 +245,7 @@ func generateId() int64 {
/* /*
adds a new peer to an existing open request adds a new peer to an existing open request
only add if less than requesterCount peers forwarded the same request id so far only add if less than requesterCount peers forwarded the same request id so far
note this is done irrespective of status (searching or found/timedOut) note this is done irrespective of status (searching or found)
*/ */
func (self *NetStore) addRequester(rs *requestStatus, req *retrieveRequestMsgData) { func (self *NetStore) addRequester(rs *requestStatus, req *retrieveRequestMsgData) {
dpaLogger.Debugf("NetStore.addRequester: key %064x - add peer [%v] to req.Id %064x", req.Key, req.peer, req.Id) dpaLogger.Debugf("NetStore.addRequester: key %064x - add peer [%v] to req.Id %064x", req.Key, req.peer, req.Id)
@ -260,7 +267,7 @@ this is the most simplistic implementation:
*/ */
func (self *NetStore) strategyUpdateRequest(rs *requestStatus, req *retrieveRequestMsgData) (timeout *time.Time) { func (self *NetStore) strategyUpdateRequest(rs *requestStatus, req *retrieveRequestMsgData) (timeout *time.Time) {
dpaLogger.Debugf("NetStore.strategyUpdateRequest: key %064x", req.Key) dpaLogger.Debugf("NetStore.strategyUpdateRequest: key %064x", req.Key)
self.addRequester(rs, req)
if rs.status == reqSearching { if rs.status == reqSearching {
timeout = self.searchTimeout(rs, req) timeout = self.searchTimeout(rs, req)
} }

View file

@ -119,11 +119,17 @@ type storeRequestMsgData struct {
storageTimeout *time.Time // expiry of content storageTimeout *time.Time // expiry of content
Metadata metaData // Metadata metaData //
// //
peer peer peer *peer
} }
func (self storeRequestMsgData) String() string { func (self storeRequestMsgData) String() string {
return fmt.Sprintf("From: %v, Key: %x; ID: %v, requestTimeout: %v, storageTimeout: %v, SData %x", self.peer.Addr(), self.Key[:4], self.Id, self.requestTimeout, self.storageTimeout, self.SData[:10]) var from string
if self.peer == nil {
from = "self"
} else {
from = self.peer.Addr().String()
}
return fmt.Sprintf("From: %v, Key: %x; ID: %v, requestTimeout: %v, storageTimeout: %v, SData %x", from, self.Key[:4], self.Id, self.requestTimeout, self.storageTimeout, self.SData[:10])
} }
/* /*
@ -142,11 +148,17 @@ type retrieveRequestMsgData struct {
timeout *time.Time // timeout *time.Time //
//Metadata metaData // //Metadata metaData //
// //
peer peer // protocol registers the requester peer *peer // protocol registers the requester
} }
func (self retrieveRequestMsgData) String() string { func (self retrieveRequestMsgData) String() string {
return fmt.Sprintf("From: %v, Key: %x; ID: %v, MaxSize: %v, MaxPeers: %v", self.peer.Addr(), self.Key[:4], self.Id, self.MaxSize, self.MaxPeers) var from string
if self.peer == nil {
from = "self"
} else {
from = self.peer.Addr().String()
}
return fmt.Sprintf("From: %v, Key: %x; ID: %v, MaxSize: %v, MaxPeers: %v", from, self.Key[:4], self.Id, self.MaxSize, self.MaxPeers)
} }
type peerAddr struct { type peerAddr struct {
@ -187,7 +199,7 @@ type peersMsgData struct {
Key Key // if a response to a retrieval request Key Key // if a response to a retrieval request
Id uint64 // if a response to a retrieval request Id uint64 // if a response to a retrieval request
// //
peer peer peer *peer
} }
/* /*
@ -280,7 +292,7 @@ func (self *bzzProtocol) handle() error {
if err := msg.Decode(&req); err != nil { if err := msg.Decode(&req); err != nil {
return self.protoError(ErrDecode, "msg %v: %v", msg, err) return self.protoError(ErrDecode, "msg %v: %v", msg, err)
} }
req.peer = peer{bzzProtocol: self} req.peer = &peer{bzzProtocol: self}
self.netStore.addStoreRequest(&req) self.netStore.addStoreRequest(&req)
case retrieveRequestMsg: case retrieveRequestMsg:
@ -292,7 +304,7 @@ func (self *bzzProtocol) handle() error {
if req.Key == nil { if req.Key == nil {
return self.protoError(ErrDecode, "protocol handler: req.Key == nil || req.Timeout == nil") return self.protoError(ErrDecode, "protocol handler: req.Key == nil || req.Timeout == nil")
} }
req.peer = peer{bzzProtocol: self} req.peer = &peer{bzzProtocol: self}
self.netStore.addRetrieveRequest(&req) self.netStore.addRetrieveRequest(&req)
case peersMsg: case peersMsg:
@ -300,7 +312,7 @@ func (self *bzzProtocol) handle() error {
if err := msg.Decode(&req); err != nil { if err := msg.Decode(&req); err != nil {
return self.protoError(ErrDecode, "->msg %v: %v", msg, err) return self.protoError(ErrDecode, "->msg %v: %v", msg, err)
} }
req.peer = peer{bzzProtocol: self} req.peer = &peer{bzzProtocol: self}
self.netStore.hive.addPeerEntries(&req) self.netStore.hive.addPeerEntries(&req)
default: default:

View file

@ -52,6 +52,10 @@ type Kademlia struct {
type Address common.Hash type Address common.Hash
func (a Address) String() string {
return fmt.Sprintf("%x", a[:])
}
type Node interface { type Node interface {
Addr() Address Addr() Address
Url() string Url() string