feat(wallet)_: Fixed account limit period for history to infinite instead of per day

Fix rpc stats doubling.
Add test for infinite limit
This commit is contained in:
Ivan Belyakov 2024-05-23 11:16:42 +04:00 committed by IvanBelyakoff
parent ce773b69ce
commit cec11e9313
4 changed files with 41 additions and 4 deletions

View File

@ -16,7 +16,8 @@ const (
minRequestsPerSecond = 20
requestsPerSecondStep = 10
tickerInterval = 1 * time.Second
tickerInterval = 1 * time.Second
LimitInfinitely = 0
)
var (
@ -165,6 +166,11 @@ func (rl *RPCRequestLimiter) Allow(tag string) (bool, error) {
return true, nil
}
// Check if period is forever
if data.Period.Milliseconds() == LimitInfinitely {
return false, nil
}
// Check if a number of requests is over the limit within the interval
if time.Since(data.CreatedAt) < data.Period {
if data.NumReqs >= data.MaxReqs {

View File

@ -114,3 +114,29 @@ func TestAllowWhenPeriodPassed(t *testing.T) {
// Verify the result
require.True(t, allow)
}
func TestAllowRestrictInfinitelyWhenLimitReached(t *testing.T) {
storage, rl := setupTest()
// Define test inputs
tag := "testTag"
maxRequests := 10
// Set up the storage with test data
data := &LimitData{
Tag: tag,
Period: LimitInfinitely,
CreatedAt: time.Now(),
MaxReqs: maxRequests,
NumReqs: maxRequests,
}
err := storage.Set(data)
require.NoError(t, err)
// Call the Allow method
allow, err := rl.Allow(tag)
require.NoError(t, err)
// Verify the result
require.False(t, allow)
}

View File

@ -51,6 +51,5 @@ func CountCallWithTag(method string, tag string) {
methodMap := value.(*sync.Map)
value, _ = methodMap.LoadOrStore(method, uint(0))
methodMap.Store(method, value.(uint)+1)
CountCall(method)
stats.total++
}

View File

@ -1127,7 +1127,13 @@ func (c *loadBlocksAndTransfersCommand) fetchHistoryBlocksForAccount(group *asyn
chainClient := chain.ClientWithTag(c.chainClient, accountTag, transferHistoryTag)
storage := chain.NewLimitsDBStorage(c.db.client)
limiter := chain.NewRequestLimiter(storage)
err := limiter.SetLimit(accountTag, transferHistoryLimitPerAccount, transferHistoryLimitPeriod)
// Check if limit is already reached, then skip the comamnd
if allow, _ := limiter.Allow(accountTag); !allow {
continue
}
err := limiter.SetLimit(accountTag, transferHistoryLimitPerAccount, chain.LimitInfinitely)
if err != nil {
log.Error("fetchHistoryBlocksForAccount SetLimit", "error", err, "accountTag", accountTag)
}