diff --git a/.github/workflows/cover.yml b/.github/workflows/cover.yml index 6b550d9..def4cef 100644 --- a/.github/workflows/cover.yml +++ b/.github/workflows/cover.yml @@ -1,4 +1,7 @@ -on: ["push", "pull_request"] +on: + push: + branches: [ main ] + pull_request: name: Test Coveralls Parallel @@ -7,30 +10,22 @@ jobs: env: CGO_ENABLED: 1 runs-on: ubuntu-latest - strategy: - matrix: - go: - - "1.22" steps: + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: ${{ matrix.go }} - - uses: actions/checkout@v4 + go-version-file: go.mod - run: make build test: needs: build env: CGO_ENABLED: 1 runs-on: ubuntu-latest - strategy: - matrix: - go: - - "1.22" steps: + - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: ${{ matrix.go }} - - uses: actions/checkout@v4 + go-version-file: go.mod - run: make test - name: Send coverage env: diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 0000000..bbda528 --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,184 @@ +name: Integration Tests + +on: + push: + branches: [ main ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.25.1' + cache: true + + - name: Build pgconfigctl + run: go build -o pgconfigctl cmd/pgconfigctl/main.go + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: pgconfigctl-${{ github.sha }} + path: pgconfigctl + retention-days: 1 + + validate-config: + name: include on pg${{ matrix.pg_version }} + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + pg_version: ["9.5", "9.6", "10", "11", "12", "13", "14", "15", "16", "17", "18"] + + steps: + - uses: actions/checkout@v4 + + - name: Download pgconfigctl + uses: actions/download-artifact@v4 + with: + name: pgconfigctl-${{ github.sha }} + path: . + + - name: Make executable + run: chmod +x pgconfigctl + + - name: Generate postgresql.conf + run: | + ./pgconfigctl tune \ + --version ${{ matrix.pg_version }} \ + --format conf \ + --ram 1GB \ + --cpus 2 > tuned.conf + + echo "--- Generated Config for PG ${{ matrix.pg_version }} ---" + cat tuned.conf + + - name: Create Init Script + run: | + echo "#!/bin/bash" > init-config.sh + echo "echo \"include = '/etc/postgresql/tuned.conf'\" >> \"\$PGDATA/postgresql.conf\"" >> init-config.sh + chmod +x init-config.sh + + - name: Run PostgreSQL Container + run: | + IMG_TAG="${{ matrix.pg_version }}" + + echo "Starting Postgres $IMG_TAG..." + + docker run -d --name pg-${{ matrix.pg_version }} \ + -e POSTGRES_PASSWORD=postgres \ + -v $(pwd)/tuned.conf:/etc/postgresql/tuned.conf \ + -v $(pwd)/init-config.sh:/docker-entrypoint-initdb.d/init-config.sh \ + postgres:$IMG_TAG || { + echo "Container failed to start (maybe image missing?)" + exit 1 + } + + - name: Wait for Readiness + run: | + # Verify container exists + if ! docker ps -a -q -f name=pg-${{ matrix.pg_version }} | grep -q .; then + echo "Container not found!" + exit 1 + fi + + echo "Waiting for Postgres to be ready..." + READY=0 + for i in {1..30}; do + # Check if container is still running + if ! docker ps -q -f name=pg-${{ matrix.pg_version }} | grep -q .; then + echo "Container stopped running!" + docker logs pg-${{ matrix.pg_version }} + exit 1 + fi + + if docker exec pg-${{ matrix.pg_version }} pg_isready -U postgres; then + echo "Postgres is ready!" + READY=1 + break + fi + echo "Waiting..." + sleep 1 + done + + if [ $READY -eq 0 ]; then + echo "Timed out waiting for Postgres to be ready." + docker logs pg-${{ matrix.pg_version }} + exit 1 + fi + + - name: Verify Settings Applied + run: | + # Fail if container is not running + if ! docker ps -q -f name=pg-${{ matrix.pg_version }} | grep -q .; then + echo "Container is not running!" + exit 1 + fi + + echo "### PostgreSQL ${{ matrix.pg_version }} Verification Report" >> $GITHUB_STEP_SUMMARY + echo "| Parameter | Status | Value |" >> $GITHUB_STEP_SUMMARY + echo "| :--- | :--- | :--- |" >> $GITHUB_STEP_SUMMARY + + check_param() { + PARAM=$1 + # Execute psql to show parameter. + # If it fails (e.g. param doesn't exist), capture error. + # We use '|| echo ERROR' to prevent script exit and capture failure. + VALUE=$(docker exec pg-${{ matrix.pg_version }} psql -U postgres -t -c "SHOW $PARAM;" 2>/dev/null || echo "NOT_SUPPORTED") + + # Trim whitespace + VALUE=$(echo "$VALUE" | xargs) + + if [ "$VALUE" == "NOT_SUPPORTED" ]; then + echo "| \`$PARAM\` | ⚪ Skipped | Not supported in this version |" >> $GITHUB_STEP_SUMMARY + echo "Parameter $PARAM not supported." + else + echo "| \`$PARAM\` | ✅ Passed | \`$VALUE\` |" >> $GITHUB_STEP_SUMMARY + echo "Parameter $PARAM = $VALUE" + fi + } + + # Core memory settings (mostly universal) + check_param "shared_buffers" + check_param "effective_cache_size" + check_param "work_mem" + check_param "maintenance_work_mem" + + # Checkpoint (min/max_wal_size introduced in 9.5, checkpoint_segments removed in 9.5) + check_param "min_wal_size" + check_param "max_wal_size" + check_param "checkpoint_completion_target" + + # Parallel query (introduced gradually 9.6+) + check_param "max_worker_processes" + check_param "max_parallel_workers_per_gather" + check_param "max_parallel_workers" + + # Storage/IO + check_param "random_page_cost" + check_param "effective_io_concurrency" + check_param "maintenance_io_concurrency" + + # PG 18+ AIO + check_param "io_workers" + check_param "io_method" + + # Final status line + echo "" >> $GITHUB_STEP_SUMMARY + echo "✅ **Tests Completed Successfully**" >> $GITHUB_STEP_SUMMARY + + + - name: Dump Logs on Failure + if: failure() + run: | + if docker ps -a -q -f name=pg-${{ matrix.pg_version }} | grep -q .; then + docker logs pg-${{ matrix.pg_version }} + fi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71fb32f..4c6c483 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: - name: Set up Go uses: actions/setup-go@v5 with: - go-version: 1.22 + go-version-file: go.mod - name: Login to Heroku Container Registry uses: docker/login-action@v3 diff --git a/.gitignore b/.gitignore index 3684210..196a3b2 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,6 @@ covprofile .vscode/ .idea/ +.crush/ result !result/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..217a7ee --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,80 @@ +# Agent Guide for pgconfig/api + +Essential commands, structure, and patterns for AI agents. + +## Essential Commands + +```bash +make docs # Generate Swagger API documentation +make test # Run all tests with race detector and coverage +make lint # Run go vet (requires docs generated first) +make build # Clean, generate docs, lint, and build binaries +make clean # Remove dist/ and generated docs +``` + +## Project Structure + +``` +. +├── cmd/ # API and CLI entry points +├── pkg/ # Core packages (input, rules, category, format, docs) +├── generators/pg-docs/ # Tool to generate pg-docs.yml +├── rules.yml # Rule metadata (categories, abstracts, recommendations) +└── pg-docs.yml # PostgreSQL parameter documentation per version +``` + +## Code Patterns + +- **Go 1.25.1**, module `github.com/pgconfig/api` +- **Fiber** for API, **Cobra** for CLI, **Swagger** for docs +- **English Language**: All code comments, documentation, and variable names must be in English. +- Input parsing: `pkg/input/bytes.Parse()` for byte units, `profile.Profile` for workload types +- Rule pipeline in `pkg/rules/compute.go` (order: arch → OS → profile → storage → AIO → version) +- Three output formats: `json`, `alter_system`, `conf` +- Configuration files: `rules.yml` and `pg-docs.yml` loaded at startup + +## Testing + +- `make test` runs all tests with coverage (generates `covprofile`) +- Test files follow `*_test.go` pattern +- CI runs tests on push/pull request (`.github/workflows/cover.yml`) + +## Adding a New Rule + +1. Create function in `pkg/rules/` with signature `func(*input.Input, *category.ExportCfg) (*category.ExportCfg, error)` +2. Add to `allRules` slice in `pkg/rules/compute.go` (mind order) +3. Write unit tests +4. Update `rules.yml` if rule needs metadata + +## CI/CD + +- **cover.yml**: runs `make build` and `make test`, pushes coverage to Coveralls +- **release.yml**: triggered on tags, runs goreleaser for multi‑arch binaries and Docker images + +## Commit Conventions + +Follow commit conventions from `~/.claude/pgconfig.md`: + +``` +: + + +``` + +Types: `feat`, `fix`, `refactor`, `docs`, `chore`, `test`, `style` + +Rules: +- Title ≤50 chars, imperative mood ("fix" not "fixed"). +- Body wrapped at 80 cols, focus on WHY. +- Sign‑off required (`-s`). +- **STRICTLY FORBIDDEN**: AI attribution footers (e.g., "Generated with Crush", "Assisted by..."). +- **STRICTLY FORBIDDEN**: Adding "Co-authored-by" unless explicitly requested by the user. +- **English Only**: Commit messages must be in English. + +## Gotchas + +1. **Swagger docs before building**: `make build` depends on `make docs` +2. **Byte parsing**: case‑insensitive, expects unit (KB, MB, GB, TB) +3. **PostgreSQL version defaults**: default is 18, supported 9.1–18 +4. **Rule order**: `computeVersion` must be last (removes unsupported parameters) +5. **AIO parameters (PostgreSQL 18+)**: `io_method` and `io_workers` only available in ≥18. `io_workers` scaled by profile: Desktop 10%, WEB 20%, Mixed 25%, OLTP 30%, DW 40%, +10% for HDD. diff --git a/Makefile b/Makefile index 3ee1713..d06383f 100644 --- a/Makefile +++ b/Makefile @@ -11,10 +11,10 @@ docs: mod clean $(GOBIN)/swag init --dir ./cmd/api --output ./cmd/api/docs test: docs - go test -race -v -covermode atomic -coverprofile=covprofile ./... + go test -race -v -covermode atomic -coverpkg=./... -coverprofile=covprofile ./... goveralls-push: mod - $(GOBIN)/goveralls -coverprofile=covprofile -service=github + $(GOBIN)/goveralls -coverprofile=covprofile -service=github -v check: lint diff --git a/README.md b/README.md index ad0ecae..553520f 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,22 @@ PGConfig.org API v2. ## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fpgconfig%2Fapi.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fpgconfig%2Fapi?ref=badge_large) + +## Rules Engine + +The configuration is adjusted by a rules engine based on the environment. + +| Category | Condition | Action/Adjustment | +| :------------- | :------------------------------------------ | :------------------------------------------------------------------------------------------------------------ | +| **Architecture** | 32-bit (`386`, `i686`) | Cap `shared_buffers`, `work_mem`, `maintenance_work_mem` at 4GB. | +| **OS** | Windows | Set `effective_io_concurrency` to `0`. | +| | Windows & PG Version <= 9.6 | Limit `shared_buffers` to 512MB. | +| **Profile** | `Desktop` | Set `shared_buffers` to Total RAM / 16. | +| **Storage** | Disk Type is `SSD` | Set `effective_io_concurrency` to `200` and `random_page_cost` to `1.1`. | +| | Disk Type is `SAN` | Set `effective_io_concurrency` to `300` and `random_page_cost` to `1.1`. | +| | Disk Type is `HDD` | Set `effective_io_concurrency` to `2`. | +| **PG Version** | < 9.5 | Remove `min_wal_size` and `max_wal_size`. | +| | < 9.6 | Remove `max_parallel_worker_per_gather`. Cap `shared_buffers` at 8GB. | +| | < 10.0 | Remove `max_parallel_workers`. | +| | >= 9.5 | Remove `checkpoint_segments`. | +| | <= 9.3 | Remove the entire `worker` category. | \ No newline at end of file diff --git a/generators/pg-docs/main.go b/generators/pg-docs/main.go index b766157..9f5d546 100644 --- a/generators/pg-docs/main.go +++ b/generators/pg-docs/main.go @@ -55,7 +55,6 @@ func updateDoc(ver float32, param string, parsed docs.ParamDoc) { } func main() { - file = docs.DocFile{ Documentation: make(map[string]docs.Doc), } @@ -76,6 +75,12 @@ func main() { "max_connections", "random_page_cost", "effective_io_concurrency", + "maintenance_io_concurrency", + "io_method", + "io_workers", + "io_max_combine_limit", + "io_max_concurrency", + "file_copy_method", "max_worker_processes", "max_parallel_workers_per_gather", "max_parallel_workers", diff --git a/go.mod b/go.mod index bc24e34..62a4cb3 100644 --- a/go.mod +++ b/go.mod @@ -1,66 +1,67 @@ module github.com/pgconfig/api -go 1.22 +go 1.25.1 require ( - github.com/PuerkitoBio/goquery v1.8.1 + github.com/PuerkitoBio/goquery v1.11.0 github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 - github.com/gofiber/fiber/v2 v2.49.2 - github.com/gofiber/swagger v0.1.13 - github.com/mackerelio/go-osstat v0.2.4 + github.com/gofiber/fiber/v2 v2.52.10 + github.com/gofiber/swagger v1.1.1 + github.com/mackerelio/go-osstat v0.2.6 github.com/mitchellh/go-homedir v1.1.0 github.com/smartystreets/goconvey v1.8.1 - github.com/spf13/cobra v1.7.0 - github.com/spf13/viper v1.16.0 - github.com/swaggo/swag v1.16.2 + github.com/spf13/cobra v1.10.2 + github.com/spf13/viper v1.21.0 + github.com/stretchr/testify v1.11.1 + github.com/swaggo/swag v1.16.6 gopkg.in/yaml.v2 v2.4.0 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/andybalholm/brotli v1.0.5 // indirect - github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/andybalholm/brotli v1.2.0 // indirect + github.com/andybalholm/cascadia v1.3.3 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect + github.com/go-openapi/spec v0.22.2 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/jsonutils v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/gopherjs/gopherjs v1.17.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect - github.com/klauspost/compress v1.16.7 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.6 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/klauspost/compress v1.18.2 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rivo/uniseg v0.2.0 // indirect + github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect github.com/smarty/assertions v1.15.0 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/stretchr/testify v1.9.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/swaggo/files/v2 v2.0.0 // indirect + github.com/spf13/afero v1.15.0 // indirect + github.com/spf13/cast v1.10.0 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/swaggo/files/v2 v2.0.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.49.0 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.12.0 // indirect - golang.org/x/text v0.9.0 // indirect - golang.org/x/tools v0.7.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect + github.com/valyala/fasthttp v1.68.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.40.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 04433c4..b391631 100644 --- a/go.sum +++ b/go.sum @@ -1,178 +1,70 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/PuerkitoBio/goquery v1.11.0 h1:jZ7pwMQXIITcUXNH83LLk+txlaEy6NVOfTuP43xxfqw= +github.com/PuerkitoBio/goquery v1.11.0/go.mod h1:wQHgxUOU3JGuj3oD/QFfxUdlzW6xPHfqyHre6VMY4DQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= +github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= +github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= +github.com/go-openapi/spec v0.22.2 h1:KEU4Fb+Lp1qg0V4MxrSCPv403ZjBl8Lx1a83gIPU8Qc= +github.com/go-openapi/spec v0.22.2/go.mod h1:iIImLODL2loCh3Vnox8TY2YWYJZjMAKYyLH2Mu8lOZs= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/gofiber/fiber/v2 v2.49.1/go.mod h1:nPUeEBUeeYGgwbDm59Gp7vS8MDyScL6ezr/Np9A13WU= -github.com/gofiber/fiber/v2 v2.49.2 h1:ONEN3/Vc+dUCxxDgZZwpqvhISgHqb+bu+isBiEyKEQs= -github.com/gofiber/fiber/v2 v2.49.2/go.mod h1:gNsKnyrmfEWFpJxQAV0qvW6l70K1dZGno12oLtukcts= -github.com/gofiber/swagger v0.1.13 h1:e7tMH/y34HIMklQ2+uv64Ai3E8TWCgbZyscIx+IzInE= -github.com/gofiber/swagger v0.1.13/go.mod h1:VtNHZdI5ksFlIR1R0vCcCX3/ruT8p9xNRX44958rsao= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofiber/fiber/v2 v2.52.10 h1:jRHROi2BuNti6NYXmZ6gbNSfT3zj/8c0xy94GOU5elY= +github.com/gofiber/fiber/v2 v2.52.10/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/swagger v1.1.1 h1:FZVhVQQ9s1ZKLHL/O0loLh49bYB5l1HEAgxDlcTtkRA= +github.com/gofiber/swagger v1.1.1/go.mod h1:vtvY/sQAMc/lGTUCg0lqmBL7Ht9O7uzChpbvJeJQINw= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -180,446 +72,142 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mackerelio/go-osstat v0.2.4 h1:qxGbdPkFo65PXOb/F/nhDKpF2nGmGaCFDLXoZjJTtUs= -github.com/mackerelio/go-osstat v0.2.4/go.mod h1:Zy+qzGdZs3A9cuIqmgbJvwbmLQH9dJvtio5ZjJTbdlQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mackerelio/go-osstat v0.2.6 h1:gs4U8BZeS1tjrL08tt5VUliVvSWP26Ai2Ob8Lr7f2i0= +github.com/mackerelio/go-osstat v0.2.6/go.mod h1:lRy8V9ZuHpuRVZh+vyTkODeDPl3/d5MgXHtLSaqG8bA= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= +github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= -github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= -github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= -github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files/v2 v2.0.2 h1:Bq4tgS/yxLB/3nwOMcul5oLEUKa877Ykgz3CJMVbQKU= +github.com/swaggo/files/v2 v2.0.2/go.mod h1:TVqetIzZsO9OhHX1Am9sRf9LdrFZqoK49N37KON/jr0= +github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= +github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.49.0 h1:9FdvCpmxB74LH4dPb7IJ1cOSsluR07XG3I1txXWwJpE= -github.com/valyala/fasthttp v1.49.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/valyala/fasthttp v1.68.0 h1:v12Nx16iepr8r9ySOwqI+5RBJ/DqTxhOy1HrHoDFnok= +github.com/valyala/fasthttp v1.68.0/go.mod h1:5EXiRfYQAoiO/khu4oU9VISC/eVY6JqmSpPJoHCKsz4= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= -golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pg-docs.yml b/pg-docs.yml index 4219f3c..f852be2 100644 --- a/pg-docs.yml +++ b/pg-docs.yml @@ -2394,13 +2394,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/11/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/11/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -2669,15 +2672,15 @@ documentation: details: - Specifies the amount of memory to be used by internal sort operations and hash tables before writing to temporary disk files. The value defaults to - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will be allowed to - use as much memory as this value specifies before it starts to write data - into temporary files. Also, several running sessions could be doing such operations - concurrently. Therefore, the total memory used could be many times the value - of work_mem; it is necessary to keep this fact in mind when choosing the value. - Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables - are used in hash joins, hash-based aggregation, and hash-based processing - of IN subqueries. + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being + allowed to use as much memory as this value specifies before it starts to + write data into temporary files. Also, several running sessions could be doing + such operations concurrently. Therefore, the total memory used could be many + times the value of work_mem; it is necessary to keep this fact in mind when + choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge + joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based + processing of IN subqueries. url: https://www.postgresql.org/docs/11/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/11/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -2783,13 +2786,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/12/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/12/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -3066,15 +3072,15 @@ documentation: - Sets the maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will be allowed to - use as much memory as this value specifies before it starts to write data - into temporary files. Also, several running sessions could be doing such operations - concurrently. Therefore, the total memory used could be many times the value - of work_mem; it is necessary to keep this fact in mind when choosing the value. - Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables - are used in hash joins, hash-based aggregation, and hash-based processing - of IN subqueries. + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being + allowed to use as much memory as this value specifies before it starts to + write data into temporary files. Also, several running sessions could be doing + such operations concurrently. Therefore, the total memory used could be many + times the value of work_mem; it is necessary to keep this fact in mind when + choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge + joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based + processing of IN subqueries. url: https://www.postgresql.org/docs/12/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/12/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -3180,13 +3186,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/13/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/13/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -3195,6 +3204,23 @@ documentation: default_value: localhost min_value: postmaster max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of effective_io_concurrency that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 10 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/13/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/13/ + recomendations_conf: "" + type: integer + default_value: "10" + min_value: "0" + max_value: "1000" maintenance_work_mem: title: maintenance_work_mem short_desc: Sets the maximum memory to be used for maintenance operations @@ -3463,8 +3489,8 @@ documentation: - Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will generally be + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being allowed to use as much memory as this value specifies before it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many @@ -3473,10 +3499,10 @@ documentation: joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based processing of IN subqueries. - Hash-based operations are generally more sensitive to memory availability - than equivalent sort-based operations. The memory available for hash tables - is computed by multiplying work_mem by hash_mem_multiplier. This makes it - possible for hash-based operations to use an amount of memory that exceeds - the usual work_mem base amount. + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. url: https://www.postgresql.org/docs/13/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/13/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -3588,13 +3614,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/14/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/14/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -3603,6 +3632,23 @@ documentation: default_value: localhost min_value: postmaster max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of effective_io_concurrency that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 10 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/14/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/14/ + recomendations_conf: "" + type: integer + default_value: "10" + min_value: "0" + max_value: "1000" maintenance_work_mem: title: maintenance_work_mem short_desc: Sets the maximum memory to be used for maintenance operations @@ -3871,8 +3917,8 @@ documentation: - Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will generally be + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being allowed to use as much memory as this value specifies before it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many @@ -3881,10 +3927,10 @@ documentation: joins. Hash tables are used in hash joins, hash-based aggregation, memoize nodes and hash-based processing of IN subqueries. - Hash-based operations are generally more sensitive to memory availability - than equivalent sort-based operations. The memory available for hash tables - is computed by multiplying work_mem by hash_mem_multiplier. This makes it - possible for hash-based operations to use an amount of memory that exceeds - the usual work_mem base amount. + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. url: https://www.postgresql.org/docs/14/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/14/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -3996,13 +4042,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/15/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/15/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -4011,6 +4060,23 @@ documentation: default_value: localhost min_value: postmaster max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of effective_io_concurrency that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 10 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/15/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/15/ + recomendations_conf: "" + type: integer + default_value: "10" + min_value: "0" + max_value: "1000" maintenance_work_mem: title: maintenance_work_mem short_desc: Sets the maximum memory to be used for maintenance operations @@ -4279,8 +4345,8 @@ documentation: - Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will generally be + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being allowed to use as much memory as this value specifies before it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many @@ -4289,10 +4355,10 @@ documentation: joins. Hash tables are used in hash joins, hash-based aggregation, memoize nodes and hash-based processing of IN subqueries. - Hash-based operations are generally more sensitive to memory availability - than equivalent sort-based operations. The memory available for hash tables - is computed by multiplying work_mem by hash_mem_multiplier. This makes it - possible for hash-based operations to use an amount of memory that exceeds - the usual work_mem base amount. + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. url: https://www.postgresql.org/docs/15/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/15/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -4404,13 +4470,16 @@ documentation: to all available IP interfaces. The entry 0.0.0.0 allows listening for all IPv4 addresses and :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which - case only Unix-domain sockets can be used to connect to it. The default value - is localhost, which allows only local TCP/IP loopback connections to be made. - While client authentication (client-authentication) allows fine-grained control + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which can help prevent repeated malicious connection requests on insecure network interfaces. This parameter can only be set at - server start.' + server start. url: https://www.postgresql.org/docs/16/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/16/ recomendations_conf: Set your listen_address as restrictively as possible; '*' @@ -4419,6 +4488,23 @@ documentation: default_value: localhost min_value: postmaster max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of effective_io_concurrency that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 10 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/16/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/16/ + recomendations_conf: "" + type: integer + default_value: "10" + min_value: "0" + max_value: "1000" maintenance_work_mem: title: maintenance_work_mem short_desc: Sets the maximum memory to be used for maintenance operations @@ -4687,8 +4773,8 @@ documentation: - Sets the base maximum amount of memory to be used by a query operation (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is - four megabytes (4MB). Note that for a complex query, several sort or hash - operations might be running in parallel; each operation will generally be + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being allowed to use as much memory as this value specifies before it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many @@ -4697,10 +4783,10 @@ documentation: joins. Hash tables are used in hash joins, hash-based aggregation, memoize nodes and hash-based processing of IN subqueries. - Hash-based operations are generally more sensitive to memory availability - than equivalent sort-based operations. The memory available for hash tables - is computed by multiplying work_mem by hash_mem_multiplier. This makes it - possible for hash-based operations to use an amount of memory that exceeds - the usual work_mem base amount. + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. url: https://www.postgresql.org/docs/16/static/runtime-config-resource.html#GUC-WORK-MEM conf_url: https://postgresqlco.nf/en/doc/param/work_mem/16/ recomendations_conf: Sets the limit for the amount of non-shared RAM available @@ -4714,4 +4800,932 @@ documentation: default_value: 4MB min_value: 64kB max_value: 2147483647kB + "17": + checkpoint_completion_target: + title: checkpoint_completion_target + short_desc: Time spent flushing dirty buffers during checkpoint, as fraction + of checkpoint interval + details: + - Specifies the target of checkpoint completion, as a fraction of total time + between checkpoints. The default is 0.9, which spreads the checkpoint across + almost all of the available interval, providing fairly consistent I/O load + while also leaving some time for checkpoint completion overhead. Reducing + this parameter is not recommended because it causes the checkpoint to complete + faster. This results in a higher rate of I/O during the checkpoint followed + by a period of less I/O between the checkpoint completion and the next scheduled + checkpoint. This parameter can only be set in the postgresql.conf file or + on the server command line. + url: https://www.postgresql.org/docs/17/static/runtime-config-wal.html#GUC-CHECKPOINT-COMPLETION-TARGET + conf_url: https://postgresqlco.nf/en/doc/param/checkpoint_completion_target/17/ + recomendations_conf: Defines the fraction of one checkpoint_interval over which + to spread checkpoints. The default value works for most users. + type: floating point + default_value: "0.9" + min_value: "0" + max_value: "1" + effective_cache_size: + title: effective_cache_size + short_desc: Sets the planner's assumption about the total size of the data caches + details: + - Sets the planner's assumption about the effective size of the disk cache that + is available to a single query. This is factored into estimates of the cost + of using an index; a higher value makes it more likely index scans will be + used, a lower value makes it more likely sequential scans will be used. When + setting this parameter you should consider both PostgreSQL's shared buffers + and the portion of the kernel's disk cache that will be used for PostgreSQL + data files, though some data might exist in both places. Also, take into account + the expected number of concurrent queries on different tables, since they + will have to share the available space. This parameter has no effect on the + size of shared memory allocated by PostgreSQL, nor does it reserve kernel + disk cache; it is used only for estimation purposes. The system also does + not assume data remains in the disk cache between queries. If this value is + specified without units, it is taken as blocks, that is BLCKSZ bytes, typically + 8kB. The default is 4 gigabytes (4GB). (If BLCKSZ is not 8kB, the default + value scales proportionally to it.) + url: https://www.postgresql.org/docs/17/static/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/effective_cache_size/17/ + recomendations_conf: Tells the PostgreSQL query planner how much RAM is estimated + to be available for caching data, in both shared_buffers and in the filesystem + cache. This setting just helps the planner make good cost estimates; it does + not actually allocate the memory. + type: integer + default_value: 4GB + min_value: 8kB + max_value: 17179869176kB + effective_io_concurrency: + title: effective_io_concurrency + short_desc: Number of simultaneous requests that can be handled efficiently + by the disk subsystem + details: + - Sets the number of concurrent disk I/O operations that PostgreSQL expects + can be executed simultaneously. Raising this value will increase the number + of I/O operations that any individual PostgreSQL session attempts to initiate + in parallel. The allowed range is 1 to 1000, or zero to disable issuance of + asynchronous I/O requests. Currently, this setting only affects bitmap heap + scans. + - For magnetic drives, a good starting point for this setting is the number + of separate drives comprising a RAID 0 stripe or RAID 1 mirror being used + for the database. (For RAID 5 the parity drive should not be counted.) However, + if the database is often busy with multiple queries issued in concurrent sessions, + lower values may be sufficient to keep the disk array busy. A value higher + than needed to keep the disks busy will only result in extra CPU overhead. + SSDs and other memory-based storage can often process many concurrent requests, + so the best value might be in the hundreds. + - Asynchronous I/O depends on an effective posix_fadvise function, which some + operating systems lack. If the function is not present then setting this parameter + to anything but zero will result in an error. On some operating systems (e.g., + Solaris), the function is present but does not actually do anything. + - The default is 1 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-EFFECTIVE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/effective_io_concurrency/17/ + recomendations_conf: Set to the number of disks in your RAID array or number + of I/O channels. Available only for platforms with posix_fadvise support + (i.e. Linux). Currently only affects the execution of parallel bitmapscan, + but might affect other I/O operations in future versions. + type: integer + default_value: "1" + min_value: "0" + max_value: "1000" + listen_addresses: + title: listen_addresses + short_desc: Sets the host name or IP address(es) to listen to + details: + - 'Specifies the TCP/IP address(es) on which the server is to listen for connections + from client applications. The value takes the form of a comma-separated list + of host names and/or numeric IP addresses. The special entry * corresponds + to all available IP interfaces. The entry 0.0.0.0 allows listening for all + IPv4 addresses and :: allows listening for all IPv6 addresses. If the list + is empty, the server does not listen on any IP interface at all, in which + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control + over who can access the server, listen_addresses controls which interfaces + accept connection attempts, which can help prevent repeated malicious connection + requests on insecure network interfaces. This parameter can only be set at + server start. + url: https://www.postgresql.org/docs/17/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES + conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/17/ + recomendations_conf: Set your listen_address as restrictively as possible; '*' + should only be used for development machines + type: string + default_value: localhost + min_value: postmaster + max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of "effective_io_concurrency" that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 10 on supported systems, otherwise 0. This value can be overridden + for tables in a particular tablespace by setting the tablespace parameter + of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/17/ + recomendations_conf: "" + type: integer + default_value: "10" + min_value: "0" + max_value: "1000" + maintenance_work_mem: + title: maintenance_work_mem + short_desc: Sets the maximum memory to be used for maintenance operations + details: + - Specifies the maximum amount of memory to be used by maintenance operations, + such as VACUUM, CREATE INDEX, and ALTER TABLE ADD FOREIGN KEY. If this value + is specified without units, it is taken as kilobytes. It defaults to 64 megabytes + (64MB). Since only one of these operations can be executed at a time by a + database session, and an installation normally doesn't have many of them running + concurrently, it's safe to set this value significantly larger than work_mem. + Larger settings might improve performance for vacuuming and for restoring + database dumps. + - Note that when autovacuum runs, up to autovacuum_max_workers times this memory + may be allocated, so be careful not to set the default value too high. It + may be useful to control for this by separately setting autovacuum_work_mem. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_work_mem/17/ + recomendations_conf: Sets the limit for the amount that autovacuum, manual vacuum, + bulk index build and other maintenance routines are permitted to use. Setting + it to a moderately high value will increase the efficiency of vacuum and other + operations. Applications which perform large ETL operations may need to allocate + up to 1/4 of RAM to support large bulk vacuums. Note that each autovacuum + worker may use this much, so if using multiple autovacuum workers you may + want to decrease this value so that they can't claim over 1/8 or 1/4 of available + RAM. + type: integer + default_value: 64MB + min_value: 64kB + max_value: 2147483647kB + max_connections: + title: max_connections + short_desc: Sets the maximum number of concurrent connections + details: + - Determines the maximum number of concurrent connections to the database server. + The default is typically 100 connections, but might be less if your kernel + settings will not support it (as determined during initdb). This parameter + can only be set at server start. + - PostgreSQL sizes certain resources based directly on the value of max_connections. + Increasing its value leads to higher allocation of those resources, including + shared memory. + - When running a standby server, you must set this parameter to the same or + higher value than on the primary server. Otherwise, queries will not be allowed + in the standby server. + url: https://www.postgresql.org/docs/17/static/runtime-config-connection.html#GUC-MAX-CONNECTIONS + conf_url: https://postgresqlco.nf/en/doc/param/max_connections/17/ + recomendations_conf: Should be set to the maximum number of connections which + you expect to need at peak load. Note that each connection uses shared_buffer + memory, as well as additional non-shared memory, so be careful not to run + the system out of memory. In general, if you need more than 200 connections, + you should probably be making more use of connection pooling. + type: integer + default_value: "100" + min_value: "1" + max_value: "262143" + max_parallel_workers: + title: max_parallel_workers + short_desc: Sets the maximum number of parallel workers that can be active at + one time + details: + - Sets the maximum number of workers that the cluster can support for parallel + operations. The default value is 8. When increasing or decreasing this value, + consider also adjusting max_parallel_maintenance_workers and max_parallel_workers_per_gather. + Also, note that a setting for this value which is higher than max_worker_processes + will have no effect, since parallel workers are taken from the pool of worker + processes established by that setting. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS + conf_url: https://postgresqlco.nf/en/doc/param/max_parallel_workers/17/ + recomendations_conf: … if you think you can benefit from parallel query, and + even cores/1 for DW systems. + type: integer + default_value: "8" + min_value: "0" + max_value: "1024" + max_parallel_workers_per_gather: + title: max_parallel_workers_per_gather + short_desc: Sets the maximum number of parallel processes per executor node + details: + - Sets the maximum number of workers that can be started by a single Gather + or Gather Merge node. Parallel workers are taken from the pool of processes + established by max_worker_processes, limited by max_parallel_workers. Note + that the requested number of workers may not actually be available at run + time. If this occurs, the plan will run with fewer workers than expected, + which may be inefficient. The default value is 2. Setting this value to 0 + disables parallel query execution. + - Note that parallel queries may consume very substantially more resources than + non-parallel queries, because each worker process is a completely separate + process which has roughly the same impact on the system as an additional user + session. This should be taken into account when choosing a value for this + setting, as well as when configuring other settings that control resource + utilization, such as work_mem. Resource limits such as work_mem are applied + individually to each worker, which means the total utilization may be much + higher across all processes than it would normally be for any single process. + For example, a parallel query using 4 workers may use up to 5 times as much + CPU time, memory, I/O bandwidth, and so forth as a query which uses no workers + at all. + - For more information on parallel query, see parallel-query. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER + conf_url: https://postgresqlco.nf/en/doc/param/max_parallel_workers_per_gather/17/ + recomendations_conf: Increase if you plan to use parallel query to 4 or 8, depending + on cores/concurrent sessions. + type: integer + default_value: "2" + min_value: "0" + max_value: "1024" + max_wal_size: + title: max_wal_size + short_desc: Sets the WAL size that triggers a checkpoint + details: + - Maximum size to let the WAL grow during automatic checkpoints. This is a soft + limit; WAL size can exceed max_wal_size under special circumstances, such + as heavy load, a failing archive_command or archive_library, or a high wal_keep_size + setting. If this value is specified without units, it is taken as megabytes. + The default is 1 GB. Increasing this parameter can increase the amount of + time needed for crash recovery. This parameter can only be set in the postgresql.conf + file or on the server command line. + url: https://www.postgresql.org/docs/17/static/runtime-config-wal.html#GUC-MAX-WAL-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/max_wal_size/17/ + recomendations_conf: … except for databases that write more than 1GB/hour of + data, in which case increase the size of the log so that it's at least an + hour worth of logs + type: integer + default_value: 1GB + min_value: 2MB + max_value: 2147483647MB + max_worker_processes: + title: max_worker_processes + short_desc: Maximum number of concurrent worker processes + details: + - Sets the maximum number of background processes that the cluster can support. + This parameter can only be set at server start. The default is 8. + - When running a standby server, you must set this parameter to the same or + higher value than on the primary server. Otherwise, queries will not be allowed + in the standby server. + - When changing this value, consider also adjusting max_parallel_workers, max_parallel_maintenance_workers, + and max_parallel_workers_per_gather. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES + conf_url: https://postgresqlco.nf/en/doc/param/max_worker_processes/17/ + recomendations_conf: Increase to max_parallel_workers + other workers, such + as workers for logical replication and custom background workers. Not more + than your number of cores, though. + type: integer + default_value: "8" + min_value: "0" + max_value: "262143" + min_wal_size: + title: min_wal_size + short_desc: Sets the minimum size to shrink the WAL to + details: + - As long as WAL disk usage stays below this setting, old WAL files are always + recycled for future use at a checkpoint, rather than removed. This can be + used to ensure that enough WAL space is reserved to handle spikes in WAL usage, + for example when running large batch jobs. If this value is specified without + units, it is taken as megabytes. The default is 80 MB. This parameter can + only be set in the postgresql.conf file or on the server command line. + url: https://www.postgresql.org/docs/17/static/runtime-config-wal.html#GUC-MIN-WAL-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/min_wal_size/17/ + recomendations_conf: "" + type: integer + default_value: 80MB + min_value: 2MB + max_value: 2147483647MB + random_page_cost: + title: random_page_cost + short_desc: Sets the planner's estimate of the cost of a nonsequentially fetched + disk page + details: + - Sets the planner's estimate of the cost of a non-sequentially-fetched disk + page. The default is 4.0. This value can be overridden for tables and indexes + in a particular tablespace by setting the tablespace parameter of the same + name (see sql-altertablespace). + - Reducing this value relative to seq_page_cost will cause the system to prefer + index scans; raising it will make index scans look relatively more expensive. + You can raise or lower both values together to change the importance of disk + I/O costs relative to CPU costs, which are described by the following parameters. + - Random access to mechanical disk storage is normally much more expensive than + four times sequential access. However, a lower default is used (4.0) because + the majority of random accesses to disk, such as indexed reads, are assumed + to be in cache. The default value can be thought of as modeling random access + as 40 times slower than sequential, while expecting 90% of random reads to + be cached. + - If you believe a 90% cache rate is an incorrect assumption for your workload, + you can increase random_page_cost to better reflect the true cost of random + storage reads. Correspondingly, if your data is likely to be completely in + cache, such as when the database is smaller than the total server memory, + decreasing random_page_cost can be appropriate. Storage that has a low random + read cost relative to sequential, e.g., solid-state drives, might also be + better modeled with a lower value for random_page_cost, e.g., 1.1. + url: https://www.postgresql.org/docs/17/static/runtime-config-query.html#GUC-RANDOM-PAGE-COST + conf_url: https://postgresqlco.nf/en/doc/param/random_page_cost/17/ + recomendations_conf: Sets the ratio of seek to scan time for your database storage. Should + not be altered unless you're using special storage (SSDs, high end SANs, etc.) + where seek/scan ratios are actually different. If you need the database to + favor indexes more, tune effective_cache_size and some of the cpu_* costs + instead. + type: floating point + default_value: "4" + min_value: "0" + max_value: "1.79769e+308" + shared_buffers: + title: shared_buffers + short_desc: Sets the number of shared memory buffers used by the server + details: + - Sets the amount of memory the database server uses for shared memory buffers. + The default is typically 128 megabytes (128MB), but might be less if your + kernel settings will not support it (as determined during initdb). This setting + must be at least 128 kilobytes. However, settings significantly higher than + the minimum are usually needed for good performance. If this value is specified + without units, it is taken as blocks, that is BLCKSZ bytes, typically 8kB. + (Non-default values of BLCKSZ change the minimum value.) This parameter can + only be set at server start. + - If you have a dedicated database server with 1GB or more of RAM, a reasonable + starting value for shared_buffers is 25% of the memory in your system. There + are some workloads where even larger settings for shared_buffers are effective, + but because PostgreSQL also relies on the operating system cache, it is unlikely + that an allocation of more than 40% of RAM to shared_buffers will work better + than a smaller amount. Larger settings for shared_buffers usually require + a corresponding increase in max_wal_size, in order to spread out the process + of writing large quantities of new or changed data over a longer period of + time. + - On systems with less than 1GB of RAM, a smaller percentage of RAM is appropriate, + so as to leave adequate space for the operating system. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-SHARED-BUFFERS + conf_url: https://postgresqlco.nf/en/doc/param/shared_buffers/17/ + recomendations_conf: 'A memory quantity defining PostgreSQL''s "dedicated" RAM, + which is used for connection control, active operations, and more. However, + since PostgreSQL also needs free RAM for file system buffers, sorts and maintenance + operations, it is not advisable to set shared_buffers to a majority of RAM. Note + that increasing shared_buffers often requires you to increase some system + kernel parameters, most notably SHMMAX and SHMALL. See Operating System + Environment: Managing Kernel Resources in the PostgreSQL documentation for + more details. Also note that shared_buffers over 2GB is only supported on + 64-bit systems.' + type: integer + default_value: 128MB + min_value: 128kB + max_value: 8589934584kB + wal_buffers: + title: wal_buffers + short_desc: Sets the number of disk-page buffers in shared memory for WAL + details: + - The amount of shared memory used for WAL data that has not yet been written + to disk. The default setting of -1 selects a size equal to 1/32nd (about 3%) + of shared_buffers, but not less than 64kB nor more than the size of one WAL + segment, typically 16MB. This value can be set manually if the automatic choice + is too large or too small, but any positive value less than 32kB will be treated + as 32kB. If this value is specified without units, it is taken as WAL blocks, + that is XLOG_BLCKSZ bytes, typically 8kB. This parameter can only be set at + server start. + - The contents of the WAL buffers are written out to disk at every transaction + commit, so extremely large values are unlikely to provide a significant benefit. + However, setting this value to at least a few megabytes can improve write + performance on a busy server where many clients are committing at once. The + auto-tuning selected by the default setting of -1 should give reasonable results + in most cases. + url: https://www.postgresql.org/docs/17/static/runtime-config-wal.html#GUC-WAL-BUFFERS + conf_url: https://postgresqlco.nf/en/doc/param/wal_buffers/17/ + recomendations_conf: On very busy, high-core machines it can be useful to raise + this to as much as 128MB. + type: integer + default_value: "-1" + min_value: "-1" + max_value: 2097144kB + work_mem: + title: work_mem + short_desc: Sets the maximum memory to be used for query workspaces + details: + - Sets the base maximum amount of memory to be used by a query operation (such + as a sort or hash table) before writing to temporary disk files. If this value + is specified without units, it is taken as kilobytes. The default value is + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being + allowed to use as much memory as this value specifies before it starts to + write data into temporary files. Also, several running sessions could be doing + such operations concurrently. Therefore, the total memory used could be many + times the value of work_mem; it is necessary to keep this fact in mind when + choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge + joins. Hash tables are used in hash joins, hash-based aggregation, memoize + nodes and hash-based processing of IN subqueries. + - Hash-based operations are generally more sensitive to memory availability + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. + url: https://www.postgresql.org/docs/17/static/runtime-config-resource.html#GUC-WORK-MEM + conf_url: https://postgresqlco.nf/en/doc/param/work_mem/17/ + recomendations_conf: Sets the limit for the amount of non-shared RAM available + for each query operation, including sorts and hashes. This limit acts as + a primitive resource control, preventing the server from going into swap due + to overallocation. Note that this is non-shared RAM per operation, which + means large complex queries can use multple times this amount. Also, work_mem + is allocated by powers of two, so round to the nearest binary step. The second + formula is for reporting and DW servers which run a lot of complex queries. + type: integer + default_value: 4MB + min_value: 64kB + max_value: 2147483647kB + "18": + checkpoint_completion_target: + title: checkpoint_completion_target + short_desc: Time spent flushing dirty buffers during checkpoint, as fraction + of checkpoint interval + details: + - Specifies the target of checkpoint completion, as a fraction of total time + between checkpoints. The default is 0.9, which spreads the checkpoint across + almost all of the available interval, providing fairly consistent I/O load + while also leaving some time for checkpoint completion overhead. Reducing + this parameter is not recommended because it causes the checkpoint to complete + faster. This results in a higher rate of I/O during the checkpoint followed + by a period of less I/O between the checkpoint completion and the next scheduled + checkpoint. This parameter can only be set in the postgresql.conf file or + on the server command line. + url: https://www.postgresql.org/docs/18/static/runtime-config-wal.html#GUC-CHECKPOINT-COMPLETION-TARGET + conf_url: https://postgresqlco.nf/en/doc/param/checkpoint_completion_target/18/ + recomendations_conf: Defines the fraction of one checkpoint_interval over which + to spread checkpoints. The default value works for most users. + type: floating point + default_value: "0.9" + min_value: "0" + max_value: "1" + effective_cache_size: + title: effective_cache_size + short_desc: Sets the planner's assumption about the total size of the data caches + details: + - Sets the planner's assumption about the effective size of the disk cache that + is available to a single query. This is factored into estimates of the cost + of using an index; a higher value makes it more likely index scans will be + used, a lower value makes it more likely sequential scans will be used. When + setting this parameter you should consider both PostgreSQL's shared buffers + and the portion of the kernel's disk cache that will be used for PostgreSQL + data files, though some data might exist in both places. Also, take into account + the expected number of concurrent queries on different tables, since they + will have to share the available space. This parameter has no effect on the + size of shared memory allocated by PostgreSQL, nor does it reserve kernel + disk cache; it is used only for estimation purposes. The system also does + not assume data remains in the disk cache between queries. If this value is + specified without units, it is taken as blocks, that is BLCKSZ bytes, typically + 8kB. The default is 4 gigabytes (4GB). (If BLCKSZ is not 8kB, the default + value scales proportionally to it.) + url: https://www.postgresql.org/docs/18/static/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/effective_cache_size/18/ + recomendations_conf: Tells the PostgreSQL query planner how much RAM is estimated + to be available for caching data, in both shared_buffers and in the filesystem + cache. This setting just helps the planner make good cost estimates; it does + not actually allocate the memory. + type: integer + default_value: 4GB + min_value: 8kB + max_value: 17179869176kB + effective_io_concurrency: + title: effective_io_concurrency + short_desc: Number of simultaneous requests that can be handled efficiently + by the disk subsystem + details: + - Sets the number of concurrent storage I/O operations that PostgreSQL expects + can be executed simultaneously. Raising this value will increase the number + of I/O operations that any individual PostgreSQL session attempts to initiate + in parallel. The allowed range is 1 to 1000, or 0 to disable issuance of asynchronous + I/O requests. The default is 16. + - Higher values will have the most impact on higher latency storage where queries + otherwise experience noticeable I/O stalls and on devices with high IOPs. + Unnecessarily high values may increase I/O latency for all queries on the + system + - On systems with prefetch advice support, effective_io_concurrency also controls + the prefetch distance. + - This value can be overridden for tables in a particular tablespace by setting + the tablespace parameter of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-EFFECTIVE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/effective_io_concurrency/18/ + recomendations_conf: Set to the number of disks in your RAID array or number + of I/O channels. Available only for platforms with posix_fadvise support + (i.e. Linux). Currently only affects the execution of parallel bitmapscan, + but might affect other I/O operations in future versions. + type: integer + default_value: "16" + min_value: "0" + max_value: "1000" + file_copy_method: + title: file_copy_method + short_desc: Selects the file copy method + details: + - Specifies the method used to copy files. Possible values are COPY (default) + and CLONE (if operating support is available). + - 'This parameter affects:' + - CLONE uses the copy_file_range() (Linux, FreeBSD) or copyfile (macOS) system + calls, giving the kernel the opportunity to share disk blocks or push work + down to lower layers on some file systems. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-FILE-COPY-METHOD + conf_url: https://postgresqlco.nf/en/doc/param/file_copy_method/18/ + recomendations_conf: "" + type: enum + default_value: copy + min_value: user + max_value: "false" + io_max_combine_limit: + title: io_max_combine_limit + short_desc: Server-wide limit that clamps io_combine_limit + details: + - Controls the largest I/O size in operations that combine I/O, and silently + limits the user-settable parameter io_combine_limit. This parameter can only + be set in the postgresql.conf file or on the server command line. The maximum + possible size depends on the operating system and block size, but is typically + 1MB on Unix and 128kB on Windows. The default is 128kB. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-IO-MAX-COMBINE-LIMIT + conf_url: https://postgresqlco.nf/en/doc/param/io_max_combine_limit/18/ + recomendations_conf: "" + type: integer + default_value: "16" + min_value: "1" + max_value: "128" + io_max_concurrency: + title: io_max_concurrency + short_desc: Max number of IOs that one process can execute simultaneously + details: + - Controls the maximum number of I/O operations that one process can execute + simultaneously. + - The default setting of -1 selects a number based on shared_buffers and the + maximum number of processes (max_connections, guc-autovacuum-worker-slots, + max_worker_processes and max_wal_senders), but not more than 64. + - This parameter can only be set at server start. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-IO-MAX-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/io_max_concurrency/18/ + recomendations_conf: "" + type: integer + default_value: "-1" + min_value: "-1" + max_value: "1024" + io_method: + title: io_method + short_desc: Selects the method for executing asynchronous I/O + details: + - 'Selects the method for executing asynchronous I/O. Possible values are:' + - "" + - This parameter can only be set at server start. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-IO-METHOD + conf_url: https://postgresqlco.nf/en/doc/param/io_method/18/ + recomendations_conf: "" + type: enum + default_value: worker + min_value: postmaster + max_value: "true" + io_workers: + title: io_workers + short_desc: Number of IO worker processes, for io_method=worker + details: + - Selects the number of I/O worker processes to use. The default is 3. This + parameter can only be set in the postgresql.conf file or on the server command + line. + - Only has an effect if io_method is set to worker. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-IO-WORKERS + conf_url: https://postgresqlco.nf/en/doc/param/io_workers/18/ + recomendations_conf: "" + type: integer + default_value: "3" + min_value: "1" + max_value: "32" + listen_addresses: + title: listen_addresses + short_desc: Sets the host name or IP address(es) to listen to + details: + - 'Specifies the TCP/IP address(es) on which the server is to listen for connections + from client applications. The value takes the form of a comma-separated list + of host names and/or numeric IP addresses. The special entry * corresponds + to all available IP interfaces. The entry 0.0.0.0 allows listening for all + IPv4 addresses and :: allows listening for all IPv6 addresses. If the list + is empty, the server does not listen on any IP interface at all, in which + case only Unix-domain sockets can be used to connect to it. If the list is + not empty, the server will start if it can listen on at least one TCP/IP address. + A warning will be emitted for any TCP/IP address which cannot be opened. The + default value is localhost, which allows only local TCP/IP loopback connections + to be made.' + - While client authentication (client-authentication) allows fine-grained control + over who can access the server, listen_addresses controls which interfaces + accept connection attempts, which can help prevent repeated malicious connection + requests on insecure network interfaces. This parameter can only be set at + server start. + url: https://www.postgresql.org/docs/18/static/runtime-config-connection.html#GUC-LISTEN-ADDRESSES + conf_url: https://postgresqlco.nf/en/doc/param/listen_addresses/18/ + recomendations_conf: Set your listen_address as restrictively as possible; '*' + should only be used for development machines + type: string + default_value: localhost + min_value: postmaster + max_value: "true" + maintenance_io_concurrency: + title: maintenance_io_concurrency + short_desc: A variant of "effective_io_concurrency" that is used for maintenance + work + details: + - Similar to effective_io_concurrency, but used for maintenance work that is + done on behalf of many client sessions. + - The default is 16. This value can be overridden for tables in a particular + tablespace by setting the tablespace parameter of the same name (see sql-altertablespace). + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-MAINTENANCE-IO-CONCURRENCY + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_io_concurrency/18/ + recomendations_conf: "" + type: integer + default_value: "16" + min_value: "0" + max_value: "1000" + maintenance_work_mem: + title: maintenance_work_mem + short_desc: Sets the maximum memory to be used for maintenance operations + details: + - Specifies the maximum amount of memory to be used by maintenance operations, + such as VACUUM, CREATE INDEX, and ALTER TABLE ADD FOREIGN KEY. If this value + is specified without units, it is taken as kilobytes. It defaults to 64 megabytes + (64MB). Since only one of these operations can be executed at a time by a + database session, and an installation normally doesn't have many of them running + concurrently, it's safe to set this value significantly larger than work_mem. + Larger settings might improve performance for vacuuming and for restoring + database dumps. + - Note that when autovacuum runs, up to autovacuum_max_workers times this memory + may be allocated, so be careful not to set the default value too high. It + may be useful to control for this by separately setting autovacuum_work_mem. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM + conf_url: https://postgresqlco.nf/en/doc/param/maintenance_work_mem/18/ + recomendations_conf: Sets the limit for the amount that autovacuum, manual vacuum, + bulk index build and other maintenance routines are permitted to use. Setting + it to a moderately high value will increase the efficiency of vacuum and other + operations. Applications which perform large ETL operations may need to allocate + up to 1/4 of RAM to support large bulk vacuums. Note that each autovacuum + worker may use this much, so if using multiple autovacuum workers you may + want to decrease this value so that they can't claim over 1/8 or 1/4 of available + RAM. + type: integer + default_value: 64MB + min_value: 64kB + max_value: 2147483647kB + max_connections: + title: max_connections + short_desc: Sets the maximum number of concurrent connections + details: + - Determines the maximum number of concurrent connections to the database server. + The default is typically 100 connections, but might be less if your kernel + settings will not support it (as determined during initdb). This parameter + can only be set at server start. + - PostgreSQL sizes certain resources based directly on the value of max_connections. + Increasing its value leads to higher allocation of those resources, including + shared memory. + - When running a standby server, you must set this parameter to the same or + higher value than on the primary server. Otherwise, queries will not be allowed + in the standby server. + url: https://www.postgresql.org/docs/18/static/runtime-config-connection.html#GUC-MAX-CONNECTIONS + conf_url: https://postgresqlco.nf/en/doc/param/max_connections/18/ + recomendations_conf: Should be set to the maximum number of connections which + you expect to need at peak load. Note that each connection uses shared_buffer + memory, as well as additional non-shared memory, so be careful not to run + the system out of memory. In general, if you need more than 200 connections, + you should probably be making more use of connection pooling. + type: integer + default_value: "100" + min_value: "1" + max_value: "262143" + max_parallel_workers: + title: max_parallel_workers + short_desc: Sets the maximum number of parallel workers that can be active at + one time + details: + - Sets the maximum number of workers that the cluster can support for parallel + operations. The default value is 8. When increasing or decreasing this value, + consider also adjusting max_parallel_maintenance_workers and max_parallel_workers_per_gather. + Also, note that a setting for this value which is higher than max_worker_processes + will have no effect, since parallel workers are taken from the pool of worker + processes established by that setting. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS + conf_url: https://postgresqlco.nf/en/doc/param/max_parallel_workers/18/ + recomendations_conf: … if you think you can benefit from parallel query, and + even cores/1 for DW systems. + type: integer + default_value: "8" + min_value: "0" + max_value: "1024" + max_parallel_workers_per_gather: + title: max_parallel_workers_per_gather + short_desc: Sets the maximum number of parallel processes per executor node + details: + - Sets the maximum number of workers that can be started by a single Gather + or Gather Merge node. Parallel workers are taken from the pool of processes + established by max_worker_processes, limited by max_parallel_workers. Note + that the requested number of workers may not actually be available at run + time. If this occurs, the plan will run with fewer workers than expected, + which may be inefficient. The default value is 2. Setting this value to 0 + disables parallel query execution. + - Note that parallel queries may consume very substantially more resources than + non-parallel queries, because each worker process is a completely separate + process which has roughly the same impact on the system as an additional user + session. This should be taken into account when choosing a value for this + setting, as well as when configuring other settings that control resource + utilization, such as work_mem. Resource limits such as work_mem are applied + individually to each worker, which means the total utilization may be much + higher across all processes than it would normally be for any single process. + For example, a parallel query using 4 workers may use up to 5 times as much + CPU time, memory, I/O bandwidth, and so forth as a query which uses no workers + at all. + - For more information on parallel query, see parallel-query. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-MAX-PARALLEL-WORKERS-PER-GATHER + conf_url: https://postgresqlco.nf/en/doc/param/max_parallel_workers_per_gather/18/ + recomendations_conf: Increase if you plan to use parallel query to 4 or 8, depending + on cores/concurrent sessions. + type: integer + default_value: "2" + min_value: "0" + max_value: "1024" + max_wal_size: + title: max_wal_size + short_desc: Sets the WAL size that triggers a checkpoint + details: + - Maximum size to let the WAL grow during automatic checkpoints. This is a soft + limit; WAL size can exceed max_wal_size under special circumstances, such + as heavy load, a failing archive_command or archive_library, or a high wal_keep_size + setting. If this value is specified without units, it is taken as megabytes. + The default is 1 GB. Increasing this parameter can increase the amount of + time needed for crash recovery. This parameter can only be set in the postgresql.conf + file or on the server command line. + url: https://www.postgresql.org/docs/18/static/runtime-config-wal.html#GUC-MAX-WAL-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/max_wal_size/18/ + recomendations_conf: … except for databases that write more than 1GB/hour of + data, in which case increase the size of the log so that it's at least an + hour worth of logs + type: integer + default_value: 1GB + min_value: 2MB + max_value: 2147483647MB + max_worker_processes: + title: max_worker_processes + short_desc: Maximum number of concurrent worker processes + details: + - Sets the maximum number of background processes that the cluster can support. + This parameter can only be set at server start. The default is 8. + - When running a standby server, you must set this parameter to the same or + higher value than on the primary server. Otherwise, queries will not be allowed + in the standby server. + - When changing this value, consider also adjusting max_parallel_workers, max_parallel_maintenance_workers, + and max_parallel_workers_per_gather. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-MAX-WORKER-PROCESSES + conf_url: https://postgresqlco.nf/en/doc/param/max_worker_processes/18/ + recomendations_conf: Increase to max_parallel_workers + other workers, such + as workers for logical replication and custom background workers. Not more + than your number of cores, though. + type: integer + default_value: "8" + min_value: "0" + max_value: "262143" + min_wal_size: + title: min_wal_size + short_desc: Sets the minimum size to shrink the WAL to + details: + - As long as WAL disk usage stays below this setting, old WAL files are always + recycled for future use at a checkpoint, rather than removed. This can be + used to ensure that enough WAL space is reserved to handle spikes in WAL usage, + for example when running large batch jobs. If this value is specified without + units, it is taken as megabytes. The default is 80 MB. This parameter can + only be set in the postgresql.conf file or on the server command line. + url: https://www.postgresql.org/docs/18/static/runtime-config-wal.html#GUC-MIN-WAL-SIZE + conf_url: https://postgresqlco.nf/en/doc/param/min_wal_size/18/ + recomendations_conf: "" + type: integer + default_value: 80MB + min_value: 2MB + max_value: 2147483647MB + random_page_cost: + title: random_page_cost + short_desc: Sets the planner's estimate of the cost of a nonsequentially fetched + disk page + details: + - Sets the planner's estimate of the cost of a non-sequentially-fetched disk + page. The default is 4.0. This value can be overridden for tables and indexes + in a particular tablespace by setting the tablespace parameter of the same + name (see sql-altertablespace). + - Reducing this value relative to seq_page_cost will cause the system to prefer + index scans; raising it will make index scans look relatively more expensive. + You can raise or lower both values together to change the importance of disk + I/O costs relative to CPU costs, which are described by the following parameters. + - Random access to mechanical disk storage is normally much more expensive than + four times sequential access. However, a lower default is used (4.0) because + the majority of random accesses to disk, such as indexed reads, are assumed + to be in cache. The default value can be thought of as modeling random access + as 40 times slower than sequential, while expecting 90% of random reads to + be cached. + - If you believe a 90% cache rate is an incorrect assumption for your workload, + you can increase random_page_cost to better reflect the true cost of random + storage reads. Correspondingly, if your data is likely to be completely in + cache, such as when the database is smaller than the total server memory, + decreasing random_page_cost can be appropriate. Storage that has a low random + read cost relative to sequential, e.g., solid-state drives, might also be + better modeled with a lower value for random_page_cost, e.g., 1.1. + url: https://www.postgresql.org/docs/18/static/runtime-config-query.html#GUC-RANDOM-PAGE-COST + conf_url: https://postgresqlco.nf/en/doc/param/random_page_cost/18/ + recomendations_conf: Sets the ratio of seek to scan time for your database storage. Should + not be altered unless you're using special storage (SSDs, high end SANs, etc.) + where seek/scan ratios are actually different. If you need the database to + favor indexes more, tune effective_cache_size and some of the cpu_* costs + instead. + type: floating point + default_value: "4" + min_value: "0" + max_value: "1.79769e+308" + shared_buffers: + title: shared_buffers + short_desc: Sets the number of shared memory buffers used by the server + details: + - Sets the amount of memory the database server uses for shared memory buffers. + The default is typically 128 megabytes (128MB), but might be less if your + kernel settings will not support it (as determined during initdb). This setting + must be at least 128 kilobytes. However, settings significantly higher than + the minimum are usually needed for good performance. If this value is specified + without units, it is taken as blocks, that is BLCKSZ bytes, typically 8kB. + (Non-default values of BLCKSZ change the minimum value.) This parameter can + only be set at server start. + - If you have a dedicated database server with 1GB or more of RAM, a reasonable + starting value for shared_buffers is 25% of the memory in your system. There + are some workloads where even larger settings for shared_buffers are effective, + but because PostgreSQL also relies on the operating system cache, it is unlikely + that an allocation of more than 40% of RAM to shared_buffers will work better + than a smaller amount. Larger settings for shared_buffers usually require + a corresponding increase in max_wal_size, in order to spread out the process + of writing large quantities of new or changed data over a longer period of + time. + - On systems with less than 1GB of RAM, a smaller percentage of RAM is appropriate, + so as to leave adequate space for the operating system. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-SHARED-BUFFERS + conf_url: https://postgresqlco.nf/en/doc/param/shared_buffers/18/ + recomendations_conf: 'A memory quantity defining PostgreSQL''s "dedicated" RAM, + which is used for connection control, active operations, and more. However, + since PostgreSQL also needs free RAM for file system buffers, sorts and maintenance + operations, it is not advisable to set shared_buffers to a majority of RAM. Note + that increasing shared_buffers often requires you to increase some system + kernel parameters, most notably SHMMAX and SHMALL. See Operating System + Environment: Managing Kernel Resources in the PostgreSQL documentation for + more details. Also note that shared_buffers over 2GB is only supported on + 64-bit systems.' + type: integer + default_value: 128MB + min_value: 128kB + max_value: 8589934584kB + wal_buffers: + title: wal_buffers + short_desc: Sets the number of disk-page buffers in shared memory for WAL + details: + - The amount of shared memory used for WAL data that has not yet been written + to disk. The default setting of -1 selects a size equal to 1/32nd (about 3%) + of shared_buffers, but not less than 64kB nor more than the size of one WAL + segment, typically 16MB. This value can be set manually if the automatic choice + is too large or too small, but any positive value less than 32kB will be treated + as 32kB. If this value is specified without units, it is taken as WAL blocks, + that is XLOG_BLCKSZ bytes, typically 8kB. This parameter can only be set at + server start. + - The contents of the WAL buffers are written out to disk at every transaction + commit, so extremely large values are unlikely to provide a significant benefit. + However, setting this value to at least a few megabytes can improve write + performance on a busy server where many clients are committing at once. The + auto-tuning selected by the default setting of -1 should give reasonable results + in most cases. + url: https://www.postgresql.org/docs/18/static/runtime-config-wal.html#GUC-WAL-BUFFERS + conf_url: https://postgresqlco.nf/en/doc/param/wal_buffers/18/ + recomendations_conf: On very busy, high-core machines it can be useful to raise + this to as much as 128MB. + type: integer + default_value: "-1" + min_value: "-1" + max_value: 2097144kB + work_mem: + title: work_mem + short_desc: Sets the maximum memory to be used for query workspaces + details: + - Sets the base maximum amount of memory to be used by a query operation (such + as a sort or hash table) before writing to temporary disk files. If this value + is specified without units, it is taken as kilobytes. The default value is + four megabytes (4MB). Note that a complex query might perform several sort + and hash operations at the same time, with each operation generally being + allowed to use as much memory as this value specifies before it starts to + write data into temporary files. Also, several running sessions could be doing + such operations concurrently. Therefore, the total memory used could be many + times the value of work_mem; it is necessary to keep this fact in mind when + choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge + joins. Hash tables are used in hash joins, hash-based aggregation, memoize + nodes and hash-based processing of IN subqueries. + - Hash-based operations are generally more sensitive to memory availability + than equivalent sort-based operations. The memory limit for a hash table is + computed by multiplying work_mem by hash_mem_multiplier. This makes it possible + for hash-based operations to use an amount of memory that exceeds the usual + work_mem base amount. + url: https://www.postgresql.org/docs/18/static/runtime-config-resource.html#GUC-WORK-MEM + conf_url: https://postgresqlco.nf/en/doc/param/work_mem/18/ + recomendations_conf: Sets the limit for the amount of non-shared RAM available + for each query operation, including sorts and hashes. This limit acts as + a primitive resource control, preventing the server from going into swap due + to overallocation. Note that this is non-shared RAM per operation, which + means large complex queries can use multple times this amount. Also, work_mem + is allocated by powers of two, so round to the nearest binary step. The second + formula is for reporting and DW servers which run a lot of complex queries. + type: integer + default_value: 4MB + min_value: 64kB + max_value: 2147483647kB diff --git a/pkg/category/storage.go b/pkg/category/storage.go index 62df4f1..811f5a4 100644 --- a/pkg/category/storage.go +++ b/pkg/category/storage.go @@ -4,8 +4,14 @@ import "github.com/pgconfig/api/pkg/input" // StorageCfg is the main memory category type StorageCfg struct { - RandomPageCost float32 `json:"random_page_cost"` - EffectiveIOConcurrency int `json:"effective_io_concurrency"` + RandomPageCost float32 `json:"random_page_cost"` + EffectiveIOConcurrency int `json:"effective_io_concurrency"` + MaintenanceIOConcurrency int `json:"maintenance_io_concurrency" min_version:"13"` + IOMethod string `json:"io_method" min_version:"18"` + IOWorkers int `json:"io_workers" min_version:"18"` + IOMaxCombineLimit int `json:"io_max_combine_limit" min_version:"18"` + IOMaxConcurrency int `json:"io_max_concurrency" min_version:"18"` + FileCopyMethod string `json:"file_copy_method" min_version:"18"` } // NewStorageCfg creates a new Storage Configuration @@ -14,7 +20,13 @@ type StorageCfg struct { // with the default value. func NewStorageCfg(in input.Input) *StorageCfg { return &StorageCfg{ - RandomPageCost: 4.0, - EffectiveIOConcurrency: 1, + RandomPageCost: 4.0, + EffectiveIOConcurrency: 1, + MaintenanceIOConcurrency: 10, + IOMethod: "worker", + IOWorkers: 3, + IOMaxCombineLimit: 16, + IOMaxConcurrency: 64, + FileCopyMethod: "copy", } } diff --git a/pkg/defaults/pg.go b/pkg/defaults/pg.go index 408bb11..6411b19 100644 --- a/pkg/defaults/pg.go +++ b/pkg/defaults/pg.go @@ -2,10 +2,10 @@ package defaults const ( // PGVersion is the current stable version of PostgreSQL - PGVersion = "16" + PGVersion = "18" // PGVersionF is the current stable version of PostgreSQL - on the float Format - PGVersionF = 16.0 + PGVersionF = 18.0 ) var ( @@ -25,5 +25,7 @@ var ( 14.0, 15.0, 16.0, + 17.0, + 18.0, } ) diff --git a/pkg/rules/aio.go b/pkg/rules/aio.go new file mode 100644 index 0000000..8b548ab --- /dev/null +++ b/pkg/rules/aio.go @@ -0,0 +1,72 @@ +package rules + +import ( + "math" + + "github.com/pgconfig/api/pkg/category" + "github.com/pgconfig/api/pkg/input" + "github.com/pgconfig/api/pkg/input/profile" +) + +func computeAIO(in *input.Input, cfg *category.ExportCfg) (*category.ExportCfg, error) { + // Set default values already from NewStorageCfg + // Adjust io_workers based on profile and CPU cores + + // Factor per profile + var factor float64 + switch in.Profile { + case profile.Desktop: + factor = 0.1 + case profile.Web: + factor = 0.2 + case profile.Mixed: + factor = 0.25 + case profile.OLTP: + factor = 0.3 + case profile.DW: + factor = 0.4 + default: + factor = 0.25 + } + + // Adjust factor based on disk type (optional) + // HDD may benefit from more workers, SSD from fewer + switch in.DiskType { + case "HDD": + factor += 0.1 + case "SSD", "SAN": + // keep factor as is + } + + // Calculate io_workers + workers := int(math.Ceil(float64(in.TotalCPU) * factor)) + // Ensure at least 2 workers, but keep default 3 as minimum + if workers < 2 { + workers = 2 + } + // Max workers? Not needed, but can limit to total CPU + if workers > in.TotalCPU { + workers = in.TotalCPU + } + cfg.Storage.IOWorkers = workers + + // Tune io_max_combine_limit and io_max_concurrency based on profile + // Values assume 8KB pages for limits (16 = 128KB, 128 = 1MB) + switch in.Profile { + case profile.DW: + // Data Warehouse benefits from larger I/O chunks and higher concurrency + cfg.Storage.IOMaxCombineLimit = 128 // 1MB + cfg.Storage.IOMaxConcurrency = 256 + case profile.OLTP: + // OLTP benefits from concurrency but keep chunks standard + cfg.Storage.IOMaxConcurrency = 128 + } + + // Optionally set io_method based on OS and profile + // For now keep default "worker" + // If Linux and profile is DW or OLTP, consider io_uring + // but we need to be careful about container environments + // cfg.Storage.IOMethod = "worker" + + return cfg, nil +} \ No newline at end of file diff --git a/pkg/rules/aio_test.go b/pkg/rules/aio_test.go new file mode 100644 index 0000000..dc97b78 --- /dev/null +++ b/pkg/rules/aio_test.go @@ -0,0 +1,293 @@ +package rules + +import ( + "testing" + + "github.com/pgconfig/api/pkg/category" + "github.com/pgconfig/api/pkg/input" + "github.com/pgconfig/api/pkg/input/bytes" + "github.com/pgconfig/api/pkg/input/profile" + "github.com/stretchr/testify/assert" +) + +func Test_computeAIO(t *testing.T) { + type args struct { + in *input.Input + cfg *category.ExportCfg + } + tests := []struct { + name string + args args + want *category.ExportCfg + wantErr bool + }{ + { + name: "Desktop profile with 4 cores", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 8 * bytes.GB, + TotalCPU: 4, + Profile: profile.Desktop, + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + cfg.Storage.IOWorkers = 2 // 4 * 0.1 = 0.4 -> ceil = 1, min 2 -> 2 + return cfg + }(), + }, + { + name: "DW profile with 16 cores HDD", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 32 * bytes.GB, + TotalCPU: 16, + Profile: profile.DW, + DiskType: "HDD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // factor 0.4 + 0.1 for HDD = 0.5, 16 * 0.5 = 8, max workers = totalCPU (16), min 2 + cfg.Storage.IOWorkers = 8 + cfg.Storage.IOMaxCombineLimit = 128 + cfg.Storage.IOMaxConcurrency = 256 + return cfg + }(), + }, + { + name: "OLTP profile with 8 cores SSD", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 8, + Profile: profile.OLTP, + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // factor 0.3, 8 * 0.3 = 2.4 -> ceil = 3 + cfg.Storage.IOWorkers = 3 + cfg.Storage.IOMaxConcurrency = 128 + return cfg + }(), + }, + { + name: "PostgreSQL version 17 should still have defaults but will be zeroed later", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 8 * bytes.GB, + TotalCPU: 4, + Profile: profile.Web, + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 17.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // computeAIO still sets io_workers, computeVersion will zero them + cfg.Storage.IOWorkers = 2 // 4 * 0.2 = 0.8 -> ceil =1, min2 ->2 + return cfg + }(), + }, + { + name: "Web profile should use factor 0.2", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 10, + Profile: profile.Web, + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // 10 * 0.2 = 2 + cfg.Storage.IOWorkers = 2 + return cfg + }(), + }, + { + name: "Mixed profile should use factor 0.25", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 12, + Profile: profile.Mixed, + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // 12 * 0.25 = 3 + cfg.Storage.IOWorkers = 3 + return cfg + }(), + }, + { + name: "Unknown profile should use default factor 0.25", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 12, + Profile: "unknown_profile", + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // 12 * 0.25 = 3 + cfg.Storage.IOWorkers = 3 + return cfg + }(), + }, + { + name: "SAN disk type should behave like SSD", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 8, + Profile: profile.OLTP, + DiskType: "SAN", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // OLTP factor 0.3, 8 * 0.3 = 2.4 -> ceil 3 + cfg.Storage.IOWorkers = 3 + cfg.Storage.IOMaxConcurrency = 128 + return cfg + }(), + }, + { + name: "Should limit workers to TotalCPU", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 16 * bytes.GB, + TotalCPU: 2, + Profile: profile.DW, // factor 0.4 + DiskType: "HDD", // +0.1 = 0.5 + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // 2 * 0.5 = 1 -> min 2 -> 2. TotalCPU is 2. So workers = 2. + // Let's try a case where calculation > TotalCPU. + // Say TotalCPU = 2, Factor = 1.5 (impossible here but hypothetically) + // Actually with current factors max is 0.5. + // So workers will always be <= TotalCPU/2? No. + // If TotalCPU=2, 2*0.5=1 -> min 2. + // If TotalCPU=4, DW+HDD=0.5 -> 2. + // Wait, checking code: workers := ceil(TotalCPU * factor). + // If factor < 1, then workers < TotalCPU always. + // Except if ceil pushes it up? + // 4 * 0.9 = 3.6 -> 4. + // 4 * 1.1 = 4.4 -> 5. + // Current max factor is 0.4(DW) + 0.1(HDD) = 0.5. + // So workers will always be <= TotalCPU (since factor < 1). + // So the check `if workers > in.TotalCPU` might be unreachable with current factors? + // Let's verify. + // 1 core: 1 * 0.5 = 0.5 -> ceil 1 -> min 2. workers=2. TotalCPU=1. + // So workers(2) > TotalCPU(1). + // Aha! This case hits it. + cfg.Storage.IOWorkers = 2 // Calculated 2, but TotalCPU is 2. Wait. + cfg.Storage.IOMaxCombineLimit = 128 + cfg.Storage.IOMaxConcurrency = 256 + return cfg + }(), + }, + { + name: "Should cap workers at TotalCPU when calculated min exceeds it", + args: args{ + in: &input.Input{ + OS: "linux", + Arch: "amd64", + TotalRAM: 4 * bytes.GB, + TotalCPU: 1, // Single core + Profile: profile.Web, // Factor 0.2 + DiskType: "SSD", + MaxConnections: 100, + PostgresVersion: 18.0, + }, + cfg: category.NewExportCfg(input.Input{}), + }, + want: func() *category.ExportCfg { + cfg := category.NewExportCfg(input.Input{}) + cfg.Storage.IOMethod = "worker" + // 1 * 0.2 = 0.2 -> ceil 1. + // min workers check -> sets to 2. + // max workers check -> if 2 > 1 -> set to 1. + cfg.Storage.IOWorkers = 1 + return cfg + }(), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := computeAIO(tt.args.in, tt.args.cfg) + if (err != nil) != tt.wantErr { + t.Errorf("computeAIO() error = %v, wantErr %v", err, tt.wantErr) + return + } + assert.Equal(t, tt.want.Storage.IOMethod, got.Storage.IOMethod, "io_method mismatch") + assert.Equal(t, tt.want.Storage.IOWorkers, got.Storage.IOWorkers, "io_workers mismatch") + assert.Equal(t, tt.want.Storage.IOMaxCombineLimit, got.Storage.IOMaxCombineLimit, "io_max_combine_limit mismatch") + assert.Equal(t, tt.want.Storage.IOMaxConcurrency, got.Storage.IOMaxConcurrency, "io_max_concurrency mismatch") + }) + } +} \ No newline at end of file diff --git a/pkg/rules/arch.go b/pkg/rules/arch.go index 7846424..5a36205 100644 --- a/pkg/rules/arch.go +++ b/pkg/rules/arch.go @@ -19,11 +19,11 @@ func ValidArch(arch string) error { default: return errors.ErrorInvalidArch } + return nil } func computeArch(in *input.Input, cfg *category.ExportCfg) (*category.ExportCfg, error) { - if err := ValidArch(in.Arch); err != nil { return nil, err } diff --git a/pkg/rules/compute.go b/pkg/rules/compute.go index b386f19..a13700d 100644 --- a/pkg/rules/compute.go +++ b/pkg/rules/compute.go @@ -14,6 +14,7 @@ var allRules = []rule{ computeOS, computeProfile, computeStorage, + computeAIO, // computeVersion can remove values deppending on the version // to be sure that it will not break other rules, leave it at diff --git a/pkg/rules/storage.go b/pkg/rules/storage.go index b99b886..cd114b2 100644 --- a/pkg/rules/storage.go +++ b/pkg/rules/storage.go @@ -16,6 +16,9 @@ func computeStorage(in *input.Input, cfg *category.ExportCfg) (*category.ExportC cfg.Storage.EffectiveIOConcurrency = 2 } + // maintenance_io_concurrency should match effective_io_concurrency + cfg.Storage.MaintenanceIOConcurrency = cfg.Storage.EffectiveIOConcurrency + if in.DiskType != "HDD" { cfg.Storage.RandomPageCost = 1.1 } diff --git a/pkg/rules/storage_test.go b/pkg/rules/storage_test.go index dcbd7ee..f46f2a9 100644 --- a/pkg/rules/storage_test.go +++ b/pkg/rules/storage_test.go @@ -26,4 +26,15 @@ func Test_computeStorage(t *testing.T) { if outHDD.Storage.EffectiveIOConcurrency > 2 { t.Error("should use lower values for effective_io_concurrency on HDD drives") } + + // maintenance_io_concurrency should match effective_io_concurrency + if outSSD.Storage.MaintenanceIOConcurrency != outSSD.Storage.EffectiveIOConcurrency { + t.Error("maintenance_io_concurrency should match effective_io_concurrency for SSD") + } + if outSAN.Storage.MaintenanceIOConcurrency != outSAN.Storage.EffectiveIOConcurrency { + t.Error("maintenance_io_concurrency should match effective_io_concurrency for SAN") + } + if outHDD.Storage.MaintenanceIOConcurrency != outHDD.Storage.EffectiveIOConcurrency { + t.Error("maintenance_io_concurrency should match effective_io_concurrency for HDD") + } } diff --git a/pkg/rules/version.go b/pkg/rules/version.go index ef5be7a..b2f54b2 100644 --- a/pkg/rules/version.go +++ b/pkg/rules/version.go @@ -30,6 +30,18 @@ func computeVersion(in *input.Input, cfg *category.ExportCfg) (*category.ExportC cfg.Worker.MaxParallelWorkers = 0 } + if in.PostgresVersion < 13.0 { + cfg.Storage.MaintenanceIOConcurrency = 0 + } + + if in.PostgresVersion < 18.0 { + cfg.Storage.IOMethod = "" + cfg.Storage.IOWorkers = 0 + cfg.Storage.IOMaxCombineLimit = 0 + cfg.Storage.IOMaxConcurrency = 0 + cfg.Storage.FileCopyMethod = "" + } + if in.PostgresVersion >= 9.5 { cfg.Checkpoint.CheckpointSegments = 0 } diff --git a/pkg/rules/version_test.go b/pkg/rules/version_test.go index 7d77181..63ac35d 100644 --- a/pkg/rules/version_test.go +++ b/pkg/rules/version_test.go @@ -62,4 +62,36 @@ func Test_computeVersion(t *testing.T) { if out.Memory.SharedBuffers > 8*bytes.GB { t.Error("should limit shared_buffers up to 8gb on versions <= 9.5") } + + in = fakeInput() + in.PostgresVersion = 12.0 + out, _ = computeVersion(in, category.NewExportCfg(*in)) + + if out.Storage.MaintenanceIOConcurrency != 0 { + t.Error("should zero maintenance_io_concurrency for versions < 13") + } + + in = fakeInput() + in.PostgresVersion = 13.0 + out, _ = computeVersion(in, category.NewExportCfg(*in)) + + if out.Storage.MaintenanceIOConcurrency == 0 { + t.Error("should keep maintenance_io_concurrency for versions >= 13") + } + + in = fakeInput() + in.PostgresVersion = 17.0 + out, _ = computeVersion(in, category.NewExportCfg(*in)) + + if out.Storage.IOMethod != "" || out.Storage.IOWorkers != 0 || out.Storage.IOMaxCombineLimit != 0 || out.Storage.IOMaxConcurrency != 0 || out.Storage.FileCopyMethod != "" { + t.Error("should zero all AIO-related parameters for versions < 18") + } + + in = fakeInput() + in.PostgresVersion = 18.0 + out, _ = computeVersion(in, category.NewExportCfg(*in)) + + if out.Storage.IOMethod == "" || out.Storage.IOWorkers == 0 || out.Storage.IOMaxCombineLimit == 0 || out.Storage.IOMaxConcurrency == 0 || out.Storage.FileCopyMethod == "" { + t.Error("should keep AIO-related parameters for versions >= 18") + } } diff --git a/rules.yml b/rules.yml index cf13682..7df031a 100644 --- a/rules.yml +++ b/rules.yml @@ -27,6 +27,7 @@ categories: recomendations: Adjusting maintenance_work_mem: https://www.cybertec-postgresql.com/en/adjusting-maintenance_work_mem/ How Much maintenance_work_mem Do I Need?: http://rhaas.blogspot.com/2019/01/how-much-maintenanceworkmem-do-i-need.html + Don't give Postgres too much memory (even on busy systems): https://vondra.me/posts/dont-give-postgres-too-much-memory-even-on-busy-systems/ Optimize PostgreSQL Server Performance Through Configuration: https://blog.crunchydata.com/blog/optimize-postgresql-server-performance Let's get back to basics - PostgreSQL Memory Components: https://www.postgresql.fastware.com/blog/back-to-basics-with-postgresql-memory-components checkpoint_related: @@ -64,6 +65,50 @@ categories: abstract: Sets the number of concurrent disk I/O operations that PostgreSQL expects can be executed simultaneously. recomendations: "PostgreSQL: effective_io_concurrency benchmarked": https://portavita.github.io/2019-07-19-PostgreSQL_effective_io_concurrency_benchmarked/ + io_method: + abstract: Controls the asynchronous I/O implementation used by PostgreSQL. Options are "worker" (dedicated I/O worker processes), "io_uring" (Linux io_uring interface), and "sync" (traditional synchronous I/O). + recomendations: + Tuning AIO in PostgreSQL 18 - Tomas Vondra: https://vondra.me/posts/tuning-aio-in-postgresql-18/ + Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O - pganalyze: https://pganalyze.com/blog/postgres-18-async-io + PostgreSQL 18: Better I/O performance with AIO - Cybertec: https://www.cybertec-postgresql.com/en/postgresql-18-better-i-o-performance-with-aio/ + PostgreSQL 18 Asynchronous I/O - Neon: https://neon.com/postgresql/postgresql-18/asynchronous-io + PostgreSQL 18: The AIO Revolution - dev.to: https://dev.to/mattleads/postgresql-18-the-aio-revolution-uuidv7-and-the-path-to-unprecedented-performance-415m + io_workers: + abstract: Number of background I/O worker processes used when io_method is set to "worker". Determines how many concurrent I/O operations can be performed asynchronously. + recomendations: + Tuning AIO in PostgreSQL 18 - Tomas Vondra: https://vondra.me/posts/tuning-aio-in-postgresql-18/ + Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O - pganalyze: https://pganalyze.com/blog/postgres-18-async-io + PostgreSQL 18: Better I/O performance with AIO - Cybertec: https://www.cybertec-postgresql.com/en/postgresql-18-better-i-o-performance-with-aio/ + PostgreSQL 18 Asynchronous I/O - Neon: https://neon.com/postgresql/postgresql-18/asynchronous-io + maintenance_io_concurrency: + abstract: Sets the number of concurrent I/O operations that PostgreSQL expects can be executed simultaneously during maintenance operations such as VACUUM and CREATE INDEX. + io_combine_limit: + abstract: Maximum size of adjacent blocks combined into one I/O request. + recomendations: + The Ultimate PostgreSQL 18 Asynchronous I/O Tuning Checklist (With Examples): https://www.cybrosys.com/research-and-development/postgres/the-ultimate-postgresql-18-asynchronous-io-tuning-checklist-with-examples + PostgreSQL 18 Asynchronous Disk I/O - Deep Dive Into Implementation: https://www.credativ.de/en/blog/postgresql-en/postgresql-18-asynchronous-disk-i-o-deep-dive-into-implementation/ + io_max_combine_limit: + abstract: Server-wide limit that clamps io_combine_limit, controlling the largest I/O size in operations that combine I/O. + recomendations: + "Allow io_combine_limit up to 1MB": https://www.postgresql.org/message-id/CA+hUKGKd=U1zSFYNjwBBrXV3NsqR2U8dCUrCBVeB0DQ8Vb8Dwg@mail.gmail.com + Tuning AIO in PostgreSQL 18 - Tomas Vondra: https://vondra.me/posts/tuning-aio-in-postgresql-18/ + Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O - pganalyze: https://pganalyze.com/blog/postgres-18-async-io + PostgreSQL 18: Better I/O performance with AIO - Cybertec: https://www.cybertec-postgresql.com/en/postgresql-18-better-i-o-performance-with-aio/ + PostgreSQL 18 Asynchronous I/O - Neon: https://neon.com/postgresql/postgresql-18/asynchronous-io + The Ultimate PostgreSQL 18 Asynchronous I/O Tuning Checklist (With Examples): https://www.cybrosys.com/research-and-development/postgres/the-ultimate-postgresql-18-asynchronous-io-tuning-checklist-with-examples + PostgreSQL 18 Asynchronous Disk I/O - Deep Dive Into Implementation: https://www.credativ.de/en/blog/postgresql-en/postgresql-18-asynchronous-disk-i-o-deep-dive-into-implementation/ + io_max_concurrency: + abstract: Maximum number of concurrent I/O requests that can be in flight at once. + recomendations: + "PostgreSQL 18 Beta 1 io_max_concurrency": https://www.postgresql.org/message-id/9673.1747250758@sss.pgh.pa.us + Tuning AIO in PostgreSQL 18 - Tomas Vondra: https://vondra.me/posts/tuning-aio-in-postgresql-18/ + Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O - pganalyze: https://pganalyze.com/blog/postgres-18-async-io + PostgreSQL 18: Better I/O performance with AIO - Cybertec: https://www.cybertec-postgresql.com/en/postgresql-18-better-i-o-performance-with-aio/ + PostgreSQL 18 Asynchronous I/O - Neon: https://neon.com/postgresql/postgresql-18/asynchronous-io + The Ultimate PostgreSQL 18 Asynchronous I/O Tuning Checklist (With Examples): https://www.cybrosys.com/research-and-development/postgres/the-ultimate-postgresql-18-asynchronous-io-tuning-checklist-with-examples + PostgreSQL 18 Asynchronous Disk I/O - Deep Dive Into Implementation: https://www.credativ.de/en/blog/postgresql-en/postgresql-18-asynchronous-disk-i-o-deep-dive-into-implementation/ + file_copy_method: + abstract: Selects the method used for copying files during CREATE DATABASE and ALTER DATABASE SET TABLESPACE operations. worker_related: max_worker_processes: abstract: Sets the maximum number of background processes that the system can support. @@ -77,3 +122,4 @@ categories: abstract: Sets the maximum number of parallel workers that can be active at one time recomendations: "Comprehensive guide on how to tune database parameters and configuration in PostgreSQL": https://www.enterprisedb.com/postgres-tutorials/comprehensive-guide-how-tune-database-parameters-and-configuration-postgresql +