Merge pull request #1215 from c9s/fix/grid2-try-lock

FIX: [grid2] use tryLock during the openGrid process
This commit is contained in:
c9s 2023-06-30 11:49:51 +08:00 committed by GitHub
commit 9d416a3dde
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 15 deletions

View File

@ -71,6 +71,7 @@ func (e *ExchangeOrderExecutionRouter) CancelOrdersTo(ctx context.Context, sessi
}
// ExchangeOrderExecutor is an order executor wrapper for single exchange instance.
//
//go:generate callbackgen -type ExchangeOrderExecutor
type ExchangeOrderExecutor struct {
// MinQuoteBalance fixedpoint.Value `json:"minQuoteBalance,omitempty" yaml:"minQuoteBalance,omitempty"`
@ -340,6 +341,8 @@ func BatchRetryPlaceOrder(ctx context.Context, exchange types.Exchange, errIdx [
createdOrders, errIdx, err2 = BatchPlaceOrder(ctx, exchange, orderCallback, submitOrders...)
if err2 != nil {
werr = multierr.Append(werr, err2)
} else {
return createdOrders, nil, nil
}
}

View File

@ -1179,7 +1179,13 @@ func (s *Strategy) updateFilledOrderMetrics(order types.Order) {
}
func (s *Strategy) updateGridNumOfOrdersMetricsWithLock() {
s.updateGridNumOfOrdersMetrics(s.getGrid())
if s.mu.TryLock() {
grid := s.grid
s.mu.Unlock()
s.updateGridNumOfOrdersMetrics(grid)
} else {
s.logger.Warnf("updateGridNumOfOrdersMetricsWithLock: failed to acquire the lock to update metrics")
}
}
func (s *Strategy) updateGridNumOfOrdersMetrics(grid *Grid) {

View File

@ -125,26 +125,34 @@ func (m *SyncOrderMap) Remove(orderID uint64) (exists bool) {
return exists
}
func (m *SyncOrderMap) Add(o Order) {
func (m *SyncOrderMap) processPendingRemoval() {
m.Lock()
defer m.Unlock()
m.orders.Add(o)
if len(m.pendingRemoval) == 0 {
return
}
if len(m.pendingRemoval) > 0 {
expireTime := time.Now().Add(-5 * time.Minute)
removing := make(map[uint64]struct{})
for orderID, creationTime := range m.pendingRemoval {
if m.orders.Exists(orderID) || creationTime.Before(expireTime) {
m.orders.Remove(orderID)
removing[orderID] = struct{}{}
}
}
for orderID := range removing {
delete(m.pendingRemoval, orderID)
expireTime := time.Now().Add(-5 * time.Minute)
removing := make(map[uint64]struct{})
for orderID, creationTime := range m.pendingRemoval {
if m.orders.Exists(orderID) || creationTime.Before(expireTime) {
m.orders.Remove(orderID)
removing[orderID] = struct{}{}
}
}
for orderID := range removing {
delete(m.pendingRemoval, orderID)
}
}
func (m *SyncOrderMap) Add(o Order) {
m.Lock()
m.orders.Add(o)
m.Unlock()
m.processPendingRemoval()
}
func (m *SyncOrderMap) Update(o Order) {