Add subscribe/unsubscribe RPCs. Add session, sessionManager, and serve JSON RPC (without HTTP). #66
|
@ -65,6 +65,13 @@ func min[Ord constraints.Ordered](x, y Ord) Ord {
|
||||||
return y
|
return y
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func max[Ord constraints.Ordered](x, y Ord) Ord {
|
||||||
|
if x > y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
|
||||||
type BlockHeaderElectrum struct {
|
type BlockHeaderElectrum struct {
|
||||||
Version uint32 `json:"version"`
|
Version uint32 `json:"version"`
|
||||||
PrevBlockHash string `json:"prev_block_hash"`
|
PrevBlockHash string `json:"prev_block_hash"`
|
||||||
|
|
|
@ -119,6 +119,7 @@ type sessionManager struct {
|
||||||
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
sessionsWait sync.WaitGroup
|
sessionsWait sync.WaitGroup
|
||||||
sessionsMax int
|
sessionsMax int
|
||||||
sessionTimeout time.Duration
|
sessionTimeout time.Duration
|
||||||
|
manageTicker *time.Ticker
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
db *db.ReadOnlyDBColumnFamily
|
db *db.ReadOnlyDBColumnFamily
|
||||||
chain *chaincfg.Params
|
chain *chaincfg.Params
|
||||||
// headerSubs are sessions subscribed via 'blockchain.headers.subscribe'
|
// headerSubs are sessions subscribed via 'blockchain.headers.subscribe'
|
||||||
|
@ -132,6 +133,7 @@ func newSessionManager(db *db.ReadOnlyDBColumnFamily, chain *chaincfg.Params, se
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
sessions: make(sessionMap),
|
sessions: make(sessionMap),
|
||||||
sessionsMax: sessionsMax,
|
sessionsMax: sessionsMax,
|
||||||
sessionTimeout: time.Duration(sessionTimeout) * time.Second,
|
sessionTimeout: time.Duration(sessionTimeout) * time.Second,
|
||||||
|
manageTicker: time.NewTicker(time.Duration(max(5, sessionTimeout/20)) * time.Second),
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
db: db,
|
db: db,
|
||||||
chain: chain,
|
chain: chain,
|
||||||
headerSubs: make(sessionMap),
|
headerSubs: make(sessionMap),
|
||||||
|
@ -156,6 +158,7 @@ func (sm *sessionManager) stop() {
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (sm *sessionManager) manage() {
|
func (sm *sessionManager) manage() {
|
||||||
|
for {
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
sm.sessionsMut.Lock()
|
sm.sessionsMut.Lock()
|
||||||
for _, sess := range sm.sessions {
|
for _, sess := range sm.sessions {
|
||||||
if time.Since(sess.lastRecv) > sm.sessionTimeout {
|
if time.Since(sess.lastRecv) > sm.sessionTimeout {
|
||||||
|
@ -164,9 +167,9 @@ func (sm *sessionManager) manage() {
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sm.sessionsMut.Unlock()
|
sm.sessionsMut.Unlock()
|
||||||
|
// Wait for next management clock tick.
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
dur, _ := time.ParseDuration("10s")
|
<-sm.manageTicker.C
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
time.AfterFunc(dur, func() { sm.manage() })
|
}
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (sm *sessionManager) addSession(conn net.Conn) *session {
|
func (sm *sessionManager) addSession(conn net.Conn) *session {
|
||||||
|
|
||||||
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
This is one of the biggest obstacles to limiting the number of go-routines. I have to call This is one of the biggest obstacles to limiting the number of go-routines. I have to call `ServeCodec()` in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.
Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time? Interesting way to keep this running forever, I think it spawns a new goroutine every time, it might be better to just use this in an intfinite loop with a sleep, and maybe parametarize the polling time?
Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down. Using Ticker object now. The Ticker.Reset() method can be used in unit tests to adjust frequency up/down.
|
This is one of the biggest obstacles to limiting the number of go-routines. I have to call
ServeCodec()
in a new go-routine in order to allow more than one session at a time, and I don't know how to control/track this routine.