Commit 62e792f5 authored by Steven Allen's avatar Steven Allen

fix: use 64bit stream/conn IDs

Given 1k requests per second (assuming one stream per request), we can
easily loop around the stream ID after less than 2 months. 32bits is
plenty (usually) for connection-scoped stream IDs because individual
connections don't usually last that long, but isn't enough for a
_global_ stream ID.

Given that there's no reason for these to be 32bit IDs, let's just make
them 64bits.
parent 3563ed1f
...@@ -47,6 +47,9 @@ var ErrDialTimeout = errors.New("dial timed out") ...@@ -47,6 +47,9 @@ var ErrDialTimeout = errors.New("dial timed out")
// communication. The Chan sends/receives Messages, which note the // communication. The Chan sends/receives Messages, which note the
// destination or source Peer. // destination or source Peer.
type Swarm struct { type Swarm struct {
nextConnID uint64 // guarded by atomic
nextStreamID uint64 // guarded by atomic
// Close refcount. This allows us to fully wait for the swarm to be torn // Close refcount. This allows us to fully wait for the swarm to be torn
// down before continuing. // down before continuing.
refs sync.WaitGroup refs sync.WaitGroup
...@@ -54,9 +57,6 @@ type Swarm struct { ...@@ -54,9 +57,6 @@ type Swarm struct {
local peer.ID local peer.ID
peers peerstore.Peerstore peers peerstore.Peerstore
nextConnID uint32 // guarded by atomic
nextStreamID uint32 // guarded by atomic
conns struct { conns struct {
sync.RWMutex sync.RWMutex
m map[peer.ID][]*Conn m map[peer.ID][]*Conn
...@@ -213,7 +213,7 @@ func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn, ...@@ -213,7 +213,7 @@ func (s *Swarm) addConn(tc transport.CapableConn, dir network.Direction) (*Conn,
conn: tc, conn: tc,
swarm: s, swarm: s,
stat: stat, stat: stat,
id: atomic.AddUint32(&s.nextConnID, 1), id: atomic.AddUint64(&s.nextConnID, 1),
} }
// we ONLY check upgraded connections here so we can send them a Disconnect message. // we ONLY check upgraded connections here so we can send them a Disconnect message.
......
...@@ -25,7 +25,7 @@ var ErrConnClosed = errors.New("connection closed") ...@@ -25,7 +25,7 @@ var ErrConnClosed = errors.New("connection closed")
// Conn is the connection type used by swarm. In general, you won't use this // Conn is the connection type used by swarm. In general, you won't use this
// type directly. // type directly.
type Conn struct { type Conn struct {
id uint32 id uint64
conn transport.CapableConn conn transport.CapableConn
swarm *Swarm swarm *Swarm
...@@ -209,7 +209,7 @@ func (c *Conn) addStream(ts mux.MuxedStream, dir network.Direction) (*Stream, er ...@@ -209,7 +209,7 @@ func (c *Conn) addStream(ts mux.MuxedStream, dir network.Direction) (*Stream, er
stream: ts, stream: ts,
conn: c, conn: c,
stat: stat, stat: stat,
id: atomic.AddUint32(&c.swarm.nextStreamID, 1), id: atomic.AddUint64(&c.swarm.nextStreamID, 1),
} }
c.streams.m[s] = struct{}{} c.streams.m[s] = struct{}{}
......
...@@ -17,7 +17,7 @@ var _ network.Stream = &Stream{} ...@@ -17,7 +17,7 @@ var _ network.Stream = &Stream{}
// Stream is the stream type used by swarm. In general, you won't use this type // Stream is the stream type used by swarm. In general, you won't use this type
// directly. // directly.
type Stream struct { type Stream struct {
id uint32 id uint64
stream mux.MuxedStream stream mux.MuxedStream
conn *Conn conn *Conn
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment