les: make clientPool.connectedBias configurable (#21305)
This commit is contained in:
		
							parent
							
								
									3a52c4dcf2
								
							
						
					
					
						commit
						4366c45e4e
					
				
							
								
								
									
										12
									
								
								les/api.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								les/api.go
									
									
									
									
									
								
							| @ -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.
 | ||||||
|  | |||||||
| @ -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) { | ||||||
|  | |||||||
| @ -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") | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user