implement separate method for getaccount without users

This commit is contained in:
crn4
2025-12-17 17:49:17 +01:00
parent 537151e0f3
commit 7484c777e9
5 changed files with 413 additions and 17 deletions

View File

@@ -25,11 +25,13 @@ type AccountResult struct {
}
type AccountRequestBuffer struct {
store store.Store
getAccountRequests map[string][]*AccountRequest
mu sync.Mutex
getAccountRequestCh chan *AccountRequest
bufferInterval time.Duration
store store.Store
getAccountRequests map[string][]*AccountRequest
getAccountWithoutUsersRequests map[string][]*AccountRequest
mu sync.Mutex
getAccountRequestCh chan *AccountRequest
getAccountWithoutUsersRequestCh chan *AccountRequest
bufferInterval time.Duration
}
func NewAccountRequestBuffer(ctx context.Context, store store.Store) *AccountRequestBuffer {
@@ -45,13 +47,16 @@ func NewAccountRequestBuffer(ctx context.Context, store store.Store) *AccountReq
log.WithContext(ctx).Infof("set account request buffer interval to %s", bufferInterval)
ac := AccountRequestBuffer{
store: store,
getAccountRequests: make(map[string][]*AccountRequest),
getAccountRequestCh: make(chan *AccountRequest),
bufferInterval: bufferInterval,
store: store,
getAccountRequests: make(map[string][]*AccountRequest),
getAccountWithoutUsersRequests: make(map[string][]*AccountRequest),
getAccountRequestCh: make(chan *AccountRequest),
getAccountWithoutUsersRequestCh: make(chan *AccountRequest),
bufferInterval: bufferInterval,
}
go ac.processGetAccountRequests(ctx)
go ac.processGetAccountWithoutUsersRequests(ctx)
return &ac
}
@@ -70,6 +75,21 @@ func (ac *AccountRequestBuffer) GetAccountWithBackpressure(ctx context.Context,
return result.Account, result.Err
}
func (ac *AccountRequestBuffer) GetAccountWithoutUsersWithBackpressure(ctx context.Context, accountID string) (*types.Account, error) {
req := &AccountRequest{
AccountID: accountID,
ResultChan: make(chan *AccountResult, 1),
}
log.WithContext(ctx).Tracef("requesting account without users %s with backpressure", accountID)
startTime := time.Now()
ac.getAccountWithoutUsersRequestCh <- req
result := <-req.ResultChan
log.WithContext(ctx).Tracef("got account without users with backpressure after %s", time.Since(startTime))
return result.Account, result.Err
}
func (ac *AccountRequestBuffer) processGetAccountBatch(ctx context.Context, accountID string) {
ac.mu.Lock()
requests := ac.getAccountRequests[accountID]
@@ -109,3 +129,43 @@ func (ac *AccountRequestBuffer) processGetAccountRequests(ctx context.Context) {
}
}
}
func (ac *AccountRequestBuffer) processGetAccountWithoutUsersBatch(ctx context.Context, accountID string) {
ac.mu.Lock()
requests := ac.getAccountWithoutUsersRequests[accountID]
delete(ac.getAccountWithoutUsersRequests, accountID)
ac.mu.Unlock()
if len(requests) == 0 {
return
}
startTime := time.Now()
account, err := ac.store.GetAccountWithoutUsers(ctx, accountID)
log.WithContext(ctx).Tracef("getting account without users %s in batch took %s", accountID, time.Since(startTime))
result := &AccountResult{Account: account, Err: err}
for _, req := range requests {
req.ResultChan <- result
close(req.ResultChan)
}
}
func (ac *AccountRequestBuffer) processGetAccountWithoutUsersRequests(ctx context.Context) {
for {
select {
case req := <-ac.getAccountWithoutUsersRequestCh:
ac.mu.Lock()
ac.getAccountWithoutUsersRequests[req.AccountID] = append(ac.getAccountWithoutUsersRequests[req.AccountID], req)
if len(ac.getAccountWithoutUsersRequests[req.AccountID]) == 1 {
go func(ctx context.Context, accountID string) {
time.Sleep(ac.bufferInterval)
ac.processGetAccountWithoutUsersBatch(ctx, accountID)
}(ctx, req.AccountID)
}
ac.mu.Unlock()
case <-ctx.Done():
return
}
}
}