les: make clientPool.connectedBias configurable (#21305)

This commit is contained in:
Binacs 2020-07-21 16:23:40 +08:00 committed by GitHub
parent 3a52c4dcf2
commit 4366c45e4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 17 deletions

View File

@ -202,6 +202,18 @@ func (api *PrivateLightServerAPI) SetDefaultParams(params map[string]interface{}
return err return err
} }
// SetConnectedBias set the connection bias, which is applied to already connected clients
// So that already connected client won't be kicked out very soon and we can ensure all
// connected clients can have enough time to request or sync some data.
// When the input parameter `bias` < 0 (illegal), return error.
func (api *PrivateLightServerAPI) SetConnectedBias(bias time.Duration) error {
if bias < time.Duration(0) {
return fmt.Errorf("bias illegal: %v less than 0", bias)
}
api.server.clientPool.setConnectedBias(bias)
return nil
}
// Benchmark runs a request performance benchmark with a given set of measurement setups // Benchmark runs a request performance benchmark with a given set of measurement setups
// in multiple passes specified by passCount. The measurement time for each setup in each // in multiple passes specified by passCount. The measurement time for each setup in each
// pass is specified in milliseconds by length. // pass is specified in milliseconds by length.

View File

@ -42,15 +42,7 @@ const (
persistCumulativeTimeRefresh = time.Minute * 5 // refresh period of the cumulative running time persistence persistCumulativeTimeRefresh = time.Minute * 5 // refresh period of the cumulative running time persistence
posBalanceCacheLimit = 8192 // the maximum number of cached items in positive balance queue posBalanceCacheLimit = 8192 // the maximum number of cached items in positive balance queue
negBalanceCacheLimit = 8192 // the maximum number of cached items in negative balance queue negBalanceCacheLimit = 8192 // the maximum number of cached items in negative balance queue
defaultConnectedBias = time.Minute * 3 // the default connectedBias used in clientPool
// connectedBias is applied to already connected clients So that
// already connected client won't be kicked out very soon and we
// can ensure all connected clients can have enough time to request
// or sync some data.
//
// todo(rjl493456442) make it configurable. It can be the option of
// free trial time!
connectedBias = time.Minute * 3
) )
// clientPool implements a client database that assigns a priority to each client // clientPool implements a client database that assigns a priority to each client
@ -94,7 +86,7 @@ type clientPool struct {
freeClientCap uint64 // The capacity value of each free client freeClientCap uint64 // The capacity value of each free client
startTime mclock.AbsTime // The timestamp at which the clientpool started running startTime mclock.AbsTime // The timestamp at which the clientpool started running
cumulativeTime int64 // The cumulative running time of clientpool at the start point. cumulativeTime int64 // The cumulative running time of clientpool at the start point.
disableBias bool // Disable connection bias(used in testing) connectedBias time.Duration // The connection bias. 0: Disable connection bias(used in testing)
} }
// clientPoolPeer represents a client peer in the pool. // clientPoolPeer represents a client peer in the pool.
@ -171,6 +163,7 @@ func newClientPool(db ethdb.Database, freeClientCap uint64, clock mclock.Clock,
startTime: clock.Now(), startTime: clock.Now(),
cumulativeTime: ndb.getCumulativeTime(), cumulativeTime: ndb.getCumulativeTime(),
stopCh: make(chan struct{}), stopCh: make(chan struct{}),
connectedBias: defaultConnectedBias,
} }
// If the negative balance of free client is even lower than 1, // If the negative balance of free client is even lower than 1,
// delete this entry. // delete this entry.
@ -279,11 +272,7 @@ func (f *clientPool) connect(peer clientPoolPeer, capacity uint64) bool {
newCount-- newCount--
return newCapacity > f.capLimit || newCount > f.connLimit return newCapacity > f.capLimit || newCount > f.connLimit
}) })
bias := connectedBias if newCapacity > f.capLimit || newCount > f.connLimit || (e.balanceTracker.estimatedPriority(now+mclock.AbsTime(f.connectedBias), false)-kickPriority) > 0 {
if f.disableBias {
bias = 0
}
if newCapacity > f.capLimit || newCount > f.connLimit || (e.balanceTracker.estimatedPriority(now+mclock.AbsTime(bias), false)-kickPriority) > 0 {
for _, c := range kickList { for _, c := range kickList {
f.connectedQueue.Push(c) f.connectedQueue.Push(c)
} }
@ -371,6 +360,16 @@ func (f *clientPool) setDefaultFactors(posFactors, negFactors priceFactors) {
f.defaultNegFactors = negFactors f.defaultNegFactors = negFactors
} }
// setConnectedBias sets the connection bias, which is applied to already connected clients
// So that already connected client won't be kicked out very soon and we can ensure all
// connected clients can have enough time to request or sync some data.
func (f *clientPool) setConnectedBias(bias time.Duration) {
f.lock.Lock()
defer f.lock.Unlock()
f.connectedBias = bias
}
// dropClient removes a client from the connected queue and finalizes its balance. // dropClient removes a client from the connected queue and finalizes its balance.
// If kick is true then it also initiates the disconnection. // If kick is true then it also initiates the disconnection.
func (f *clientPool) dropClient(e *clientInfo, now mclock.AbsTime, kick bool) { func (f *clientPool) dropClient(e *clientInfo, now mclock.AbsTime, kick bool) {

View File

@ -91,7 +91,7 @@ func testClientPool(t *testing.T, connLimit, clientCount, paidCount int, randomD
} }
pool = newClientPool(db, 1, &clock, disconnFn) pool = newClientPool(db, 1, &clock, disconnFn)
) )
pool.disableBias = true pool.setConnectedBias(0)
pool.setLimits(connLimit, uint64(connLimit)) pool.setLimits(connLimit, uint64(connLimit))
pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1})
@ -248,7 +248,7 @@ func TestPaidClientKickedOut(t *testing.T) {
clock.Run(time.Millisecond) clock.Run(time.Millisecond)
} }
clock.Run(time.Second) clock.Run(time.Second)
clock.Run(connectedBias) clock.Run(defaultConnectedBias)
if !pool.connect(poolTestPeer(11), 0) { if !pool.connect(poolTestPeer(11), 0) {
t.Fatalf("Free client should be accectped") t.Fatalf("Free client should be accectped")
} }