postgresqlqm

package
v1.7.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 9, 2025 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

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

Index

Constants

View Source
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.

)
View Source
const QuotaManagerName = "postgresql"

QuotaManagerName identifies the PostgreSQL quota implementation.

Variables

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

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

Functions

This section is empty.

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL