Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
dms3
go-unixfs
Commits
05b80afc
Commit
05b80afc
authored
10 years ago
by
Jeromy
Committed by
Juan Batiz-Benet
10 years ago
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix swarm message type code, i beleive it works well now
parent
afdac2ca
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
93 additions
and
69 deletions
+93
-69
routing/dht/dht.go
routing/dht/dht.go
+13
-12
routing/dht/ext_test.go
routing/dht/ext_test.go
+2
-2
routing/dht/routing.go
routing/dht/routing.go
+3
-3
swarm/interface.go
swarm/interface.go
+2
-3
swarm/mes_wrapper.pb.go
swarm/mes_wrapper.pb.go
+7
-4
swarm/mes_wrapper.proto
swarm/mes_wrapper.proto
+2
-1
swarm/swarm.go
swarm/swarm.go
+34
-41
swarm/swarm_test.go
swarm/swarm_test.go
+6
-3
swarm/wrapper.go
swarm/wrapper.go
+24
-0
No files found.
routing/dht/dht.go
View file @
05b80afc
...
...
@@ -28,6 +28,7 @@ type IpfsDHT struct {
routingTables
[]
*
kb
.
RoutingTable
network
swarm
.
Network
netChan
*
swarm
.
Chan
// Local peer (yourself)
self
*
peer
.
Peer
...
...
@@ -55,6 +56,7 @@ type IpfsDHT struct {
func
NewDHT
(
p
*
peer
.
Peer
,
net
swarm
.
Network
)
*
IpfsDHT
{
dht
:=
new
(
IpfsDHT
)
dht
.
network
=
net
dht
.
netChan
=
net
.
GetChannel
(
swarm
.
PBWrapper_DHT_MESSAGE
)
dht
.
datastore
=
ds
.
NewMapDatastore
()
dht
.
self
=
p
dht
.
providers
=
NewProviderManager
()
...
...
@@ -101,10 +103,9 @@ func (dht *IpfsDHT) handleMessages() {
u
.
DOut
(
"Begin message handling routine
\n
"
)
errs
:=
dht
.
network
.
GetErrChan
()
dhtmes := dht.network.GetChannel(swarm.PBWrapper_DHT_MESSAGE)
for
{
select
{
case mes, ok := <-dht
mes
:
case
mes
,
ok
:=
<-
dht
.
netChan
.
Incoming
:
if
!
ok
{
u
.
DOut
(
"handleMessages closing, bad recv on incoming
\n
"
)
return
...
...
@@ -165,7 +166,7 @@ func (dht *IpfsDHT) putValueToNetwork(p *peer.Peer, key string, value []byte) er
}
mes
:=
swarm
.
NewMessage
(
p
,
pmes
.
ToProtobuf
())
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
return
nil
}
...
...
@@ -225,7 +226,7 @@ func (dht *IpfsDHT) handleGetValue(p *peer.Peer, pmes *PBDHTMessage) {
out
:
mes
:=
swarm
.
NewMessage
(
p
,
resp
.
ToProtobuf
())
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
// Store a value in this peer local storage
...
...
@@ -247,7 +248,7 @@ func (dht *IpfsDHT) handlePing(p *peer.Peer, pmes *PBDHTMessage) {
ID
:
pmes
.
GetId
(),
}
dht.net
work.Send(
swarm.NewMessage(p, resp.ToProtobuf())
)
dht
.
net
Chan
.
Outgoing
<-
swarm
.
NewMessage
(
p
,
resp
.
ToProtobuf
())
}
func
(
dht
*
IpfsDHT
)
handleFindPeer
(
p
*
peer
.
Peer
,
pmes
*
PBDHTMessage
)
{
...
...
@@ -258,7 +259,7 @@ func (dht *IpfsDHT) handleFindPeer(p *peer.Peer, pmes *PBDHTMessage) {
}
defer
func
()
{
mes
:=
swarm
.
NewMessage
(
p
,
resp
.
ToProtobuf
())
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}()
level
:=
pmes
.
GetValue
()[
0
]
u
.
DOut
(
"handleFindPeer: searching for '%s'
\n
"
,
peer
.
ID
(
pmes
.
GetKey
())
.
Pretty
())
...
...
@@ -310,7 +311,7 @@ func (dht *IpfsDHT) handleGetProviders(p *peer.Peer, pmes *PBDHTMessage) {
}
mes
:=
swarm
.
NewMessage
(
p
,
resp
.
ToProtobuf
())
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
type
providerInfo
struct
{
...
...
@@ -336,7 +337,7 @@ func (dht *IpfsDHT) handleDiagnostic(p *peer.Peer, pmes *PBDHTMessage) {
for
_
,
ps
:=
range
seq
{
mes
:=
swarm
.
NewMessage
(
ps
,
pmes
)
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
buf
:=
new
(
bytes
.
Buffer
)
...
...
@@ -372,7 +373,7 @@ out:
}
mes
:=
swarm
.
NewMessage
(
p
,
resp
.
ToProtobuf
())
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
func
(
dht
*
IpfsDHT
)
getValueOrPeers
(
p
*
peer
.
Peer
,
key
u
.
Key
,
timeout
time
.
Duration
,
level
int
)
([]
byte
,
[]
*
peer
.
Peer
,
error
)
{
...
...
@@ -429,7 +430,7 @@ func (dht *IpfsDHT) getValueSingle(p *peer.Peer, key u.Key, timeout time.Duratio
mes
:=
swarm
.
NewMessage
(
p
,
pmes
.
ToProtobuf
())
t
:=
time
.
Now
()
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
// Wait for either the response or a timeout
timeup
:=
time
.
After
(
timeout
)
...
...
@@ -545,7 +546,7 @@ func (dht *IpfsDHT) findPeerSingle(p *peer.Peer, id peer.ID, timeout time.Durati
mes
:=
swarm
.
NewMessage
(
p
,
pmes
.
ToProtobuf
())
listenChan
:=
dht
.
listener
.
Listen
(
pmes
.
ID
,
1
,
time
.
Minute
)
t
:=
time
.
Now
()
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
after
:=
time
.
After
(
timeout
)
select
{
case
<-
after
:
...
...
@@ -581,7 +582,7 @@ func (dht *IpfsDHT) findProvidersSingle(p *peer.Peer, key u.Key, level int, time
mes
:=
swarm
.
NewMessage
(
p
,
pmes
.
ToProtobuf
())
listenChan
:=
dht
.
listener
.
Listen
(
pmes
.
ID
,
1
,
time
.
Minute
)
dht.net
work.Send(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
after
:=
time
.
After
(
timeout
)
select
{
case
<-
after
:
...
...
This diff is collapsed.
Click to expand it.
routing/dht/ext_test.go
View file @
05b80afc
...
...
@@ -70,8 +70,8 @@ func (f *fauxNet) GetErrChan() chan error {
return
f
.
Chan
.
Errors
}
func
(
f
*
fauxNet
)
GetChannel
(
t
swarm
.
PBWrapper_MessageType
)
chan
*
swarm
.
Message
{
return
f
.
Chan
.
Incoming
func
(
f
*
fauxNet
)
GetChannel
(
t
swarm
.
PBWrapper_MessageType
)
*
swarm
.
Chan
{
return
f
.
Chan
}
func
(
f
*
fauxNet
)
Connect
(
addr
*
ma
.
Multiaddr
)
(
*
peer
.
Peer
,
error
)
{
...
...
This diff is collapsed.
Click to expand it.
routing/dht/routing.go
View file @
05b80afc
...
...
@@ -240,7 +240,7 @@ func (dht *IpfsDHT) Provide(key u.Key) error {
for
_
,
p
:=
range
peers
{
mes
:=
swarm
.
NewMessage
(
p
,
pbmes
)
dht
.
net
work
.
Send
(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
return
nil
}
...
...
@@ -352,7 +352,7 @@ func (dht *IpfsDHT) Ping(p *peer.Peer, timeout time.Duration) error {
before
:=
time
.
Now
()
responseChan
:=
dht
.
listener
.
Listen
(
pmes
.
ID
,
1
,
time
.
Minute
)
dht
.
net
work
.
Send
(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
tout
:=
time
.
After
(
timeout
)
select
{
...
...
@@ -385,7 +385,7 @@ func (dht *IpfsDHT) getDiagnostic(timeout time.Duration) ([]*diagInfo, error) {
pbmes
:=
pmes
.
ToProtobuf
()
for
_
,
p
:=
range
targets
{
mes
:=
swarm
.
NewMessage
(
p
,
pbmes
)
dht
.
net
work
.
Send
(
mes
)
dht
.
net
Chan
.
Outgoing
<-
mes
}
var
out
[]
*
diagInfo
...
...
This diff is collapsed.
Click to expand it.
swarm/interface.go
View file @
05b80afc
...
...
@@ -8,14 +8,13 @@ import (
)
type
Network
interface
{
Send
(
*
Message
)
Error
(
error
)
Find
(
u
.
Key
)
*
peer
.
Peer
Listen
()
error
ConnectNew
(
*
ma
.
Multiaddr
)
(
*
peer
.
Peer
,
error
)
GetConnection
(
id
peer
.
ID
,
addr
*
ma
.
Multiaddr
)
(
*
peer
.
Peer
,
error
)
Error
(
error
)
GetErrChan
()
chan
error
GetChannel
(
PBWrapper_MessageType
)
c
han
*
Message
GetChannel
(
PBWrapper_MessageType
)
*
C
han
Close
()
Drop
(
*
peer
.
Peer
)
error
}
This diff is collapsed.
Click to expand it.
swarm/mes_wrapper.pb.go
View file @
05b80afc
...
...
@@ -23,14 +23,17 @@ var _ = math.Inf
type
PBWrapper_MessageType
int32
const
(
PBWrapper_DHT_MESSAGE
PBWrapper_MessageType
=
0
PBWrapper_TEST
PBWrapper_MessageType
=
0
PBWrapper_DHT_MESSAGE
PBWrapper_MessageType
=
1
)
var
PBWrapper_MessageType_name
=
map
[
int32
]
string
{
0
:
"DHT_MESSAGE"
,
0
:
"TEST"
,
1
:
"DHT_MESSAGE"
,
}
var
PBWrapper_MessageType_value
=
map
[
string
]
int32
{
"DHT_MESSAGE"
:
0
,
"TEST"
:
0
,
"DHT_MESSAGE"
:
1
,
}
func
(
x
PBWrapper_MessageType
)
Enum
()
*
PBWrapper_MessageType
{
...
...
@@ -64,7 +67,7 @@ func (m *PBWrapper) GetType() PBWrapper_MessageType {
if
m
!=
nil
&&
m
.
Type
!=
nil
{
return
*
m
.
Type
}
return
PBWrapper_
DHT_MESSAGE
return
PBWrapper_
TEST
}
func
(
m
*
PBWrapper
)
GetMessage
()
[]
byte
{
...
...
This diff is collapsed.
Click to expand it.
swarm/mes_wrapper.proto
View file @
05b80afc
...
...
@@ -2,7 +2,8 @@ package swarm;
message
PBWrapper
{
enum
MessageType
{
DHT_MESSAGE
=
0
;
TEST
=
0
;
DHT_MESSAGE
=
1
;
}
required
MessageType
Type
=
1
;
...
...
This diff is collapsed.
Click to expand it.
swarm/swarm.go
View file @
05b80afc
...
...
@@ -38,7 +38,7 @@ func NewMessage(p *peer.Peer, data proto.Message) *Message {
}
}
// Chan is a swam channel, which provides duplex communication and errors.
// Chan is a swa
r
m channel, which provides duplex communication and errors.
type
Chan
struct
{
Outgoing
chan
*
Message
Incoming
chan
*
Message
...
...
@@ -84,7 +84,7 @@ type Swarm struct {
conns
ConnMap
connsLock
sync
.
RWMutex
filterChans
map
[
PBWrapper_MessageType
]
c
han
*
Message
filterChans
map
[
PBWrapper_MessageType
]
*
C
han
toFilter
chan
*
Message
newFilters
chan
*
newFilterInfo
...
...
@@ -98,7 +98,7 @@ func NewSwarm(local *peer.Peer) *Swarm {
Chan
:
NewChan
(
10
),
conns
:
ConnMap
{},
local
:
local
,
filterChans
:
make
(
map
[
PBWrapper_MessageType
]
c
han
*
Message
),
filterChans
:
make
(
map
[
PBWrapper_MessageType
]
*
C
han
),
toFilter
:
make
(
chan
*
Message
,
32
),
newFilters
:
make
(
chan
*
newFilterInfo
),
}
...
...
@@ -233,6 +233,8 @@ func (s *Swarm) Dial(peer *peer.Peer) (*Conn, error, bool) {
return
conn
,
nil
,
false
}
// StartConn adds the passed in connection to its peerMap and starts
// the fanIn routine for that connection
func
(
s
*
Swarm
)
StartConn
(
conn
*
Conn
)
error
{
if
conn
==
nil
{
return
errors
.
New
(
"Tried to start nil connection."
)
...
...
@@ -275,14 +277,8 @@ func (s *Swarm) fanOut() {
continue
}
wrapped
,
err
:=
Wrap
(
msg
.
Data
,
PBWrapper_DHT_MESSAGE
)
if
err
!=
nil
{
s
.
Error
(
err
)
continue
}
// queue it in the connection's buffer
conn
.
Outgoing
.
MsgChan
<-
wrapped
conn
.
Outgoing
.
MsgChan
<-
msg
.
Data
}
}
}
...
...
@@ -320,7 +316,7 @@ out:
type
newFilterInfo
struct
{
Type
PBWrapper_MessageType
resp
chan
c
han
*
Message
resp
chan
*
C
han
}
func
(
s
*
Swarm
)
routeMessages
()
{
...
...
@@ -342,15 +338,36 @@ func (s *Swarm) routeMessages() {
}
mes
.
Data
=
wrapper
.
GetMessage
()
ch
<-
mes
ch
.
Incoming
<-
mes
case
gchan
:=
<-
s
.
newFilters
:
nch
:=
make
(
chan
*
Message
)
s
.
filterChans
[
gchan
.
Type
]
=
nch
nch
,
ok
:=
s
.
filterChans
[
gchan
.
Type
]
if
!
ok
{
nch
=
NewChan
(
16
)
s
.
filterChans
[
gchan
.
Type
]
=
nch
go
s
.
muxChan
(
nch
,
gchan
.
Type
)
}
gchan
.
resp
<-
nch
}
}
}
func
(
s
*
Swarm
)
muxChan
(
ch
*
Chan
,
typ
PBWrapper_MessageType
)
{
for
{
select
{
case
<-
ch
.
Close
:
return
case
mes
:=
<-
ch
.
Outgoing
:
data
,
err
:=
Wrap
(
mes
.
Data
,
typ
)
if
err
!=
nil
{
u
.
PErr
(
"muxChan error: %s
\n
"
,
err
)
continue
}
mes
.
Data
=
data
s
.
Chan
.
Outgoing
<-
mes
}
}
}
func
(
s
*
Swarm
)
Find
(
key
u
.
Key
)
*
peer
.
Peer
{
s
.
connsLock
.
RLock
()
defer
s
.
connsLock
.
RUnlock
()
...
...
@@ -386,6 +403,7 @@ func (s *Swarm) GetConnection(id peer.ID, addr *ma.Multiaddr) (*peer.Peer, error
return
conn
.
Peer
,
err
}
// Handle performing a handshake on a new connection and ensuring proper forward communication
func
(
s
*
Swarm
)
handleDialedCon
(
conn
*
Conn
)
error
{
err
:=
ident
.
Handshake
(
s
.
local
,
conn
.
Peer
,
conn
.
Incoming
.
MsgChan
,
conn
.
Outgoing
.
MsgChan
)
if
err
!=
nil
{
...
...
@@ -440,10 +458,6 @@ func (s *Swarm) Drop(p *peer.Peer) error {
return
conn
.
Close
()
}
func
(
s
*
Swarm
)
Send
(
mes
*
Message
)
{
s
.
Chan
.
Outgoing
<-
mes
}
func
(
s
*
Swarm
)
Error
(
e
error
)
{
s
.
Chan
.
Errors
<-
e
}
...
...
@@ -452,31 +466,10 @@ func (s *Swarm) GetErrChan() chan error {
return
s
.
Chan
.
Errors
}
func
Wrap
(
data
[]
byte
,
typ
PBWrapper_MessageType
)
([]
byte
,
error
)
{
wrapper
:=
new
(
PBWrapper
)
wrapper
.
Message
=
data
wrapper
.
Type
=
&
typ
b
,
err
:=
proto
.
Marshal
(
wrapper
)
if
err
!=
nil
{
return
nil
,
err
}
return
b
,
nil
}
func
Unwrap
(
data
[]
byte
)
(
*
PBWrapper
,
error
)
{
mes
:=
new
(
PBWrapper
)
err
:=
proto
.
Unmarshal
(
data
,
mes
)
if
err
!=
nil
{
return
nil
,
err
}
return
mes
,
nil
}
func
(
s
*
Swarm
)
GetChannel
(
typ
PBWrapper_MessageType
)
chan
*
Message
{
func
(
s
*
Swarm
)
GetChannel
(
typ
PBWrapper_MessageType
)
*
Chan
{
nfi
:=
&
newFilterInfo
{
Type
:
typ
,
resp
:
make
(
chan
c
han
*
Message
),
resp
:
make
(
chan
*
C
han
),
}
s
.
newFilters
<-
nfi
...
...
This diff is collapsed.
Click to expand it.
swarm/swarm_test.go
View file @
05b80afc
...
...
@@ -38,7 +38,8 @@ func pong(c net.Conn, peer *peer.Peer) {
fmt
.
Printf
(
"error: didn't receive ping: '%v'
\n
"
,
b
.
GetMessage
())
return
}
data
,
err
=
Wrap
([]
byte
(
"pong"
),
PBWrapper_DHT_MESSAGE
)
data
,
err
=
Wrap
([]
byte
(
"pong"
),
PBWrapper_TEST
)
if
err
!=
nil
{
fmt
.
Printf
(
"error %v
\n
"
,
err
)
return
...
...
@@ -63,6 +64,7 @@ func TestSwarm(t *testing.T) {
"11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
:
"/ip4/127.0.0.1/tcp/4567"
,
}
recv
:=
swarm
.
GetChannel
(
PBWrapper_TEST
)
for
k
,
n
:=
range
peerNames
{
peer
,
err
:=
setupPeer
(
k
,
n
)
if
err
!=
nil
{
...
...
@@ -96,13 +98,14 @@ func TestSwarm(t *testing.T) {
MsgNum
:=
1000
for
k
:=
0
;
k
<
MsgNum
;
k
++
{
for
_
,
p
:=
range
peers
{
swarm
.
Chan
.
Outgoing
<-
&
Message
{
Peer
:
p
,
Data
:
[]
byte
(
"ping"
)}
recv
.
Outgoing
<-
&
Message
{
Peer
:
p
,
Data
:
[]
byte
(
"ping"
)}
}
}
got
:=
map
[
u
.
Key
]
int
{}
for
k
:=
0
;
k
<
(
MsgNum
*
len
(
peers
));
k
++
{
msg
:=
<-
swarm
.
Chan
.
Incoming
msg
:=
<-
recv
.
Incoming
if
string
(
msg
.
Data
)
!=
"pong"
{
t
.
Error
(
"unexpected conn output"
,
msg
.
Data
)
}
...
...
This diff is collapsed.
Click to expand it.
swarm/wrapper.go
0 → 100644
View file @
05b80afc
package
swarm
import
"code.google.com/p/goprotobuf/proto"
func
Wrap
(
data
[]
byte
,
typ
PBWrapper_MessageType
)
([]
byte
,
error
)
{
wrapper
:=
new
(
PBWrapper
)
wrapper
.
Message
=
data
wrapper
.
Type
=
&
typ
b
,
err
:=
proto
.
Marshal
(
wrapper
)
if
err
!=
nil
{
return
nil
,
err
}
return
b
,
nil
}
func
Unwrap
(
data
[]
byte
)
(
*
PBWrapper
,
error
)
{
mes
:=
new
(
PBWrapper
)
err
:=
proto
.
Unmarshal
(
data
,
mes
)
if
err
!=
nil
{
return
nil
,
err
}
return
mes
,
nil
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment