Some draft stuff for Janos

This commit is contained in:
Balint Gabor 2018-01-04 16:51:11 +01:00
parent f3fdcb2064
commit c2bedb54fe
3 changed files with 48 additions and 29 deletions

View file

@ -122,18 +122,6 @@ func addRequester(rs *storage.RequestStatus, req *retrieveRequestMsg) {
rs.Requesters[req.Id] = append(list, req) rs.Requesters[req.Id] = append(list, req)
} }
/*
store requests are put in netstore so they are stored and then
forwarded to the peers in their kademlia proximity bin by the syncer
*/
type storeRequestMsg struct {
Key storage.Key
SData []byte // the stored chunk Data (incl size)
// optional
Id uint64 // request ID. if delivery, the ID is retrieve request ID
from Peer // [not serialised] protocol registers the requester
}
func (self storeRequestMsg) String() string { func (self storeRequestMsg) String() string {
var from string var from string
if self.from == nil { if self.from == nil {
@ -147,18 +135,3 @@ func (self storeRequestMsg) String() string {
} }
return fmt.Sprintf("from: %v, ID: %v, SData %x", from, self.Id, self.SData[:end]) return fmt.Sprintf("from: %v, ID: %v, SData %x", from, self.Id, self.SData[:end])
} }
// the entrypoint for store requests coming from the bzz wire protocol
// if key found locally, return. otherwise
// remote is untrusted, so hash is verified and chunk passed on to NetStore
func (self *RequestHandler) handleStoreRequestMsg(msg interface{}, p Peer) error {
req := msg.(*storeRequestMsg)
req.from = p
// TODO: chunk validation
chunk := storage.NewChunk(req.Key, nil)
chunk.SData = req.SData
chunk.Source = p
self.netStore.Put(chunk)
log.Trace(fmt.Sprintf("delivery of %v from %v", chunk, p))
return nil
}

View file

@ -22,6 +22,7 @@ import (
"fmt" "fmt"
"sync" "sync"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/p2p/discover" "github.com/ethereum/go-ethereum/p2p/discover"
"github.com/ethereum/go-ethereum/p2p/protocols" "github.com/ethereum/go-ethereum/p2p/protocols"
bv "github.com/ethereum/go-ethereum/swarm/network/bitvector" bv "github.com/ethereum/go-ethereum/swarm/network/bitvector"
@ -91,6 +92,18 @@ type UnsyncedKeysMsg struct {
*HandoverProof // HandoverProof *HandoverProof // HandoverProof
} }
/*
store requests are put in netstore so they are stored and then
forwarded to the peers in their kademlia proximity bin by the syncer
*/
type ChunkDeliveryMsg struct {
Key storage.Key
SData []byte // the stored chunk Data (incl size)
// optional
Id uint64 // request ID. if delivery, the ID is retrieve request ID
from Peer // [not serialised] protocol registers the requester
}
// String pretty prints UnsyncedKeysMsg // String pretty prints UnsyncedKeysMsg
func (self UnsyncedKeysMsg) String() string { func (self UnsyncedKeysMsg) String() string {
return fmt.Sprintf("Stream '%v' [%v-%v] (%v)", self.Stream, self.From, self.To, len(self.Hashes)/HashSize) return fmt.Sprintf("Stream '%v' [%v-%v] (%v)", self.Stream, self.From, self.To, len(self.Hashes)/HashSize)
@ -170,7 +183,7 @@ func (self *Streamer) PeerInfo(id discover.NodeID) interface{} {
} }
// OutgoingStreamer interface for outgoing peer Streamer // OutgoingStreamer interface for outgoing peer Streamer
type OutgoingStreamer interface { type OutgoingStreamerBackend interface {
CurrentBatch() []byte CurrentBatch() []byte
SetNextBatch(uint64, uint64) ([]byte, uint64, uint64, *HandoverProof, error) SetNextBatch(uint64, uint64) ([]byte, uint64, uint64, *HandoverProof, error)
GetData([]byte) []byte GetData([]byte) []byte
@ -178,7 +191,7 @@ type OutgoingStreamer interface {
} }
// IncomingStreamer interface for incoming peer Streamer // IncomingStreamer interface for incoming peer Streamer
type IncomingStreamer interface { type IncomingStreamerBackend interface {
NextBatch(uint64) (uint64, uint64) NextBatch(uint64) (uint64, uint64)
NeedData([]byte) func() NeedData([]byte) func()
Priority() int Priority() int
@ -197,6 +210,16 @@ type StreamerPeer struct {
quit chan struct{} quit chan struct{}
} }
type IncomingStreamer struct {
priority uint8
peer *StreamerPeer
}
type OutgoingStreamer struct {
priority uint8
peer *StreamerPeer
}
// NewStreamerPeer is the constructor for StreamerPeer // NewStreamerPeer is the constructor for StreamerPeer
func NewStreamerPeer(p Peer, streamer *Streamer) *StreamerPeer { func NewStreamerPeer(p Peer, streamer *Streamer) *StreamerPeer {
self := &StreamerPeer{ self := &StreamerPeer{
@ -255,6 +278,10 @@ func (self *StreamerPeer) setIncomingStreamer(s Stream, i IncomingStreamer) erro
return nil return nil
} }
func (self *OutgoingStreamer) Subscribe(s Stream) OutgoingStreamerBackend {
}
// Subscribe initiates the streamer // Subscribe initiates the streamer
func (self *StreamerPeer) Subscribe(s Stream, from, to uint64) error { func (self *StreamerPeer) Subscribe(s Stream, from, to uint64) error {
f, err := self.streamer.GetIncomingStreamer(s) f, err := self.streamer.GetIncomingStreamer(s)
@ -384,6 +411,18 @@ func (self *StreamerPeer) handleTakeoverProofMsg(msg interface{}) error {
return nil return nil
} }
func (self *StreamerPeer) handleChunkDeliveryMsg(msg interface{}) error {
req := msg.(*chunkDeliveryMsg)
req.from = self
// TODO: chunk validation
chunk := storage.NewChunk(req.Key, nil)
chunk.SData = req.SData
chunk.Source = p
self.netStore.Put(chunk)
log.Trace(fmt.Sprintf("delivery of %v from %v", chunk, p))
return nil
}
// Deliver sends a storeRequestMsg protocol message to the peer // Deliver sends a storeRequestMsg protocol message to the peer
func (self *StreamerPeer) Deliver(chunk *storage.Chunk, priority int) error { func (self *StreamerPeer) Deliver(chunk *storage.Chunk, priority int) error {
msg := &storeRequestMsg{ msg := &storeRequestMsg{
@ -451,6 +490,9 @@ func (self *StreamerPeer) HandleMsg(msg interface{}) error {
case *WantedKeysMsg: case *WantedKeysMsg:
return self.handleWantedKeysMsg(msg) return self.handleWantedKeysMsg(msg)
case *ChunkDeliveryMsg:
return self.handleChunkDeliveryMsg(msg)
default: default:
return fmt.Errorf("unknown message type: %T", msg) return fmt.Errorf("unknown message type: %T", msg)
} }

View file

@ -148,6 +148,10 @@ type IncomingSwarmSyncer struct {
end, start uint64 end, start uint64
} }
type {
Subscribe()
}
// NewIncomingSwarmSyncer is a contructor for provable data exchange syncer // NewIncomingSwarmSyncer is a contructor for provable data exchange syncer
func NewIncomingSwarmSyncer(po uint8, priority int, intervals []uint64, p Peer, store storage.ChunkStore, chunker storage.Chunker) (*IncomingSwarmSyncer, error) { func NewIncomingSwarmSyncer(po uint8, priority int, intervals []uint64, p Peer, store storage.ChunkStore, chunker storage.Chunker) (*IncomingSwarmSyncer, error) {
self := &IncomingSwarmSyncer{ self := &IncomingSwarmSyncer{