package postgresqlqm

import "github.com/google/trillian/quota/postgresqlqm"

Package postgresqlqm defines a PostgreSQL-based quota.Manager implementation.

Index

Constants

const (
	// DefaultMaxUnsequenced is a suggested value for MaxUnsequencedRows.
	// Note that this is a Global/Write quota suggestion, so it applies across trees.
	DefaultMaxUnsequenced = 500000 // About 2h of non-stop signing at 70QPS.

)
const QuotaManagerName = "postgresql"

QuotaManagerName identifies the PostgreSQL quota implementation.

Variables

var ErrTooManyUnsequencedRows = errors.New("too many unsequenced rows")

ErrTooManyUnsequencedRows is returned when tokens are requested but Unsequenced has grown beyond the configured limit.

Types

type QuotaManager

type QuotaManager struct {
	DB                 *pgxpool.Pool
	MaxUnsequencedRows int
	UseSelectCount     bool
}

QuotaManager is a PostgreSQL-based quota.Manager implementation.

QuotaManager only implements Global/Write quotas, which is based on the number of Unsequenced rows (to be exact, tokens = MaxUnsequencedRows - actualUnsequencedRows). Other quotas are considered infinite. In other words, it attempts to protect the MMD SLO of all logs in the instance, but it does not make any attempt to ensure fairness, whether per-tree, per-intermediate-CA (in the case of Certificate Transparency), or any other dimension.

It has two working modes: one estimates the number of Unsequenced rows by collecting information from EXPLAIN output; the other does a select count(*) on the Unsequenced table. Estimates are default, even though they are approximate, as they're constant time (select count(*) on PostgreSQL needs to traverse the index and may take quite a while to complete). Other estimation methods exist (see https://wiki.postgresql.org/wiki/Count_estimate), but using EXPLAIN output is the most accurate because it "fetches the actual current number of pages in the table (this is a cheap operation, not requiring a table scan). If that is different from relpages then reltuples is scaled accordingly to arrive at a current number-of-rows estimate." (quoting https://www.postgresql.org/docs/current/row-estimation-examples.html)

func (*QuotaManager) GetTokens

func (m *QuotaManager) GetTokens(ctx context.Context, numTokens int, specs []quota.Spec) error

GetTokens implements quota.Manager.GetTokens. It doesn't actually reserve or retrieve tokens, instead it allows access based on the number of rows in the Unsequenced table.

func (*QuotaManager) PutTokens

func (m *QuotaManager) PutTokens(ctx context.Context, numTokens int, specs []quota.Spec) error

PutTokens implements quota.Manager.PutTokens. It's a noop for QuotaManager.

func (*QuotaManager) ResetQuota

func (m *QuotaManager) ResetQuota(ctx context.Context, specs []quota.Spec) error

ResetQuota implements quota.Manager.ResetQuota. It's a noop for QuotaManager.

Source Files

postgresql_quota.go quota_provider.go

Version
v1.7.1 (latest)
Published
Jan 9, 2025
Platform
linux/amd64
Imports
7 packages
Last checked
5 days ago

Tools for package owners.