From 65aa24174fea39a3dfff1b72fd2d8152939b98ad Mon Sep 17 00:00:00 2001 From: Bob Callaway Date: Fri, 21 Aug 2026 13:16:08 +0000 Subject: [PATCH 1/3] offer caching for mysql quota provider Signed-off-by: Bob Callaway --- quota/mysqlqm/quota_provider.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/quota/mysqlqm/quota_provider.go b/quota/mysqlqm/quota_provider.go index 008f13b6a0..7189c29d8b 100644 --- a/quota/mysqlqm/quota_provider.go +++ b/quota/mysqlqm/quota_provider.go @@ -18,6 +18,7 @@ import ( "flag" "github.com/google/trillian/quota" + "github.com/google/trillian/quota/cacheqm" "github.com/google/trillian/storage/mysql" "k8s.io/klog/v2" ) @@ -25,8 +26,14 @@ import ( // QuotaManagerName identifies the MySQL quota implementation. const QuotaManagerName = "mysql" -var maxUnsequencedRows = flag.Int("max_unsequenced_rows", DefaultMaxUnsequenced, "Max number of unsequenced rows before rate limiting kicks in. "+ - "Only effective for quota_system=mysql.") +var ( + maxUnsequencedRows = flag.Int("max_unsequenced_rows", DefaultMaxUnsequenced, "Max number of unsequenced rows before rate limiting kicks in. "+ + "Only effective for quota_system=mysql.") + mysqlQuotaMinBatchSize = flag.Int("mysql_quota_min_batch_size", 0, "Minimum number of tokens to request from the MySQL quota system. "+ + "Zero or lower disables batching. Only effective for quota_system=mysql.") + mysqlQuotaMaxCacheEntries = flag.Int("mysql_quota_max_cache_entries", cacheqm.DefaultMaxCacheEntries, "Maximum number of quota specs in the MySQL quota cache. "+ + "Only effective when mysql_quota_min_batch_size is positive.") +) func init() { if err := quota.RegisterProvider(QuotaManagerName, newMySQLQuotaManager); err != nil { @@ -43,6 +50,14 @@ func newMySQLQuotaManager() (quota.Manager, error) { DB: db, MaxUnsequencedRows: *maxUnsequencedRows, } + if *mysqlQuotaMinBatchSize > 0 { + cachedqm, err := cacheqm.NewCachedManager(qm, *mysqlQuotaMinBatchSize, *mysqlQuotaMaxCacheEntries) + if err != nil { + return nil, err + } + klog.Infof("Using cached MySQL QuotaManager with minimum batch size %d", *mysqlQuotaMinBatchSize) + return cachedqm, nil + } klog.Info("Using MySQL QuotaManager") return qm, nil } From d6447b2da8e697b40c5ff655b1d9f2d88d317db1 Mon Sep 17 00:00:00 2001 From: Bob Callaway <2845093+bobcallaway@users.noreply.github.com> Date: Fri, 21 Aug 2026 11:47:09 -0400 Subject: [PATCH 2/3] Update quota/mysqlqm/quota_provider.go Co-authored-by: Roger Ng --- quota/mysqlqm/quota_provider.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/quota/mysqlqm/quota_provider.go b/quota/mysqlqm/quota_provider.go index 7189c29d8b..3e1dde5233 100644 --- a/quota/mysqlqm/quota_provider.go +++ b/quota/mysqlqm/quota_provider.go @@ -51,6 +51,9 @@ func newMySQLQuotaManager() (quota.Manager, error) { MaxUnsequencedRows: *maxUnsequencedRows, } if *mysqlQuotaMinBatchSize > 0 { + if *mysqlQuotaMinBatchSize >= *maxUnsequencedRows { + return nil, fmt.Errorf("mysql_quota_min_batch_size (%d) must be less than max_unsequenced_rows (%d)", *mysqlQuotaMinBatchSize, *maxUnsequencedRows) + } cachedqm, err := cacheqm.NewCachedManager(qm, *mysqlQuotaMinBatchSize, *mysqlQuotaMaxCacheEntries) if err != nil { return nil, err From 561d7e79bc371cfde930480bfa5a4209956944e1 Mon Sep 17 00:00:00 2001 From: Bob Callaway Date: Fri, 21 Aug 2026 15:50:51 +0000 Subject: [PATCH 3/3] add fmt Signed-off-by: Bob Callaway --- quota/mysqlqm/quota_provider.go | 1 + 1 file changed, 1 insertion(+) diff --git a/quota/mysqlqm/quota_provider.go b/quota/mysqlqm/quota_provider.go index 3e1dde5233..41d646ef67 100644 --- a/quota/mysqlqm/quota_provider.go +++ b/quota/mysqlqm/quota_provider.go @@ -16,6 +16,7 @@ package mysqlqm import ( "flag" + "fmt" "github.com/google/trillian/quota" "github.com/google/trillian/quota/cacheqm"