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
p2p
go-p2p-swarm
Commits
35dc0732
Unverified
Commit
35dc0732
authored
Jun 04, 2019
by
Steven Allen
Committed by
GitHub
Jun 04, 2019
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #129 from libp2p/feat/cache-interface-addrs
feat: cache interface addresses for 1 minute
parents
99831444
1b20b7bb
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
1 deletion
+53
-1
swarm.go
swarm.go
+5
-0
swarm_addr.go
swarm_addr.go
+45
-1
swarm_listen.go
swarm_listen.go
+3
-0
No files found.
swarm.go
View file @
35dc0732
...
@@ -20,6 +20,7 @@ import (
...
@@ -20,6 +20,7 @@ import (
goprocessctx
"github.com/jbenet/goprocess/context"
goprocessctx
"github.com/jbenet/goprocess/context"
filter
"github.com/libp2p/go-maddr-filter"
filter
"github.com/libp2p/go-maddr-filter"
ma
"github.com/multiformats/go-multiaddr"
mafilter
"github.com/whyrusleeping/multiaddr-filter"
mafilter
"github.com/whyrusleeping/multiaddr-filter"
)
)
...
@@ -58,6 +59,10 @@ type Swarm struct {
...
@@ -58,6 +59,10 @@ type Swarm struct {
listeners
struct
{
listeners
struct
{
sync
.
RWMutex
sync
.
RWMutex
ifaceListenAddres
[]
ma
.
Multiaddr
cacheEOL
time
.
Time
m
map
[
transport
.
Listener
]
struct
{}
m
map
[
transport
.
Listener
]
struct
{}
}
}
...
...
swarm_addr.go
View file @
35dc0732
package
swarm
package
swarm
import
(
import
(
"time"
addrutil
"github.com/libp2p/go-addr-util"
addrutil
"github.com/libp2p/go-addr-util"
ma
"github.com/multiformats/go-multiaddr"
ma
"github.com/multiformats/go-multiaddr"
)
)
...
@@ -9,6 +11,10 @@ import (
...
@@ -9,6 +11,10 @@ import (
func
(
s
*
Swarm
)
ListenAddresses
()
[]
ma
.
Multiaddr
{
func
(
s
*
Swarm
)
ListenAddresses
()
[]
ma
.
Multiaddr
{
s
.
listeners
.
RLock
()
s
.
listeners
.
RLock
()
defer
s
.
listeners
.
RUnlock
()
defer
s
.
listeners
.
RUnlock
()
return
s
.
listenAddressesNoLock
()
}
func
(
s
*
Swarm
)
listenAddressesNoLock
()
[]
ma
.
Multiaddr
{
addrs
:=
make
([]
ma
.
Multiaddr
,
0
,
len
(
s
.
listeners
.
m
))
addrs
:=
make
([]
ma
.
Multiaddr
,
0
,
len
(
s
.
listeners
.
m
))
for
l
:=
range
s
.
listeners
.
m
{
for
l
:=
range
s
.
listeners
.
m
{
addrs
=
append
(
addrs
,
l
.
Multiaddr
())
addrs
=
append
(
addrs
,
l
.
Multiaddr
())
...
@@ -16,9 +22,47 @@ func (s *Swarm) ListenAddresses() []ma.Multiaddr {
...
@@ -16,9 +22,47 @@ func (s *Swarm) ListenAddresses() []ma.Multiaddr {
return
addrs
return
addrs
}
}
const
ifaceAddrsCacheDuration
=
1
*
time
.
Minute
// InterfaceListenAddresses returns a list of addresses at which this swarm
// InterfaceListenAddresses returns a list of addresses at which this swarm
// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to
// listens. It expands "any interface" addresses (/ip4/0.0.0.0, /ip6/::) to
// use the known local interfaces.
// use the known local interfaces.
func
(
s
*
Swarm
)
InterfaceListenAddresses
()
([]
ma
.
Multiaddr
,
error
)
{
func
(
s
*
Swarm
)
InterfaceListenAddresses
()
([]
ma
.
Multiaddr
,
error
)
{
return
addrutil
.
ResolveUnspecifiedAddresses
(
s
.
ListenAddresses
(),
nil
)
s
.
listeners
.
RLock
()
// RLock start
ifaceListenAddres
:=
s
.
listeners
.
ifaceListenAddres
isEOL
:=
time
.
Now
()
.
After
(
s
.
listeners
.
cacheEOL
)
s
.
listeners
.
RUnlock
()
// RLock end
if
ifaceListenAddres
!=
nil
&&
!
isEOL
{
// Cache is valid
return
ifaceListenAddres
,
nil
}
// Cache is not valid
// Perfrom double checked locking
s
.
listeners
.
Lock
()
// Lock start
ifaceListenAddres
=
s
.
listeners
.
ifaceListenAddres
isEOL
=
time
.
Now
()
.
After
(
s
.
listeners
.
cacheEOL
)
if
ifaceListenAddres
==
nil
||
isEOL
{
// Cache is still invalid
var
err
error
ifaceListenAddres
,
err
=
addrutil
.
ResolveUnspecifiedAddresses
(
s
.
listenAddressesNoLock
(),
nil
)
if
err
!=
nil
{
s
.
listeners
.
Unlock
()
// Lock early exit
return
nil
,
err
}
s
.
listeners
.
ifaceListenAddres
=
ifaceListenAddres
s
.
listeners
.
cacheEOL
=
time
.
Now
()
.
Add
(
ifaceAddrsCacheDuration
)
}
s
.
listeners
.
Unlock
()
// Lock end
return
ifaceListenAddres
,
nil
}
}
swarm_listen.go
View file @
35dc0732
...
@@ -2,6 +2,7 @@ package swarm
...
@@ -2,6 +2,7 @@ package swarm
import
(
import
(
"fmt"
"fmt"
"time"
"github.com/libp2p/go-libp2p-core/network"
"github.com/libp2p/go-libp2p-core/network"
...
@@ -55,6 +56,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
...
@@ -55,6 +56,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
}
}
s
.
refs
.
Add
(
1
)
s
.
refs
.
Add
(
1
)
s
.
listeners
.
m
[
list
]
=
struct
{}{}
s
.
listeners
.
m
[
list
]
=
struct
{}{}
s
.
listeners
.
cacheEOL
=
time
.
Time
{}
s
.
listeners
.
Unlock
()
s
.
listeners
.
Unlock
()
maddr
:=
list
.
Multiaddr
()
maddr
:=
list
.
Multiaddr
()
...
@@ -69,6 +71,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
...
@@ -69,6 +71,7 @@ func (s *Swarm) AddListenAddr(a ma.Multiaddr) error {
list
.
Close
()
list
.
Close
()
s
.
listeners
.
Lock
()
s
.
listeners
.
Lock
()
delete
(
s
.
listeners
.
m
,
list
)
delete
(
s
.
listeners
.
m
,
list
)
s
.
listeners
.
cacheEOL
=
time
.
Time
{}
s
.
listeners
.
Unlock
()
s
.
listeners
.
Unlock
()
s
.
refs
.
Done
()
s
.
refs
.
Done
()
}()
}()
...
...
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