Copy disabled (too large)
Download .txt
Showing preview only (16,207K chars total). Download the full file to get everything.
Repository: github/gh-ost
Branch: master
Commit: b9652c336746
Files: 2299
Total size: 21.9 MB
Directory structure:
gitextract_0igtfzyc/
├── .github/
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── codeql.yml
│ ├── golangci-lint.yml
│ └── replica-tests.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile.packaging
├── Dockerfile.test
├── LICENSE
├── README.md
├── build.sh
├── doc/
│ ├── azure.md
│ ├── cheatsheet.md
│ ├── coding-ghost.md
│ ├── command-line-flags.md
│ ├── cut-over.md
│ ├── hooks.md
│ ├── interactive-commands.md
│ ├── local-tests.md
│ ├── migrating-with-sbr.md
│ ├── perks.md
│ ├── questions.md
│ ├── rds.md
│ ├── requirements-and-limitations.md
│ ├── resume.md
│ ├── revert.md
│ ├── shared-key.md
│ ├── subsecond-lag.md
│ ├── testing-on-replica.md
│ ├── the-fine-print.md
│ ├── throttle.md
│ ├── triggerless-design.md
│ ├── understanding-output.md
│ ├── what-if.md
│ └── why-triggerless.md
├── docker-compose.yml
├── go/
│ ├── base/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── default_logger.go
│ │ ├── load_map.go
│ │ ├── load_map_test.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── binlog/
│ │ ├── binlog_dml_event.go
│ │ ├── binlog_entry.go
│ │ ├── binlog_reader.go
│ │ ├── gomysql_reader.go
│ │ └── testdata/
│ │ ├── mysql-bin.000066
│ │ ├── mysql-bin.000070
│ │ ├── rbr-sample-0.txt
│ │ ├── rbr-sample-1.txt
│ │ └── rbr-sample-2.txt
│ ├── cmd/
│ │ └── gh-ost/
│ │ └── main.go
│ ├── logic/
│ │ ├── applier.go
│ │ ├── applier_test.go
│ │ ├── checkpoint.go
│ │ ├── hooks.go
│ │ ├── hooks_test.go
│ │ ├── inspect.go
│ │ ├── inspect_test.go
│ │ ├── migrator.go
│ │ ├── migrator_test.go
│ │ ├── my.cnf.test
│ │ ├── server.go
│ │ ├── server_test.go
│ │ ├── streamer.go
│ │ ├── streamer_test.go
│ │ ├── test_utils.go
│ │ └── throttler.go
│ ├── mysql/
│ │ ├── binlog.go
│ │ ├── binlog_file.go
│ │ ├── binlog_file_test.go
│ │ ├── binlog_gtid.go
│ │ ├── connection.go
│ │ ├── connection_test.go
│ │ ├── instance_key.go
│ │ ├── instance_key_map.go
│ │ ├── instance_key_test.go
│ │ ├── replica_terminology_map.go
│ │ └── utils.go
│ └── sql/
│ ├── builder.go
│ ├── builder_test.go
│ ├── encoding.go
│ ├── parser.go
│ ├── parser_test.go
│ ├── types.go
│ └── types_test.go
├── go.mod
├── go.sum
├── localtests/
│ ├── alter-charset/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── alter-charset-all-dml/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── attempt-instant-ddl/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── autoinc-copy-deletes/
│ │ ├── create.sql
│ │ └── expect_table_structure
│ ├── autoinc-copy-deletes-user-defined/
│ │ ├── create.sql
│ │ ├── expect_table_structure
│ │ └── extra_args
│ ├── autoinc-copy-simple/
│ │ ├── create.sql
│ │ └── expect_table_structure
│ ├── autoinc-zero-value/
│ │ └── create.sql
│ ├── bigint-change-nullable/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── binary-to-varbinary/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── bit-add/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── bit-dml/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── compound-pk/
│ │ └── create.sql
│ ├── compound-pk-ts/
│ │ └── create.sql
│ ├── convert-utf8mb4/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── copy-retries-exhausted/
│ │ ├── after.sql
│ │ ├── before.sql
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── datetime/
│ │ └── create.sql
│ ├── datetime-1970/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ ├── orig_columns
│ │ └── sql_mode
│ ├── datetime-submillis/
│ │ └── create.sql
│ ├── datetime-submillis-zeroleading/
│ │ └── create.sql
│ ├── datetime-to-timestamp/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── datetime-to-timestamp-pk-fail/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── datetime-with-zero/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── decimal/
│ │ └── create.sql
│ ├── discard-fk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── docker-compose.yml
│ ├── drop-null-add-not-null/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── enum/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── enum-pk/
│ │ └── create.sql
│ ├── enum-to-varchar/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── existing-datetime-with-zero/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── fail-datetime-with-zero/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-drop-pk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-existing-datetime-with-zero/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-fk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── ignore_versions
│ ├── fail-fk-parent/
│ │ ├── create.sql
│ │ ├── destroy.sql
│ │ ├── expect_failure
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── fail-float-unique-key/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-no-shared-uk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-no-unique-key/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-rename-table/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-update-pk-column/
│ │ └── create.sql
│ ├── gbk-charset/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── generated-columns/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── generated-columns-add/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ ├── ignore_versions
│ │ ├── order_by
│ │ └── orig_columns
│ ├── generated-columns-rename/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── generated-columns-unique/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── geometry/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── gtid/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── gtid_mode
│ │ └── ignore_versions
│ ├── json/
│ │ └── create.sql
│ ├── json-dml/
│ │ └── create.sql
│ ├── keyword-column/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── latin1/
│ │ └── create.sql
│ ├── latin1text/
│ │ └── create.sql
│ ├── mixed-charset/
│ │ └── create.sql
│ ├── modify-change-case/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── modify-change-case-pk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-duplicate-unique-values-on-column-type-change/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-duplicate-values-for-unique-index/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ ├── extra_args
│ │ └── test.sh
│ ├── rename/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-inserts-only/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-none-column/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-none-comment/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-reorder-column/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── rename-reorder-columns/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── reorder-columns/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── shared-uk/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── spatial/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── swap-pk-uk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── order_by
│ ├── swap-uk/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── swap-uk-uk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── order_by
│ ├── sysbench/
│ │ └── create.sql
│ ├── test.sh
│ ├── timestamp/
│ │ └── create.sql
│ ├── timestamp-datetime/
│ │ └── create.sql
│ ├── timestamp-to-datetime/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trigger-advanced-features/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trigger-ghost-name-conflict/
│ │ ├── create.sql
│ │ ├── destroy.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── trigger-long-name-validation/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trivial/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── tz/
│ │ └── create.sql
│ ├── tz-datetime/
│ │ └── create.sql
│ ├── tz-datetime-ts/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── unsigned/
│ │ └── create.sql
│ ├── unsigned-modify/
│ │ └── create.sql
│ ├── unsigned-rename/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── unsigned-reorder/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── utf8/
│ │ └── create.sql
│ ├── utf8mb4/
│ │ └── create.sql
│ └── varbinary/
│ └── create.sql
├── resources/
│ └── hooks-sample/
│ ├── gh-ost-on-before-cut-over-hook
│ ├── gh-ost-on-before-row-copy-hook
│ ├── gh-ost-on-begin-postponed-hook
│ ├── gh-ost-on-failure-hook
│ ├── gh-ost-on-interactive-command-hook
│ ├── gh-ost-on-row-copy-complete-hook
│ ├── gh-ost-on-rowcount-complete-hook
│ ├── gh-ost-on-start-replication-hook
│ ├── gh-ost-on-startup-hook
│ ├── gh-ost-on-status-hook
│ ├── gh-ost-on-stop-replication-hook
│ ├── gh-ost-on-success-hook
│ ├── gh-ost-on-success-hook-2
│ └── gh-ost-on-validated-hook
├── script/
│ ├── bootstrap
│ ├── build
│ ├── build-deploy-tarball
│ ├── cibuild
│ ├── cibuild-gh-ost-build-deploy-tarball
│ ├── dock
│ ├── docker-gh-ost-replica-tests
│ ├── ensure-go-installed
│ ├── ensure-golangci-lint-installed
│ ├── gh-ost-test-mysql-master
│ ├── gh-ost-test-mysql-replica
│ ├── go
│ ├── lint
│ └── test
├── test.sh
├── tmp/
│ └── .gitkeep
└── vendor/
├── dario.cat/
│ └── mergo/
│ ├── .deepsource.toml
│ ├── .gitignore
│ ├── .travis.yml
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── README.md
│ ├── SECURITY.md
│ ├── doc.go
│ ├── map.go
│ ├── merge.go
│ └── mergo.go
├── filippo.io/
│ └── edwards25519/
│ ├── LICENSE
│ ├── README.md
│ ├── doc.go
│ ├── edwards25519.go
│ ├── extra.go
│ ├── field/
│ │ ├── fe.go
│ │ ├── fe_amd64.go
│ │ ├── fe_amd64.s
│ │ ├── fe_amd64_noasm.go
│ │ ├── fe_arm64.go
│ │ ├── fe_arm64.s
│ │ ├── fe_arm64_noasm.go
│ │ ├── fe_extra.go
│ │ └── fe_generic.go
│ ├── scalar.go
│ ├── scalar_fiat.go
│ ├── scalarmult.go
│ └── tables.go
├── github.com/
│ ├── Azure/
│ │ └── go-ansiterm/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── constants.go
│ │ ├── context.go
│ │ ├── csi_entry_state.go
│ │ ├── csi_param_state.go
│ │ ├── escape_intermediate_state.go
│ │ ├── escape_state.go
│ │ ├── event_handler.go
│ │ ├── ground_state.go
│ │ ├── osc_string_state.go
│ │ ├── parser.go
│ │ ├── parser_action_helpers.go
│ │ ├── parser_actions.go
│ │ ├── states.go
│ │ ├── utilities.go
│ │ └── winterm/
│ │ ├── ansi.go
│ │ ├── api.go
│ │ ├── attr_translation.go
│ │ ├── cursor_helpers.go
│ │ ├── erase_helpers.go
│ │ ├── scroll_helper.go
│ │ ├── utilities.go
│ │ └── win_event_handler.go
│ ├── Masterminds/
│ │ └── semver/
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── collection.go
│ │ ├── constraints.go
│ │ ├── doc.go
│ │ ├── version.go
│ │ └── version_fuzz.go
│ ├── Microsoft/
│ │ └── go-winio/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODEOWNERS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── backup.go
│ │ ├── doc.go
│ │ ├── ea.go
│ │ ├── file.go
│ │ ├── fileinfo.go
│ │ ├── hvsock.go
│ │ ├── internal/
│ │ │ ├── fs/
│ │ │ │ ├── doc.go
│ │ │ │ ├── fs.go
│ │ │ │ ├── security.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── socket/
│ │ │ │ ├── rawaddr.go
│ │ │ │ ├── socket.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ └── stringbuffer/
│ │ │ └── wstring.go
│ │ ├── pipe.go
│ │ ├── pkg/
│ │ │ └── guid/
│ │ │ ├── guid.go
│ │ │ ├── guid_nonwindows.go
│ │ │ ├── guid_windows.go
│ │ │ └── variant_string.go
│ │ ├── privilege.go
│ │ ├── reparse.go
│ │ ├── sd.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── cenkalti/
│ │ └── backoff/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backoff.go
│ │ ├── context.go
│ │ ├── exponential.go
│ │ ├── retry.go
│ │ ├── ticker.go
│ │ ├── timer.go
│ │ └── tries.go
│ ├── containerd/
│ │ ├── log/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── context.go
│ │ └── platforms/
│ │ ├── .gitattributes
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── compare.go
│ │ ├── cpuinfo.go
│ │ ├── cpuinfo_linux.go
│ │ ├── cpuinfo_other.go
│ │ ├── database.go
│ │ ├── defaults.go
│ │ ├── defaults_darwin.go
│ │ ├── defaults_freebsd.go
│ │ ├── defaults_unix.go
│ │ ├── defaults_windows.go
│ │ ├── errors.go
│ │ ├── platform_compat_windows.go
│ │ ├── platforms.go
│ │ ├── platforms_other.go
│ │ └── platforms_windows.go
│ ├── cpuguy83/
│ │ └── dockercfg/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auth.go
│ │ ├── config.go
│ │ └── load.go
│ ├── davecgh/
│ │ └── go-spew/
│ │ ├── LICENSE
│ │ └── spew/
│ │ ├── bypass.go
│ │ ├── bypasssafe.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── dump.go
│ │ ├── format.go
│ │ └── spew.go
│ ├── distribution/
│ │ └── reference/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE-OF-CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── GOVERNANCE.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── helpers.go
│ │ ├── normalize.go
│ │ ├── reference.go
│ │ ├── regexp.go
│ │ └── sort.go
│ ├── docker/
│ │ ├── docker/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── common.go
│ │ │ │ ├── swagger-gen.yaml
│ │ │ │ ├── swagger.yaml
│ │ │ │ └── types/
│ │ │ │ ├── blkiodev/
│ │ │ │ │ └── blkio.go
│ │ │ │ ├── checkpoint/
│ │ │ │ │ ├── list.go
│ │ │ │ │ └── options.go
│ │ │ │ ├── client.go
│ │ │ │ ├── common/
│ │ │ │ │ └── id_response.go
│ │ │ │ ├── container/
│ │ │ │ │ ├── change_type.go
│ │ │ │ │ ├── change_types.go
│ │ │ │ │ ├── commit.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── create_request.go
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── exec.go
│ │ │ │ │ ├── filesystem_change.go
│ │ │ │ │ ├── health.go
│ │ │ │ │ ├── hostconfig.go
│ │ │ │ │ ├── hostconfig_unix.go
│ │ │ │ │ ├── hostconfig_windows.go
│ │ │ │ │ ├── network_settings.go
│ │ │ │ │ ├── options.go
│ │ │ │ │ ├── port.go
│ │ │ │ │ ├── stats.go
│ │ │ │ │ ├── top_response.go
│ │ │ │ │ ├── update_response.go
│ │ │ │ │ ├── wait_exit_error.go
│ │ │ │ │ ├── wait_response.go
│ │ │ │ │ └── waitcondition.go
│ │ │ │ ├── error_response.go
│ │ │ │ ├── error_response_ext.go
│ │ │ │ ├── events/
│ │ │ │ │ └── events.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── parse.go
│ │ │ │ ├── image/
│ │ │ │ │ ├── delete_response.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── image_history.go
│ │ │ │ │ ├── image_inspect.go
│ │ │ │ │ ├── manifest.go
│ │ │ │ │ ├── opts.go
│ │ │ │ │ └── summary.go
│ │ │ │ ├── mount/
│ │ │ │ │ └── mount.go
│ │ │ │ ├── network/
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── endpoint.go
│ │ │ │ │ ├── ipam.go
│ │ │ │ │ └── network.go
│ │ │ │ ├── plugin.go
│ │ │ │ ├── plugin_device.go
│ │ │ │ ├── plugin_env.go
│ │ │ │ ├── plugin_interface_type.go
│ │ │ │ ├── plugin_mount.go
│ │ │ │ ├── plugin_responses.go
│ │ │ │ ├── registry/
│ │ │ │ │ ├── authconfig.go
│ │ │ │ │ ├── authenticate.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ └── search.go
│ │ │ │ ├── storage/
│ │ │ │ │ └── driver_data.go
│ │ │ │ ├── strslice/
│ │ │ │ │ └── strslice.go
│ │ │ │ ├── swarm/
│ │ │ │ │ ├── common.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── network.go
│ │ │ │ │ ├── node.go
│ │ │ │ │ ├── runtime/
│ │ │ │ │ │ ├── gen.go
│ │ │ │ │ │ ├── plugin.pb.go
│ │ │ │ │ │ └── plugin.proto
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ ├── secret.go
│ │ │ │ │ ├── service.go
│ │ │ │ │ ├── service_create_response.go
│ │ │ │ │ ├── service_update_response.go
│ │ │ │ │ ├── swarm.go
│ │ │ │ │ └── task.go
│ │ │ │ ├── system/
│ │ │ │ │ ├── info.go
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ └── security_opts.go
│ │ │ │ ├── time/
│ │ │ │ │ └── timestamp.go
│ │ │ │ ├── types.go
│ │ │ │ ├── types_deprecated.go
│ │ │ │ ├── versions/
│ │ │ │ │ └── compare.go
│ │ │ │ └── volume/
│ │ │ │ ├── cluster_volume.go
│ │ │ │ ├── create_options.go
│ │ │ │ ├── list_response.go
│ │ │ │ ├── options.go
│ │ │ │ ├── volume.go
│ │ │ │ └── volume_update.go
│ │ │ ├── client/
│ │ │ │ ├── README.md
│ │ │ │ ├── build_cancel.go
│ │ │ │ ├── build_prune.go
│ │ │ │ ├── checkpoint.go
│ │ │ │ ├── checkpoint_create.go
│ │ │ │ ├── checkpoint_delete.go
│ │ │ │ ├── checkpoint_list.go
│ │ │ │ ├── client.go
│ │ │ │ ├── client_deprecated.go
│ │ │ │ ├── client_interfaces.go
│ │ │ │ ├── client_unix.go
│ │ │ │ ├── client_windows.go
│ │ │ │ ├── config_create.go
│ │ │ │ ├── config_inspect.go
│ │ │ │ ├── config_list.go
│ │ │ │ ├── config_remove.go
│ │ │ │ ├── config_update.go
│ │ │ │ ├── container_attach.go
│ │ │ │ ├── container_commit.go
│ │ │ │ ├── container_copy.go
│ │ │ │ ├── container_create.go
│ │ │ │ ├── container_diff.go
│ │ │ │ ├── container_exec.go
│ │ │ │ ├── container_export.go
│ │ │ │ ├── container_inspect.go
│ │ │ │ ├── container_kill.go
│ │ │ │ ├── container_list.go
│ │ │ │ ├── container_logs.go
│ │ │ │ ├── container_pause.go
│ │ │ │ ├── container_prune.go
│ │ │ │ ├── container_remove.go
│ │ │ │ ├── container_rename.go
│ │ │ │ ├── container_resize.go
│ │ │ │ ├── container_restart.go
│ │ │ │ ├── container_start.go
│ │ │ │ ├── container_stats.go
│ │ │ │ ├── container_stop.go
│ │ │ │ ├── container_top.go
│ │ │ │ ├── container_unpause.go
│ │ │ │ ├── container_update.go
│ │ │ │ ├── container_wait.go
│ │ │ │ ├── disk_usage.go
│ │ │ │ ├── distribution_inspect.go
│ │ │ │ ├── envvars.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── events.go
│ │ │ │ ├── hijack.go
│ │ │ │ ├── image_build.go
│ │ │ │ ├── image_create.go
│ │ │ │ ├── image_history.go
│ │ │ │ ├── image_history_opts.go
│ │ │ │ ├── image_import.go
│ │ │ │ ├── image_inspect.go
│ │ │ │ ├── image_inspect_opts.go
│ │ │ │ ├── image_list.go
│ │ │ │ ├── image_load.go
│ │ │ │ ├── image_load_opts.go
│ │ │ │ ├── image_prune.go
│ │ │ │ ├── image_pull.go
│ │ │ │ ├── image_push.go
│ │ │ │ ├── image_remove.go
│ │ │ │ ├── image_save.go
│ │ │ │ ├── image_save_opts.go
│ │ │ │ ├── image_search.go
│ │ │ │ ├── image_tag.go
│ │ │ │ ├── info.go
│ │ │ │ ├── login.go
│ │ │ │ ├── network_connect.go
│ │ │ │ ├── network_create.go
│ │ │ │ ├── network_disconnect.go
│ │ │ │ ├── network_inspect.go
│ │ │ │ ├── network_list.go
│ │ │ │ ├── network_prune.go
│ │ │ │ ├── network_remove.go
│ │ │ │ ├── node_inspect.go
│ │ │ │ ├── node_list.go
│ │ │ │ ├── node_remove.go
│ │ │ │ ├── node_update.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ping.go
│ │ │ │ ├── plugin_create.go
│ │ │ │ ├── plugin_disable.go
│ │ │ │ ├── plugin_enable.go
│ │ │ │ ├── plugin_inspect.go
│ │ │ │ ├── plugin_install.go
│ │ │ │ ├── plugin_list.go
│ │ │ │ ├── plugin_push.go
│ │ │ │ ├── plugin_remove.go
│ │ │ │ ├── plugin_set.go
│ │ │ │ ├── plugin_upgrade.go
│ │ │ │ ├── request.go
│ │ │ │ ├── secret_create.go
│ │ │ │ ├── secret_inspect.go
│ │ │ │ ├── secret_list.go
│ │ │ │ ├── secret_remove.go
│ │ │ │ ├── secret_update.go
│ │ │ │ ├── service_create.go
│ │ │ │ ├── service_inspect.go
│ │ │ │ ├── service_list.go
│ │ │ │ ├── service_logs.go
│ │ │ │ ├── service_remove.go
│ │ │ │ ├── service_update.go
│ │ │ │ ├── swarm_get_unlock_key.go
│ │ │ │ ├── swarm_init.go
│ │ │ │ ├── swarm_inspect.go
│ │ │ │ ├── swarm_join.go
│ │ │ │ ├── swarm_leave.go
│ │ │ │ ├── swarm_unlock.go
│ │ │ │ ├── swarm_update.go
│ │ │ │ ├── task_inspect.go
│ │ │ │ ├── task_list.go
│ │ │ │ ├── task_logs.go
│ │ │ │ ├── utils.go
│ │ │ │ ├── version.go
│ │ │ │ ├── volume_create.go
│ │ │ │ ├── volume_inspect.go
│ │ │ │ ├── volume_list.go
│ │ │ │ ├── volume_prune.go
│ │ │ │ ├── volume_remove.go
│ │ │ │ └── volume_update.go
│ │ │ ├── errdefs/
│ │ │ │ ├── defs.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── http_helpers.go
│ │ │ │ └── is.go
│ │ │ ├── internal/
│ │ │ │ ├── lazyregexp/
│ │ │ │ │ └── lazyregexp.go
│ │ │ │ └── multierror/
│ │ │ │ └── multierror.go
│ │ │ └── pkg/
│ │ │ ├── archive/
│ │ │ │ ├── archive.go
│ │ │ │ ├── archive_linux.go
│ │ │ │ ├── archive_other.go
│ │ │ │ ├── archive_unix.go
│ │ │ │ ├── archive_windows.go
│ │ │ │ ├── changes.go
│ │ │ │ ├── changes_linux.go
│ │ │ │ ├── changes_other.go
│ │ │ │ ├── changes_unix.go
│ │ │ │ ├── changes_windows.go
│ │ │ │ ├── copy.go
│ │ │ │ ├── copy_unix.go
│ │ │ │ ├── copy_windows.go
│ │ │ │ ├── dev_freebsd.go
│ │ │ │ ├── dev_unix.go
│ │ │ │ ├── diff.go
│ │ │ │ ├── diff_unix.go
│ │ │ │ ├── diff_windows.go
│ │ │ │ ├── path.go
│ │ │ │ ├── path_unix.go
│ │ │ │ ├── path_windows.go
│ │ │ │ ├── time.go
│ │ │ │ ├── time_nonwindows.go
│ │ │ │ ├── time_windows.go
│ │ │ │ ├── whiteouts.go
│ │ │ │ ├── wrap.go
│ │ │ │ ├── xattr_supported.go
│ │ │ │ ├── xattr_supported_linux.go
│ │ │ │ ├── xattr_supported_unix.go
│ │ │ │ └── xattr_unsupported.go
│ │ │ ├── idtools/
│ │ │ │ ├── idtools.go
│ │ │ │ ├── idtools_unix.go
│ │ │ │ └── idtools_windows.go
│ │ │ ├── jsonmessage/
│ │ │ │ └── jsonmessage.go
│ │ │ └── stdcopy/
│ │ │ └── stdcopy.go
│ │ ├── go-connections/
│ │ │ ├── LICENSE
│ │ │ ├── nat/
│ │ │ │ ├── nat.go
│ │ │ │ ├── parse.go
│ │ │ │ └── sort.go
│ │ │ ├── sockets/
│ │ │ │ ├── README.md
│ │ │ │ ├── inmem_socket.go
│ │ │ │ ├── proxy.go
│ │ │ │ ├── sockets.go
│ │ │ │ ├── sockets_unix.go
│ │ │ │ ├── sockets_windows.go
│ │ │ │ ├── tcp_socket.go
│ │ │ │ └── unix_socket.go
│ │ │ └── tlsconfig/
│ │ │ ├── certpool.go
│ │ │ ├── config.go
│ │ │ └── config_client_ciphers.go
│ │ └── go-units/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── circle.yml
│ │ ├── duration.go
│ │ ├── size.go
│ │ └── ulimit.go
│ ├── ebitengine/
│ │ └── purego/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── abi_amd64.h
│ │ ├── abi_arm64.h
│ │ ├── cgo.go
│ │ ├── dlerror.go
│ │ ├── dlfcn.go
│ │ ├── dlfcn_android.go
│ │ ├── dlfcn_darwin.go
│ │ ├── dlfcn_freebsd.go
│ │ ├── dlfcn_linux.go
│ │ ├── dlfcn_nocgo_freebsd.go
│ │ ├── dlfcn_nocgo_linux.go
│ │ ├── dlfcn_playground.go
│ │ ├── dlfcn_stubs.s
│ │ ├── func.go
│ │ ├── go_runtime.go
│ │ ├── internal/
│ │ │ ├── cgo/
│ │ │ │ ├── dlfcn_cgo_unix.go
│ │ │ │ ├── empty.go
│ │ │ │ └── syscall_cgo_unix.go
│ │ │ ├── fakecgo/
│ │ │ │ ├── abi_amd64.h
│ │ │ │ ├── abi_arm64.h
│ │ │ │ ├── asm_amd64.s
│ │ │ │ ├── asm_arm64.s
│ │ │ │ ├── callbacks.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── freebsd.go
│ │ │ │ ├── go_darwin_amd64.go
│ │ │ │ ├── go_darwin_arm64.go
│ │ │ │ ├── go_freebsd_amd64.go
│ │ │ │ ├── go_freebsd_arm64.go
│ │ │ │ ├── go_libinit.go
│ │ │ │ ├── go_linux_amd64.go
│ │ │ │ ├── go_linux_arm64.go
│ │ │ │ ├── go_setenv.go
│ │ │ │ ├── go_util.go
│ │ │ │ ├── iscgo.go
│ │ │ │ ├── libcgo.go
│ │ │ │ ├── libcgo_darwin.go
│ │ │ │ ├── libcgo_freebsd.go
│ │ │ │ ├── libcgo_linux.go
│ │ │ │ ├── setenv.go
│ │ │ │ ├── symbols.go
│ │ │ │ ├── symbols_darwin.go
│ │ │ │ ├── symbols_freebsd.go
│ │ │ │ ├── symbols_linux.go
│ │ │ │ ├── trampolines_amd64.s
│ │ │ │ ├── trampolines_arm64.s
│ │ │ │ └── trampolines_stubs.s
│ │ │ └── strings/
│ │ │ └── strings.go
│ │ ├── is_ios.go
│ │ ├── nocgo.go
│ │ ├── struct_amd64.go
│ │ ├── struct_arm64.go
│ │ ├── struct_other.go
│ │ ├── sys_amd64.s
│ │ ├── sys_arm64.s
│ │ ├── sys_unix_arm64.s
│ │ ├── syscall.go
│ │ ├── syscall_cgo_linux.go
│ │ ├── syscall_sysv.go
│ │ ├── syscall_windows.go
│ │ ├── zcallback_amd64.s
│ │ └── zcallback_arm64.s
│ ├── felixge/
│ │ └── httpsnoop/
│ │ ├── .gitignore
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── capture_metrics.go
│ │ ├── docs.go
│ │ ├── wrap_generated_gteq_1.8.go
│ │ └── wrap_generated_lt_1.8.go
│ ├── go-ini/
│ │ └── ini/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── codecov.yml
│ │ ├── data_source.go
│ │ ├── deprecated.go
│ │ ├── error.go
│ │ ├── file.go
│ │ ├── helper.go
│ │ ├── ini.go
│ │ ├── key.go
│ │ ├── parser.go
│ │ ├── section.go
│ │ └── struct.go
│ ├── go-logr/
│ │ ├── logr/
│ │ │ ├── .golangci.yaml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── context.go
│ │ │ ├── context_noslog.go
│ │ │ ├── context_slog.go
│ │ │ ├── discard.go
│ │ │ ├── funcr/
│ │ │ │ ├── funcr.go
│ │ │ │ └── slogsink.go
│ │ │ ├── logr.go
│ │ │ ├── sloghandler.go
│ │ │ ├── slogr.go
│ │ │ └── slogsink.go
│ │ └── stdr/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stdr.go
│ ├── go-mysql-org/
│ │ └── go-mysql/
│ │ ├── LICENSE
│ │ ├── client/
│ │ │ ├── auth.go
│ │ │ ├── conn.go
│ │ │ ├── pool.go
│ │ │ ├── pool_options.go
│ │ │ ├── req.go
│ │ │ ├── resp.go
│ │ │ ├── stmt.go
│ │ │ └── tls.go
│ │ ├── compress/
│ │ │ └── zlib.go
│ │ ├── mysql/
│ │ │ ├── const.go
│ │ │ ├── errcode.go
│ │ │ ├── errname.go
│ │ │ ├── error.go
│ │ │ ├── field.go
│ │ │ ├── gtid.go
│ │ │ ├── mariadb_gtid.go
│ │ │ ├── mysql_gtid.go
│ │ │ ├── parse_binary.go
│ │ │ ├── position.go
│ │ │ ├── result.go
│ │ │ ├── resultset.go
│ │ │ ├── resultset_helper.go
│ │ │ ├── rowdata.go
│ │ │ ├── state.go
│ │ │ ├── util.go
│ │ │ └── validate.go
│ │ ├── packet/
│ │ │ └── conn.go
│ │ ├── replication/
│ │ │ ├── backup.go
│ │ │ ├── binlogstreamer.go
│ │ │ ├── binlogsyncer.go
│ │ │ ├── const.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── generic_event.go
│ │ │ ├── json_binary.go
│ │ │ ├── parser.go
│ │ │ ├── row_event.go
│ │ │ ├── time.go
│ │ │ └── transaction_payload_event.go
│ │ └── utils/
│ │ ├── byte_slice_pool.go
│ │ ├── bytes_buffer_pool.go
│ │ ├── now.go
│ │ ├── now_unix.go
│ │ └── zeroalloc.go
│ ├── go-ole/
│ │ └── go-ole/
│ │ ├── .travis.yml
│ │ ├── ChangeLog.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── com.go
│ │ ├── com_func.go
│ │ ├── connect.go
│ │ ├── constants.go
│ │ ├── error.go
│ │ ├── error_func.go
│ │ ├── error_windows.go
│ │ ├── guid.go
│ │ ├── iconnectionpoint.go
│ │ ├── iconnectionpoint_func.go
│ │ ├── iconnectionpoint_windows.go
│ │ ├── iconnectionpointcontainer.go
│ │ ├── iconnectionpointcontainer_func.go
│ │ ├── iconnectionpointcontainer_windows.go
│ │ ├── idispatch.go
│ │ ├── idispatch_func.go
│ │ ├── idispatch_windows.go
│ │ ├── ienumvariant.go
│ │ ├── ienumvariant_func.go
│ │ ├── ienumvariant_windows.go
│ │ ├── iinspectable.go
│ │ ├── iinspectable_func.go
│ │ ├── iinspectable_windows.go
│ │ ├── iprovideclassinfo.go
│ │ ├── iprovideclassinfo_func.go
│ │ ├── iprovideclassinfo_windows.go
│ │ ├── itypeinfo.go
│ │ ├── itypeinfo_func.go
│ │ ├── itypeinfo_windows.go
│ │ ├── iunknown.go
│ │ ├── iunknown_func.go
│ │ ├── iunknown_windows.go
│ │ ├── ole.go
│ │ ├── oleutil/
│ │ │ ├── connection.go
│ │ │ ├── connection_func.go
│ │ │ ├── connection_windows.go
│ │ │ ├── go-get.go
│ │ │ └── oleutil.go
│ │ ├── safearray.go
│ │ ├── safearray_func.go
│ │ ├── safearray_windows.go
│ │ ├── safearrayconversion.go
│ │ ├── safearrayslices.go
│ │ ├── utility.go
│ │ ├── variables.go
│ │ ├── variant.go
│ │ ├── variant_386.go
│ │ ├── variant_amd64.go
│ │ ├── variant_arm.go
│ │ ├── variant_arm64.go
│ │ ├── variant_date_386.go
│ │ ├── variant_date_amd64.go
│ │ ├── variant_date_arm.go
│ │ ├── variant_date_arm64.go
│ │ ├── variant_ppc64le.go
│ │ ├── variant_s390x.go
│ │ ├── vt_string.go
│ │ ├── winrt.go
│ │ └── winrt_doc.go
│ ├── go-sql-driver/
│ │ └── mysql/
│ │ ├── .gitignore
│ │ ├── AUTHORS
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── atomic_bool.go
│ │ ├── atomic_bool_go118.go
│ │ ├── auth.go
│ │ ├── buffer.go
│ │ ├── collations.go
│ │ ├── conncheck.go
│ │ ├── conncheck_dummy.go
│ │ ├── connection.go
│ │ ├── connector.go
│ │ ├── const.go
│ │ ├── driver.go
│ │ ├── dsn.go
│ │ ├── errors.go
│ │ ├── fields.go
│ │ ├── infile.go
│ │ ├── nulltime.go
│ │ ├── packets.go
│ │ ├── result.go
│ │ ├── rows.go
│ │ ├── statement.go
│ │ ├── transaction.go
│ │ └── utils.go
│ ├── goccy/
│ │ └── go-json/
│ │ ├── .codecov.yml
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── color.go
│ │ ├── decode.go
│ │ ├── docker-compose.yml
│ │ ├── encode.go
│ │ ├── error.go
│ │ ├── internal/
│ │ │ ├── decoder/
│ │ │ │ ├── anonymous_field.go
│ │ │ │ ├── array.go
│ │ │ │ ├── assign.go
│ │ │ │ ├── bool.go
│ │ │ │ ├── bytes.go
│ │ │ │ ├── compile.go
│ │ │ │ ├── compile_norace.go
│ │ │ │ ├── compile_race.go
│ │ │ │ ├── context.go
│ │ │ │ ├── float.go
│ │ │ │ ├── func.go
│ │ │ │ ├── int.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── invalid.go
│ │ │ │ ├── map.go
│ │ │ │ ├── number.go
│ │ │ │ ├── option.go
│ │ │ │ ├── path.go
│ │ │ │ ├── ptr.go
│ │ │ │ ├── slice.go
│ │ │ │ ├── stream.go
│ │ │ │ ├── string.go
│ │ │ │ ├── struct.go
│ │ │ │ ├── type.go
│ │ │ │ ├── uint.go
│ │ │ │ ├── unmarshal_json.go
│ │ │ │ ├── unmarshal_text.go
│ │ │ │ └── wrapped_string.go
│ │ │ ├── encoder/
│ │ │ │ ├── code.go
│ │ │ │ ├── compact.go
│ │ │ │ ├── compiler.go
│ │ │ │ ├── compiler_norace.go
│ │ │ │ ├── compiler_race.go
│ │ │ │ ├── context.go
│ │ │ │ ├── decode_rune.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── indent.go
│ │ │ │ ├── int.go
│ │ │ │ ├── map112.go
│ │ │ │ ├── map113.go
│ │ │ │ ├── opcode.go
│ │ │ │ ├── option.go
│ │ │ │ ├── optype.go
│ │ │ │ ├── query.go
│ │ │ │ ├── string.go
│ │ │ │ ├── string_table.go
│ │ │ │ ├── vm/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── hack.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ ├── vm_color/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── hack.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ ├── vm_color_indent/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ └── vm_indent/
│ │ │ │ ├── debug_vm.go
│ │ │ │ ├── hack.go
│ │ │ │ ├── util.go
│ │ │ │ └── vm.go
│ │ │ ├── errors/
│ │ │ │ └── error.go
│ │ │ └── runtime/
│ │ │ ├── rtype.go
│ │ │ ├── struct_field.go
│ │ │ └── type.go
│ │ ├── json.go
│ │ ├── option.go
│ │ ├── path.go
│ │ └── query.go
│ ├── gogo/
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ └── proto/
│ │ ├── Makefile
│ │ ├── clone.go
│ │ ├── custom_gogo.go
│ │ ├── decode.go
│ │ ├── deprecated.go
│ │ ├── discard.go
│ │ ├── duration.go
│ │ ├── duration_gogo.go
│ │ ├── encode.go
│ │ ├── encode_gogo.go
│ │ ├── equal.go
│ │ ├── extensions.go
│ │ ├── extensions_gogo.go
│ │ ├── lib.go
│ │ ├── lib_gogo.go
│ │ ├── message_set.go
│ │ ├── pointer_reflect.go
│ │ ├── pointer_reflect_gogo.go
│ │ ├── pointer_unsafe.go
│ │ ├── pointer_unsafe_gogo.go
│ │ ├── properties.go
│ │ ├── properties_gogo.go
│ │ ├── skip_gogo.go
│ │ ├── table_marshal.go
│ │ ├── table_marshal_gogo.go
│ │ ├── table_merge.go
│ │ ├── table_unmarshal.go
│ │ ├── table_unmarshal_gogo.go
│ │ ├── text.go
│ │ ├── text_gogo.go
│ │ ├── text_parser.go
│ │ ├── timestamp.go
│ │ ├── timestamp_gogo.go
│ │ ├── wrappers.go
│ │ └── wrappers_gogo.go
│ ├── google/
│ │ └── uuid/
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dce.go
│ │ ├── doc.go
│ │ ├── hash.go
│ │ ├── marshal.go
│ │ ├── node.go
│ │ ├── node_js.go
│ │ ├── node_net.go
│ │ ├── null.go
│ │ ├── sql.go
│ │ ├── time.go
│ │ ├── util.go
│ │ ├── uuid.go
│ │ ├── version1.go
│ │ ├── version4.go
│ │ ├── version6.go
│ │ └── version7.go
│ ├── hashicorp/
│ │ └── go-version/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── constraint.go
│ │ ├── version.go
│ │ └── version_collection.go
│ ├── klauspost/
│ │ └── compress/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .goreleaser.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── compressible.go
│ │ ├── flate/
│ │ │ ├── deflate.go
│ │ │ ├── dict_decoder.go
│ │ │ ├── fast_encoder.go
│ │ │ ├── huffman_bit_writer.go
│ │ │ ├── huffman_code.go
│ │ │ ├── huffman_sortByFreq.go
│ │ │ ├── huffman_sortByLiteral.go
│ │ │ ├── inflate.go
│ │ │ ├── inflate_gen.go
│ │ │ ├── level1.go
│ │ │ ├── level2.go
│ │ │ ├── level3.go
│ │ │ ├── level4.go
│ │ │ ├── level5.go
│ │ │ ├── level6.go
│ │ │ ├── matchlen_amd64.go
│ │ │ ├── matchlen_amd64.s
│ │ │ ├── matchlen_generic.go
│ │ │ ├── regmask_amd64.go
│ │ │ ├── regmask_other.go
│ │ │ ├── stateless.go
│ │ │ └── token.go
│ │ ├── fse/
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── bytereader.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ └── fse.go
│ │ ├── gen.sh
│ │ ├── huff0/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ ├── decompress_amd64.go
│ │ │ ├── decompress_amd64.s
│ │ │ ├── decompress_generic.go
│ │ │ └── huff0.go
│ │ ├── internal/
│ │ │ ├── cpuinfo/
│ │ │ │ ├── cpuinfo.go
│ │ │ │ ├── cpuinfo_amd64.go
│ │ │ │ └── cpuinfo_amd64.s
│ │ │ └── snapref/
│ │ │ ├── LICENSE
│ │ │ ├── decode.go
│ │ │ ├── decode_other.go
│ │ │ ├── encode.go
│ │ │ ├── encode_other.go
│ │ │ └── snappy.go
│ │ ├── s2sx.mod
│ │ ├── s2sx.sum
│ │ ├── zlib/
│ │ │ ├── reader.go
│ │ │ └── writer.go
│ │ └── zstd/
│ │ ├── README.md
│ │ ├── bitreader.go
│ │ ├── bitwriter.go
│ │ ├── blockdec.go
│ │ ├── blockenc.go
│ │ ├── blocktype_string.go
│ │ ├── bytebuf.go
│ │ ├── bytereader.go
│ │ ├── decodeheader.go
│ │ ├── decoder.go
│ │ ├── decoder_options.go
│ │ ├── dict.go
│ │ ├── enc_base.go
│ │ ├── enc_best.go
│ │ ├── enc_better.go
│ │ ├── enc_dfast.go
│ │ ├── enc_fast.go
│ │ ├── encoder.go
│ │ ├── encoder_options.go
│ │ ├── framedec.go
│ │ ├── frameenc.go
│ │ ├── fse_decoder.go
│ │ ├── fse_decoder_amd64.go
│ │ ├── fse_decoder_amd64.s
│ │ ├── fse_decoder_generic.go
│ │ ├── fse_encoder.go
│ │ ├── fse_predefined.go
│ │ ├── hash.go
│ │ ├── history.go
│ │ ├── internal/
│ │ │ └── xxhash/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── xxhash.go
│ │ │ ├── xxhash_amd64.s
│ │ │ ├── xxhash_arm64.s
│ │ │ ├── xxhash_asm.go
│ │ │ ├── xxhash_other.go
│ │ │ └── xxhash_safe.go
│ │ ├── matchlen_amd64.go
│ │ ├── matchlen_amd64.s
│ │ ├── matchlen_generic.go
│ │ ├── seqdec.go
│ │ ├── seqdec_amd64.go
│ │ ├── seqdec_amd64.s
│ │ ├── seqdec_generic.go
│ │ ├── seqenc.go
│ │ ├── snappy.go
│ │ ├── zip.go
│ │ └── zstd.go
│ ├── lufia/
│ │ └── plan9stats/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── cpu.go
│ │ ├── doc.go
│ │ ├── host.go
│ │ ├── int.go
│ │ ├── opts.go
│ │ └── stats.go
│ ├── magiconair/
│ │ └── properties/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── decode.go
│ │ ├── doc.go
│ │ ├── integrate.go
│ │ ├── lex.go
│ │ ├── load.go
│ │ ├── parser.go
│ │ ├── properties.go
│ │ └── rangecheck.go
│ ├── moby/
│ │ ├── docker-image-spec/
│ │ │ ├── LICENSE
│ │ │ └── specs-go/
│ │ │ └── v1/
│ │ │ └── image.go
│ │ ├── patternmatcher/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── ignorefile/
│ │ │ │ └── ignorefile.go
│ │ │ └── patternmatcher.go
│ │ └── sys/
│ │ ├── sequential/
│ │ │ ├── LICENSE
│ │ │ ├── doc.go
│ │ │ ├── sequential_unix.go
│ │ │ └── sequential_windows.go
│ │ ├── user/
│ │ │ ├── LICENSE
│ │ │ ├── lookup_unix.go
│ │ │ ├── user.go
│ │ │ └── user_fuzzer.go
│ │ └── userns/
│ │ ├── LICENSE
│ │ ├── userns.go
│ │ ├── userns_linux.go
│ │ ├── userns_linux_fuzzer.go
│ │ └── userns_unsupported.go
│ ├── morikuni/
│ │ └── aec/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── aec.go
│ │ ├── ansi.go
│ │ ├── builder.go
│ │ └── sgr.go
│ ├── openark/
│ │ └── golib/
│ │ ├── LICENSE
│ │ ├── log/
│ │ │ └── log.go
│ │ └── sqlutils/
│ │ ├── dialect.go
│ │ ├── sqlite_dialect.go
│ │ └── sqlutils.go
│ ├── opencontainers/
│ │ ├── go-digest/
│ │ │ ├── .mailmap
│ │ │ ├── .pullapprove.yml
│ │ │ ├── .travis.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── LICENSE.docs
│ │ │ ├── MAINTAINERS
│ │ │ ├── README.md
│ │ │ ├── algorithm.go
│ │ │ ├── digest.go
│ │ │ ├── digester.go
│ │ │ ├── doc.go
│ │ │ └── verifiers.go
│ │ └── image-spec/
│ │ ├── LICENSE
│ │ └── specs-go/
│ │ ├── v1/
│ │ │ ├── annotations.go
│ │ │ ├── config.go
│ │ │ ├── descriptor.go
│ │ │ ├── index.go
│ │ │ ├── layout.go
│ │ │ ├── manifest.go
│ │ │ └── mediatype.go
│ │ ├── version.go
│ │ └── versioned.go
│ ├── pingcap/
│ │ ├── errors/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── compatible_shim.go
│ │ │ ├── errors.go
│ │ │ ├── group.go
│ │ │ ├── juju_adaptor.go
│ │ │ ├── normalize.go
│ │ │ └── stack.go
│ │ └── tidb/
│ │ └── pkg/
│ │ └── parser/
│ │ ├── LICENSE
│ │ ├── charset/
│ │ │ ├── BUILD.bazel
│ │ │ ├── charset.go
│ │ │ ├── encoding.go
│ │ │ ├── encoding_ascii.go
│ │ │ ├── encoding_base.go
│ │ │ ├── encoding_bin.go
│ │ │ ├── encoding_gbk.go
│ │ │ ├── encoding_latin1.go
│ │ │ ├── encoding_table.go
│ │ │ └── encoding_utf8.go
│ │ ├── format/
│ │ │ ├── BUILD.bazel
│ │ │ └── format.go
│ │ ├── mysql/
│ │ │ ├── BUILD.bazel
│ │ │ ├── charset.go
│ │ │ ├── const.go
│ │ │ ├── errcode.go
│ │ │ ├── errname.go
│ │ │ ├── error.go
│ │ │ ├── locale_format.go
│ │ │ ├── privs.go
│ │ │ ├── state.go
│ │ │ ├── type.go
│ │ │ └── util.go
│ │ └── terror/
│ │ ├── BUILD.bazel
│ │ └── terror.go
│ ├── pkg/
│ │ └── errors/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── errors.go
│ │ ├── go113.go
│ │ └── stack.go
│ ├── pmezard/
│ │ └── go-difflib/
│ │ ├── LICENSE
│ │ └── difflib/
│ │ └── difflib.go
│ ├── power-devops/
│ │ └── perfstat/
│ │ ├── LICENSE
│ │ ├── c_helpers.c
│ │ ├── c_helpers.h
│ │ ├── config.go
│ │ ├── cpustat.go
│ │ ├── diskstat.go
│ │ ├── doc.go
│ │ ├── fsstat.go
│ │ ├── helpers.go
│ │ ├── lparstat.go
│ │ ├── lvmstat.go
│ │ ├── memstat.go
│ │ ├── netstat.go
│ │ ├── procstat.go
│ │ ├── sysconf.go
│ │ ├── systemcfg.go
│ │ ├── types_cpu.go
│ │ ├── types_disk.go
│ │ ├── types_fs.go
│ │ ├── types_lpar.go
│ │ ├── types_lvm.go
│ │ ├── types_memory.go
│ │ ├── types_network.go
│ │ ├── types_process.go
│ │ └── uptime.go
│ ├── shirou/
│ │ └── gopsutil/
│ │ └── v4/
│ │ ├── LICENSE
│ │ ├── common/
│ │ │ └── env.go
│ │ ├── cpu/
│ │ │ ├── cpu.go
│ │ │ ├── cpu_aix.go
│ │ │ ├── cpu_aix_cgo.go
│ │ │ ├── cpu_aix_nocgo.go
│ │ │ ├── cpu_darwin.go
│ │ │ ├── cpu_darwin_arm64.go
│ │ │ ├── cpu_darwin_fallback.go
│ │ │ ├── cpu_dragonfly.go
│ │ │ ├── cpu_dragonfly_amd64.go
│ │ │ ├── cpu_fallback.go
│ │ │ ├── cpu_freebsd.go
│ │ │ ├── cpu_freebsd_386.go
│ │ │ ├── cpu_freebsd_amd64.go
│ │ │ ├── cpu_freebsd_arm.go
│ │ │ ├── cpu_freebsd_arm64.go
│ │ │ ├── cpu_linux.go
│ │ │ ├── cpu_netbsd.go
│ │ │ ├── cpu_netbsd_amd64.go
│ │ │ ├── cpu_netbsd_arm.go
│ │ │ ├── cpu_netbsd_arm64.go
│ │ │ ├── cpu_openbsd.go
│ │ │ ├── cpu_openbsd_386.go
│ │ │ ├── cpu_openbsd_amd64.go
│ │ │ ├── cpu_openbsd_arm.go
│ │ │ ├── cpu_openbsd_arm64.go
│ │ │ ├── cpu_openbsd_riscv64.go
│ │ │ ├── cpu_plan9.go
│ │ │ ├── cpu_solaris.go
│ │ │ └── cpu_windows.go
│ │ ├── internal/
│ │ │ └── common/
│ │ │ ├── binary.go
│ │ │ ├── common.go
│ │ │ ├── common_darwin.go
│ │ │ ├── common_freebsd.go
│ │ │ ├── common_linux.go
│ │ │ ├── common_netbsd.go
│ │ │ ├── common_openbsd.go
│ │ │ ├── common_unix.go
│ │ │ ├── common_windows.go
│ │ │ ├── endian.go
│ │ │ ├── sleep.go
│ │ │ └── warnings.go
│ │ ├── mem/
│ │ │ ├── ex_linux.go
│ │ │ ├── ex_windows.go
│ │ │ ├── mem.go
│ │ │ ├── mem_aix.go
│ │ │ ├── mem_aix_cgo.go
│ │ │ ├── mem_aix_nocgo.go
│ │ │ ├── mem_bsd.go
│ │ │ ├── mem_darwin.go
│ │ │ ├── mem_fallback.go
│ │ │ ├── mem_freebsd.go
│ │ │ ├── mem_linux.go
│ │ │ ├── mem_netbsd.go
│ │ │ ├── mem_openbsd.go
│ │ │ ├── mem_openbsd_386.go
│ │ │ ├── mem_openbsd_amd64.go
│ │ │ ├── mem_openbsd_arm.go
│ │ │ ├── mem_openbsd_arm64.go
│ │ │ ├── mem_openbsd_riscv64.go
│ │ │ ├── mem_plan9.go
│ │ │ ├── mem_solaris.go
│ │ │ └── mem_windows.go
│ │ ├── net/
│ │ │ ├── net.go
│ │ │ ├── net_aix.go
│ │ │ ├── net_aix_cgo.go
│ │ │ ├── net_aix_nocgo.go
│ │ │ ├── net_darwin.go
│ │ │ ├── net_fallback.go
│ │ │ ├── net_freebsd.go
│ │ │ ├── net_linux.go
│ │ │ ├── net_openbsd.go
│ │ │ ├── net_solaris.go
│ │ │ ├── net_unix.go
│ │ │ └── net_windows.go
│ │ └── process/
│ │ ├── process.go
│ │ ├── process_bsd.go
│ │ ├── process_darwin.go
│ │ ├── process_darwin_amd64.go
│ │ ├── process_darwin_arm64.go
│ │ ├── process_fallback.go
│ │ ├── process_freebsd.go
│ │ ├── process_freebsd_386.go
│ │ ├── process_freebsd_amd64.go
│ │ ├── process_freebsd_arm.go
│ │ ├── process_freebsd_arm64.go
│ │ ├── process_linux.go
│ │ ├── process_openbsd.go
│ │ ├── process_openbsd_386.go
│ │ ├── process_openbsd_amd64.go
│ │ ├── process_openbsd_arm.go
│ │ ├── process_openbsd_arm64.go
│ │ ├── process_openbsd_riscv64.go
│ │ ├── process_plan9.go
│ │ ├── process_posix.go
│ │ ├── process_solaris.go
│ │ ├── process_windows.go
│ │ ├── process_windows_32bit.go
│ │ └── process_windows_64bit.go
│ ├── shopspring/
│ │ └── decimal/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── decimal-go.go
│ │ ├── decimal.go
│ │ └── rounding.go
│ ├── siddontang/
│ │ └── go-log/
│ │ ├── LICENSE
│ │ ├── log/
│ │ │ ├── doc.go
│ │ │ ├── filehandler.go
│ │ │ ├── handler.go
│ │ │ ├── log.go
│ │ │ └── logger.go
│ │ └── loggers/
│ │ └── loggers.go
│ ├── stretchr/
│ │ └── testify/
│ │ ├── LICENSE
│ │ ├── assert/
│ │ │ ├── assertion_compare.go
│ │ │ ├── assertion_format.go
│ │ │ ├── assertion_format.go.tmpl
│ │ │ ├── assertion_forward.go
│ │ │ ├── assertion_forward.go.tmpl
│ │ │ ├── assertion_order.go
│ │ │ ├── assertions.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── forward_assertions.go
│ │ │ ├── http_assertions.go
│ │ │ └── yaml/
│ │ │ ├── yaml_custom.go
│ │ │ ├── yaml_default.go
│ │ │ └── yaml_fail.go
│ │ ├── require/
│ │ │ ├── doc.go
│ │ │ ├── forward_requirements.go
│ │ │ ├── require.go
│ │ │ ├── require.go.tmpl
│ │ │ ├── require_forward.go
│ │ │ ├── require_forward.go.tmpl
│ │ │ └── requirements.go
│ │ └── suite/
│ │ ├── doc.go
│ │ ├── interfaces.go
│ │ ├── stats.go
│ │ └── suite.go
│ ├── tklauser/
│ │ ├── go-sysconf/
│ │ │ ├── .cirrus.yml
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── sysconf.go
│ │ │ ├── sysconf_bsd.go
│ │ │ ├── sysconf_darwin.go
│ │ │ ├── sysconf_dragonfly.go
│ │ │ ├── sysconf_freebsd.go
│ │ │ ├── sysconf_generic.go
│ │ │ ├── sysconf_linux.go
│ │ │ ├── sysconf_netbsd.go
│ │ │ ├── sysconf_openbsd.go
│ │ │ ├── sysconf_posix.go
│ │ │ ├── sysconf_solaris.go
│ │ │ ├── sysconf_unsupported.go
│ │ │ ├── zsysconf_defs_darwin.go
│ │ │ ├── zsysconf_defs_dragonfly.go
│ │ │ ├── zsysconf_defs_freebsd.go
│ │ │ ├── zsysconf_defs_linux.go
│ │ │ ├── zsysconf_defs_netbsd.go
│ │ │ ├── zsysconf_defs_openbsd.go
│ │ │ ├── zsysconf_defs_solaris.go
│ │ │ ├── zsysconf_values_freebsd_386.go
│ │ │ ├── zsysconf_values_freebsd_amd64.go
│ │ │ ├── zsysconf_values_freebsd_arm.go
│ │ │ ├── zsysconf_values_freebsd_arm64.go
│ │ │ ├── zsysconf_values_freebsd_riscv64.go
│ │ │ ├── zsysconf_values_linux_386.go
│ │ │ ├── zsysconf_values_linux_amd64.go
│ │ │ ├── zsysconf_values_linux_arm.go
│ │ │ ├── zsysconf_values_linux_arm64.go
│ │ │ ├── zsysconf_values_linux_loong64.go
│ │ │ ├── zsysconf_values_linux_mips.go
│ │ │ ├── zsysconf_values_linux_mips64.go
│ │ │ ├── zsysconf_values_linux_mips64le.go
│ │ │ ├── zsysconf_values_linux_mipsle.go
│ │ │ ├── zsysconf_values_linux_ppc64.go
│ │ │ ├── zsysconf_values_linux_ppc64le.go
│ │ │ ├── zsysconf_values_linux_riscv64.go
│ │ │ ├── zsysconf_values_linux_s390x.go
│ │ │ ├── zsysconf_values_netbsd_386.go
│ │ │ ├── zsysconf_values_netbsd_amd64.go
│ │ │ ├── zsysconf_values_netbsd_arm.go
│ │ │ └── zsysconf_values_netbsd_arm64.go
│ │ └── numcpus/
│ │ ├── .cirrus.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── numcpus.go
│ │ ├── numcpus_bsd.go
│ │ ├── numcpus_linux.go
│ │ ├── numcpus_solaris.go
│ │ ├── numcpus_unsupported.go
│ │ └── numcpus_windows.go
│ └── yusufpapurcu/
│ └── wmi/
│ ├── LICENSE
│ ├── README.md
│ ├── swbemservices.go
│ └── wmi.go
├── go.opentelemetry.io/
│ ├── auto/
│ │ └── sdk/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── VERSIONING.md
│ │ ├── doc.go
│ │ ├── internal/
│ │ │ └── telemetry/
│ │ │ ├── attr.go
│ │ │ ├── doc.go
│ │ │ ├── id.go
│ │ │ ├── number.go
│ │ │ ├── resource.go
│ │ │ ├── scope.go
│ │ │ ├── span.go
│ │ │ ├── status.go
│ │ │ ├── traces.go
│ │ │ └── value.go
│ │ ├── limit.go
│ │ ├── span.go
│ │ ├── tracer.go
│ │ └── tracer_provider.go
│ ├── contrib/
│ │ └── instrumentation/
│ │ └── net/
│ │ └── http/
│ │ └── otelhttp/
│ │ ├── LICENSE
│ │ ├── client.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── handler.go
│ │ ├── internal/
│ │ │ └── semconvutil/
│ │ │ ├── gen.go
│ │ │ ├── httpconv.go
│ │ │ └── netconv.go
│ │ ├── labeler.go
│ │ ├── transport.go
│ │ ├── version.go
│ │ └── wrap.go
│ └── otel/
│ ├── .codespellignore
│ ├── .codespellrc
│ ├── .gitattributes
│ ├── .gitignore
│ ├── .golangci.yml
│ ├── .lycheeignore
│ ├── .markdownlint.yaml
│ ├── CHANGELOG.md
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── Makefile
│ ├── README.md
│ ├── RELEASING.md
│ ├── VERSIONING.md
│ ├── attribute/
│ │ ├── README.md
│ │ ├── doc.go
│ │ ├── encoder.go
│ │ ├── filter.go
│ │ ├── iterator.go
│ │ ├── key.go
│ │ ├── kv.go
│ │ ├── set.go
│ │ ├── type_string.go
│ │ └── value.go
│ ├── baggage/
│ │ ├── README.md
│ │ ├── baggage.go
│ │ ├── context.go
│ │ └── doc.go
│ ├── codes/
│ │ ├── README.md
│ │ ├── codes.go
│ │ └── doc.go
│ ├── dependencies.Dockerfile
│ ├── doc.go
│ ├── error_handler.go
│ ├── get_main_pkgs.sh
│ ├── handler.go
│ ├── internal/
│ │ ├── attribute/
│ │ │ └── attribute.go
│ │ ├── baggage/
│ │ │ ├── baggage.go
│ │ │ └── context.go
│ │ ├── gen.go
│ │ ├── global/
│ │ │ ├── handler.go
│ │ │ ├── instruments.go
│ │ │ ├── internal_logging.go
│ │ │ ├── meter.go
│ │ │ ├── propagator.go
│ │ │ ├── state.go
│ │ │ └── trace.go
│ │ └── rawhelpers.go
│ ├── internal_logging.go
│ ├── metric/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asyncfloat64.go
│ │ ├── asyncint64.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── embedded/
│ │ │ ├── README.md
│ │ │ └── embedded.go
│ │ ├── instrument.go
│ │ ├── meter.go
│ │ ├── syncfloat64.go
│ │ └── syncint64.go
│ ├── metric.go
│ ├── propagation/
│ │ ├── README.md
│ │ ├── baggage.go
│ │ ├── doc.go
│ │ ├── propagation.go
│ │ └── trace_context.go
│ ├── propagation.go
│ ├── renovate.json
│ ├── requirements.txt
│ ├── semconv/
│ │ ├── v1.20.0/
│ │ │ ├── README.md
│ │ │ ├── attribute_group.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── exception.go
│ │ │ ├── http.go
│ │ │ ├── resource.go
│ │ │ ├── schema.go
│ │ │ └── trace.go
│ │ └── v1.26.0/
│ │ ├── README.md
│ │ ├── attribute_group.go
│ │ ├── doc.go
│ │ ├── exception.go
│ │ ├── metric.go
│ │ └── schema.go
│ ├── trace/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auto.go
│ │ ├── config.go
│ │ ├── context.go
│ │ ├── doc.go
│ │ ├── embedded/
│ │ │ ├── README.md
│ │ │ └── embedded.go
│ │ ├── internal/
│ │ │ └── telemetry/
│ │ │ ├── attr.go
│ │ │ ├── doc.go
│ │ │ ├── id.go
│ │ │ ├── number.go
│ │ │ ├── resource.go
│ │ │ ├── scope.go
│ │ │ ├── span.go
│ │ │ ├── status.go
│ │ │ ├── traces.go
│ │ │ └── value.go
│ │ ├── nonrecording.go
│ │ ├── noop/
│ │ │ ├── README.md
│ │ │ └── noop.go
│ │ ├── noop.go
│ │ ├── provider.go
│ │ ├── span.go
│ │ ├── trace.go
│ │ ├── tracer.go
│ │ └── tracestate.go
│ ├── trace.go
│ ├── verify_readmes.sh
│ ├── verify_released_changelog.sh
│ ├── version.go
│ └── versions.yaml
├── golang.org/
│ └── x/
│ ├── crypto/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── blowfish/
│ │ │ ├── block.go
│ │ │ ├── cipher.go
│ │ │ └── const.go
│ │ ├── chacha20/
│ │ │ ├── chacha_arm64.go
│ │ │ ├── chacha_arm64.s
│ │ │ ├── chacha_generic.go
│ │ │ ├── chacha_noasm.go
│ │ │ ├── chacha_ppc64x.go
│ │ │ ├── chacha_ppc64x.s
│ │ │ ├── chacha_s390x.go
│ │ │ ├── chacha_s390x.s
│ │ │ └── xor.go
│ │ ├── curve25519/
│ │ │ └── curve25519.go
│ │ ├── internal/
│ │ │ ├── alias/
│ │ │ │ ├── alias.go
│ │ │ │ └── alias_purego.go
│ │ │ └── poly1305/
│ │ │ ├── mac_noasm.go
│ │ │ ├── poly1305.go
│ │ │ ├── sum_amd64.s
│ │ │ ├── sum_asm.go
│ │ │ ├── sum_generic.go
│ │ │ ├── sum_loong64.s
│ │ │ ├── sum_ppc64x.s
│ │ │ ├── sum_s390x.go
│ │ │ └── sum_s390x.s
│ │ └── ssh/
│ │ ├── buffer.go
│ │ ├── certs.go
│ │ ├── channel.go
│ │ ├── cipher.go
│ │ ├── client.go
│ │ ├── client_auth.go
│ │ ├── common.go
│ │ ├── connection.go
│ │ ├── doc.go
│ │ ├── handshake.go
│ │ ├── internal/
│ │ │ └── bcrypt_pbkdf/
│ │ │ └── bcrypt_pbkdf.go
│ │ ├── kex.go
│ │ ├── keys.go
│ │ ├── mac.go
│ │ ├── messages.go
│ │ ├── mux.go
│ │ ├── server.go
│ │ ├── session.go
│ │ ├── ssh_gss.go
│ │ ├── streamlocal.go
│ │ ├── tcpip.go
│ │ └── transport.go
│ ├── net/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ └── context/
│ │ └── context.go
│ ├── sync/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ └── errgroup/
│ │ └── errgroup.go
│ ├── sys/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── cpu/
│ │ │ ├── asm_aix_ppc64.s
│ │ │ ├── asm_darwin_x86_gc.s
│ │ │ ├── byteorder.go
│ │ │ ├── cpu.go
│ │ │ ├── cpu_aix.go
│ │ │ ├── cpu_arm.go
│ │ │ ├── cpu_arm64.go
│ │ │ ├── cpu_arm64.s
│ │ │ ├── cpu_darwin_x86.go
│ │ │ ├── cpu_gc_arm64.go
│ │ │ ├── cpu_gc_s390x.go
│ │ │ ├── cpu_gc_x86.go
│ │ │ ├── cpu_gc_x86.s
│ │ │ ├── cpu_gccgo_arm64.go
│ │ │ ├── cpu_gccgo_s390x.go
│ │ │ ├── cpu_gccgo_x86.c
│ │ │ ├── cpu_gccgo_x86.go
│ │ │ ├── cpu_linux.go
│ │ │ ├── cpu_linux_arm.go
│ │ │ ├── cpu_linux_arm64.go
│ │ │ ├── cpu_linux_loong64.go
│ │ │ ├── cpu_linux_mips64x.go
│ │ │ ├── cpu_linux_noinit.go
│ │ │ ├── cpu_linux_ppc64x.go
│ │ │ ├── cpu_linux_riscv64.go
│ │ │ ├── cpu_linux_s390x.go
│ │ │ ├── cpu_loong64.go
│ │ │ ├── cpu_loong64.s
│ │ │ ├── cpu_mips64x.go
│ │ │ ├── cpu_mipsx.go
│ │ │ ├── cpu_netbsd_arm64.go
│ │ │ ├── cpu_openbsd_arm64.go
│ │ │ ├── cpu_openbsd_arm64.s
│ │ │ ├── cpu_other_arm.go
│ │ │ ├── cpu_other_arm64.go
│ │ │ ├── cpu_other_mips64x.go
│ │ │ ├── cpu_other_ppc64x.go
│ │ │ ├── cpu_other_riscv64.go
│ │ │ ├── cpu_other_x86.go
│ │ │ ├── cpu_ppc64x.go
│ │ │ ├── cpu_riscv64.go
│ │ │ ├── cpu_s390x.go
│ │ │ ├── cpu_s390x.s
│ │ │ ├── cpu_wasm.go
│ │ │ ├── cpu_x86.go
│ │ │ ├── cpu_zos.go
│ │ │ ├── cpu_zos_s390x.go
│ │ │ ├── endian_big.go
│ │ │ ├── endian_little.go
│ │ │ ├── hwcap_linux.go
│ │ │ ├── parse.go
│ │ │ ├── proc_cpuinfo_linux.go
│ │ │ ├── runtime_auxv.go
│ │ │ ├── runtime_auxv_go121.go
│ │ │ ├── syscall_aix_gccgo.go
│ │ │ ├── syscall_aix_ppc64_gc.go
│ │ │ └── syscall_darwin_x86_gc.go
│ │ ├── plan9/
│ │ │ ├── asm.s
│ │ │ ├── asm_plan9_386.s
│ │ │ ├── asm_plan9_amd64.s
│ │ │ ├── asm_plan9_arm.s
│ │ │ ├── const_plan9.go
│ │ │ ├── dir_plan9.go
│ │ │ ├── env_plan9.go
│ │ │ ├── errors_plan9.go
│ │ │ ├── mkall.sh
│ │ │ ├── mkerrors.sh
│ │ │ ├── mksysnum_plan9.sh
│ │ │ ├── pwd_go15_plan9.go
│ │ │ ├── pwd_plan9.go
│ │ │ ├── race.go
│ │ │ ├── race0.go
│ │ │ ├── str.go
│ │ │ ├── syscall.go
│ │ │ ├── syscall_plan9.go
│ │ │ ├── zsyscall_plan9_386.go
│ │ │ ├── zsyscall_plan9_amd64.go
│ │ │ ├── zsyscall_plan9_arm.go
│ │ │ └── zsysnum_plan9.go
│ │ ├── unix/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── affinity_linux.go
│ │ │ ├── aliases.go
│ │ │ ├── asm_aix_ppc64.s
│ │ │ ├── asm_bsd_386.s
│ │ │ ├── asm_bsd_amd64.s
│ │ │ ├── asm_bsd_arm.s
│ │ │ ├── asm_bsd_arm64.s
│ │ │ ├── asm_bsd_ppc64.s
│ │ │ ├── asm_bsd_riscv64.s
│ │ │ ├── asm_linux_386.s
│ │ │ ├── asm_linux_amd64.s
│ │ │ ├── asm_linux_arm.s
│ │ │ ├── asm_linux_arm64.s
│ │ │ ├── asm_linux_loong64.s
│ │ │ ├── asm_linux_mips64x.s
│ │ │ ├── asm_linux_mipsx.s
│ │ │ ├── asm_linux_ppc64x.s
│ │ │ ├── asm_linux_riscv64.s
│ │ │ ├── asm_linux_s390x.s
│ │ │ ├── asm_openbsd_mips64.s
│ │ │ ├── asm_solaris_amd64.s
│ │ │ ├── asm_zos_s390x.s
│ │ │ ├── auxv.go
│ │ │ ├── auxv_unsupported.go
│ │ │ ├── bluetooth_linux.go
│ │ │ ├── bpxsvc_zos.go
│ │ │ ├── bpxsvc_zos.s
│ │ │ ├── cap_freebsd.go
│ │ │ ├── constants.go
│ │ │ ├── dev_aix_ppc.go
│ │ │ ├── dev_aix_ppc64.go
│ │ │ ├── dev_darwin.go
│ │ │ ├── dev_dragonfly.go
│ │ │ ├── dev_freebsd.go
│ │ │ ├── dev_linux.go
│ │ │ ├── dev_netbsd.go
│ │ │ ├── dev_openbsd.go
│ │ │ ├── dev_zos.go
│ │ │ ├── dirent.go
│ │ │ ├── endian_big.go
│ │ │ ├── endian_little.go
│ │ │ ├── env_unix.go
│ │ │ ├── fcntl.go
│ │ │ ├── fcntl_darwin.go
│ │ │ ├── fcntl_linux_32bit.go
│ │ │ ├── fdset.go
│ │ │ ├── gccgo.go
│ │ │ ├── gccgo_c.c
│ │ │ ├── gccgo_linux_amd64.go
│ │ │ ├── ifreq_linux.go
│ │ │ ├── ioctl_linux.go
│ │ │ ├── ioctl_signed.go
│ │ │ ├── ioctl_unsigned.go
│ │ │ ├── ioctl_zos.go
│ │ │ ├── mkall.sh
│ │ │ ├── mkerrors.sh
│ │ │ ├── mmap_nomremap.go
│ │ │ ├── mremap.go
│ │ │ ├── pagesize_unix.go
│ │ │ ├── pledge_openbsd.go
│ │ │ ├── ptrace_darwin.go
│ │ │ ├── ptrace_ios.go
│ │ │ ├── race.go
│ │ │ ├── race0.go
│ │ │ ├── readdirent_getdents.go
│ │ │ ├── readdirent_getdirentries.go
│ │ │ ├── sockcmsg_dragonfly.go
│ │ │ ├── sockcmsg_linux.go
│ │ │ ├── sockcmsg_unix.go
│ │ │ ├── sockcmsg_unix_other.go
│ │ │ ├── sockcmsg_zos.go
│ │ │ ├── symaddr_zos_s390x.s
│ │ │ ├── syscall.go
│ │ │ ├── syscall_aix.go
│ │ │ ├── syscall_aix_ppc.go
│ │ │ ├── syscall_aix_ppc64.go
│ │ │ ├── syscall_bsd.go
│ │ │ ├── syscall_darwin.go
│ │ │ ├── syscall_darwin_amd64.go
│ │ │ ├── syscall_darwin_arm64.go
│ │ │ ├── syscall_darwin_libSystem.go
│ │ │ ├── syscall_dragonfly.go
│ │ │ ├── syscall_dragonfly_amd64.go
│ │ │ ├── syscall_freebsd.go
│ │ │ ├── syscall_freebsd_386.go
│ │ │ ├── syscall_freebsd_amd64.go
│ │ │ ├── syscall_freebsd_arm.go
│ │ │ ├── syscall_freebsd_arm64.go
│ │ │ ├── syscall_freebsd_riscv64.go
│ │ │ ├── syscall_hurd.go
│ │ │ ├── syscall_hurd_386.go
│ │ │ ├── syscall_illumos.go
│ │ │ ├── syscall_linux.go
│ │ │ ├── syscall_linux_386.go
│ │ │ ├── syscall_linux_alarm.go
│ │ │ ├── syscall_linux_amd64.go
│ │ │ ├── syscall_linux_amd64_gc.go
│ │ │ ├── syscall_linux_arm.go
│ │ │ ├── syscall_linux_arm64.go
│ │ │ ├── syscall_linux_gc.go
│ │ │ ├── syscall_linux_gc_386.go
│ │ │ ├── syscall_linux_gc_arm.go
│ │ │ ├── syscall_linux_gccgo_386.go
│ │ │ ├── syscall_linux_gccgo_arm.go
│ │ │ ├── syscall_linux_loong64.go
│ │ │ ├── syscall_linux_mips64x.go
│ │ │ ├── syscall_linux_mipsx.go
│ │ │ ├── syscall_linux_ppc.go
│ │ │ ├── syscall_linux_ppc64x.go
│ │ │ ├── syscall_linux_riscv64.go
│ │ │ ├── syscall_linux_s390x.go
│ │ │ ├── syscall_linux_sparc64.go
│ │ │ ├── syscall_netbsd.go
│ │ │ ├── syscall_netbsd_386.go
│ │ │ ├── syscall_netbsd_amd64.go
│ │ │ ├── syscall_netbsd_arm.go
│ │ │ ├── syscall_netbsd_arm64.go
│ │ │ ├── syscall_openbsd.go
│ │ │ ├── syscall_openbsd_386.go
│ │ │ ├── syscall_openbsd_amd64.go
│ │ │ ├── syscall_openbsd_arm.go
│ │ │ ├── syscall_openbsd_arm64.go
│ │ │ ├── syscall_openbsd_libc.go
│ │ │ ├── syscall_openbsd_mips64.go
│ │ │ ├── syscall_openbsd_ppc64.go
│ │ │ ├── syscall_openbsd_riscv64.go
│ │ │ ├── syscall_solaris.go
│ │ │ ├── syscall_solaris_amd64.go
│ │ │ ├── syscall_unix.go
│ │ │ ├── syscall_unix_gc.go
│ │ │ ├── syscall_unix_gc_ppc64x.go
│ │ │ ├── syscall_zos_s390x.go
│ │ │ ├── sysvshm_linux.go
│ │ │ ├── sysvshm_unix.go
│ │ │ ├── sysvshm_unix_other.go
│ │ │ ├── timestruct.go
│ │ │ ├── unveil_openbsd.go
│ │ │ ├── vgetrandom_linux.go
│ │ │ ├── vgetrandom_unsupported.go
│ │ │ ├── xattr_bsd.go
│ │ │ ├── zerrors_aix_ppc.go
│ │ │ ├── zerrors_aix_ppc64.go
│ │ │ ├── zerrors_darwin_amd64.go
│ │ │ ├── zerrors_darwin_arm64.go
│ │ │ ├── zerrors_dragonfly_amd64.go
│ │ │ ├── zerrors_freebsd_386.go
│ │ │ ├── zerrors_freebsd_amd64.go
│ │ │ ├── zerrors_freebsd_arm.go
│ │ │ ├── zerrors_freebsd_arm64.go
│ │ │ ├── zerrors_freebsd_riscv64.go
│ │ │ ├── zerrors_linux.go
│ │ │ ├── zerrors_linux_386.go
│ │ │ ├── zerrors_linux_amd64.go
│ │ │ ├── zerrors_linux_arm.go
│ │ │ ├── zerrors_linux_arm64.go
│ │ │ ├── zerrors_linux_loong64.go
│ │ │ ├── zerrors_linux_mips.go
│ │ │ ├── zerrors_linux_mips64.go
│ │ │ ├── zerrors_linux_mips64le.go
│ │ │ ├── zerrors_linux_mipsle.go
│ │ │ ├── zerrors_linux_ppc.go
│ │ │ ├── zerrors_linux_ppc64.go
│ │ │ ├── zerrors_linux_ppc64le.go
│ │ │ ├── zerrors_linux_riscv64.go
│ │ │ ├── zerrors_linux_s390x.go
│ │ │ ├── zerrors_linux_sparc64.go
│ │ │ ├── zerrors_netbsd_386.go
│ │ │ ├── zerrors_netbsd_amd64.go
│ │ │ ├── zerrors_netbsd_arm.go
│ │ │ ├── zerrors_netbsd_arm64.go
│ │ │ ├── zerrors_openbsd_386.go
│ │ │ ├── zerrors_openbsd_amd64.go
│ │ │ ├── zerrors_openbsd_arm.go
│ │ │ ├── zerrors_openbsd_arm64.go
│ │ │ ├── zerrors_openbsd_mips64.go
│ │ │ ├── zerrors_openbsd_ppc64.go
│ │ │ ├── zerrors_openbsd_riscv64.go
│ │ │ ├── zerrors_solaris_amd64.go
│ │ │ ├── zerrors_zos_s390x.go
│ │ │ ├── zptrace_armnn_linux.go
│ │ │ ├── zptrace_linux_arm64.go
│ │ │ ├── zptrace_mipsnn_linux.go
│ │ │ ├── zptrace_mipsnnle_linux.go
│ │ │ ├── zptrace_x86_linux.go
│ │ │ ├── zsymaddr_zos_s390x.s
│ │ │ ├── zsyscall_aix_ppc.go
│ │ │ ├── zsyscall_aix_ppc64.go
│ │ │ ├── zsyscall_aix_ppc64_gc.go
│ │ │ ├── zsyscall_aix_ppc64_gccgo.go
│ │ │ ├── zsyscall_darwin_amd64.go
│ │ │ ├── zsyscall_darwin_amd64.s
│ │ │ ├── zsyscall_darwin_arm64.go
│ │ │ ├── zsyscall_darwin_arm64.s
│ │ │ ├── zsyscall_dragonfly_amd64.go
│ │ │ ├── zsyscall_freebsd_386.go
│ │ │ ├── zsyscall_freebsd_amd64.go
│ │ │ ├── zsyscall_freebsd_arm.go
│ │ │ ├── zsyscall_freebsd_arm64.go
│ │ │ ├── zsyscall_freebsd_riscv64.go
│ │ │ ├── zsyscall_illumos_amd64.go
│ │ │ ├── zsyscall_linux.go
│ │ │ ├── zsyscall_linux_386.go
│ │ │ ├── zsyscall_linux_amd64.go
│ │ │ ├── zsyscall_linux_arm.go
│ │ │ ├── zsyscall_linux_arm64.go
│ │ │ ├── zsyscall_linux_loong64.go
│ │ │ ├── zsyscall_linux_mips.go
│ │ │ ├── zsyscall_linux_mips64.go
│ │ │ ├── zsyscall_linux_mips64le.go
│ │ │ ├── zsyscall_linux_mipsle.go
│ │ │ ├── zsyscall_linux_ppc.go
│ │ │ ├── zsyscall_linux_ppc64.go
│ │ │ ├── zsyscall_linux_ppc64le.go
│ │ │ ├── zsyscall_linux_riscv64.go
│ │ │ ├── zsyscall_linux_s390x.go
│ │ │ ├── zsyscall_linux_sparc64.go
│ │ │ ├── zsyscall_netbsd_386.go
│ │ │ ├── zsyscall_netbsd_amd64.go
│ │ │ ├── zsyscall_netbsd_arm.go
│ │ │ ├── zsyscall_netbsd_arm64.go
│ │ │ ├── zsyscall_openbsd_386.go
│ │ │ ├── zsyscall_openbsd_386.s
│ │ │ ├── zsyscall_openbsd_amd64.go
│ │ │ ├── zsyscall_openbsd_amd64.s
│ │ │ ├── zsyscall_openbsd_arm.go
│ │ │ ├── zsyscall_openbsd_arm.s
│ │ │ ├── zsyscall_openbsd_arm64.go
│ │ │ ├── zsyscall_openbsd_arm64.s
│ │ │ ├── zsyscall_openbsd_mips64.go
│ │ │ ├── zsyscall_openbsd_mips64.s
│ │ │ ├── zsyscall_openbsd_ppc64.go
│ │ │ ├── zsyscall_openbsd_ppc64.s
│ │ │ ├── zsyscall_openbsd_riscv64.go
│ │ │ ├── zsyscall_openbsd_riscv64.s
│ │ │ ├── zsyscall_solaris_amd64.go
│ │ │ ├── zsyscall_zos_s390x.go
│ │ │ ├── zsysctl_openbsd_386.go
│ │ │ ├── zsysctl_openbsd_amd64.go
│ │ │ ├── zsysctl_openbsd_arm.go
│ │ │ ├── zsysctl_openbsd_arm64.go
│ │ │ ├── zsysctl_openbsd_mips64.go
│ │ │ ├── zsysctl_openbsd_ppc64.go
│ │ │ ├── zsysctl_openbsd_riscv64.go
│ │ │ ├── zsysnum_darwin_amd64.go
│ │ │ ├── zsysnum_darwin_arm64.go
│ │ │ ├── zsysnum_dragonfly_amd64.go
│ │ │ ├── zsysnum_freebsd_386.go
│ │ │ ├── zsysnum_freebsd_amd64.go
│ │ │ ├── zsysnum_freebsd_arm.go
│ │ │ ├── zsysnum_freebsd_arm64.go
│ │ │ ├── zsysnum_freebsd_riscv64.go
│ │ │ ├── zsysnum_linux_386.go
│ │ │ ├── zsysnum_linux_amd64.go
│ │ │ ├── zsysnum_linux_arm.go
│ │ │ ├── zsysnum_linux_arm64.go
│ │ │ ├── zsysnum_linux_loong64.go
│ │ │ ├── zsysnum_linux_mips.go
│ │ │ ├── zsysnum_linux_mips64.go
│ │ │ ├── zsysnum_linux_mips64le.go
│ │ │ ├── zsysnum_linux_mipsle.go
│ │ │ ├── zsysnum_linux_ppc.go
│ │ │ ├── zsysnum_linux_ppc64.go
│ │ │ ├── zsysnum_linux_ppc64le.go
│ │ │ ├── zsysnum_linux_riscv64.go
│ │ │ ├── zsysnum_linux_s390x.go
│ │ │ ├── zsysnum_linux_sparc64.go
│ │ │ ├── zsysnum_netbsd_386.go
│ │ │ ├── zsysnum_netbsd_amd64.go
│ │ │ ├── zsysnum_netbsd_arm.go
│ │ │ ├── zsysnum_netbsd_arm64.go
│ │ │ ├── zsysnum_openbsd_386.go
│ │ │ ├── zsysnum_openbsd_amd64.go
│ │ │ ├── zsysnum_openbsd_arm.go
│ │ │ ├── zsysnum_openbsd_arm64.go
│ │ │ ├── zsysnum_openbsd_mips64.go
│ │ │ ├── zsysnum_openbsd_ppc64.go
│ │ │ ├── zsysnum_openbsd_riscv64.go
│ │ │ ├── zsysnum_zos_s390x.go
│ │ │ ├── ztypes_aix_ppc.go
│ │ │ ├── ztypes_aix_ppc64.go
│ │ │ ├── ztypes_darwin_amd64.go
│ │ │ ├── ztypes_darwin_arm64.go
│ │ │ ├── ztypes_dragonfly_amd64.go
│ │ │ ├── ztypes_freebsd_386.go
│ │ │ ├── ztypes_freebsd_amd64.go
│ │ │ ├── ztypes_freebsd_arm.go
│ │ │ ├── ztypes_freebsd_arm64.go
│ │ │ ├── ztypes_freebsd_riscv64.go
│ │ │ ├── ztypes_linux.go
│ │ │ ├── ztypes_linux_386.go
│ │ │ ├── ztypes_linux_amd64.go
│ │ │ ├── ztypes_linux_arm.go
│ │ │ ├── ztypes_linux_arm64.go
│ │ │ ├── ztypes_linux_loong64.go
│ │ │ ├── ztypes_linux_mips.go
│ │ │ ├── ztypes_linux_mips64.go
│ │ │ ├── ztypes_linux_mips64le.go
│ │ │ ├── ztypes_linux_mipsle.go
│ │ │ ├── ztypes_linux_ppc.go
│ │ │ ├── ztypes_linux_ppc64.go
│ │ │ ├── ztypes_linux_ppc64le.go
│ │ │ ├── ztypes_linux_riscv64.go
│ │ │ ├── ztypes_linux_s390x.go
│ │ │ ├── ztypes_linux_sparc64.go
│ │ │ ├── ztypes_netbsd_386.go
│ │ │ ├── ztypes_netbsd_amd64.go
│ │ │ ├── ztypes_netbsd_arm.go
│ │ │ ├── ztypes_netbsd_arm64.go
│ │ │ ├── ztypes_openbsd_386.go
│ │ │ ├── ztypes_openbsd_amd64.go
│ │ │ ├── ztypes_openbsd_arm.go
│ │ │ ├── ztypes_openbsd_arm64.go
│ │ │ ├── ztypes_openbsd_mips64.go
│ │ │ ├── ztypes_openbsd_ppc64.go
│ │ │ ├── ztypes_openbsd_riscv64.go
│ │ │ ├── ztypes_solaris_amd64.go
│ │ │ └── ztypes_zos_s390x.go
│ │ └── windows/
│ │ ├── aliases.go
│ │ ├── dll_windows.go
│ │ ├── env_windows.go
│ │ ├── eventlog.go
│ │ ├── exec_windows.go
│ │ ├── memory_windows.go
│ │ ├── mkerrors.bash
│ │ ├── mkknownfolderids.bash
│ │ ├── mksyscall.go
│ │ ├── race.go
│ │ ├── race0.go
│ │ ├── security_windows.go
│ │ ├── service.go
│ │ ├── setupapi_windows.go
│ │ ├── str.go
│ │ ├── syscall.go
│ │ ├── syscall_windows.go
│ │ ├── types_windows.go
│ │ ├── types_windows_386.go
│ │ ├── types_windows_amd64.go
│ │ ├── types_windows_arm.go
│ │ ├── types_windows_arm64.go
│ │ ├── zerrors_windows.go
│ │ ├── zknownfolderids_windows.go
│ │ └── zsyscall_windows.go
│ ├── term/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── README.md
│ │ ├── codereview.cfg
│ │ ├── term.go
│ │ ├── term_plan9.go
│ │ ├── term_unix.go
│ │ ├── term_unix_bsd.go
│ │ ├── term_unix_other.go
│ │ ├── term_unsupported.go
│ │ ├── term_windows.go
│ │ └── terminal.go
│ └── text/
│ ├── LICENSE
│ ├── PATENTS
│ ├── encoding/
│ │ ├── charmap/
│ │ │ ├── charmap.go
│ │ │ └── tables.go
│ │ ├── encoding.go
│ │ ├── internal/
│ │ │ ├── identifier/
│ │ │ │ ├── identifier.go
│ │ │ │ └── mib.go
│ │ │ └── internal.go
│ │ ├── japanese/
│ │ │ ├── all.go
│ │ │ ├── eucjp.go
│ │ │ ├── iso2022jp.go
│ │ │ ├── shiftjis.go
│ │ │ └── tables.go
│ │ ├── korean/
│ │ │ ├── euckr.go
│ │ │ └── tables.go
│ │ ├── simplifiedchinese/
│ │ │ ├── all.go
│ │ │ ├── gbk.go
│ │ │ ├── hzgb2312.go
│ │ │ └── tables.go
│ │ ├── traditionalchinese/
│ │ │ ├── big5.go
│ │ │ └── tables.go
│ │ └── unicode/
│ │ ├── override.go
│ │ └── unicode.go
│ ├── internal/
│ │ └── utf8internal/
│ │ └── utf8internal.go
│ ├── runes/
│ │ ├── cond.go
│ │ └── runes.go
│ └── transform/
│ └── transform.go
├── gopkg.in/
│ ├── natefinch/
│ │ └── lumberjack.v2/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── chown.go
│ │ ├── chown_linux.go
│ │ └── lumberjack.go
│ └── yaml.v3/
│ ├── LICENSE
│ ├── NOTICE
│ ├── README.md
│ ├── apic.go
│ ├── decode.go
│ ├── emitterc.go
│ ├── encode.go
│ ├── parserc.go
│ ├── readerc.go
│ ├── resolve.go
│ ├── scannerc.go
│ ├── sorter.go
│ ├── writerc.go
│ ├── yaml.go
│ ├── yamlh.go
│ └── yamlprivateh.go
└── modules.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CODEOWNERS
================================================
* @rashiq @meiji163 @timvaillancourt
================================================
FILE: .github/CONTRIBUTING.md
================================================
## Contributing
Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.
This project adheres to the [Open Code of Conduct](http://todogroup.org/opencodeofconduct/#gh-ost/opensource@github.com). By participating, you are expected to uphold this code.
## Submitting a pull request
0. [Fork](https://github.com/github/gh-ost/fork) and clone the repository
0. Create a new branch: `git checkout -b my-branch-name`
0. Make your change, add tests, and make sure the tests still pass
0. Push to your fork and [submit a pull request](https://github.com/github/gh-ost/compare)
0. Pat your self on the back and wait for your pull request to be reviewed and merged.
Here are a few things you can do that will increase the likelihood of your pull request being accepted:
- Follow the [style guide](https://golang.org/doc/effective_go.html#formatting).
- Write tests.
- Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests.
- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
## Development Guidelines
### Channel Safety
When working with channels in goroutines, it's critical to prevent deadlocks that can occur when a channel receiver exits due to an error while senders are still trying to send values. Always use `base.SendWithContext` for channel sends to avoid deadlocks:
```go
// ✅ CORRECT - Uses helper to prevent deadlock
if err := base.SendWithContext(ctx, ch, value); err != nil {
return err // context was cancelled
}
// ❌ WRONG - Can deadlock if receiver exits
ch <- value
```
Even if the destination channel is buffered, deadlocks could still occur if the buffer fills up and the receiver exits, so it's important to use `SendWithContext` in those cases as well.
## Resources
- [Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/)
- [Using Pull Requests](https://help.github.com/articles/using-pull-requests/)
- [GitHub Help](https://help.github.com)
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
> This is the place to report a bug, ask a question, or suggest an enhancement.
> This is also the place to make a discussion before creating a PR.
> If this is a bug report, please provide a test case (e.g., your table definition and gh-ost command) and the error output.
> Please use markdown to format code or SQL: https://guides.github.com/features/mastering-markdown/
> Please label the issue on the right (bug, enhancement, question, etc.).
> And please understand if this issue is not addressed immediately or in a timeframe you were expecting.
> Thank you!
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
## A Pull Request should be associated with an Issue.
> We wish to have discussions in Issues. A single issue may be targeted by multiple PRs.
> If you're offering a new feature or fixing anything, we'd like to know beforehand in Issues,
> and potentially we'll be able to point development in a particular direction.
Related issue: https://github.com/github/gh-ost/issues/0123456789
> Further notes in https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md
> Thank you! We are open to PRs, but please understand if for technical reasons we are unable to accept each and any PR
### Description
This PR [briefly explain what it does]
> In case this PR introduced Go code changes:
- [ ] contributed code is using same conventions as original code
- [ ] `script/cibuild` returns with no formatting errors, build errors or unit test errors.
================================================
FILE: .github/dependabot.yml
================================================
---
version: 2
updates:
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
permissions:
contents: read
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: Build
run: script/cibuild
- name: Upload gh-ost binary artifact
uses: actions/upload-artifact@v4
with:
name: gh-ost
path: bin/gh-ost
================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL analysis"
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
schedule:
- cron: '25 22 * * 6'
jobs:
codeql:
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'actions', 'go' ]
runs-on: ubuntu-latest # windows-latest and ubuntu-latest are supported. macos-latest is not supported at this time.
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
================================================
FILE: .github/workflows/golangci-lint.yml
================================================
name: golangci-lint
on:
push:
branches:
- master
pull_request:
permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
# pull-requests: read
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v6
with:
go-version-file: go.mod
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.61.0
================================================
FILE: .github/workflows/replica-tests.yml
================================================
name: migration tests
permissions:
contents: read
on: [pull_request]
jobs:
docker-tests:
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
image: ['mysql/mysql-server:5.7.41','mysql:8.0.41','mysql:8.4.3','percona/percona-server:8.0.41-32']
env:
TEST_MYSQL_IMAGE: ${{ matrix.image }}
steps:
- uses: actions/checkout@v4
- name: Install sysbench
run: |
sudo apt-get update
sudo apt-get install -y sysbench
- name: Setup environment
run: script/docker-gh-ost-replica-tests up
- name: Run tests
run: script/docker-gh-ost-replica-tests run
- name: Set artifact name
if: failure()
run: |
ARTIFACT_NAME=$(echo "${{ matrix.image }}" | tr '/:' '-')
echo "ARTIFACT_NAME=test-logs-${ARTIFACT_NAME}" >> $GITHUB_ENV
- name: Upload test logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: /tmp/gh-ost-test.*
retention-days: 7
- name: Teardown environment
if: always()
run: script/docker-gh-ost-replica-tests down
================================================
FILE: .gitignore
================================================
/.gopath/
/bin/
/libexec/
/.vendor/
.idea/
*.tmp
================================================
FILE: .golangci.yml
================================================
run:
timeout: 5m
linters:
disable:
- errcheck
enable:
- bodyclose
- containedctx
- contextcheck
- dogsled
- durationcheck
- errname
- errorlint
- gofmt
- misspell
- nilerr
- nilnil
- noctx
- nolintlint
- nosprintfhostport
- prealloc
- rowserrcheck
- sqlclosecheck
- unconvert
- unparam
- unused
- wastedassign
- whitespace
================================================
FILE: Dockerfile.packaging
================================================
FROM golang:1.23-bullseye
RUN apt-get update
RUN apt-get install -y ruby ruby-dev rubygems build-essential
RUN gem install fpm
ENV GOPATH=/tmp/go
RUN apt-get install -y curl
RUN apt-get install -y rsync
RUN apt-get install -y gcc
RUN apt-get install -y g++
RUN apt-get install -y bash
RUN apt-get install -y git
RUN apt-get install -y tar
RUN apt-get install -y rpm
RUN mkdir -p $GOPATH/src/github.com/github/gh-ost
WORKDIR $GOPATH/src/github.com/github/gh-ost
COPY . .
RUN bash build.sh
================================================
FILE: Dockerfile.test
================================================
FROM golang:1.23-bullseye
LABEL maintainer="github@github.com"
RUN apt-get update
RUN apt-get install -y lsb-release
RUN rm -rf /var/lib/apt/lists/*
COPY . /go/src/github.com/github/gh-ost
WORKDIR /go/src/github.com/github/gh-ost
CMD ["script/test"]
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# gh-ost
[](https://github.com/github/gh-ost/actions/workflows/ci.yml) [](https://github.com/github/gh-ost/actions/workflows/replica-tests.yml) [](https://github.com/github/gh-ost/releases) [](https://github.com/github/gh-ost/releases)
#### GitHub's online schema migration for MySQL <img src="doc/images/gh-ost-logo-light-160.png" align="right">
`gh-ost` is a triggerless online schema migration solution for MySQL. It is testable and provides pausability, dynamic control/reconfiguration, auditing, and many operational perks.
`gh-ost` produces a light workload on the master throughout the migration, decoupled from the existing workload on the migrated table.
It has been designed based on years of experience with existing solutions, and changes the paradigm of table migrations.
## How?
All existing online-schema-change tools operate in similar manner: they create a _ghost_ table in the likeness of your original table, migrate that table while empty, slowly and incrementally copy data from your original table to the _ghost_ table, meanwhile propagating ongoing changes (any `INSERT`, `DELETE`, `UPDATE` applied to your table) to the _ghost_ table. Finally, at the right time, they replace your original table with the _ghost_ table.
`gh-ost` uses the same pattern. However it differs from all existing tools by not using triggers. We have recognized the triggers to be the source of [many limitations and risks](doc/why-triggerless.md).
Instead, `gh-ost` [uses the binary log stream](doc/triggerless-design.md) to capture table changes, and asynchronously applies them onto the _ghost_ table. `gh-ost` takes upon itself some tasks that other tools leave for the database to perform. As result, `gh-ost` has greater control over the migration process; can truly suspend it; can truly decouple the migration's write load from the master's workload.
In addition, it offers many [operational perks](doc/perks.md) that make it safer, trustworthy and fun to use.

## Highlights
- Build your trust in `gh-ost` by testing it on replicas. `gh-ost` will issue same flow as it would have on the master, to migrate a table on a replica, without actually replacing the original table, leaving the replica with two tables you can then compare and satisfy yourself that the tool operates correctly. This is how we continuously test `gh-ost` in production.
- True pause: when `gh-ost` [throttles](doc/throttle.md), it truly ceases writes on master: no row copies and no ongoing events processing. By throttling, you return your master to its original workload
- Dynamic control: you can [interactively](doc/interactive-commands.md) reconfigure `gh-ost`, even as migration still runs. You may forcibly initiate throttling.
- Auditing: you may query `gh-ost` for status. `gh-ost` listens on unix socket or TCP.
- Control over cut-over phase: `gh-ost` can be instructed to postpone what is probably the most critical step: the swap of tables, until such time that you're comfortably available. No need to worry about ETA being outside office hours.
- External [hooks](doc/hooks.md) can couple `gh-ost` with your particular environment.
Please refer to the [docs](doc) for more information. No, really, read the [docs](doc).
## Usage
The [cheatsheet](doc/cheatsheet.md) has it all. You may be interested in invoking `gh-ost` in various modes:
- a _noop_ migration (merely testing that the migration is valid and good to go)
- a real migration, utilizing a replica (the migration runs on the master; `gh-ost` figures out identities of servers involved. Required mode if your master uses Statement Based Replication)
- a real migration, run directly on the master (but `gh-ost` prefers the former)
- a real migration on a replica (master untouched)
- a test migration on a replica, the way for you to build trust with `gh-ost`'s operation.
Our tips:
- [Testing above all](doc/testing-on-replica.md), try out `--test-on-replica` first few times. Better yet, make it continuous. We have multiple replicas where we iterate our entire fleet of production tables, migrating them one by one, checksumming the results, verifying migration is good.
- For each master migration, first issue a _noop_
- Then issue the real thing via `--execute`.
More tips:
- Use `--exact-rowcount` for accurate progress indication
- Use `--postpone-cut-over-flag-file` to gain control over cut-over timing
- Get familiar with the [interactive commands](doc/interactive-commands.md)
Also see:
- [requirements and limitations](doc/requirements-and-limitations.md)
- [common questions](doc/questions.md)
- [what if?](doc/what-if.md)
- [the fine print](doc/the-fine-print.md)
- [Community questions](https://github.com/github/gh-ost/issues?q=label%3Aquestion)
- [Using `gh-ost` on AWS RDS](doc/rds.md)
- [Using `gh-ost` on Azure Database for MySQL](doc/azure.md)
## What's in a name?
Originally this was named `gh-osc`: GitHub Online Schema Change, in the likes of [Facebook online schema change](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) and [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html).
But then a rare genetic mutation happened, and the `c` transformed into `t`. And that sent us down the path of trying to figure out a new acronym. `gh-ost` (pronounce: _Ghost_), stands for GitHub's Online Schema Transmogrifier/Translator/Transformer/Transfigurator
## License
`gh-ost` is licensed under the [MIT license](https://github.com/github/gh-ost/blob/master/LICENSE)
`gh-ost` uses 3rd party libraries, each with their own license. These are found [here](https://github.com/github/gh-ost/tree/master/vendor).
## Community
`gh-ost` is released at a stable state, but with mileage to go. We are [open to pull requests](https://github.com/github/gh-ost/blob/master/.github/CONTRIBUTING.md). Please first discuss your intentions via [Issues](https://github.com/github/gh-ost/issues).
We develop `gh-ost` at GitHub and for the community. We may have different priorities than others. From time to time we may suggest a contribution that is not on our immediate roadmap but which may appeal to others.
Please see [Coding gh-ost](doc/coding-ghost.md) for a guide to getting started developing with gh-ost.
## Download/binaries/source
`gh-ost` is now GA and stable.
`gh-ost` is available in binary format for Linux and Mac OS/X
[Download latest release here](https://github.com/github/gh-ost/releases/latest)
`gh-ost` is a Go project; it is built with Go `1.15` and above. To build on your own, use either:
- [script/build](https://github.com/github/gh-ost/blob/master/script/build) - this is the same build script used by CI hence the authoritative; artifact is `./bin/gh-ost` binary.
- [build.sh](https://github.com/github/gh-ost/blob/master/build.sh) for building `tar.gz` artifacts in `/tmp/gh-ost-release`
Generally speaking, `master` branch is stable, but only [releases](https://github.com/github/gh-ost/releases) are to be used in production.
## Authors
`gh-ost` is designed, authored, reviewed and tested by the database infrastructure team at GitHub:
- [@jonahberquist](https://github.com/jonahberquist)
- [@ggunson](https://github.com/ggunson)
- [@tomkrouper](https://github.com/tomkrouper)
- [@shlomi-noach](https://github.com/shlomi-noach)
- [@jessbreckenridge](https://github.com/jessbreckenridge)
- [@gtowey](https://github.com/gtowey)
- [@timvaillancourt](https://github.com/timvaillancourt)
================================================
FILE: build.sh
================================================
#!/bin/bash
RELEASE_VERSION=
buildpath=
function setuptree() {
b=$( mktemp -d $buildpath/gh-ostXXXXXX ) || return 1
mkdir -p $b/gh-ost
mkdir -p $b/gh-ost/usr/bin
echo $b
}
function build {
osname=$1
osshort=$2
GOOS=$3
GOARCH=$4
if ! go version | egrep -q 'go1\.(1[5-9]|[2-9][0-9]{1})' ; then
echo "go version must be 1.15 or above"
exit 1
fi
echo "Building ${osname}-${GOARCH} binary"
export GOOS
export GOARCH
go build -ldflags "$ldflags" -o $buildpath/$target go/cmd/gh-ost/main.go
if [ $? -ne 0 ]; then
echo "Build failed for ${osname} ${GOARCH}."
exit 1
fi
(cd $buildpath && tar cfz ./gh-ost-binary-${osshort}-${GOARCH}-${timestamp}.tar.gz $target)
# build RPM and deb for Linux, x86-64 only
if [ "$GOOS" == "linux" ] && [ "$GOARCH" == "amd64" ] ; then
echo "Creating Distro full packages"
builddir=$(setuptree)
cp $buildpath/$target $builddir/gh-ost/usr/bin
cd $buildpath
fpm -v "${RELEASE_VERSION}" --epoch 1 -f -s dir -n gh-ost -m 'GitHub' --description "GitHub's Online Schema Migrations for MySQL " --url "https://github.com/github/gh-ost" --vendor "GitHub" --license "Apache 2.0" -C $builddir/gh-ost --prefix=/ -t rpm --rpm-rpmbuild-define "_build_id_links none" --rpm-os linux .
fpm -v "${RELEASE_VERSION}" --epoch 1 -f -s dir -n gh-ost -m 'GitHub' --description "GitHub's Online Schema Migrations for MySQL " --url "https://github.com/github/gh-ost" --vendor "GitHub" --license "Apache 2.0" -C $builddir/gh-ost --prefix=/ -t deb --deb-no-default-config-files .
cd -
fi
}
main() {
if [ -z "${RELEASE_VERSION}" ] ; then
RELEASE_VERSION=$(git describe --abbrev=0 --tags | tr -d 'v')
fi
if [ -z "${RELEASE_VERSION}" ] ; then
echo "RELEASE_VERSION must be set"
exit 1
fi
if [ -z "${GIT_COMMIT}" ]; then
GIT_COMMIT=$(git rev-parse HEAD)
fi
buildpath=/tmp/gh-ost-release
target=gh-ost
timestamp=$(date "+%Y%m%d%H%M%S")
ldflags="-X main.AppVersion=${RELEASE_VERSION} -X main.GitCommit=${GIT_COMMIT}"
mkdir -p ${buildpath}
rm -rf ${buildpath:?}/*
build GNU/Linux linux linux amd64
build GNU/Linux linux linux arm64
build macOS osx darwin amd64
build macOS osx darwin arm64
bin_files=$(find $buildpath/gh-ost* -type f -maxdepth 1)
echo "Binaries found in:"
echo "$bin_files"
echo "Checksums:"
(shasum -a256 $bin_files 2>/dev/null)
echo "Build Success!"
}
main "$@"
================================================
FILE: doc/azure.md
================================================
`gh-ost` has been updated to work with Azure Database for MySQL however due to GitHub does not use it, this documentation is community driven so if you find a bug please [open an issue][new_issue]!
# Azure Database for MySQL
## Limitations
- `gh-ost` runs should be setup use [`--assume-rbr`][assume_rbr_docs] and use `binlog_row_image=FULL`.
- Azure Database for MySQL does not use same user name suffix for master and replica, so master host, user and password need to be pointed out.
## Step
1. Change the replica server's `binlog_row_image` from `MINIMAL` to `FULL`. See [guide](https://docs.microsoft.com/en-us/azure/mysql/howto-server-parameters) on Azure document.
2. Use your `gh-ost` always with additional 5 parameter
```{bash}
gh-ost \
--azure \
--assume-master-host=master-server-dns-name \
--master-user="master-user-name" \
--master-password="master-password" \
--assume-rbr \
[-- other parameters you need]
```
[new_issue]: https://github.com/github/gh-ost/issues/new
[assume_rbr_docs]: https://github.com/github/gh-ost/blob/master/doc/command-line-flags.md#assume-rbr
[migrate_test_on_replica_docs]: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md#c-migratetest-on-replica
================================================
FILE: doc/cheatsheet.md
================================================
# Cheatsheet
### Operation modes

`gh-ost` operates by connecting to potentially multiple servers, as well as imposing itself as a replica in order to streamline binary log events directly from one of those servers. There are various operation modes, which depend on your setup, configuration, and where you want to run the migration.
#### a. Connect to replica, migrate on master
This is the mode `gh-ost` expects by default. `gh-ost` will investigate the replica, crawl up to find the topology's master, and will hook onto it as well. Migration will:
- Read and write row-data on master
- Read binary logs events on the replica, apply the changes onto the master
- Investigates table format, columns & keys, count rows on the replica
- Read internal changelog events (such as heartbeat) from the replica
- Cut-over (switch tables) on the master
If your master works with SBR, this is the mode to work with. The replica must be configured with binary logs enabled (`log_bin`, `log_slave_updates`) and should have `binlog_format=ROW` (`gh-ost` can apply the latter for you).
However even with RBR we suggest this is the least master-intrusive operation mode.
```shell
gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="myreplica.1.com,myreplica.2.com" \
--max-lag-millis=1500 \
--user="gh-ost" \
--password="123456" \
--host=replica.with.rbr.com \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--switch-to-rbr \
--allow-master-master \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--default-retries=120 \
--panic-flag-file=/tmp/ghost.panic.flag \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \
[--execute]
```
With `--execute`, migration actually copies data and flips tables. Without it this is a `noop` run.
#### b. Connect to master
If you don't have replicas, or do not wish to use them, you are still able to operate directly on the master. `gh-ost` will do all operations directly on the master. You may still ask it to be considerate of replication lag.
- Your master must produce binary logs in RBR format.
- You must approve this mode via `--allow-on-master`.
```shell
gh-ost \
--max-load=Threads_running=25 \
--critical-load=Threads_running=1000 \
--chunk-size=1000 \
--throttle-control-replicas="myreplica.1.com,myreplica.2.com" \
--max-lag-millis=1500 \
--user="gh-ost" \
--password="123456" \
--host=master.with.rbr.com \
--allow-on-master \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--switch-to-rbr \
--allow-master-master \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--default-retries=120 \
--panic-flag-file=/tmp/ghost.panic.flag \
--postpone-cut-over-flag-file=/tmp/ghost.postpone.flag \
[--execute]
```
#### c. Migrate/test on replica
This will perform a migration on the replica. `gh-ost` will briefly connect to the master but will thereafter perform all operations on the replica without modifying anything on the master.
Throughout the operation, `gh-ost` will throttle such that the replica is up to date.
- `--migrate-on-replica` indicates to `gh-ost` that it must migrate the table directly on the replica. It will perform the cut-over phase even while replication is running.
- `--test-on-replica` indicates the migration is for purpose of testing only. Before cut-over takes place, replication is stopped. Tables are swapped and then swapped back: your original table returns to its original place.
Both tables are left with replication stopped. You may examine the two and compare data.
Test on replica cheatsheet:
```shell
gh-ost \
--user="gh-ost" \
--password="123456" \
--host=replica.with.rbr.com \
--test-on-replica \
--database="my_schema" \
--table="my_table" \
--verbose \
--alter="engine=innodb" \
--initially-drop-ghost-table \
--initially-drop-old-table \
--max-load=Threads_running=30 \
--switch-to-rbr \
--chunk-size=500 \
--cut-over=default \
--exact-rowcount \
--concurrent-rowcount \
--serve-socket-file=/tmp/gh-ost.test.sock \
--panic-flag-file=/tmp/gh-ost.panic.flag \
--execute
```
### cnf file
You may use a `cnf` file in the following format:
```
[client]
user=gh-ost
password=123456
```
You may then remove `--user=gh-ost --password=123456` and specify `--conf=/path/to/config/file.cnf`
### Special configurations
#### Master-master
Master-master setups are supported, but at this time only active-passive. An active-active setup, where both masters write to the migrated table, is not supported at this stage. `gh-ost` requires you to acknowledge master-master via:
```
gh-ost --allow-master-master
```
`gh-ost` will pick one of the masters to work on. You may additionally force `gh-ost` to pick a particular master of your choice:
```
gh-ost --allow-master-master --assume-master-host=a.specific.master.com
```
#### Tungsten
Topologies using _tungsten replicator_ are peculiar in that the participating servers are not actually aware they are replicating. The _tungsten replicator_ looks just like another app issuing queries on those hosts. `gh-ost` is unable to identify that a server participates in a _tungsten_ topology.
If you choose to migrate directly on master (see above), there's nothing special you need to do.
If you choose to migrate via replica, then you need to make sure Tungsten is configured with log-slave-updates parameter (note this is different from MySQL's own log-slave-updates parameter), otherwise changes will not be in the replica's binlog, causing data to be corrupted after table swap. You must also supply the identity of the master, and indicate this is a tungsten setup, as follows:
```
gh-ost --tungsten --assume-master-host=the.topology.master.com
```
Also note that `--switch-to-rbr` does not work for a Tungsten setup as the replication process is external, so you need to make sure `binlog_format` is set to ROW before Tungsten Replicator connects to the server and starts applying events from the master.
### Concurrent migrations
It is possible to run concurrent `gh-ost` migrations.
- Never on the exact same table.
- If running on different replicas, (e.g. `table1` on `replica1` and `table2` on `replica2`) then no further configuration required.
- If running from same server (binaries run on same server, regardless of which replica/replicas are used):
- Make sure not to specify same `-serve-socket-file` (or let `gh-ost` pick one for you).
- You may choose to use same `-throttle-flag-file` (preferably use `-throttle-additional-flag-file`, this is exactly the reason there's two, this latter file is for sharing).
- You may choose to use same `-panic-flag-file`. This all depends on your flow and how you'd like to control your migrations.
- If using same inspected box (either master or replica, `--host=everyone.uses.this.host`) then for each `gh-ost` process you must also provide a different, unique `--replica-server-id`. Optionally use process ID (`$$` in shell) ; but it's on you to choose a number that does not collide with another `gh-ost` or another running replica.
================================================
FILE: doc/coding-ghost.md
================================================
# Getting started with gh-ost development.
## Overview
Getting started with gh-ost development is simple!
- First obtain the repository with `git clone` or `go get`.
- From inside of the repository run `script/cibuild`.
- This will bootstrap the environment if needed, format the code, build the code, and then run the unit test.
## CI build workflow
`script/cibuild` performs the following actions will bootstrap the environment to build `gh-ost` correctly, build, perform syntax checks and run unit tests.
If additional steps are needed, please add them into this workflow so that the workflow remains simple.
## `golang-ci` linter
To enfore best-practices, Pull Requests are automatically linted by [`golang-ci`](https://golangci-lint.run/). The linter config is located at [`.golangci.yml`](https://github.com/github/gh-ost/blob/master/.golangci.yml) and the `golangci-lint` GitHub Action is located at [`.github/workflows/golangci-lint.yml`](https://github.com/github/gh-ost/blob/master/.github/workflows/golangci-lint.yml).
To run the `golang-ci` linters locally _(recommended before push)_, use `script/lint`.
## Notes:
Currently, `script/ensure-go-installed` will install `go` for Mac OS X and Linux. We welcome PR's to add other platforms.
================================================
FILE: doc/command-line-flags.md
================================================
# Command line flags
A more in-depth discussion of various `gh-ost` command line flags: implementation, implication, use cases.
### aliyun-rds
Add this flag when executing on Aliyun RDS.
### allow-zero-in-date
Allows the user to make schema changes that include a zero date or zero in date (e.g. adding a `datetime default '0000-00-00 00:00:00'` column), even if global `sql_mode` on MySQL has `NO_ZERO_IN_DATE,NO_ZERO_DATE`.
### azure
Add this flag when executing on Azure Database for MySQL.
### allow-master-master
See [`--assume-master-host`](#assume-master-host).
### allow-on-master
By default, `gh-ost` would like you to connect to a replica, from where it figures out the master by itself. This wiring is required should your master execute using `binlog_format=STATEMENT`.
If, for some reason, you do not wish `gh-ost` to connect to a replica, you may connect it directly to the master and approve this via `--allow-on-master`.
### allow-setup-metadata-lock-instruments
`--allow-setup-metadata-lock-instruments` allows gh-ost to enable the [`metadata_locks`](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-metadata-locks-table.html) table in `performance_schema`, if it is not already enabled. This is used for a safety check before cut-over.
See also: [`skip-metadata-lock-check`](#skip-metadata-lock-check)
### approve-renamed-columns
When your migration issues a column rename (`change column old_name new_name ...`) `gh-ost` analyzes the statement to try and associate the old column name with new column name. Otherwise, the new structure may also look like some column was dropped and another was added.
`gh-ost` will print out what it thinks the _rename_ implied, but will not issue the migration unless you provide with `--approve-renamed-columns`.
If you think `gh-ost` is mistaken and that there's actually no _rename_ involved, you may pass [`--skip-renamed-columns`](#skip-renamed-columns) instead. This will cause `gh-ost` to disassociate the column values; data will not be copied between those columns.
### assume-master-host
`gh-ost` infers the identity of the master server by crawling up the replication topology. You may explicitly tell `gh-ost` the identity of the master host via `--assume-master-host=the.master.com`. This is useful in:
- _master-master_ topologies (together with [`--allow-master-master`](#allow-master-master)), where `gh-ost` can arbitrarily pick one of the co-masters, and you prefer that it picks a specific one
- _tungsten replicator_ topologies (together with [`--tungsten`](#tungsten)), where `gh-ost` is unable to crawl and detect the master
### assume-rbr
If you happen to _know_ your servers use RBR (Row Based Replication, i.e. `binlog_format=ROW`), you may specify `--assume-rbr`. This skips a verification step where `gh-ost` would issue a `STOP SLAVE; START SLAVE`.
Skipping this step means `gh-ost` would not need the `SUPER` privilege in order to operate.
You may want to use this on Amazon RDS.
### attempt-instant-ddl
MySQL 8.0 supports "instant DDL" for some operations. If an alter statement can be completed with instant DDL, only a metadata change is required internally. Instant operations include:
- Adding a column
- Dropping a column
- Dropping an index
- Extending a varchar column
- Adding a virtual generated column
It is not reliable to parse the `ALTER` statement to determine if it is instant or not. This is because the table might be in an older row format, or have some other incompatibility that is difficult to identify.
`--attempt-instant-ddl` is disabled by default, but the risks of enabling it are relatively minor: `gh-ost` may need to acquire a metadata lock at the start of the operation. This is not a problem for most scenarios, but it could be a problem for users that start the DDL during a period with long running transactions.
`gh-ost` will automatically fallback to the normal DDL process if the attempt to use instant DDL is unsuccessful.
### binlogsyncer-max-reconnect-attempts
`--binlogsyncer-max-reconnect-attempts=0`, the maximum number of attempts to re-establish a broken inspector connection for sync binlog. `0` or `negative number` means infinite retry, default `0`
### checkpoint
`--checkpoint` enables periodic checkpoints of the gh-ost's state so that gh-ost can resume a migration from the checkpoint with `--resume`. Checkpoints are written to a separate table named `_${original_table_name}_ghk`. It is recommended to use with `--gtid` for checkpoints.
See also: [`resuming-migrations`](resume.md)
### checkpoint-seconds
`--checkpoint-seconds` specifies the seconds between checkpoints. Default is 300.
### conf
`--conf=/path/to/my.cnf`: file where credentials are specified. Should be in (or contain) the following format:
```
[client]
user=gromit
password=123456
```
### concurrent-rowcount
Defaults to `true`. See [`exact-rowcount`](#exact-rowcount)
### critical-load
Comma delimited status-name=threshold, same format as [`--max-load`](#max-load).
`--critical-load` defines a threshold that, when met, `gh-ost` panics and bails out. The default behavior is to bail out immediately when meeting this threshold.
This may sometimes lead to migrations bailing out on a very short spike, that, while in itself is impacting production and is worth investigating, isn't reason enough to kill a 10-hour migration.
### critical-load-hibernate-seconds
When `--critical-load-hibernate-seconds` is non-zero (e.g. `--critical-load-hibernate-seconds=300`), `critical-load` does not panic and bail out; instead, `gh-ost` goes into hibernation for the specified duration. It will not read/write anything from/to any server during this time. Execution then continues upon waking from hibernation.
If `critical-load` is met again, `gh-ost` will repeat this cycle, and never panic and bail out.
### critical-load-interval-millis
When `--critical-load-interval-millis` is specified (e.g. `--critical-load-interval-millis=2500`), `gh-ost` gives a second chance: when it meets `critical-load` threshold, it doesn't bail out. Instead, it starts a timer (in this example: `2.5` seconds) and re-checks `critical-load` when the timer expires. If `critical-load` is met again, `gh-ost` panics and bails out. If not, execution continues.
This is somewhat similar to a Nagios `n`-times test, where `n` in our case is always `2`.
### cut-over
Optional. Default is `safe`. See more discussion in [`cut-over`](cut-over.md)
### cut-over-lock-timeout-seconds
Default `3`. Max number of seconds to hold locks on tables while attempting to cut-over (retry attempted when lock exceeds timeout).
### discard-foreign-keys
**Danger**: this flag will _silently_ discard any foreign keys existing on your table.
At this time (10-2016) `gh-ost` does not support foreign keys on migrated tables (it bails out when it notices a FK on the migrated table). However, it is able to support _dropping_ of foreign keys via this flag. If you're trying to get rid of foreign keys in your environment, this is a useful flag.
See also: [`skip-foreign-key-checks`](#skip-foreign-key-checks)
### dml-batch-size
`gh-ost` reads event from the binary log and applies them onto the _ghost_ table. It does so in batched writes: grouping multiple events to apply in a single transaction. This gives better write throughput as we don't need to sync the transaction log to disk for each event.
The `--dml-batch-size` flag controls the size of the batched write. Allowed values are `1 - 1000`, where `1` means no batching (every event from the binary log is applied onto the _ghost_ table on its own transaction). Default value is `10`.
Why is this behavior configurable? Different workloads have different characteristics. Some workloads have very large writes, such that aggregating even `50` writes into a transaction makes for a significant transaction size. On other workloads write rate is high such that one just can't allow for a hundred more syncs to disk per second. The default value of `10` is a modest compromise that should probably work very well for most workloads. Your mileage may vary.
Noteworthy is that setting `--dml-batch-size` to higher value _does not_ mean `gh-ost` blocks or waits on writes. The batch size is an upper limit on transaction size, not a minimal one. If `gh-ost` doesn't have "enough" events in the pipe, it does not wait on the binary log, it just writes what it already has. This conveniently suggests that if write load is light enough for `gh-ost` to only see a few events in the binary log at a given time, then it is also light enough for `gh-ost` to apply a fraction of the batch size.
### exact-rowcount
A `gh-ost` execution need to copy whatever rows you have in your existing table onto the ghost table. This can and often will be, a large number. Exactly what that number is?
`gh-ost` initially estimates the number of rows in your table by issuing an `explain select * from your_table`. This will use statistics on your table and return with a rough estimate. How rough? It might go as low as half or as high as double the actual number of rows in your table. This is the same method as used in [`pt-online-schema-change`](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html).
`gh-ost` also supports the `--exact-rowcount` flag. When this flag is given, two things happen:
- An initial, authoritative `select count(*) from your_table`.
This query may take a long time to complete, but is performed before we begin the massive operations.
When [`--concurrent-rowcount`](#concurrent-rowcount) is also specified, this runs in parallel to row copy.
Note: [`--concurrent-rowcount`](#concurrent-rowcount) now defaults to `true`.
- A continuous update to the estimate as we make progress applying events.
We heuristically update the number of rows based on the queries we process from the binlogs.
While the ongoing estimated number of rows is still heuristic, it's almost exact, such that the reported [ETA](understanding-output.md) or percentage progress is typically accurate to the second throughout a multiple-hour operation.
### execute
Without this parameter, migration is a _noop_: testing table creation and validity of migration, but not touching data.
### force-named-cut-over
If given, a `cut-over` command must name the migrated table, or else ignored.
### force-named-panic
If given, a `panic` command must name the migrated table, or else ignored.
### force-table-names
Table name prefix to be used on the temporary tables.
### gcp
Add this flag when executing on a 1st generation Google Cloud Platform (GCP).
### gtid
Add this flag to enable support for [MySQL replication GTIDs](https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html) for replication positioning. This requires `gtid_mode` and `enforce_gtid_consistency` to be set to `ON`.
### heartbeat-interval-millis
Default 100. See [`subsecond-lag`](subsecond-lag.md) for details.
### hooks-status-interval
Defaults to 60 seconds. Configures how often the `gh-ost-on-status` hook is called, see [`hooks`](hooks.md) for full details on how to use hooks.
### initially-drop-ghost-table
`gh-ost` maintains two tables while migrating: the _ghost_ table (which is synced from your original table and finally replaces it) and a changelog table, which is used internally for bookkeeping. By default, it panics and aborts if it sees those tables upon startup. Provide `--initially-drop-ghost-table` and `--initially-drop-old-table` to let `gh-ost` know it's OK to drop them beforehand.
We think `gh-ost` should not take chances or make assumptions about the user's tables. Dropping tables can be a dangerous, locking operation. We let the user explicitly approve such operations.
### initially-drop-old-table
See [`initially-drop-ghost-table`](#initially-drop-ghost-table)
### initially-drop-socket-file
Default False. Should `gh-ost` forcibly delete an existing socket file. Be careful: this might drop the socket file of a running migration!
### max-lag-millis
On a replication topology, this is perhaps the most important migration throttling factor: the maximum lag allowed for migration to work. If lag exceeds this value, migration throttles.
When using [Connect to replica, migrate on master](cheatsheet.md#a-connect-to-replica-migrate-on-master), this lag is primarily tested on the very replica `gh-ost` operates on. Lag is measured by checking the heartbeat events injected by `gh-ost` itself on the utility changelog table. That is, to measure this replica's lag, `gh-ost` doesn't need to issue `show slave status` nor have any external heartbeat mechanism.
When [`--throttle-control-replicas`](#throttle-control-replicas) is provided, throttling also considers lag on specified hosts. Lag measurements on listed hosts is done by querying `gh-ost`'s _changelog_ table, where `gh-ost` injects a heartbeat.
When using on master or when `--allow-on-master` is provided, `max-lag-millis` is also considered a threshold for starting the cutover stage of the migration. If the row copy is complete and the heartbeat lag is less than `max-lag-millis` cutover phase of the migration will start.
See also: [Sub-second replication lag throttling](subsecond-lag.md)
### max-load
List of metrics and threshold values; topping the threshold of any will cause throttler to kick in. See also: [`throttling`](throttle.md#status-thresholds)
### migrate-on-replica
Typically `gh-ost` is used to migrate tables on a master. If you wish to only perform the migration in full on a replica, connect `gh-ost` to said replica and pass `--migrate-on-replica`. `gh-ost` will briefly connect to the master but otherwise will make no changes on the master. Migration will be fully executed on the replica, while making sure to maintain a small replication lag.
### panic-on-warnings
When this flag is set, `gh-ost` will panic when SQL warnings indicating data loss are encountered when copying data. This flag helps prevent data loss scenarios with migrations touching unique keys, column collation and types, as well as `NOT NULL` constraints, where `MySQL` will silently drop inserted rows that no longer satisfy the updated constraint (also dependent on the configured `sql_mode`).
While `panic-on-warnings` is currently disabled by defaults, it will default to `true` in a future version of `gh-ost`.
### postpone-cut-over-flag-file
Indicate a file name, such that the final [cut-over](cut-over.md) step does not take place as long as the file exists.
When this flag is set, `gh-ost` expects the file to exist on startup, or else tries to create it. `gh-ost` exits with error if the file does not exist and `gh-ost` is unable to create it.
With this flag set, the migration will cut-over upon deletion of the file or upon `cut-over` [interactive command](interactive-commands.md).
### replica-server-id
Defaults to 99999. If you run multiple migrations then you must provide a different, unique `--replica-server-id` for each `gh-ost` process.
Optionally involve the process ID, for example: `--replica-server-id=$((1000000000+$$))`.
It's on you to choose a number that does not collide with another `gh-ost` or another running replica.
See also: [`concurrent-migrations`](cheatsheet.md#concurrent-migrations) on the cheatsheet.
### resume
`--resume` attempts to resume a migration that was previously interrupted from the last checkpoint. The first `gh-ost` invocation must run with `--checkpoint` and have successfully written a checkpoint in order for `--resume` to work.
See also: [`resuming-migrations`](resume.md)
### serve-socket-file
Defaults to an auto-determined and advertised upon startup file. Defines Unix socket file to serve on.
### skip-foreign-key-checks
By default `gh-ost` verifies no foreign keys exist on the migrated table. On servers with large number of tables this check can take a long time. If you're absolutely certain no foreign keys exist (table does not reference other table nor is referenced by other tables) and wish to save the check time, provide with `--skip-foreign-key-checks`.
### skip-metadata-lock-check
By default `gh-ost` performs a check before the cut-over to ensure the rename session holds the exclusive metadata lock on the table. In case `performance_schema.metadata_locks` cannot be enabled on your setup, this check can be skipped with `--skip-metadata-lock-check`.
:warning: Disabling this check involves the small chance of data loss in case a session accesses the ghost table during cut-over. See https://github.com/github/gh-ost/pull/1536 for details.
See also: [`allow-setup-metadata-lock-instruments`](#allow-setup-metadata-lock-instruments)
### skip-strict-mode
By default `gh-ost` enforces STRICT_ALL_TABLES sql_mode as a safety measure. In some cases this changes the behaviour of other modes (namely ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, and NO_ZERO_IN_DATE) which may lead to errors during migration. Use `--skip-strict-mode` to explicitly tell `gh-ost` not to enforce this. **Danger** This may have some unexpected disastrous side effects.
### skip-renamed-columns
See [`approve-renamed-columns`](#approve-renamed-columns)
### ssl
By default `gh-ost` does not use ssl/tls connections to the database servers when performing migrations. This flag instructs `gh-ost` to use encrypted connections. If enabled, `gh-ost` will use the system's ca certificate pool for server certificate verification. If a different certificate is needed for server verification, see `--ssl-ca`. If you wish to skip server verification, but still use encrypted connections, use with `--ssl-allow-insecure`.
### ssl-allow-insecure
Allows `gh-ost` to connect to the MySQL servers using encrypted connections, but without verifying the validity of the certificate provided by the server during the connection. Requires `--ssl`.
### ssl-ca
`--ssl-ca=/path/to/ca-cert.pem`: ca certificate file (in PEM format) to use for server certificate verification. If specified, the default system ca cert pool will not be used for verification, only the ca cert provided here. Requires `--ssl`.
### ssl-cert
`--ssl-cert=/path/to/ssl-cert.crt`: SSL public key certificate file (in PEM format).
### ssl-key
`--ssl-key=/path/to/ssl-key.key`: SSL private key file (in PEM format).
### storage-engine
Default is `innodb`, and `rocksdb` support is currently experimental. InnoDB and RocksDB are both transactional engines, supporting both shared and exclusive row locks.
But RocksDB currently lacks a few features support compared to InnoDB:
- Gap Locks
- Foreign Key
- Generated Columns
- Spatial
- Geometry
When `--storage-engine=rocksdb`, `gh-ost` will make some changes necessary (e.g. sets isolation level to `READ_COMMITTED`) to support RocksDB.
### charset
The default charset for the database connection is utf8mb4, utf8, latin1. The ability to specify character set and collation is supported, eg: utf8mb4_general_ci,utf8_general_ci,latin1.
### test-on-replica
Issue the migration on a replica; do not modify data on master. Useful for validating, testing and benchmarking. See [`testing-on-replica`](testing-on-replica.md)
### test-on-replica-skip-replica-stop
Default `False`. When `--test-on-replica` is enabled, do not issue commands stop replication (requires `--test-on-replica`).
### throttle-control-replicas
Provide a command delimited list of replicas; `gh-ost` will throttle when any of the given replicas lag beyond [`--max-lag-millis`](#max-lag-millis). The list can be queried and updated dynamically via [interactive commands](interactive-commands.md)
### throttle-http
Provide an HTTP endpoint; `gh-ost` will issue `HEAD` requests on given URL and throttle whenever response status code is not `200`. The URL can be queried and updated dynamically via [interactive commands](interactive-commands.md). Empty URL disables the HTTP check.
### throttle-http-interval-millis
Defaults to 100. Configures the HTTP throttle check interval in milliseconds.
### throttle-http-timeout-millis
Defaults to 1000 (1 second). Configures the HTTP throttler check timeout in milliseconds.
### timestamp-old-table
Makes the _old_ table include a timestamp value. The _old_ table is what the original table is renamed to at the end of a successful migration. For example, if the table is `gh_ost_test`, then the _old_ table would normally be `_gh_ost_test_del`. With `--timestamp-old-table` it would be, for example, `_gh_ost_test_20170221103147_del`.
### tungsten
See [`tungsten`](cheatsheet.md#tungsten) on the cheatsheet.
================================================
FILE: doc/cut-over.md
================================================
# Cut-over step
The cut-over is the final major step of the migration: it's the moment where your original table is pushed aside, and the ghost table (the one we secretly altered and operated on throughout the process) takes its place.
MySQL poses some limitations on how the table swap can take place. While it supports an atomic swap, it does not allow a connection to swap tables it holds under lock.
The [facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/) tool documents this nicely. Look for **"Cut-over phase"**. The Facebook solution uses a non-atomic swap: the original table is first renamed and pushed aside, then the ghost table is renamed to take its place. In between the two renames there's a brief period of time where your table just does not exist, and queries will fail.
`gh-ost` solves this by using an atomic, two-step blocking swap: while one connection holds the lock, another attempts the atomic `RENAME`. The `RENAME` is guaranteed to not be executed prematurely by positioning a sentry table which blocks the `RENAME` operation until `gh-ost` is satisfied all is in order.
This solution either:
- executes successfully, in which case the tables are swapped atomically and pending connections are blocked for a brief period of time, proceeding to operate on the newly migrated table
- or fails, due to timeout or death of some connection, in which case we are naturally returning to pre-cut-over phase, where the original table is still in place and accessible. This releases the pending connections, which are able again to write to the table, and `gh-ost` is then able to make another attempt at the cut-over.
Also note:
- With `--migrate-on-replica` the cut-over is executed in exactly the same way as on master.
- With `--test-on-replica` the replication is first stopped; then the cut-over is executed just as on master, but then reverted (tables rename forth then back again).
Internals of the atomic cut-over are discussed in [Issue #82](https://github.com/github/gh-ost/issues/82).
At this time the command-line argument `--cut-over` is supported, and defaults to the atomic cut-over algorithm described above. Also supported is `--cut-over=two-step`, which uses the FB non-atomic algorithm. We recommend using the default cut-over that has been battle tested in our production environments.
================================================
FILE: doc/hooks.md
================================================
# Hooks
`gh-ost` supports _hooks_: external processes which `gh-ost` executes at particular points of interest.
Use cases include:
- You wish to be notified by mail when a migration completes/fails
- You wish to be notified when `gh-ost` postpones cut-over (at your demand), thus ready to complete (at your leisure)
- RDS users who wish to `--test-on-replica`, but who cannot have `gh-ost` issue a `STOP SLAVE`, would use a hook to command RDS to stop replication
- Send a status message to your chatops every hour
- Perform cleanup on the _ghost_ table (drop/rename/nibble) once migration completes
- etc.
`gh-ost` defines certain points of interest (event types), and executes hooks at those points.
Notes:
- You may have more than one hook per event type.
- `gh-ost` will invoke relevant hooks _sequentially_ and _synchronously_
- thus, you would generally like the hooks to execute as fast as possible, or otherwise issue tasks in the background
- A hook returning with error code will propagate the error in `gh-ost`. Thus, you are able to force `gh-ost` to fail migration on your conditions.
- Make sure to only return an error code when you do indeed wish to fail the rest of the migration
### Creating hooks
All hooks are expected to reside in a single directory. This directory is indicated by `--hooks-path`. When not provided, no hooks are executed.
`gh-ost` will dynamically search for hooks in said directory. You may add and remove hooks to/from this directory as `gh-ost` makes progress (though likely you don't want to). Hook files are expected to be executable processes.
In an effort to simplify code and to standardize usage, `gh-ost` expects hooks in explicit naming conventions. As an example, the `onStartup` hook expects processes named `gh-ost-on-startup*`. It will match and accept files named:
- `gh-ost-on-startup`
- `gh-ost-on-startup--send-notification-mail`
- `gh-ost-on-startup12345`
- etc.
The full list of supported hooks is best found in code: [hooks.go](https://github.com/github/gh-ost/blob/master/go/logic/hooks.go). Documentation will always be a bit behind. At this time, though, the following are recognized:
- `gh-ost-on-startup`
- `gh-ost-on-validated`
- `gh-ost-on-rowcount-complete`
- `gh-ost-on-before-row-copy`
- `gh-ost-on-status`
- `gh-ost-on-interactive-command`
- `gh-ost-on-row-copy-complete`
- `gh-ost-on-stop-replication`
- `gh-ost-on-start-replication`
- `gh-ost-on-begin-postponed`
- `gh-ost-on-before-cut-over`
- `gh-ost-on-success`
- `gh-ost-on-failure`
- `gh-ost-on-batch-copy-retry`
### Context
`gh-ost` will set environment variables per hook invocation. Hooks are then able to read those variables, indicating schema name, table name, `alter` statement, migrated host name etc. Some variables are available on all hooks, and some are available on relevant hooks.
The following variables are available on all hooks:
- `GH_OST_DATABASE_NAME`
- `GH_OST_TABLE_NAME`
- `GH_OST_GHOST_TABLE_NAME`
- `GH_OST_OLD_TABLE_NAME` - the name the original table will be renamed to at the end of operation
- `GH_OST_DDL`
- `GH_OST_ELAPSED_SECONDS` - total runtime
- `GH_OST_ELAPSED_COPY_SECONDS` - row-copy time (excluding startup, row-count and postpone time)
- `GH_OST_ESTIMATED_ROWS` - estimated total rows in table
- `GH_OST_COPIED_ROWS` - number of rows copied by `gh-ost`
- `GH_OST_INSPECTED_LAG` - lag in seconds (floating point) of inspected server
- `GH_OST_HEARTBEAT_LAG` - lag in seconds (floating point) of heartbeat
- `GH_OST_PROGRESS` - progress pct ([0..100], floating point) of migration
- `GH_OST_ETA_SECONDS` - estimated duration until migration finishes in seconds
- `GH_OST_MIGRATED_HOST`
- `GH_OST_INSPECTED_HOST`
- `GH_OST_EXECUTING_HOST`
- `GH_OST_HOOKS_HINT` - copy of `--hooks-hint` value
- `GH_OST_HOOKS_HINT_OWNER` - copy of `--hooks-hint-owner` value
- `GH_OST_HOOKS_HINT_TOKEN` - copy of `--hooks-hint-token` value
- `GH_OST_DRY_RUN` - whether or not the `gh-ost` run is a dry run
- `GH_OST_REVERT` - whether or not `gh-ost` is running in revert mode
The following variable are available on particular hooks:
- `GH_OST_COMMAND` is only available in `gh-ost-on-interactive-command`
- `GH_OST_STATUS` is only available in `gh-ost-on-status`
- `GH_OST_LAST_BATCH_COPY_ERROR` is only available in `gh-ost-on-batch-copy-retry`
### Examples
See [sample hooks](https://github.com/github/gh-ost/tree/master/resources/hooks-sample), as `bash` implementation samples.
================================================
FILE: doc/interactive-commands.md
================================================
# Interactive commands
`gh-ost` is designed to be operations friendly. To that effect, it allows the user to control its behavior even while it is running.
### Interactive interfaces
`gh-ost` listens on:
- Unix socket file: either provided via `--serve-socket-file` or determined by `gh-ost`, this interface is always up.
When self-determined, `gh-ost` will advertise the identify of socket file upon start up and throughout the migration.
- TCP: if `--serve-tcp-port` is provided
Both interfaces may serve at the same time. Both respond to simple text command, which makes it easy to interact via shell.
### Known commands
- `help`: shows a brief list of available commands
- `status`: returns a detailed status summary of migration progress and configuration
- `sup`: returns a brief status summary of migration progress
- `cpu-profile`: returns a base64-encoded [`runtime/pprof`](https://pkg.go.dev/runtime/pprof) CPU profile using a duration, default: `30s`. Comma-separated options `gzip` and/or `block` (blocked profile) may follow the profile duration
- `coordinates`: returns recent (though not exactly up to date) binary log coordinates of the inspected server
- `applier`: returns the hostname of the applier
- `inspector`: returns the hostname of the inspector
- `chunk-size=<newsize>`: modify the `chunk-size`; applies on next running copy-iteration
- `dml-batch-size=<newsize>`: modify the `dml-batch-size`; applies on next applying of binary log events
- `max-lag-millis=<max-lag>`: modify the maximum replication lag threshold (milliseconds, minimum value is `100`, i.e. `0.1` second)
- `max-load=<max-load-thresholds>`: modify the `max-load` config; applies on next running copy-iteration
- The `max-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`'
- For example: `Threads_running=50,threads_connected=1000`, and you would then write/echo `max-load=Threads_running=50,threads_connected=1000` to the socket.
- `critical-load=<critical-load-thresholds>`: modify the `critical-load` config (exceeding these thresholds aborts the operation)
- The `critical-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`'
- For example: `Threads_running=1000,threads_connected=5000`, and you would then write/echo `critical-load=Threads_running=1000,threads_connected=5000` to the socket.
- `nice-ratio=<ratio>`: change _nice_ ratio: 0 for aggressive (not nice, not sleeping), positive integer `n`:
- For any `1ms` spent copying rows, spend `n*1ms` units of time sleeping.
- Examples: assume a single rows chunk copy takes `100ms` to complete.
- `nice-ratio=0.5` will cause `gh-ost` to sleep for `50ms` immediately following.
- `nice-ratio=1` will cause `gh-ost` to sleep for `100ms`, effectively doubling runtime
- value of `2` will effectively triple the runtime; etc.
- `throttle-http`: change throttle HTTP endpoint
- `throttle-query`: change throttle query
- `throttle-control-replicas='replica1,replica2'`: change list of throttle-control replicas, these are replicas `gh-ost` will check. This takes a comma separated list of replica's to check and replaces the previous list.
- `throttle`: force migration suspend
- `no-throttle`: cancel forced suspension (though other throttling reasons may still apply)
- `postpone-cut-over-flag-file=<path>`: Postpone the [cut-over](cut-over.md) phase, writing a cut over flag file to the given path
- `unpostpone`: at a time where `gh-ost` is postponing the [cut-over](cut-over.md) phase, instruct `gh-ost` to stop postponing and proceed immediately to cut-over.
- `panic`: immediately panic and abort operation
### Querying for data
For commands that accept an argument as value, pass `?` (question mark) to _get_ current value rather than _set_ a new one.
### Examples
While migration is running:
```shell
$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:45:16 +0200 2016
# chunk-size: 200; max lag: 1500ms; dml-batch-size: 10; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 40s(copy); streamer: mysql-bin.000550:49942; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
```
```shell
$ echo "chunk-size=250" | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:56:03 +0200 2016
# chunk-size: 250; max lag: 1500ms; dml-batch-size: 10; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
```
```shell
$ echo "chunk-size=?" | nc -U /tmp/gh-ost.test.sample_data_0.sock
250
```
```shell
$ echo throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:56:03 +0200 2016
# chunk-size: 250; max lag: 1500ms; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 59s(total), 59s(copy); streamer: mysql-bin.000551:68067; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, commanded by user; ETA: N/A
```
================================================
FILE: doc/local-tests.md
================================================
# Local tests
`gh-ost` is continuously tested in production via `--test-on-replica alter='engine=innodb'`. These tests check the GitHub workload and usage, but not necessarily the general case.
Local tests are an additional layer of tests used for continuous integration tests and local development.
Local tests test explicit use cases, such as column renames, mix of time zones, special types and alters. Traits of a single test:
- Composed of a single table.
- A single alter.
- By default the alter is `engine=innodb`, but this can be overridden per-test
- Scheduled DML operations, executed via `event_scheduler`.
- `gh-ost` is set to execute and throttle for `5` seconds, at which time all tested DMLs are expected to operate.
- The test requires a replication topology and utilizes `--test-on-replica`
- The test checksums the two tables (original and _ghost_) and expects identical checksum
- By default the test selects all (`*`) columns, but this can be overridden per-test
Tests are found under [localtests](https://github.com/github/gh-ost/tree/master/localtests). A single test is a subdirectory and tests are iterated alphabetically.
New data-integrity, synchronization issues or otherwise concerns are expected to be tested by new test cases.
## Run with docker compose
Local tests can be run locally with docker compose using the helper script [script/docker-gh-ost-replica-tests](https://github.com/github/gh-ost/tree/master/script/docker-gh-ost-replica-tests).
Example usage:
```shell
# create primary-replica containers with specified mysql image
TEST_MYSQL_IMAGE="mysql-server:8.0.16" ./script/docker-gh-ost-replica-tests up
# run all tests
./script/docker-gh-ost-replica-tests run
# cleanup containers
./script/docker-gh-ost-replica-tests down
```
Pass the `-t` flag to run the tests with a toxiproxy between gh-ost and the MySQL replica. This simulates network conditions where MySQL connections are closed unexpectedly.
```shell
# run tests with toxiproxy
./script/docker-gh-ost-replica-tests up -t
./script/docker-gh-ost-replica-tests run -t
```
================================================
FILE: doc/migrating-with-sbr.md
================================================
# Migrating with Statement Based Replication
Even though `gh-ost` relies on Row Based Replication (RBR), it does not mean you can't keep your Statement Based Replication (SBR).
`gh-ost` is happy to, and actually prefers and suggests to, connect to a replica. On this replica, it is happy to:
- issue the heavyweight `INFORMATION_SCHEMA` queries that make a table structure analysis
- issue a `select count(*) from mydb.mytable`, should `--exact-rowcount` be provided
- connect itself as a fake replica to get the binary log stream
All of the above can be executed on the master, but we're more comfortable that they execute on a replica.
Please note the third item: `gh-ost` connects as a fake replica and pulls the binary logs. This is how `gh-ost` finds the table's changelog: it looks up entries in the binary log.
The magic is that your master can still produce SBR, but if you have a replica with `log-slave-updates`, you can also configure it to have `binlog_format='ROW'`. Such a replica accepts SBR statements from its master, and produces RBR statements onto its binary logs.
`gh-ost` is happy to modify the `binlog_format` on the replica for you:
- If you supply `--switch-to-rbr`, `gh-ost` will convert the binlog format for you, and restart replication to make sure this takes effect.
- If your replica is an intermediate master, i.e. further serves as a master to other replicas, `gh-ost` will not convert the `binlog_format`.
- At any case, `gh-ost` **will not** convert back to `STATEMENT` (SBR). This is because you may be running multiple migrations concurrently. Being able to run concurrent migrations is one of the design goals of this tool. It's your own responsibility to switch back to SBR once all pending migrations are complete.
### Summary
- If you're already using RBR, all is well for you
- If not, convert one of your replicas to `binlog_format='ROW'`, or let `gh-ost` do this for you.
================================================
FILE: doc/perks.md
================================================
# Perks
Listed below are some operation perks that make the DBA happy.
### Dynamic reconfiguration
You started with a `chunk-size=5000` but you find out it's too much. You want to reduce it. There is no need to kill and restart the migration with a new configuration. You may change the `chunk-size` dynamically.
`gh-ost` listens on a unix socket file, and optionally via `TCP` as well. You may, for example:
```shell
$ echo "chunk-size=250" | nc -U /tmp/gh-ost.test.sample_data_0.sock
```
Likewise, you can change the `max-load` configuration:
```shell
$ echo "max-load=Threads_running=50,threads_connected=1000" | nc -U /tmp/gh-ost.test.sample_data_0.sock
```
The `max-load` format must be: `some_status=<numeric-threshold>[,some_status=<numeric-threshold>...]`.
In case of parsing error the command is ignored.
Read more about [interactive commands](interactive-commands.md)
### What's the status?
You do not have to have access to the `screen` where the migration is issued. You have two ways to get current status:
1. Use [interactive commands](interactive-commands.md). Via unix socket file or via `TCP` you can get current status:
```shell
$ echo status | nc -U /tmp/gh-ost.test.sample_data_0.sock
# Migrating `test`.`sample_data_0`; Ghost table is `test`.`_sample_data_0_gst`
# Migration started at Tue Jun 07 11:45:16 +0200 2016
# chunk-size: 200; max lag: 1500ms; max-load: map[Threads_connected:20]
# Throttle additional flag file: /tmp/gh-ost.throttle
# Serving on unix socket: /tmp/gh-ost.test.sample_data_0.sock
# Serving on TCP port: 10001
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 40s(copy); streamer: mysql-bin.000550:49942; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
```
1. `gh-ost` creates and uses a changelog table for internal bookkeeping. This table has the `_osc` suffix (the tool creates and announces this table upon startup) If you like, you can SQL your status:
```
> select * from _sample_data_0_osc order by id desc limit 1 \G
*************************** 1. row ***************************
id: 325
last_update: 2016-06-08 15:52:13
hint: copy iteration 0 at 1465393933
value: throttled, flag-file
```
### Postpone the cut-over phase
You begin a migration, and the ETA is for it to complete at 04:00am. Not a good time for you, because you happen to want to have eyes on things as the migration completes (ideally, you shouldn't need to, but life is hard).
Today, DBAs are coordinating the migration start time such that it completes in a convenient hour. `gh-ost` offers an alternative: postpone the final cut-over phase till you're ready.
Execute `gh-ost` with `--postpone-cut-over-flag-file=/path/to/flag.file`. As long as this file exists, `gh-ost` will not take the final cut-over step. It will complete the row copy, and continue to synchronize the tables by continuously applying changes made on the original table onto the ghost table. It can do so on and on and on. When you're finally ready, remove the file and cut-over will take place.
### Sub-second lag throttling
With sub-second replication lag measurements, `gh-ost` is able to keep a fleet of replicas well below `1sec` lag throughout the migration. We encourage you to issue sub-second heartbeats. Read more on [sub-second replication lag throttling](subsecond-lag.md)
================================================
FILE: doc/questions.md
================================================
# How?
### How does the cut-over work? Is it really atomic?
The cut-over phase, where the original table is swapped away, and the _ghost_ table takes its place, is an atomic, blocking, controlled operation.
- Atomic: the tables are swapped together. There is no gap where your table does not exist.
- Blocking: all app queries involving the migrated (original) table are either operate on the original table, or are blocked, or proceed to operate on the _new_ table (formerly the _ghost_ table, now swapped in).
- Controlled: the cut-over times out at pre-defined threshold, and is atomically aborted, then re-attempted. Cut-over only takes place when no lags are present, and otherwise no throttling reason is found. Cut-over step itself gets high priority and is never throttled.
Read more on [cut-over](cut-over.md) and on the [cut-over design Issue](https://github.com/github/gh-ost/issues/82)
# Is it possible to?
### Is it possible to add a UNIQUE KEY?
Adding a `UNIQUE KEY` is possible, in the condition that no violation will occur. That is, you must make sure there aren't any violating rows on your table before, and during the migration.
At this time there is no equivalent to `ALTER IGNORE`, where duplicates are implicitly and silently thrown away. The MySQL `5.7` docs say:
> As of MySQL 5.7.4, the IGNORE clause for ALTER TABLE is removed and its use produces an error.
It is therefore unlikely that `gh-ost` will support this behavior.
### Run concurrent migrations?
Yes. TL;DR if running all on same replica/master, make sure to provide `--replica-server-id`. [Read more](cheatsheet.md#concurrent-migrations)
# Why
### Why Is the "Connect to Replica" mode preferred?
To avoid placing extra load on the master. `gh-ost` connects as a replication client. Each additional replica adds some load to the master.
To monitor replication lag from a replica. This makes the replication lag throttle, `--max-lag-millis`, more representative of the lag experienced by other replicas following the master (perhaps N levels deep in a tree of replicas).
================================================
FILE: doc/rds.md
================================================
`gh-ost` has been updated to work with Amazon RDS however due to GitHub not using AWS for databases, this documentation is community driven so if you find a bug please [open an issue][new_issue]!
# Amazon RDS
## Limitations
- No `SUPER` privileges.
- `gh-ost` runs should be setup use [`--assume-rbr`][assume_rbr_docs] and use `binlog_format=ROW`.
- Aurora does not allow editing of the `read_only` parameter. While it is defined as `{TrueIfReplica}`, the parameter is non-modifiable field.
## Aurora
#### Replication
In Aurora replication, you have separate reader and writer endpoints however because the cluster shares the underlying storage layer, `gh-ost` will detect it is running on the master. This becomes an issue when you wish to use [migrate/test on replica][migrate_test_on_replica_docs] because you won't be able to use a single cluster in the same way you would with MySQL RDS.
To work around this, you can follow along the [AWS replication between clusters documentation][aws_replication_docs] for Aurora with one small caveat. For the "Create a Snapshot of Your Replication Master" step, the binlog position is not available in the AWS console. You will need to issue the SQL query `SHOW SLAVE STATUS` or `aws rds describe-events` API call to get the correct position.
#### Percona Toolkit
If you use `pt-table-checksum` as a part of your data integrity checks, you might want to check out [this patch][percona_toolkit_patch] which will enable you to run `pt-table-checksum` with the `--no-binlog-format-check` flag and prevent errors like the following:
```
03-24T12:51:06 Failed to /*!50108 SET @@binlog_format := 'STATEMENT'*/: DBD::mysql::db do failed: Access denied; you need (at least one of) the SUPER privilege(s) for this operation [for Statement "/*!50108 SET @@binlog_format := 'STATEMENT'*/"] at pt-table-checksum line 9292.
This tool requires binlog_format=STATEMENT, but the current binlog_format is set to ROW and an error occurred while attempting to change it. If running MySQL 5.1.29 or newer, setting binlog_format requires the SUPER privilege. You will need to manually set binlog_format to 'STATEMENT' before running this tool.
```
#### Binlog filtering
In Aurora, the [binlog filtering feature][aws_replication_docs_bin_log_filtering] is enabled by default. This becomes an issue when gh-ost tries to do the cut-over, because gh-ost waits for an entry in the binlog to proceed but this entry will never end up in the binlog because it gets filtered out by the binlog filtering feature.
You need to turn this feature off during the migration process.
Set the `aurora_enable_repl_bin_log_filtering` parameter to 0 in the Parameter Group for your cluster.
When the migration is done, set it back to 1 (default).
#### Preflight checklist
Before trying to run any `gh-ost` migrations you will want to confirm the following:
- [ ] You have a secondary cluster available that will act as a replica. Rule of thumb here has been a 1 instance per cluster to mimic MySQL-style replication as opposed to Aurora style.
- [ ] The database instance parameters and database cluster parameters are consistent between your master and replicas
- [ ] Executing `SHOW SLAVE STATUS\G` on your replica cluster displays the correct master host, binlog position, etc.
- [ ] Database backup retention is greater than 1 day to enable binlogs
- [ ] You have setup [`hooks`][ghost_hooks] to issue RDS procedures for stopping and starting replication. (see [github/gh-ost#163][ghost_rds_issue_tracking] for examples)
- [ ] The parameter `aurora_enable_repl_bin_log_filtering` is set to 0
[new_issue]: https://github.com/github/gh-ost/issues/new
[assume_rbr_docs]: https://github.com/github/gh-ost/blob/master/doc/command-line-flags.md#assume-rbr
[migrate_test_on_replica_docs]: https://github.com/github/gh-ost/blob/master/doc/cheatsheet.md#c-migratetest-on-replica
[aws_replication_docs]: http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Aurora.Overview.Replication.MySQLReplication.html
[percona_toolkit_patch]: https://github.com/jacobbednarz/percona-toolkit/commit/0271ba6a094da446a5e5bb8d99b5c26f1777f2b9
[ghost_hooks]: https://github.com/github/gh-ost/blob/master/doc/hooks.md
[ghost_rds_issue_tracking]: https://github.com/github/gh-ost/issues/163
[aws_replication_docs_bin_log_filtering]: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.html#AuroraMySQL.Replication.Performance
================================================
FILE: doc/requirements-and-limitations.md
================================================
# Requirements and limitations
### Requirements
- `gh-ost` currently requires MySQL versions 5.7 and greater.
- You will need to have one server serving Row Based Replication (RBR) format binary logs. Right now `FULL` row image is supported. `MINIMAL` to be supported in the near future. `gh-ost` prefers to work with replicas. You may [still have your master configured with Statement Based Replication](migrating-with-sbr.md) (SBR).
- If you are using a replica, the table must have an identical schema between the master and replica.
- `gh-ost` requires an account with these privileges:
- `ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE` on the database (schema) where your migrated table is, or of course on `*.*`
- either:
- `SUPER, REPLICATION SLAVE` on `*.*`, or:
- `REPLICATION CLIENT, REPLICATION SLAVE` on `*.*`
The `SUPER` privilege is required for `STOP SLAVE`, `START SLAVE` operations. These are used on:
- Switching your `binlog_format` to `ROW`, in the case where it is _not_ `ROW` and you explicitly specified `--switch-to-rbr`
- If your replication is already in RBR (`binlog_format=ROW`) you can specify `--assume-rbr` to avoid the `STOP SLAVE/START SLAVE` operations, hence no need for `SUPER`.
- `gh-ost` uses the `REPEATABLE_READ` transaction isolation level for all MySQL connections, regardless of the server default.
- Running `--test-on-replica`: before the cut-over phase, `gh-ost` stops replication so that you can compare the two tables and satisfy that the migration is sound.
### Limitations
- Foreign key constraints are not supported. They may be supported in the future, to some extent.
- Triggers are not supported. They may be supported in the future.
- MySQL 5.7 `JSON` columns are supported but not as part of `PRIMARY KEY`
- The two _before_ & _after_ tables must share a `PRIMARY KEY` or other `UNIQUE KEY`. This key will be used by `gh-ost` to iterate through the table rows when copying. [Read more](shared-key.md)
- The migration key must not include columns with NULL values. This means either:
1. The columns are `NOT NULL`, or
2. The columns are nullable but don't contain any NULL values.
- by default, `gh-ost` will not run if the only `UNIQUE KEY` includes nullable columns.
- You may override this via `--allow-nullable-unique-key` but make sure there are no actual `NULL` values in those columns. Existing NULL values can't guarantee data integrity on the migrated table.
- It is not allowed to migrate a table where another table exists with same name and different upper/lower case.
- For example, you may not migrate `MyTable` if another table called `MYtable` exists in the same schema.
- Amazon RDS works, but has its own [limitations](rds.md).
- Google Cloud SQL works, `--gcp` flag required.
- Aliyun RDS works, `--aliyun-rds` flag required.
- Azure Database for MySQL works, `--azure` flag required, and have detailed document about it. (azure.md)
- Multisource is not supported when migrating via replica. It _should_ work (but never tested) when connecting directly to master (`--allow-on-master`)
- Master-master setup is only supported in active-passive setup. Active-active (where table is being written to on both masters concurrently) is unsupported. It may be supported in the future.
- If you have an `enum` field as part of your migration key (typically the `PRIMARY KEY`), migration performance will be degraded and potentially bad. [Read more](https://github.com/github/gh-ost/pull/277#issuecomment-254811520)
- Migrating a `FEDERATED` table is unsupported and is irrelevant to the problem `gh-ost` tackles.
- [Encrypted binary logs](https://www.percona.com/blog/2018/03/08/binlog-encryption-percona-server-mysql/) are not supported.
- `ALTER TABLE ... RENAME TO some_other_name` is not supported (and you shouldn't use `gh-ost` for such a trivial operation).
================================================
FILE: doc/resume.md
================================================
# Resuming Migrations
`gh-ost` can attempt to resume an interrupted migration from a checkpoint if the following conditions are met:
- The first `gh-ost` process was invoked with `--checkpoint`
- The first `gh-ost` process had at least one successful checkpoint
- The binlogs from the last checkpoint's binlog coordinates still exist on the replica gh-ost is inspecting (specified by `--host`)
- The checkpoint table (name ends with `_ghk`) still exists
To resume, invoke `gh-ost` again with the same arguments with the `--resume` flag.
> [!WARNING]
> It is recommended use `--checkpoint` with `--gtid` enabled so that checkpoint binlog coordinates store GTID sets rather than file positions. In that case, `gh-ost` can resume using a different replica than it originally attached to.
## Example
The migration starts with a `gh-ost` invocation such as:
```shell
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="add column mycol varchar(20)"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--execute
```
In this example `gh-ost` writes a checkpoint to a table `_mytable_ghk` every 60 seconds. After `gh-ost` is interrupted/killed, the migration can be resumed with:
```shell
# resume migration
gh-ost \
--chunk-size=100
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="add column mycol varchar(20)"
--gtid \
--resume \
--execute
```
`gh-ost` then reconnects at the binlog coordinates of the last checkpoint and resumes copying rows at the chunk specified by the checkpoint. The data integrity of the ghost table is preserved because `gh-ost` applies row DMLs and copies row in an idempotent way.
================================================
FILE: doc/revert.md
================================================
# Reverting Migrations
`gh-ost` can attempt to revert a previously completed migration if the follow conditions are met:
- The first `gh-ost` process was invoked with `--checkpoint`
- The checkpoint table (name ends with `_ghk`) still exists
- The binlogs from the time of the migration's cut-over still exist on the replica gh-ost is inspecting (specified by `--host`)
To revert, find the name of the "old" table from the original migration e.g. `_mytable_del`. Then invoke `gh-ost` with the same arguments and the flags `--revert` and `--old-table="_mytable_del"`.
gh-ost will read the binlog coordinates of the original cut-over from the checkpoint table and bring the old table up to date. Then it performs another cut-over to complete the reversion.
Note that the checkpoint table (name ends with _ghk) will not be automatically dropped unless `--ok-to-drop-table` is provided.
> [!WARNING]
> It is recommended use `--checkpoint` with `--gtid` enabled so that checkpoint binlog coordinates store GTID sets rather than file positions. In that case, `gh-ost` can revert using a different replica than it originally attached to.
### ❗ Note ❗
Reverting is roughly equivalent to applying the "reverse" migration. _Before attempting to revert you should determine if the reverse migration is possible and does not involve any unacceptable data loss._
For example: if the original migration drops a `NOT NULL` column that has no `DEFAULT` then the reverse migration adds the column. In this case, the reverse migration is impossible if rows were added after the original cut-over and the revert will fail.
Another example: if the original migration modifies a `VARCHAR(32)` column to `VARCHAR(64)`, the reverse migration truncates the `VARCHAR(64)` column to `VARCHAR(32)`. If values were inserted with length > 32 after the cut-over then the revert will fail.
## Example
The migration starts with a `gh-ost` invocation such as:
```shell
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--alter="drop key idx1"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--execute
```
In this example `gh-ost` writes a cut-over checkpoint to `_mytable_ghk` after the cut-over is successful. The original table is renamed to `_mytable_del`.
Suppose that dropping the index causes problems, the migration can be revert with:
```shell
# revert migration
gh-ost \
--chunk-size=100 \
--host=replica1.company.com \
--database="mydb" \
--table="mytable" \
--old-table="_mytable_del"
--gtid \
--checkpoint \
--checkpoint-seconds=60 \
--revert \
--execute
```
gh-ost then reconnects at the binlog coordinates stored in the cut-over checkpoint and applies DMLs until the old table is up-to-date.
Note that the "reverse" migration is `ADD KEY idx(...)` so there is no potential data loss to consider in this case.
================================================
FILE: doc/shared-key.md
================================================
# Shared key
gh-ost requires for every migration that both the _before_ and _after_ versions of the table share the same unique not-null key columns. This page illustrates this rule.
### Introduction
Consider a simple migration, with a normal table,
```sql
CREATE TABLE tbl (
id bigint unsigned not null auto_increment,
data varchar(255),
more_data int,
PRIMARY KEY(id)
)
```
and the migration `add column ts timestamp`. The _after_ table version would be:
```sql
CREATE TABLE tbl (
id bigint unsigned not null auto_increment,
data varchar(255),
more_data int,
ts timestamp,
PRIMARY KEY(id)
)
```
(This is also the definition of the _ghost_ table, except that that table would be called `_tbl_gho`).
In this migration, the _before_ and _after_ versions contain the same unique not-null key (the PRIMARY KEY). To run this migration, `gh-ost` would iterate through the `tbl` table using the primary key, copy rows from `tbl` to the _ghost_ table `_tbl_gho` in primary key order, while also applying the binlog event writes from `tbl` onto `_tbl_gho`.
The applying of the binlog events is what requires the shared unique key. For example, an `UPDATE` statement to `tbl` translates to a `REPLACE` statement which `gh-ost` applies to `_tbl_gho`. A `REPLACE` statement expects to insert or replace an existing row based on its row's values and the table's unique key constraints. In particular, if inserting that row would result in a unique key violation (e.g., a row with that primary key already exists), it would _replace_ that existing row with the new values.
So `gh-ost` correlates `tbl` and `_tbl_gho` rows one to one using a unique key. In the above example that would be the `PRIMARY KEY`.
### Interpreting the rule
The _before_ and _after_ versions of the table share the same unique not-null key, but:
- the key doesn't have to be the PRIMARY KEY
- the key can have a different name between the _before_ and _after_ versions (e.g., renamed via DROP INDEX and ADD INDEX) so long as it contains the exact same column(s)
At the start of the migration, `gh-ost` inspects both the original and _ghost_ table it created, and attempts to find at least one such unique key (or rather, a set of columns) that is shared between the two. Typically this would just be the `PRIMARY KEY`, but some tables don't have primary keys, or sometimes it is the primary key that is being modified by the migration. In these cases `gh-ost` will look for other options.
`gh-ost` expects unique keys where no `NULL` values are found, i.e. all columns contained in the unique key are defined as `NOT NULL`. This is implicitly true for primary keys. If no such key can be found, `gh-ost` bails out.
If the table contains a unique key with nullable columns, but you know your columns contain no `NULL` values, use the `--allow-nullable-unique-key` option. The migration will run well as long as no `NULL` values are found in the unique key's columns. **Any actual `NULL`s may corrupt the migration.**
### Examples: Allowed and Not Allowed
```sql
create table some_table (
id int not null auto_increment,
ts timestamp,
name varchar(128) not null,
owner_id int not null,
loc_id int not null,
primary key(id),
unique key name_uidx(name)
)
```
Note the two unique, not-null indexes: the primary key and `name_uidx`.
Allowed migrations:
- `add column i int`
- `add key owner_idx (owner_id)`
- `add unique key owner_name_idx (owner_id, name)` - **be careful not to write conflicting rows while this migration runs**
- `drop key name_uidx` - `primary key` is shared between the tables
- `drop primary key, add primary key(owner_id, loc_id)` - `name_uidx` is shared between the tables
- `change id bigint unsigned not null auto_increment` - the `primary key` changes datatype but not value, and can be used
- `drop primary key, drop key name_uidx, add primary key(name), add unique key id_uidx(id)` - swapping the two keys. Either `id` or `name` could be used
Not allowed:
- `drop primary key, drop key name_uidx` - the _ghost_ table has no unique key
- `drop primary key, drop key name_uidx, create primary key(name, owner_id)` - no shared columns to the unique keys on both tables. Even though `name` exists in the _ghost_ table's `primary key`, it is only part of the key and in itself does not guarantee uniqueness in the _ghost_ table.
### Workarounds
If you need to change your primary key or only not-null unique index to use different columns, you will want to do it as two separate migrations:
1. `ADD UNIQUE KEY temp_pk (temp_pk_column,...)`
1. `DROP PRIMARY KEY, DROP KEY temp_pk, ADD PRIMARY KEY (temp_pk_column,...)`
================================================
FILE: doc/subsecond-lag.md
================================================
# Sub-second replication lag throttling
`gh-ost` is able to utilize sub-second replication lag measurements.
At GitHub, small replication lag is crucial, and we like to keep it below `1s` at all times.
`gh-ost` will do sub-second throttling when `--max-lag-millis` is smaller than `1000`, i.e. smaller than `1sec`.
Replication lag is measured on:
- The "inspected" server (the server `gh-ost` connects to; replica is desired but not mandatory)
- The `throttle-control-replicas` list
In both cases, `gh-ost` uses an internal heartbeat mechanism. It injects heartbeat events onto the utility changelog table, then reads those entries on replicas, and compares times. This measurement is on by default and by definition supports sub-second resolution.
You can explicitly define how frequently will `gh-ost` inject heartbeat events, via `heartbeat-interval-millis`. You should set `heartbeat-interval-millis <= max-lag-millis`. It still works if not, but loses granularity and effect.
In earlier versions, the `--throttle-control-replicas` list was subjected to `1` second resolution or to 3rd party heartbeat injections such as `pt-heartbeat`. This is no longer the case. The argument `--replication-lag-query` has been deprecated and is no longer needed.
Our production migrations use sub-second lag throttling and are able to keep our entire fleet of replicas well below `1sec` lag. We use `--heartbeat-interval-millis=100` on our production migrations with a `--max-lag-millis` value of between `300` and `500`.
================================================
FILE: doc/testing-on-replica.md
================================================
# Testing on replica
`gh-ost`'s design allows for trusted and reliable tests of the migration without compromising production data integrity.
Test on replica if you:
- Are unsure of `gh-ost`, have not gained confidence into its workings
- Just want to experiment with a real migration without affecting production (maybe measure migration time?)
- Wish to observe data change impact
## What testing on replica means
TL;DR `gh-ost` will make all changes on a replica and leave both original and ghost tables for you to compare.
## Issuing a test drive
Apply `--test-on-replica --host=<a.replica>`.
- `gh-ost` would connect to the indicated server
- Will verify this is indeed a replica and not a master
- Will perform _everything_ on this replica. Other then checking who the master is, it will otherwise not touch it.
- All `INFORMATION_SCHEMA` and `SELECT` queries run on the replica
- Ghost table is created on the replica
- Rows are copied onto the ghost table on the replica
- Binlog events are read from the replica and applied to ghost table on the replica
- So... everything
`gh-ost` will sync the ghost table with the original table.
- When it is satisfied, it will issue a `STOP SLAVE`, stopping replication
- Will finalize last few statements
- Will swap tables via normal [cut-over](cut-over.md), and immediately revert the swap.
- Will terminate. No table is dropped.
You are now left with the original table **and** the ghost table. When using a trivial `alter` statement, such as `engine-innodb`, both tables _should_ be identical.
You now have the time to verify the tool works correctly. You may checksum the entire table data if you like.
- e.g.
`mysql -e 'select * from mydb.mytable order by id' | md5sum`
`mysql -e 'select * from mydb._mytable_gst order by id' | md5sum`
- or of course only select the shared columns before/after the migration
- We use the trivial `engine=innodb` for `alter` when testing. This way the resulting ghost table is identical in structure to the original table (including indexes) and we expect data to be completely identical. We use `md5sum` on the entire dataset to confirm the test result.
- When adding/dropping columns, you will want to use the explicit list of shared columns before/after migration. This list is printed by `gh-ost` at the beginning of the migration.
### Cleanup
It's your job to:
- Drop the ghost table (at your leisure, you should be aware that a `DROP` can be a lengthy operation)
- Start replication back (via `START SLAVE`)
### Examples
Simple:
```shell
$ gh-ost --host=myhost.com --conf=/etc/gh-ost.cnf --database=test --table=sample_table --alter="engine=innodb" --chunk-size=2000 --max-load=Threads_connected=20 --initially-drop-ghost-table --initially-drop-old-table --test-on-replica --verbose --execute
```
Elaborate:
```shell
$ gh-ost --host=myhost.com --conf=/etc/gh-ost.cnf --database=test --table=sample_table --alter="engine=innodb" --chunk-size=2000 --max-load=Threads_connected=20 --switch-to-rbr --initially-drop-ghost-table --initially-drop-old-table --test-on-replica --postpone-cut-over-flag-file=/tmp/ghost-postpone.flag --exact-rowcount --concurrent-rowcount --allow-nullable-unique-key --verbose --execute
```
- Count exact number of rows (makes ETA estimation very good). This goes at the expense of paying the time for issuing a `SELECT COUNT(*)` on your table. We use this lovingly.
- Automatically switch to `RBR` if replica is configured as `SBR`. See also: [migrating with SBR](migrating-with-sbr.md)
- allow iterating on a `UNIQUE KEY` that has `NULL`able columns (at your own risk)
### Further notes
Do not confuse `--test-on-replica` with `--migrate-on-replica`; the latter performs the migration and _keeps it that way_ (does not revert the table swap nor stops replication)
As part of testing on replica, `gh-ost` issues a `STOP SLAVE`. This requires the `SUPER` privilege.
See related discussion on https://github.com/github/gh-ost/issues/162
================================================
FILE: doc/the-fine-print.md
================================================
# The Fine Print: What are You Not Telling Me?
Here are technical considerations you may be interested in. We write here things that are not an obvious [Requirements & Limitations](requirements-and-limitations.md)
# Connecting to replica
`gh-ost` prefers connecting to a replica. If your master uses Statement Based Replication, this is a _requirement_.
What does "connect to replica" mean?
- `gh-ost` connects to the replica as a normal client
- It additionally connects as a replica to the replica (pretends to be a MySQL replica itself)
- It auto-detects the master
`gh-ost` reads the RBR binary logs from the replica, and applies events onto the master as part of the table migration.
THE FINE PRINT:
- You trust the replica's binary logs to represent events applied on master.
- If you don't trust the replica, or if you suspect there's data drift between replica & master, take notice.
- If the table on the replica has a different schema than the master, `gh-ost` likely won't work correctly.
- Our take: we trust replica data; if master dies in production, we promote a replica. Our read serving is based on replica(s).
- If your master is RBR, do instead connect `gh-ost` to master, via `--allow-on-master` (see [cheatsheet](cheatsheet.md)).
- Replication needs to run.
- This is an obvious, but worth stating. You cannot perform a migration with "connect to replica" if your replica lags. `gh-ost` will actually do all it can so that replication does not lag, and avoid critical operations if replication is lagging.
# Network usage
`gh-ost` reads binary logs and then applies them onto the migrated server.
THE FINE PRINT:
- `gh-ost` delivers more network traffic than other online-schema-change tools, that let MySQL handle all data transfer internally. This is part of the [triggerless design](triggerless-design.md).
- Our take: we deal with cross-DC migration traffic and this is working well for us.
# Impersonating as a replica
`gh-ost` impersonates as a replica: it connects to a MySQL server, says "oh hey, I'm a replica, please send me binary logs kthx".
THE FINE PRINT:
- `SHOW SLAVE HOSTS` or `SHOW PROCESSLIST` will list this strange "replica" that you can't really connect to.
================================================
FILE: doc/throttle.md
================================================
# Throttle
Throughout a migration operation, `gh-ost` is either actively copying and applying data, or is _throttling_.
When _throttled_, `gh-ost` ceases to write row data and ceases to inspect binary log entries. It pauses all writes except for the low-volume changelog status writes and the heartbeat writes.
As compared with trigger-based solutions, when `gh-ost` is throttled, the write load on the master is truly removed.
Typically, throttling is based on replication lag or on master load. At such time, you wish to reduce load from master and from replication by pausing the _ghost_ writes. However, with a trigger based solution this is impossible to achieve: the triggers must remain in place and they continue to generate excess writes while the table is being used.
Since `gh-ost` is not based on triggers, but of reading binary logs, it controls its own writes. Each and every write on the master comes from the `gh-ost` app, which means `gh-ost` is able to reduce writes to a bare minimum when it wishes so.
`gh-ost` supports various means for controlling throttling behavior; it is operations friendly in that it allows the user greater, dynamic control of throttler behavior.
### Throttling parameters and factors
Throttling is controlled via the following explicit and implicit factors:
#### Replication-lag
The recommended way of running `gh-ost` is by connecting it to a replica. It will figure out the master by traversing the topology. It is by design that `gh-ost` is throttle aware: it generates its own _heartbeat_ mechanism; while it is running the migration, it is self-checking the replica to which it is connected for replication lag.
Otherwise you may specify your own list of replica servers you wish it to observe.
- `--throttle-control-replicas`: list of replicas you explicitly wish `gh-ost` to check for replication lag.
Example: `--throttle-control-replicas=myhost1.com:3306,myhost2.com,myhost3.com:3307`
- `--max-lag-millis`: maximum allowed lag; any controlled replica lagging more than this value will cause throttling to kick in. When all control replicas have smaller lag than indicated, operation resumes.
Note that you may dynamically change both `--max-lag-millis` and the `throttle-control-replicas` list via [interactive commands](interactive-commands.md)
#### Status thresholds
- `--max-load`: list of metrics and threshold values; topping the threshold of any will cause throttler to kick in.
Example:
`--max-load='Threads_running=100,Threads_connected=500'`
Metrics must be valid, numeric [status variables](https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html)
#### Throttle query
- When provided, the `--throttle-query` is expected to return a scalar integer. A return value `> 0` implies `gh-ost` should throttle. A return value `<= 0` implied `gh-ost` is free to proceed (pending other throttling factors).
An example query could be: `--throttle-query="select hour(now()) between 8 and 17"` which implies throttling auto-starts `8:00am` and migration auto-resumes at `18:00pm`.
#### HTTP Throttle
The `--throttle-http` flag allows for throttling via HTTP. Every 100ms `gh-ost` issues a `HEAD` request to the provided URL. If the response status code is not `200` throttling will kick in until a `200` response status code is returned.
If no URL is provided or the URL provided doesn't contain the scheme then the HTTP check will be disabled. For example `--throttle-http="http://1.2.3.4:6789/throttle"` will enable the HTTP check/throttling, but `--throttle-http="1.2.3.4:6789/throttle"` will not.
The URL can be queried and updated dynamically via [interactive interface](interactive-commands.md).
#### Manual control
In addition to the above, you are able to take control and throttle the operation any time you like.
- `--throttle-flag-file`: when this file exists, throttling kicks in. Just `touch` the file to begin throttling.
- `--throttle-additional-flag-file`: similar to the above. When this file exists, throttling kicks in.
Default: `/tmp/gh-ost.throttle`
The reason for having two files has to do with the intent of being able to run multiple migrations concurrently.
The setup we wish to use is that each migration would have its own, specific `throttle-flag-file`, but all would use the same `throttle-additional-flag-file`. Thus, we are able to throttle specific migrations by touching their specific files, or we are able to throttle all migrations at once, by touching the shared file.
- `throttle` command via [interactive interface](interactive-commands.md).
Example:
```
echo throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
echo no-throttle | nc -U /tmp/gh-ost.test.sample_data_0.sock
```
### Throttle precedence
Any single factor in the above that suggests the migration should throttle - causes throttling. That is, once some component decides to throttle, you cannot override it; you cannot force continued execution of the migration.
`gh-ost` collects different throttle-related metrics at different times, independently. It asynchronously reads the collected metrics and checks if they satisfy conditions/thresholds.
The first check to suggest throttling stops the check; the status message will note the reason for throttling as the first satisfied check.
### Throttle status
The throttle status is printed as part of the periodic [status message](understanding-output.md):
```
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 41s(total), 41s(copy); streamer: mysql-bin.000551:47983; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, flag-file; ETA: N/A
Copy: 0/2915 0.0%; Applied: 0; Backlog: 0/100; Time: 42s(total), 42s(copy); streamer: mysql-bin.000551:49370; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, commanded by user; ETA: N/A
```
### How long can you throttle for?
Throttling time is limited by the availability of the binary logs. When throttling begins, `gh-ost` suspends reading the binary logs, and expects to resume reading from same binary log where it paused.
Your availability of binary logs is typically determined by the [expire_logs_days](https://dev.mysql.com/doc/refman/5.7/en/replication-options-binary-log.html#sysvar_expire_logs_days) variable. If you have `expire_logs_days = 10` (or check `select @@global.expire_logs_days`), then you should be able to throttle for up to `10` days.
Having said that, throttling for so long is far fetching, in that the `gh-ost` process itself must be kept alive during that time; and the amount of binary logs to process once it resumes will potentially take days to replay.
It is worth mentioning that some deployments have external scheduled scripts that purge binary logs, regardless of the `expire_logs_days` configuration. Please verify your own deployment configuration.
To clarify, you only need to keep binary logs on the single server `gh-ost` connects to.
================================================
FILE: doc/triggerless-design.md
================================================
# Triggerless design
A breakdown of the logic and algorithm behind `gh-ost`'s triggerless design, followed by the implications, advantages and disadvantages of such design.
### Trigger-based migrations background
It is worthwhile to consider two popular existing online schema change solutions:
- [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)
- [Facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/)
The former uses a synchronous design: it adds three triggers (`AFTER INSERT`, `AFTER UPDATE`, `AFTER DELETE`) on the original table. Each such trigger relays the operation onto the ghost table. So for every `UPDATE` on the original table, an `UPDATE` executes on the ghost table. A `DELETE` on the original table triggers a `DELETE` on the ghost table. Same for `INSERT`. The triggers live in the same transaction space as the original query.
The latter uses an asynchronous design: it adds three triggers (`AFTER INSERT`, `AFTER UPDATE`, `AFTER DELETE`) on the original table. It also creates a _changelog_ table. The triggers do not relay operations directly to the ghost table. Instead, they each add an entry to the changelog table. An `UPDATE` on the original table makes for an `INSERT` on the changelog table saying "There was an UPDATE on the original table with this and that values"; likewise for `INSERT` and `DELETE`.
A background process tails the changelog table and applies the changes onto the ghost table. This approach is asynchronous in that the applier does not live in the same transaction space as the original table, and may operate on a change event seconds or more after said event was written.
It is noteworthy that the writes to the changelog table still live in the same transaction space as the writes on the original table.
### Triggerless based asynchronous migrations
`gh-ost`'s triggerless design uses an asynchronous approach. However it does not require triggers because it does not require having a _changelog_ table like the FB tool does. The reason it does not require a changelog table is that it finds the changelog in another place: the binary logs.
In particular, it reads Row Based Replication (RBR) entries (you can still [use it with Statement Based Replication!](migrating-with-sbr.md)) and searches for entries that apply to the original table.
RBR entries are very convenient for this job: they break complex statements, potentially multi-table, into distinct, per-table, per-row entries, which are easy to read and apply.
`gh-ost` pretends to be a MySQL replica: it connects to the MySQL server and begins requesting for binlog events as though it were a real replication server. Thus, it gets a continuous streaming of the binary logs, and filters out those events that apply to the original table.
`gh-ost` can connect directly to the master, but prefers to connect to one of its replicas. Such a replica would need to use `log-slave-updates` and use `binlog-format=ROW` (`gh-ost` can change the latter setting for you).
Reading from the binary log, specially in the case of reading those on a replica, further stresses the asynchronous nature of the algorithm. While the transaction _may_ (based on configuration) be synced with the binlog entry write, it will take time until `gh-ost` - pretending to be a replica - will get notification for that, copy the event downstream and apply it.
The asynchronous design implies many noteworthy outcomes, to be discussed later on.
### Workflow overview
The workflow includes reading table data from the server, reading event data from the binary log, checking for replication lag or other throttling parameters, applying changes onto the server (typically the master), sending hints through the binary log stream and more.
Some flow breakdown:
#### Initial setup & validation
Initial setup is a no-concurrency operation
- Connecting to replica/master, detecting master identify
- Pre-validating `alter` statement
- Initial sanity: privileges, existence of tables
- Creation of changelog and ghost tables.
- Applying `alter` on ghost table
- Comparing structure of original & ghost table. Looking for shared columns, shared unique keys, validating foreign keys. Choosing shared unique key, the key by which we chunk the table and process it.
- Setting up the binlog listener; begin listening on changelog events
- Injecting a "good to go" entry onto the changelog table (to be intercepted via binary logs)
- Begin listening on binlog events for original table DMLs
- Reading original table's chosen key min/max values
#### Copy flow
This setup includes multiple moving parts, all acting concurrently with some coordination
- Setting up a heartbeat mechanism: frequent writes on the changelog table (we consider this to be low, negligible write load for throttling purposes)
- Continuously updating status
- Periodically (frequently) checking for potential throttle scenarios or hints
- Work through the original table's rows range, chunk by chunk, queueing copy tasks onto the ghost table
- Reading DML events from the binlogs, queueing apply tasks onto the ghost table
- Processing the copy tasks queue and the apply tasks queue and sequentially applying onto ghost table
- Suspending by throttle state
- Injecting/intercepting "copy all done" once full row-copy range has been exhausted
- Stall/postpone while `postpone-cut-over-flag-file` exists (we keep apply ongoing DMLs)
#### Cut-over and completion
- Locking the original table for writes, working on what remains on the binlog event backlog (recall this is an asynchronous operation, and so even as the table is locked, we still have unhandled events in our pipe).
- Swapping the original table out, the ghost table in
- Cleanup: potential drop of tables
### Asynchronous design implications
#### Cut-over phase
A complication the asynchronous approach presents is the cut-over phase: the swapping of the tables. In the synchronous approach, the two tables are kept in sync thanks to the transaction-space in which the triggers operate. Thus, a simple, atomic `rename table original to _original_old, ghost to original` suffices and is valid.
In the asynchronous approach, as we lock the original table, we often still have events in the pipeline, changes in the binary log we still need to apply onto the ghost table. An atomic swap would be a premature and incorrect solution, since it would imply the write load would immediately proceed to operate on what used to be the ghost table, even before we completed applying those last changes.
The Facebook solution uses an "outage", two-step rename:
- Lock the original table, work on backlog
- Rename original table to `_old`
- Rename ghost table to original
In between those two renames there's a point in time where the table does not exist, hence there's a "table outage".
`gh-ost` solves this by using a two-step algorithm that blocks writes to the table, then issues an atomic swap. It uses safety latches such that the operation either succeeds, atomically, or fails, bringing us back to pre-cut-over stage.
Read more on the [cut-over](cut-over.md) documentation.
#### Decoupling
The most impacting change the triggerless, asynchronous approach provides is the decoupling of workload. With triggers, either synchronous or asynchronous, every write on your table implied an immediate write on another table.
We will break down the meaning of workload decoupling, shortly. But it is important to understand that `gh-ost` interprets the situation in its own time and acts in its own time, yet still makes this an online operation.
The decoupling is important not only as the tool's logic goes, but very importantly as the master server sees it. As far as the master knows, write to the table and writes to the ghost table are unrelated.
#### Writer load
Not using triggers means the master no longer needs to overload multiple, concurrent writes with stored routine interpretation combined with lock contention on the ghost table.
The responsibility for applying data to the ghost table is completely `gh-ost`'s. As such, `gh-ost` decides which data gets to be written to the ghost table and when. We are decoupled from the original table's write load, and choose to write to the ghost table in a single thread.
MySQL does not perform well on multiple concurrent massive writes to a specific table. Locking becomes an issue. This is why we choose to alternate between the massive row-copy and the ongoing binlog events backlog such that the server only sees writes from a single connection.
It is also interesting to observe that `gh-ost` is the only application writing to the ghost table. No one else is even aware of its existence. Thus, the trigger originated problem of high concurrency, high contention writes simply does not exist in `gh-ost`.
#### Pausability
When `gh-ost` pauses (throttles), it issues no writes on the ghost table. Because there are no triggers, write workload is decoupled from the `gh-ost` write workload. And because we're using an asynchronous approach, the algorithm already handles a time difference between a master write time and the ghost apply time. A difference of a few microseconds is no different from a difference of minutes or hours.
When `gh-ost` [throttles](throttle.md), either by replication lag, `max-load` setting or an explicit [interactive user command](interactive-commands.md), the master is back to normal. It sees no more writes on the ghost table.
An exception is the ongoing heartbeat writes onto the changelog table, which we consider to be negligible.
#### Testability
We are able to test the migration process: as we've decoupled the migration operation from the master's workload, we are good to apply the changes not to the master, but to one of its replicas. We are able to migrate a table on a replica.
This in itself is a nice feature; but it also presents us with testability: just as we complete the migration, we stop replication on the replica. We cut-over but rollback again. We do not drop any table. The result is both the original and ghost table exist on the replica, which is not taking any further changes. We have time to examine the two tables and compare them to our satisfaction.
This is the method used by GitHub to continuously validate the tool's integrity: multiple production replicas are continuously and repeatedly doing a "trivial migration" (no actually change of column) on all our production tables. Each migration is followed by a checksum of the entire table data, on both original and ghost tables. We expect the checksums to be identical and we log the results. We expect zero failures.
#### Multiple, concurrent migrations
`gh-ost` was designed with having multiple concurrent migration running in parallel (no two on the same table, of course). The asynchronous approach supports that design by not caring when data is being shipped to the ghost table. The fact no triggers exist means multiple migrations appear to the master (or other migrated host) just as multiple connections, each writing to some otherwise unknown table. Each can throttle in its own time, or we can throttle all together.
#### Going outside the server space
More to come as we make progress.
### No free meals
#### Increased traffic
The existing tools utilize triggers to propagate data changes. `gh-ost` takes upon itself to read the data, then write it back. `gh-ost` actually prefers to read from a replica and write to the master. This implies data transfers between hosts, and certainly in/out the MySQL server daemon. At this time the MySQL client library used by `gh-ost` does not support compression, and so during a migration you can expect the full volume of a table to transfer on the wire.
#### Code complexity
With the synchronous, trigger based approach, the role of the migration tool is relatively small. A lot of the migration is based on the triggers doing their job within the transaction space. Issues such as rollback, datatypes, cut-over are implicitly taken care of by the database. With `gh-ost`'s asynchronous approach, the tool turns complex. It connects to the master and onto a replica; it imposes as a replicating server; it writes heartbeat events; it reads binlog data into the app to be written again onto the migrated host; it need to manage connection failures, replication lag, and more.
The tool has therefore a larger codebase and a more complicated asynchronous, concurrent logic. But we jumped the opportunity to add some [perks](perks.md) and completely redesign how an online migration tool should work.
================================================
FILE: doc/understanding-output.md
================================================
# Understanding gh-ost output
`gh-ost` attempts to be verbose to the point where you really know what it's doing, without completely spamming you.
You can control output levels:
- `--verbose`: common use. Useful output, not tons of it
- `--debug`: everything. Tons of output.
Initial output lines may look like this:
```
2016-05-19 17:57:04 INFO starting gh-ost 0.7.14
2016-05-19 17:57:04 INFO Migrating `mydb`.`mytable`
2016-05-19 17:57:04 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:04 INFO User has ALL privileges
2016-05-19 17:57:04 INFO binary logs validated on 127.0.0.1:3306
2016-05-19 17:57:04 INFO Restarting replication on 127.0.0.1:3306 to make sure binlog settings apply to replication thread
2016-05-19 17:57:04 INFO Table found. Engine=InnoDB
2016-05-19 17:57:05 INFO As instructed, I'm issuing a SELECT COUNT(*) on the table. This may take a while
2016-05-19 17:57:11 INFO Exact number of rows via COUNT: 4466810
2016-05-19 17:57:11 INFO --test-on-replica given. Will not execute on master the.master:3306 but rather on replica 127.0.0.1:3306 itself
2016-05-19 17:57:11 INFO Master found to be 127.0.0.1:3306
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO Registering replica at 127.0.0.1:3306
2016-05-19 17:57:11 INFO Connecting binlog streamer at mysql-bin.002587:348694066
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO rotate to next log name: mysql-bin.002587
2016-05-19 17:57:11 INFO connection validated on 127.0.0.1:3306
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_old`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Creating ghost table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Ghost table created
2016-05-19 17:57:11 INFO Altering ghost table `mydb`.`_mytable_gst`
2016-05-19 17:57:11 INFO Ghost table altered
2016-05-19 17:57:11 INFO Dropping table `mydb`.`_mytable_osc`
2016-05-19 17:57:11 INFO Table dropped
2016-05-19 17:57:11 INFO Creating changelog table `mydb`.`_mytable_osc`
2016-05-19 17:57:11 INFO Changelog table created
2016-05-19 17:57:11 INFO Chosen shared unique key is PRIMARY
2016-05-19 17:57:11 INFO Shared columns are id,name,ref,col4,col5,col6
```
Those are relatively self explanatory. Mostly they indicate that all goes well.
You will be mostly interested in following up on the migration and understanding whether it goes well. Once migration actually begins, you will see output as follows:
```
Copy: 0/752865 0.0%; Applied: 0; Backlog: 0/100; Time: 29s(total), 0s(copy); streamer: mysql-bin.007068:846528615; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 0/752865 0.0%; Applied: 0; Backlog: 0/100; Time: 30s(total), 1s(copy); streamer: mysql-bin.007068:846875570; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 7300/752865 1.0%; Applied: 0; Backlog: 0/100; Time: 31s(total), 2s(copy); streamer: mysql-bin.007068:855439063; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: N/A
Copy: 14100/752865 1.9%; Applied: 0; Backlog: 0/100; Time: 32s(total), 3s(copy); streamer: mysql-bin.007068:864722759; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m37s
Copy: 20100/752865 2.7%; Applied: 0; Backlog: 0/100; Time: 33s(total), 4s(copy); streamer: mysql-bin.007068:874346340; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m26s
Copy: 27000/752865 3.6%; Applied: 0; Backlog: 0/100; Time: 34s(total), 5s(copy); streamer: mysql-bin.007068:886997306; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 2m14s
...
```
In the above some time was spent on counting table rows. `29s` have elapsed before actual rowcopy began. `gh-ost` will not deliver ETA before `1%` of the copy is complete.
```
Copy: 460900/752865 61.2%; Applied: 0; Backlog: 0/100; Time: 2m35s(total), 2m6s(copy); streamer: mysql-bin.007069:596112173; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 1m19s
Copy: 466600/752865 62.0%; Applied: 0; Backlog: 0/100; Time: 2m40s(total), 2m11s(copy); streamer: mysql-bin.007069:622646704; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, my.replica-01.com:3306 replica-lag=3.000000s; ETA: 1m19s
Copy: 478500/752865 63.6%; Applied: 0; Backlog: 0/100; Time: 2m45s(total), 2m16s(copy); streamer: mysql-bin.007069:641258880; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 1m17s
Copy: 496900/752865 66.0%; Applied: 0; Backlog: 0/100; Time: 2m50s(total), 2m21s(copy); streamer: mysql-bin.007069:678956577; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, my.replica-01.com:3306 replica-lag=2.000000s; ETA: 1m17s
Copy: 496900/752865 66.0%; Applied: 0; Backlog: 0/100; Time: 2m55s(total), 2m26s(copy); streamer: mysql-bin.007069:681610879; Lag: 0.01s, HeartbeatLag: 0.01s, State: throttled, max-load Threads_running=26 >= 25; ETA: 1m17s
Copy: 528000/752865 70.1%; Applied: 0; Backlog: 0/100; Time: 3m0s(total), 2m31s(copy); streamer: mysql-bin.007069:711177703; Lag: 2.483039s, HeartbeatLag: 0.01s, State: throttled, lag=2.483039s; ETA: 1m17s
Copy: 564900/752865 75.0%; Applied: 0; Backlog: 0/100; Time: 3m30s(total), 3m1s(copy); streamer: mysql-bin.007069:795150744; Lag: 3.482914s, HeartbeatLag: 0.01s, State: throttled, lag=3.482914s; ETA: 1m17s
Copy: 577200/752865 76.7%; Applied: 0; Backlog: 0/100; Time: 3m39s(total), 3m10s(copy); streamer: mysql-bin.007069:819956052; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 57s
Copy: 589300/752865 78.3%; Applied: 0; Backlog: 0/100; Time: 3m56s(total), 3m27s(copy); streamer: mysql-bin.007069:858738375; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 57s
Copy: 595700/752865 79.1%; Applied: 0; Backlog: 0/100; Time: 3m57s(total), 3m28s(copy); streamer: mysql-bin.007069:860745762; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 54s
```
In the above migration is throttled on occasion.
- A few times because one of the control replicas, specifically `my.replica-01.com:3306`, was lagging
- Once because `max-load` threshold has been reached (`Threads_running=26 >= 25`)
- Once because the migration replica itself (the server into which `gh-ost` connected) lagged.
`gh-ost` will always specify the reason for throttling.
### Progress
- `Copy: 595700/752865 79.1%` indicates the number of existing table rows copied onto the _ghost_ table, out of an estimate of the total row count.
- `Applied: 0` indicates the number of entries processed in the binary log and applied onto the _ghost_ table. In the examples above there was no traffic on the migrated table, hence no rows processed.
A migration on a more intensively used table may look like this:
```
Copy: 30713100/43138319 71.2%; Applied: 381910; Backlog: 0/100; Time: 2h6m30s(total), 2h3m20s(copy); streamer: mysql-bin.006792:1001340307; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m53s
Copy: 30852500/43138338 71.5%; Applied: 383365; Backlog: 0/100; Time: 2h7m0s(total), 2h3m50s(copy); streamer: mysql-bin.006792:1050191186; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m18s
2016-07-25 03:20:41 INFO rotate to next log name: mysql-bin.006793
2016-07-25 03:20:41 INFO rotate to next log name: mysql-bin.006793
Copy: 30925700/43138360 71.7%; Applied: 384873; Backlog: 0/100; Time: 2h7m30s(total), 2h4m20s(copy); streamer: mysql-bin.006793:9144080; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 49m5s
Copy: 31028800/43138380 71.9%; Applied: 386325; Backlog: 0/100; Time: 2h8m0s(total), 2h4m50s(copy); streamer: mysql-bin.006793:47984430; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 48m43s
Copy: 31165600/43138397 72.2%; Applied: 387787; Backlog: 0/100; Time: 2h8m30s(total), 2h5m20s(copy); streamer: mysql-bin.006793:96139474; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 48m8s
Copy: 31291200/43138418 72.5%; Applied: 389257; Backlog: 7/100; Time: 2h9m0s(total), 2h5m50s(copy); streamer: mysql-bin.006793:141094700; Lag: 0.01s, HeartbeatLag: 0.01s, State: migrating; ETA: 47m38s
Copy: 31389700/43138432 72.8%; Applied: 390629; Backlog: 100/100; Time: 2h9m30s(total), 2h6m20s(copy); streamer: mysql-bin.006793:179473435; Lag: 1.548707s, HeartbeatLag: 0.01s, State: throttled, lag=1.548707s; ETA: 47m38s
```
Notes:
- `Applied: 381910`: `381910` events in the binary logs presenting changes to the migrated table have been processed and applied on the _ghost_ table since beginning of migration.
- `Backlog: 0/100`: we are performing well on reading the binary log. There's nothing known in the binary log queue that awaits processing.
- `Backlog: 7/100`: while copying rows, a few events have piled up in the binary log _modifying our table_ that we spotted, and still need to apply.
- `Backlog: 100/100`: our buffer of `100` events is full; you may see this during or right after throttling (the binary logs keep filling up with relevant queries that are not being processed), or immediately following a high workload.
`gh-ost` will always prioritize binlog event processing (backlog) over row-copy; when next possible (throttling completes, in our example), `gh-ost` will drain the queue first, and only then proceed to resume row copy.
There is nothing wrong with seeing `100/100`; it just indicates we're behind at that point in time.
- `Copy: 31291200/43138418`, `Copy: 31389700/43138432`: this migration executed with `--exact-rowcount`. `gh-ost` continuously heuristically updates the total number of expected row copies as migration proceeds, hence the change from `43138418` to `43138432`
- `streamer: mysql-bin.006793:179473435` tells us which binary log entry is `gh-ost` processing at this time.
### Status hint
In addition, once every `10` minutes, a friendly reminder is printed, in the following form:
```
# Migrating `mydb`.`mytable`; Ghost table is `mydb`.`_mytable_gst`
# Migrating mysql.master-01.com:3306; inspecting mysql.replica-05.com:3306; executing on some.host-17.com
# Migration started at Mon Jul 25 01:13:19 2016
# chunk-size: 500; max lag: 1000ms; max-load: Threads_running=25; critical-load: Threads_running=1000; nice-ratio: 0
# throttle-additional-flag-file: /tmp/gh-ost.throttle.flag.file
# postpone-cut-over-flag-file: /tmp/gh-ost.postpone.flag.file [set]
# panic-flag-file: /tmp/gh-ost.panic.flag.file
# Serving on unix socket: /tmp/gh-ost.mydb.mytable.sock
```
- The above mostly print out the current configuration. Remember you can [dynamically control](interactive-commands.md) most of them.
- `gh-ost` notes that the `postpone-cut-over-flag-file` file actually exists by printing `[set]`
================================================
FILE: doc/what-if.md
================================================
# What if?
Technical questions and answers. This document will be updated as we go
### What if I'm using Statement Based Replication?
You can still migrate tables with `gh-ost`. We do that. What you will need is a replica configured with:
- `log_bin`
- `log_slave_updates`
- `binlog_format=ROW`
Thus, the replica will transform the master's SBR binlogs into RBR binlogs. `gh-ost` is happy to read the binary logs from the replica. [Read more](migrating-with-sbr.md)
### What if gh-ost crashes halfway through, or I kill it?
Unlike trigger-based solutions, there's nothing urgent to clean up in the event `gh-ost` bails out or gets killed. There are the two tables creates by `gh-ost`:
- The _ghost_ table: `_yourtablename_gho`
- The _changelog_ table: `_yourtablename_ghc`
You may instruct `gh-ost` to drop these tables upon startup; or better yet, you drop them.
### What if the cut-over (table switch) is unable to proceed due to locks/timeout?
There is a `lock_wait_timeout` explicitly associated with the cut-over operation. If your table suddenly suffers from a long running query, the cut-over (involving `LOCK` and `RENAME` statements) may be unable to proceed. There's a finite number of retries, and if none of these succeeds, `gh-ost` bails out.
### What if the migration is causing a high load on my master?
This is where `gh-ost` shines. There is no need to kill it as you may be used to with other tools. You can reconfigure `gh-ost` [on the fly](https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md) to be nicer.
You're always able to actively begin [throttling](throttle.md). Just touch the `throttle-file` or `echo throttle` into `gh-ost`. Otherwise, reconfigure your `max-load`, the `nice-ratio`, the `throttle-query` to gain better thresholds that would suit your needs.
### What if my replicas don't use binary logs?
If the master is running Row Based Replication (RBR) - point `gh-ost` to the master, and specify `--allow-on-master`. See [cheatsheets](cheatsheet.md)
If the master is running Statement Based Replication (SBR) - you have no alternative but to reconfigure a replica with:
- `log_bin`
- `log_slave_updates`
- `binlog_format=ROW`
================================================
FILE: doc/why-triggerless.md
================================================
# Why triggerless?
Existing MySQL schema migration tools:
- [pt-online-schema-change](https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html)
- [Facebook OSC](https://www.facebook.com/notes/mysql-at-facebook/online-schema-change-for-mysql/430801045932/)
- [LHM](https://github.com/soundcloud/lhm)
- [oak-online-alter-table](https://github.com/shlomi-noach/openarkkit)
are all using [triggers](https://dev.mysql.com/doc/refman/5.7/en/triggers.html) to propagate live changes on your table onto a ghost/shadow table that is slowly being synchronized. The tools not all work the same: while most use a synchronous approach (all changes applied on the ghost table), the Facebook tool uses an asynchronous approach (changes are appended to a changelog table, later reviewed and applied on ghost table).
Use of triggers simplifies a lot of the flow in doing a live table migration, but also poses some limitations or difficulties. Here are reasons why we choose to [design a triggerless solution](triggerless-design.md) to schema migrations.
## Overview
Triggers are stored routines which are invoked on a per-row operation upon `INSERT`, `DELETE`, `UPDATE` on a table.
They were introduced in MySQL `5.0`.
A trigger may contain a set of queries, and these queries run in the same transaction space as the query that manipulates the table. This makes for an atomicity of both the original operation on the table and the trigger-invoked operations.
### Triggers, overhead
A trigger in MySQL is a stored routine. MySQL stored routines are interpreted, never compiled. With triggers, for every `INSERT`, `DELETE`, `UPDATE` on our often busy table, we pay the necessary price of the additional write (onto ghost or changelog table), but also the price of interpreting the trigger body.
We know this to be a visible overhead on very busy or very large tables.
### Triggers, locks
When a table with triggers is concurrently being written to, the triggers, being in same transaction space as the incoming queries, are also executed concurrently. While concurrent queries compete for resources via locks (e.g. the `auto_increment` value), the triggers need to _simultaneously_ compete for their own locks (e.g., likewise on the `auto_increment` value on the ghost table, in a synchronous solution). These competitions are non-coordinated.
We have evidenced near or complete lock downs in production, to the effect of rendering the table or the entire database inaccessible due to lock contention.
### Trigger based migration, no pause
The triggers are used to either apply or record ongoing changes to your original table.
Existing online migration tools (notably `pt-online-schema-change`) support the notion of _throttling_: suspending execution when the master becomes too busy, or replication is unable to catch up.
However this throttling is partial. The tool may only suspend the tedious and long task of copying the millions of rows from the original table onto the ghost table, but the tool may not, at any stage, cancel the triggers. Cancelling the triggers means loss of information, leading to incorrect data.
Thus, triggers must keep operating. On busy servers, we have seen that even as the online operation throttles, the master is brought down by the load of the triggers.
Read more about [`gh-ost` throttling](throttle.md)
### Triggers, multiple migrations
We are interested in being able to run multiple concurrent migrations (not on the same table, of course). Given all the above, we do not have trust that running multiple trigger-based migrations is a safe operation. In our current, past and shared experiences we have never done so; we are unaware of anyone who is doing so.
### Trigger based migration, no reliable production test
We sometimes wish to experiment with a migration, or know in advance how much time it would take. A trigger-based solution allows us to run a migration on a replica, provided it uses Statement Based Replication.
With Row Based Replication there is no option at all to use triggers on a replica, since the triggers only execute on the master (replica only gets notified of the _effect_ of the trigger).
But even with Statement Based Replication we do not get a reliable representation of the migration as it would have executed on the master. MySQL replication (up to and including `5.6`) is single threaded, given a table, and even in `5.7` we do not expect to find concurrency on a single table. The triggers on the replica will invoke sequentially ; they will not simulate the same load, and they will not suffer from the same concurrency and locking problems depicted above, as on the master.
### Trigger based migration, bound to server
The trigger space is within a MySQL service. It cannot go beyond that space. We are working towards a multi-server solution. More discussion as we make progress.
## Triggerless design
Proceed to read about the [triggerless design](triggerless-design.md)
================================================
FILE: docker-compose.yml
================================================
version: "3.5"
services:
app:
image: app
build:
context: .
dockerfile: Dockerfile.test
================================================
FILE: go/base/context.go
================================================
/*
Copyright 2022 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"context"
"fmt"
"math"
"os"
"regexp"
"strings"
"sync"
"sync/atomic"
"time"
"unicode/utf8"
uuid "github.com/google/uuid"
"github.com/github/gh-ost/go/mysql"
"github.com/github/gh-ost/go/sql"
"github.com/openark/golib/log"
"github.com/go-ini/ini"
)
// RowsEstimateMethod is the type of row number estimation
type RowsEstimateMethod string
const (
TableStatusRowsEstimate RowsEstimateMethod = "TableStatusRowsEstimate"
ExplainRowsEstimate RowsEstimateMethod = "ExplainRowsEstimate"
CountRowsEstimate RowsEstimateMethod = "CountRowsEstimate"
)
type CutOver int
const (
CutOverAtomic CutOver = iota
CutOverTwoStep
)
type ThrottleReasonHint string
const (
NoThrottleReasonHint ThrottleReasonHint = "NoThrottleReasonHint"
UserCommandThrottleReasonHint ThrottleReasonHint = "UserCommandThrottleReasonHint"
LeavingHibernationThrottleReasonHint ThrottleReasonHint = "LeavingHibernationThrottleReasonHint"
)
const (
HTTPStatusOK = 200
MaxEventsBatchSize = 1000
ETAUnknown = math.MinInt64
)
var (
envVariableRegexp = regexp.MustCompile("[$][{](.*)[}]")
)
type ThrottleCheckResult struct {
ShouldThrottle bool
Reason string
ReasonHint ThrottleReasonHint
}
func NewThrottleCheckResult(throttle bool, reason string, reasonHint ThrottleReasonHint) *ThrottleCheckResult {
return &ThrottleCheckResult{
ShouldThrottle: throttle,
Reason: reason,
ReasonHint: reasonHint,
}
}
// MigrationContext has the general, global state of migration. It is used by
// all components throughout the migration process.
type MigrationContext struct {
Uuid string
DatabaseName string
OriginalTableName string
AlterStatement string
AlterStatementOptions string // anything following the 'ALTER TABLE [schema.]table' from AlterStatement
countMutex sync.Mutex
countTableRowsCancelFunc func()
CountTableRows bool
ConcurrentCountTableRows bool
AllowedRunningOnMaster bool
AllowedMasterMaster bool
SwitchToRowBinlogFormat bool
AssumeRBR bool
SkipForeignKeyChecks bool
SkipStrictMode bool
AllowZeroInDate bool
NullableUniqueKeyAllowed bool
ApproveRenamedColumns bool
SkipRenamedColumns bool
IsTungsten bool
DiscardForeignKeys bool
AliyunRDS bool
GoogleCloudPlatform bool
AzureMySQL bool
AttemptInstantDDL bool
Resume bool
Revert bool
OldTableName string
// SkipPortValidation allows skipping the port validation in `ValidateConnection`
// This is useful when connecting to a MySQL instance where the external port
// may not match the internal port.
SkipPortValidation bool
UseGTIDs bool
config ContextConfig
configMutex *sync.Mutex
ConfigFile string
CliUser string
CliPassword string
UseTLS bool
TLSAllowInsecure bool
TLSCACertificate string
TLSCertificate string
TLSKey string
CliMasterUser string
CliMasterPassword string
HeartbeatIntervalMilliseconds int64
defaultNumRetries int64
ChunkSize int64
niceRatio float64
MaxLagMillisecondsThrottleThreshold int64
throttleControlReplicaKeys *mysql.InstanceKeyMap
ThrottleFlagFile string
ThrottleAdditionalFlagFile string
throttleQuery string
throttleHTTP string
IgnoreHTTPErrors bool
ThrottleCommandedByUser int64
HibernateUntil int64
maxLoad LoadMap
criticalLoad LoadMap
CriticalLoadIntervalMilliseconds int64
CriticalLoadHibernateSeconds int64
PostponeCutOverFlagFile string
CutOverLockTimeoutSeconds int64
CutOverExponentialBackoff bool
ExponentialBackoffMaxInterval int64
ForceNamedCutOverCommand bool
ForceNamedPanicCommand bool
PanicFlagFile string
HooksPath string
HooksHintMessage string
HooksHintOwner string
HooksHintToken string
HooksStatusIntervalSec int64
PanicOnWarnings bool
Checkpoint bool
CheckpointIntervalSeconds int64
DropServeSocket bool
ServeSocketFile string
ServeTCPPort int64
Noop bool
TestOnReplica bool
MigrateOnReplica bool
TestOnReplicaSkipReplicaStop bool
OkToDropTable bool
InitiallyDropOldTable bool
InitiallyDropGhostTable bool
TimestampOldTable bool // Should old table name include a timestamp
CutOverType CutOver
ReplicaServerId uint
Hostname string
AssumeMasterHostname string
ApplierTimeZone string
ApplierWaitTimeout int64
TableEngine string
RowsEstimate int64
RowsDeltaEstimate int64
UsedRowsEstimateMethod RowsEstimateMethod
HasSuperPrivilege bool
OriginalBinlogFormat string
OriginalBinlogRowImage string
InspectorConnectionConfig *mysql.ConnectionConfig
InspectorMySQLVersion string
ApplierConnectionConfig *mysql.ConnectionConfig
ApplierMySQLVersion string
StartTime time.Time
RowCopyStartTime time.Time
RowCopyEndTime time.Time
LockTablesStartTime time.Time
RenameTablesStartTime time.Time
RenameTablesEndTime time.Time
pointOfInterestTime time.Time
pointOfInterestTimeMutex *sync.Mutex
lastHeartbeatOnChangelogTime time.Time
lastHeartbeatOnChangelogMutex *sync.Mutex
CurrentLag int64
currentProgress uint64
etaNanoseonds int64
EtaRowsPerSecond int64
ThrottleHTTPIntervalMillis int64
ThrottleHTTPStatusCode int64
ThrottleHTTPTimeoutMillis int64
controlReplicasLagResult mysql.ReplicationLagResult
TotalRowsCopied int64
TotalDMLEventsApplied int64
DMLBatchSize int64
isThrottled bool
throttleReason string
throttleReasonHint ThrottleReasonHint
throttleGeneralCheckResult ThrottleCheckResult
throttleMutex *sync.Mutex
throttleHTTPMutex *sync.Mutex
IsPostponingCutOver int64
CountingRowsFlag int64
AllEventsUpToLockProcessedInjectedFlag int64
CleanupImminentFlag int64
UserCommandedUnpostponeFlag int64
CutOverCompleteFlag int64
InCutOverCriticalSectionFlag int64
PanicAbort chan error
// Context for cancellation signaling across all goroutines
// Stored in struct as it spans the entire migration lifecycle, not per-function.
// context.Context is safe for concurrent use by multiple goroutines.
ctx context.Context //nolint:containedctx
cancelFunc context.CancelFunc
// Stores the fatal error that triggered abort
AbortError error
abortMutex *sync.Mutex
OriginalTableColumnsOnApplier *sql.ColumnList
OriginalTableColumns *sql.ColumnList
OriginalTableVirtualColumns *sql.ColumnList
OriginalTableUniqueKeys [](*sql.UniqueKey)
OriginalTableAutoIncrement uint64
GhostTableColumns *sql.ColumnList
GhostTableVirtualColumns *sql.ColumnList
GhostTableUniqueKeys [](*sql.UniqueKey)
UniqueKey *sql.UniqueKey
SharedColumns *sql.ColumnList
ColumnRenameMap map[string]string
DroppedColumnsMap map[string]bool
MappedSharedColumns *sql.ColumnList
MigrationLastInsertSQLWarnings []string
MigrationRangeMinValues *sql.ColumnValues
MigrationRangeMaxValues *sql.ColumnValues
Iteration int64
MigrationIterationRangeMinValues *sql.ColumnValues
MigrationIterationRangeMaxValues *sql.ColumnValues
InitialStreamerCoords mysql.BinlogCoordinates
ForceTmpTableName string
IncludeTriggers bool
RemoveTriggerSuffix bool
TriggerSuffix string
Triggers []mysql.Trigger
recentBinlogCoordinates mysql.BinlogCoordinates
BinlogSyncerMaxReconnectAttempts int
AllowSetupMetadataLockInstruments bool
SkipMetadataLockCheck bool
IsOpenMetadataLockInstruments bool
Log Logger
}
type Logger interface {
Debug(args ...interface{})
Debugf(format string, args ...interface{})
Info(args ...interface{})
Infof(format string, args ...interface{})
Warning(args ...interface{}) error
Warningf(format string, args ...interface{}) error
Error(args ...interface{}) error
Errorf(format string, args ...interface{}) error
Errore(err error) error
Fatal(args ...interface{}) error
Fatalf(format string, args ...interface{}) error
Fatale(err error) error
SetLevel(level log.LogLevel)
SetPrintStackTrace(printStackTraceFlag bool)
}
type ContextConfig struct {
Client struct {
User string
Password string
}
Osc struct {
Chunk_Size int64
Max_Lag_Millis int64
Replication_Lag_Query string
Max_Load string
}
}
func NewMigrationContext() *MigrationContext {
ctx, cancelFunc := context.WithCancel(context.Background())
return &MigrationContext{
Uuid: uuid.NewString(),
defaultNumRetries: 60,
ChunkSize: 1000,
InspectorConnectionConfig: mysql.NewConnectionConfig(),
ApplierConnectionConfig: mysql.NewConnectionConfig(),
MaxLagMillisecondsThrottleThreshold: 1500,
CutOverLockTimeoutSeconds: 3,
DMLBatchSize: 10,
etaNanoseonds: ETAUnknown,
maxLoad: NewLoadMap(),
criticalLoad: NewLoadMap(),
throttleMutex: &sync.Mutex{},
throttleHTTPMutex: &sync.Mutex{},
throttleControlReplicaKeys: mysql.NewInstanceKeyMap(),
configMutex: &sync.Mutex{},
pointOfInterestTimeMutex: &sync.Mutex{},
lastHeartbeatOnChangelogMutex: &sync.Mutex{},
ColumnRenameMap: make(map[string]string),
PanicAbort: make(chan error),
ctx: ctx,
cancelFunc: cancelFunc,
abortMutex: &sync.Mutex{},
Log: NewDefaultLogger(),
}
}
func (this *MigrationContext) SetConnectionConfig(storageEngine string) error {
var transactionIsolation string
switch storageEngine {
case "rocksdb":
transactionIsolation = "READ-COMMITTED"
default:
transactionIsolation = "REPEATABLE-READ"
}
this.InspectorConnectionConfig.TransactionIsolation = transactionIsolation
this.ApplierConnectionConfig.TransactionIsolation = transactionIsolation
return nil
}
func (this *MigrationContext) SetConnectionCharset(charset string) {
if charset == "" {
charset = "utf8mb4,utf8,latin1"
}
this.InspectorConnectionConfig.Charset = charset
this.ApplierConnectionConfig.Charset = charset
}
func getSafeTableName(baseName string, suffix string) string {
name := fmt.Sprintf("_%s_%s", baseName, suffix)
if len(name) <= mysql.MaxTableNameLength {
return name
}
extraCharacters := len(name) - mysql.MaxTableNameLength
return fmt.Sprintf("_%s_%s", baseName[0:len(baseName)-extraCharacters], suffix)
}
// GetGhostTableName generates the name of ghost table, based on original table name
// or a given table name
func (this *MigrationContext) GetGhostTableName() string {
if this.Revert {
// When reverting the "ghost" table is the _del table from the original migration.
return this.OldTableName
}
if this.ForceTmpTableName != "" {
return getSafeTableName(this.ForceTmpTableName, "gho")
} else {
return getSafeTableName(this.OriginalTableName, "gho")
}
}
// GetOldTableName generates the name of the "old" table, into which the original table is renamed.
func (this *MigrationContext) GetOldTableName() string {
var tableName string
if this.ForceTmpTableName != "" {
tableName = this.ForceTmpTableName
} else {
tableName = this.OriginalTableName
}
suffix := "del"
if this.Revert {
suffix = "rev_del"
}
if this.TimestampOldTable {
t := this.StartTime
timestamp := fmt.Sprintf("%d%02d%02d%02d%02d%02d",
t.Year(), t.Month(), t.Day(),
t.Hour(), t.Minute(), t.Second())
return getSafeTableName(tableName, fmt.Sprintf("%s_%s", timestamp, suffix))
}
return getSafeTableName(tableName, suffix)
}
// GetChangelogTableName generates the name of changelog table, based on original table name
// or a given table name.
func (this *MigrationContext) GetChangelogTableName() string {
if this.ForceTmpTableName != "" {
return getSafeTableName(this.ForceTmpTableName, "ghc")
} else {
return getSafeTableName(this.OriginalTableName, "ghc")
}
}
// GetCheckpointTableName generates the name of checkpoint table.
func (this *MigrationContext) GetCheckpointTableName() string {
if this.ForceTmpTableName != "" {
return getSafeTableName(this.ForceTmpTableName, "ghk")
} else {
return getSafeTableName(this.OriginalTableName, "ghk")
}
}
// GetVoluntaryLockName returns a name of a voluntary lock to be used throughout
// the swap-tables process.
func (this *MigrationContext) GetVoluntaryLockName() string {
return fmt.Sprintf("%s.%s.lock", this.DatabaseName, this.OriginalTableName)
}
// RequiresBinlogFormatChange is `true` when the original binlog format isn't `ROW`
func (this *MigrationContext) RequiresBinlogFormatChange() bool {
return this.OriginalBinlogFormat != "ROW"
}
// GetApplierHostname is a safe access method to the applier hostname
func (this *MigrationContext) GetApplierHostname() string {
if this.ApplierConnectionConfig == nil {
return ""
}
if this.ApplierConnectionConfig.ImpliedKey == nil {
return ""
}
return this.ApplierConnectionConfig.ImpliedKey.Hostname
}
// GetInspectorHostname is a safe access method to the inspector hostname
func (this *MigrationContext) GetInspectorHostname() string {
if this.InspectorConnectionConfig == nil {
return ""
}
if this.InspectorConnectionConfig.ImpliedKey == nil {
return ""
}
return this.InspectorConnectionConfig.ImpliedKey.Hostname
}
// InspectorIsAlsoApplier is `true` when the both inspector and applier are the
// same database instance. This would be true when running directly on master or when
// testing on replica.
func (this *MigrationContext) InspectorIsAlsoApplier() bool {
return this.InspectorConnectionConfig.Equals(this.ApplierConnectionConfig)
}
// HasMigrationRange tells us whether there's a range to iterate for copying rows.
// It will be `false` if the table is initially empty
func (this *MigrationContext) HasMigrationRange() bool {
return this.MigrationRangeMinValues != nil && this.MigrationRangeMaxValues != nil
}
func (this *MigrationContext) SetCutOverLockTimeoutSeconds(timeoutSeconds int64) error {
if timeoutSeconds < 1 {
return fmt.Errorf("Minimal timeout is 1sec. Timeout remains at %d", this.CutOverLockTimeoutSeconds)
}
if timeoutSeconds > 10 {
return fmt.Errorf("Maximal timeout is 10sec. Timeout remains at %d", this.CutOverLockTimeoutSeconds)
}
this.CutOverLockTimeoutSeconds = timeoutSeconds
return nil
}
func (this *MigrationContext) SetExponentialBackoffMaxInterval(intervalSeconds int64) error {
if intervalSeconds < 2 {
return fmt.Errorf("Minimal maximum interval is 2sec. Timeout remains at %d", this.ExponentialBackoffMaxInterval)
}
this.ExponentialBackoffMaxInterval = intervalSeconds
return nil
}
func (this *MigrationContext) SetDefaultNumRetries(retries int64) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
if retries > 0 {
this.defaultNumRetries = retries
}
}
func (this *MigrationContext) MaxRetries() int64 {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
retries := this.defaultNumRetries
return retries
}
func (this *MigrationContext) IsTransactionalTable() bool {
switch strings.ToLower(this.TableEngine) {
case "innodb":
{
return true
}
case "tokudb":
{
return true
}
case "rocksdb":
{
return true
}
}
return false
}
// SetCountTableRowsCancelFunc sets the cancel function for the CountTableRows query context
func (this *MigrationContext) SetCountTableRowsCancelFunc(f func()) {
this.countMutex.Lock()
defer this.countMutex.Unlock()
this.countTableRowsCancelFunc = f
}
// IsCountingTableRows returns true if the migration has a table count query running
func (this *MigrationContext) IsCountingTableRows() bool {
this.countMutex.Lock()
defer this.countMutex.Unlock()
return this.countTableRowsCancelFunc != nil
}
// CancelTableRowsCount cancels the CountTableRows query context. It is safe to
// call function even when IsCountingTableRows is false.
func (this *MigrationContext) CancelTableRowsCount() {
this.countMutex.Lock()
defer this.countMutex.Unlock()
if this.countTableRowsCancelFunc == nil {
return
}
this.countTableRowsCancelFunc()
this.countTableRowsCancelFunc = nil
}
// ElapsedTime returns time since very beginning of the process
func (this *MigrationContext) ElapsedTime() time.Duration {
return time.Since(this.StartTime)
}
// MarkRowCopyStartTime
func (this *MigrationContext) MarkRowCopyStartTime() {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.RowCopyStartTime = time.Now()
}
// ElapsedRowCopyTime returns time since starting to copy chunks of rows
func (this *MigrationContext) ElapsedRowCopyTime() time.Duration {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
if this.RowCopyStartTime.IsZero() {
// Row copy hasn't started yet
return 0
}
if this.RowCopyEndTime.IsZero() {
return time.Since(this.RowCopyStartTime)
}
return this.RowCopyEndTime.Sub(this.RowCopyStartTime)
}
// ElapsedRowCopyTime returns time since starting to copy chunks of rows
func (this *MigrationContext) MarkRowCopyEndTime() {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.RowCopyEndTime = time.Now()
}
func (this *MigrationContext) TimeSinceLastHeartbeatOnChangelog() time.Duration {
return time.Since(this.GetLastHeartbeatOnChangelogTime())
}
func (this *MigrationContext) GetCurrentLagDuration() time.Duration {
return time.Duration(atomic.LoadInt64(&this.CurrentLag))
}
func (this *MigrationContext) GetProgressPct() float64 {
return math.Float64frombits(atomic.LoadUint64(&this.currentProgress))
}
func (this *MigrationContext) SetProgressPct(progressPct float64) {
atomic.StoreUint64(&this.currentProgress, math.Float64bits(progressPct))
}
func (this *MigrationContext) GetETADuration() time.Duration {
return time.Duration(atomic.LoadInt64(&this.etaNanoseonds))
}
func (this *MigrationContext) SetETADuration(etaDuration time.Duration) {
atomic.StoreInt64(&this.etaNanoseonds, etaDuration.Nanoseconds())
}
func (this *MigrationContext) GetETASeconds() int64 {
nano := atomic.LoadInt64(&this.etaNanoseonds)
if nano < 0 {
return ETAUnknown
}
return nano / int64(time.Second)
}
// math.Float64bits([f=0..100])
// GetTotalRowsCopied returns the accurate number of rows being copied (affected)
// This is not exactly the same as the rows being iterated via chunks, but potentially close enough
func (this *MigrationContext) GetTotalRowsCopied() int64 {
return atomic.LoadInt64(&this.TotalRowsCopied)
}
func (this *MigrationContext) GetIteration() int64 {
return atomic.LoadInt64(&this.Iteration)
}
func (this *MigrationContext) SetNextIterationRangeMinValues() {
this.MigrationIterationRangeMinValues = this.MigrationIterationRangeMaxValues
if this.MigrationIterationRangeMinValues == nil {
this.MigrationIterationRangeMinValues = this.MigrationRangeMinValues
}
}
func (this *MigrationContext) MarkPointOfInterest() int64 {
this.pointOfInterestTimeMutex.Lock()
defer this.pointOfInterestTimeMutex.Unlock()
this.pointOfInterestTime = time.Now()
return atomic.LoadInt64(&this.Iteration)
}
func (this *MigrationContext) TimeSincePointOfInterest() time.Duration {
this.pointOfInterestTimeMutex.Lock()
defer this.pointOfInterestTimeMutex.Unlock()
return time.Since(this.pointOfInterestTime)
}
func (this *MigrationContext) SetLastHeartbeatOnChangelogTime(t time.Time) {
this.lastHeartbeatOnChangelogMutex.Lock()
defer this.lastHeartbeatOnChangelogMutex.Unlock()
this.lastHeartbeatOnChangelogTime = t
}
func (this *MigrationContext) GetLastHeartbeatOnChangelogTime() time.Time {
this.lastHeartbeatOnChangelogMutex.Lock()
defer this.lastHeartbeatOnChangelogMutex.Unlock()
return this.lastHeartbeatOnChangelogTime
}
func (this *MigrationContext) SetHeartbeatIntervalMilliseconds(heartbeatIntervalMilliseconds int64) {
if heartbeatIntervalMilliseconds < 100 {
heartbeatIntervalMilliseconds = 100
}
if heartbeatIntervalMilliseconds > 1000 {
heartbeatIntervalMilliseconds = 1000
}
this.HeartbeatIntervalMilliseconds = heartbeatIntervalMilliseconds
}
func (this *MigrationContext) SetMaxLagMillisecondsThrottleThreshold(maxLagMillisecondsThrottleThreshold int64) {
if maxLagMillisecondsThrottleThreshold < 100 {
maxLagMillisecondsThrottleThreshold = 100
}
atomic.StoreInt64(&this.MaxLagMillisecondsThrottleThreshold, maxLagMillisecondsThrottleThreshold)
}
func (this *MigrationContext) SetChunkSize(chunkSize int64) {
if chunkSize < 10 {
chunkSize = 10
}
if chunkSize > 100000 {
chunkSize = 100000
}
atomic.StoreInt64(&this.ChunkSize, chunkSize)
}
func (this *MigrationContext) SetDMLBatchSize(batchSize int64) {
if batchSize < 1 {
batchSize = 1
}
if batchSize > MaxEventsBatchSize {
batchSize = MaxEventsBatchSize
}
atomic.StoreInt64(&this.DMLBatchSize, batchSize)
}
func (this *MigrationContext) SetThrottleGeneralCheckResult(checkResult *ThrottleCheckResult) *ThrottleCheckResult {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.throttleGeneralCheckResult = *checkResult
return checkResult
}
func (this *MigrationContext) GetThrottleGeneralCheckResult() *ThrottleCheckResult {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
result := this.throttleGeneralCheckResult
return &result
}
func (this *MigrationContext) SetThrottled(throttle bool, reason string, reasonHint ThrottleReasonHint) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.isThrottled = throttle
this.throttleReason = reason
this.throttleReasonHint = reasonHint
}
func (this *MigrationContext) IsThrottled() (bool, string, ThrottleReasonHint) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
// we don't throttle when cutting over. We _do_ throttle:
// - during copy phase
// - just before cut-over
// - in between cut-over retries
// When cutting over, we need to be aggressive. Cut-over holds table locks.
// We need to release those asap.
if atomic.LoadInt64(&this.InCutOverCriticalSectionFlag) > 0 {
return false, "critical section", NoThrottleReasonHint
}
return this.isThrottled, this.throttleReason, this.throttleReasonHint
}
func (this *MigrationContext) GetThrottleQuery() string {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
var query = this.throttleQuery
return query
}
func (this *MigrationContext) SetThrottleQuery(newQuery string) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.throttleQuery = newQuery
}
func (this *MigrationContext) GetThrottleHTTP() string {
this.throttleHTTPMutex.Lock()
defer this.throttleHTTPMutex.Unlock()
var throttleHTTP = this.throttleHTTP
return throttleHTTP
}
func (this *MigrationContext) SetThrottleHTTP(throttleHTTP string) {
this.throttleHTTPMutex.Lock()
defer this.throttleHTTPMutex.Unlock()
this.throttleHTTP = throttleHTTP
}
func (this *MigrationContext) SetIgnoreHTTPErrors(ignoreHTTPErrors bool) {
this.throttleHTTPMutex.Lock()
defer this.throttleHTTPMutex.Unlock()
this.IgnoreHTTPErrors = ignoreHTTPErrors
}
func (this *MigrationContext) GetMaxLoad() LoadMap {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
return this.maxLoad.Duplicate()
}
func (this *MigrationContext) GetCriticalLoad() LoadMap {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
return this.criticalLoad.Duplicate()
}
func (this *MigrationContext) GetNiceRatio() float64 {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
return this.niceRatio
}
func (this *MigrationContext) SetNiceRatio(newRatio float64) {
if newRatio < 0.0 {
newRatio = 0.0
}
if newRatio > 100.0 {
newRatio = 100.0
}
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.niceRatio = newRatio
}
func (this *MigrationContext) GetRecentBinlogCoordinates() mysql.BinlogCoordinates {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
return this.recentBinlogCoordinates
}
func (this *MigrationContext) SetRecentBinlogCoordinates(coordinates mysql.BinlogCoordinates) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.recentBinlogCoordinates = coordinates
}
// ReadMaxLoad parses the `--max-load` flag, which is in multiple key-value format,
// such as: 'Threads_running=100,Threads_connected=500'
// It only applies changes in case there's no parsing error.
func (this *MigrationContext) ReadMaxLoad(maxLoadList string) error {
loadMap, err := ParseLoadMap(maxLoadList)
if err != nil {
return err
}
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.maxLoad = loadMap
return nil
}
// ReadCriticalLoad parses the `--max-load` flag, which is in multiple key-value format,
// such as: 'Threads_running=100,Threads_connected=500'
// It only applies changes in case there's no parsing error.
func (this *MigrationContext) ReadCriticalLoad(criticalLoadList string) error {
loadMap, err := ParseLoadMap(criticalLoadList)
if err != nil {
return err
}
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.criticalLoad = loadMap
return nil
}
func (this *MigrationContext) GetControlReplicasLagResult() mysql.ReplicationLagResult {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
lagResult := this.controlReplicasLagResult
return lagResult
}
func (this *MigrationContext) SetControlReplicasLagResult(lagResult *mysql.ReplicationLagResult) {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
if lagResult == nil {
this.controlReplicasLagResult = *mysql.NewNoReplicationLagResult()
} else {
this.controlReplicasLagResult = *lagResult
}
}
func (this *MigrationContext) GetThrottleControlReplicaKeys() *mysql.InstanceKeyMap {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
keys := mysql.NewInstanceKeyMap()
keys.AddKeys(this.throttleControlReplicaKeys.GetInstanceKeys())
return keys
}
func (this *MigrationContext) ReadThrottleControlReplicaKeys(throttleControlReplicas string) error {
keys := mysql.NewInstanceKeyMap()
if err := keys.ReadCommaDelimitedList(throttleControlReplicas); err != nil {
return err
}
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.throttleControlReplicaKeys = keys
return nil
}
func (this *MigrationContext) AddThrottleControlReplicaKey(key mysql.InstanceKey) error {
this.throttleMutex.Lock()
defer this.throttleMutex.Unlock()
this.throttleControlReplicaKeys.AddKey(key)
return nil
}
// ApplyCredentials sorts out the credentials between the config file and the CLI flags
func (this *MigrationContext) ApplyCredentials() {
this.configMutex.Lock()
defer this.configMutex.Unlock()
if this.config.Client.User != "" {
this.InspectorConnectionConfig.User = this.config.Client.User
}
if this.CliUser != "" {
// Override
this.InspectorConnectionConfig.User = this.CliUser
}
if this.config.Client.Password != "" {
this.InspectorConnectionConfig.Password = this.config.Client.Password
}
if this.CliPassword != "" {
// Override
this.InspectorConnectionConfig.Password = this.CliPassword
}
}
func (this *MigrationContext) SetupTLS() error {
if this.UseTLS {
return this.InspectorConnectionConfig.UseTLS(this.TLSCACertificate, this.TLSCertificate, this.TLSKey, this.TLSAllowInsecure)
}
return nil
}
// ReadConfigFile attempts to read the config file, if it exists
func (this *MigrationContext) ReadConfigFile() error {
this.configMutex.Lock()
defer this.configMutex.Unlock()
if this.ConfigFile == "" {
return nil
}
cfg, err := ini.Load(this.ConfigFile)
if err != nil {
return err
}
if cfg.Section("client").HasKey("user") {
this.config.Client.User = cfg.Section("client").Key("user").String()
}
if cfg.Section("client").HasKey("password") {
this.config.Client.Password = cfg.Section("client").Key("password").String()
}
if cfg.Section("osc").HasKey("chunk_size") {
this.config.Osc.Chunk_Size, err = cfg.Section("osc").Key("chunk_size").Int64()
if err != nil {
return fmt.Errorf("Unable to read osc chunk size: %w", err)
}
}
if cfg.Section("osc").HasKey("max_load") {
this.config.Osc.Max_Load = cfg.Section("osc").Key("max_load").String()
}
if cfg.Section("osc").HasKey("replication_lag_query") {
this.config.Osc.Replication_Lag_Query = cfg.Section("osc").Key("replication_lag_query").String()
}
if cfg.Section("osc").HasKey("max_lag_millis") {
this.config.Osc.Max_Lag_Millis, err = cfg.Section("osc").Key("max_lag_millis").Int64()
if err != nil {
return fmt.Errorf("Unable to read max lag millis: %w", err)
}
}
// We accept user & password in the form "${SOME_ENV_VARIABLE}" in which case we pull
// the given variable from os env
if submatch := envVariableRegexp.FindStringSubmatch(this.config.Client.User); len(submatch) > 1 {
this.config.Client.User = os.Getenv(submatch[1])
}
if submatch := envVariableRegexp.FindStringSubmatch(this.config.Client.Password); len(submatch) > 1 {
this.config.Client.Password = os.Getenv(submatch[1])
}
return nil
}
// getGhostTriggerName generates the name of a ghost trigger, based on original trigger name
// or a given trigger name
func (this *MigrationContext) GetGhostTriggerName(triggerName string) string {
if this.RemoveTriggerSuffix && strings.HasSuffix(triggerName, this.TriggerSuffix) {
return strings.TrimSuffix(triggerName, this.TriggerSuffix)
}
// else
return triggerName + this.TriggerSuffix
}
// ValidateGhostTriggerLengthBelowMaxLength checks if the given trigger name (already transformed
// by GetGhostTriggerName) does not exceed the maximum allowed length.
func (this *MigrationContext) ValidateGhostTriggerLengthBelowMaxLength(triggerName string) bool {
return utf8.RuneCountInString(triggerName) <= mysql.MaxTableNameLength
}
// GetContext returns the migration context for cancellation checking
func (this *MigrationContext) GetContext() context.Context {
return this.ctx
}
// SetAbortError stores the fatal error that triggered abort
// Only the first error is stored (subsequent errors are ignored)
func (this *MigrationContext) SetAbortError(err error) {
this.abortMutex.Lock()
defer this.abortMutex.Unlock()
if this.AbortError == nil {
this.AbortError = err
}
}
// GetAbortError retrieves the stored abort error
func (this *MigrationContext) GetAbortError() error {
this.abortMutex.Lock()
defer this.abortMutex.Unlock()
return this.AbortError
}
// CancelContext cancels the migration context to signal all goroutines to stop
// The cancel function is safe to call multiple times and from multiple goroutines.
func (this *MigrationContext) CancelContext() {
if this.cancelFunc != nil {
this.cancelFunc()
}
}
// SendWithContext attempts to send a value to a channel, but returns early
// if the context is cancelled. This prevents goroutine deadlocks when the
// channel receiver has exited due to an error.
//
// Use this instead of bare channel sends (ch <- val) in goroutines to ensure
// proper cleanup when the migration is aborted.
//
// Example:
//
// if err := base.SendWithContext(ctx, ch, value); err != nil {
// return err // context was cancelled
// }
func SendWithContext[T any](ctx context.Context, ch chan<- T, val T) error {
select {
case ch <- val:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
================================================
FILE: go/base/context_test.go
================================================
/*
Copyright 2021 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"errors"
"os"
"strings"
"sync"
"testing"
"time"
"github.com/openark/golib/log"
"github.com/stretchr/testify/require"
)
func init() {
log.SetLevel(log.ERROR)
}
func TestGetTableNames(t *testing.T) {
{
context := NewMigrationContext()
context.OriginalTableName = "some_table"
require.Equal(t, "_some_table_del", context.GetOldTableName())
require.Equal(t, "_some_table_gho", context.GetGhostTableName())
require.Equal(t, "_some_table_ghc", context.GetChangelogTableName(), "_some_table_ghc")
}
{
context := NewMigrationContext()
context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890"
require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_del", context.GetOldTableName())
require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_gho", context.GetGhostTableName())
require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_ghc", context.GetChangelogTableName())
}
{
context := NewMigrationContext()
context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890123"
oldTableName := context.GetOldTableName()
require.Equal(t, "_a1234567890123456789012345678901234567890123456789012345678_del", oldTableName)
}
{
context := NewMigrationContext()
context.OriginalTableName = "a123456789012345678901234567890123456789012345678901234567890123"
context.TimestampOldTable = true
longForm := "Jan 2, 2006 at 3:04pm (MST)"
context.StartTime, _ = time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")
oldTableName := context.GetOldTableName()
require.Equal(t, "_a1234567890123456789012345678901234567890123_20130203195400_del", oldTableName)
}
{
context := NewMigrationContext()
context.OriginalTableName = "foo_bar_baz"
context.ForceTmpTableName = "tmp"
require.Equal(t, "_tmp_del", context.GetOldTableName())
require.Equal(t, "_tmp_gho", context.GetGhostTableName())
require.Equal(t, "_tmp_ghc", context.GetChangelogTableName())
}
}
func TestGetTriggerNames(t *testing.T) {
{
context := NewMigrationContext()
context.TriggerSuffix = "_gho"
require.Equal(t, "my_trigger"+context.TriggerSuffix, context.GetGhostTriggerName("my_trigger"))
}
{
context := NewMigrationContext()
context.TriggerSuffix = "_gho"
context.RemoveTriggerSuffix = true
require.Equal(t, "my_trigger"+context.TriggerSuffix, context.GetGhostTriggerName("my_trigger"))
}
{
context := NewMigrationContext()
context.TriggerSuffix = "_gho"
context.RemoveTriggerSuffix = true
require.Equal(t, "my_trigger", context.GetGhostTriggerName("my_trigger_gho"))
}
{
context := NewMigrationContext()
context.TriggerSuffix = "_gho"
context.RemoveTriggerSuffix = false
require.Equal(t, "my_trigger_gho_gho", context.GetGhostTriggerName("my_trigger_gho"))
}
}
func TestValidateGhostTriggerLengthBelowMaxLength(t *testing.T) {
// Tests simulate the real call pattern: GetGhostTriggerName first, then validate the result.
{
// Short trigger name with suffix appended: well under 64 chars
context := NewMigrationContext()
context.TriggerSuffix = "_gho"
ghostName := context.GetGhostTriggerName("my_trigger") // "my_trigger_gho" = 14 chars
require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// 64-char original + "_ghost" suffix = 70 chars → exceeds limit
context := NewMigrationContext()
context.TriggerSuffix = "_ghost"
ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4)) // 64 + 6 = 70
require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// 48-char original + "_ghost" suffix = 54 chars → valid
context := NewMigrationContext()
context.TriggerSuffix = "_ghost"
ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 3)) // 48 + 6 = 54
require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// RemoveTriggerSuffix: 64-char name ending in "_ghost" → suffix removed → 58 chars → valid
context := NewMigrationContext()
context.TriggerSuffix = "_ghost"
context.RemoveTriggerSuffix = true
ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4)) // suffix removed → 58
require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// RemoveTriggerSuffix: name doesn't end in suffix → suffix appended → 65 + 6 = 71 chars → exceeds
context := NewMigrationContext()
context.TriggerSuffix = "_ghost"
context.RemoveTriggerSuffix = true
ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4) + "X") // no match, appended → 71
require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// RemoveTriggerSuffix: 70-char name ending in "_ghost" → suffix removed → 64 chars → exactly at limit → valid
context := NewMigrationContext()
context.TriggerSuffix = "_ghost"
context.RemoveTriggerSuffix = true
ghostName := context.GetGhostTriggerName(strings.Repeat("my_trigger_ghost", 4) + "_ghost") // suffix removed → 64
require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// Edge case: exactly 64 chars after transformation → valid (boundary test)
context := NewMigrationContext()
context.TriggerSuffix = "_ght"
originalName := strings.Repeat("x", 60) // 60 chars
ghostName := context.GetGhostTriggerName(originalName) // 60 + 4 = 64
require.Equal(t, 64, len(ghostName))
require.True(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
{
// Edge case: 65 chars after transformation → exceeds (boundary test)
context := NewMigrationContext()
context.TriggerSuffix = "_ght"
originalName := strings.Repeat("x", 61) // 61 chars
ghostName := context.GetGhostTriggerName(originalName) // 61 + 4 = 65
require.Equal(t, 65, len(ghostName))
require.False(t, context.ValidateGhostTriggerLengthBelowMaxLength(ghostName))
}
}
func TestReadConfigFile(t *testing.T) {
{
context := NewMigrationContext()
context.ConfigFile = "/does/not/exist"
if err := context.ReadConfigFile(); err == nil {
t.Fatal("Expected .ReadConfigFile() to return an error, got nil")
}
}
{
f, err := os.CreateTemp("", t.Name())
if err != nil {
t.Fatalf("Failed to create tmp file: %v", err)
}
defer os.Remove(f.Name())
f.Write([]byte("[client]"))
context := NewMigrationContext()
context.ConfigFile = f.Name()
if err := context.ReadConfigFile(); err != nil {
t.Fatalf(".ReadConfigFile() failed: %v", err)
}
}
{
f, err := os.CreateTemp("", t.Name())
if err != nil {
t.Fatalf("Failed to create tmp file: %v", err)
}
defer os.Remove(f.Name())
f.Write([]byte("[client]\nuser=test\npassword=123456"))
context := NewMigrationContext()
context.ConfigFile = f.Name()
if err := context.ReadConfigFile(); err != nil {
t.Fatalf(".ReadConfigFile() failed: %v", err)
}
if context.config.Client.User != "test" {
t.Fatalf("Expected client user %q, got %q", "test", context.config.Client.User)
} else if context.config.Client.Password != "123456" {
t.Fatalf("Expected client password %q, got %q", "123456", context.config.Client.Password)
}
}
{
f, err := os.CreateTemp("", t.Name())
if err != nil {
t.Fatalf("Failed to create tmp file: %v", err)
}
defer os.Remove(f.Name())
f.Write([]byte("[osc]\nmax_load=10"))
context := NewMigrationContext()
context.ConfigFile = f.Name()
if err := context.ReadConfigFile(); err != nil {
t.Fatalf(".ReadConfigFile() failed: %v", err)
}
if context.config.Osc.Max_Load != "10" {
t.Fatalf("Expected osc 'max_load' %q, got %q", "10", context.config.Osc.Max_Load)
}
}
}
func TestSetAbortError_StoresFirstError(t *testing.T) {
ctx := NewMigrationContext()
err1 := errors.New("first error")
err2 := errors.New("second error")
ctx.SetAbortError(err1)
ctx.SetAbortError(err2)
got := ctx.GetAbortError()
if got != err1 { //nolint:errorlint // Testing pointer equality for sentinel error
t.Errorf("Expected first error %v, got %v", err1, got)
}
}
func TestSetAbortError_ThreadSafe(t *testing.T) {
ctx := NewMigrationContext()
var wg sync.WaitGroup
errs := []error{
errors.New("error 1"),
errors.New("error 2"),
errors.New("error 3"),
}
// Launch 3 goroutines trying to set error concurrently
for _, err := range errs {
wg.Add(1)
go func(e error) {
defer wg.Done()
ctx.SetAbortError(e)
}(err)
}
wg.Wait()
// Should store exactly one of the errors
got := ctx.GetAbortError()
if got == nil {
t.Fatal("Expected error to be stored, got nil")
}
// Verify it's one of the errors we sent
found := false
for _, err := range errs {
if got == err { //nolint:errorlint // Testing pointer equality for sentinel error
found = true
break
}
}
if !found {
t.Errorf("Stored error %v not in list of sent errors", got)
}
}
================================================
FILE: go/base/default_logger.go
================================================
/*
Copyright 2022 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"github.com/openark/golib/log"
)
type simpleLogger struct{}
func NewDefaultLogger() *simpleLogger {
return &simpleLogger{}
}
func (*simpleLogger) Debug(args ...interface{}) {
log.Debug(args[0].(string), args[1:])
}
func (*simpleLogger) Debugf(format string, args ...interface{}) {
log.Debugf(format, args...)
}
func (*simpleLogger) Info(args ...interface{}) {
log.Info(args[0].(string), args[1:])
}
func (*simpleLogger) Infof(format string, args ...interface{}) {
log.Infof(format, args...)
}
func (*simpleLogger) Warning(args ...interface{}) error {
return log.Warning(args[0].(string), args[1:])
}
func (*simpleLogger) Warningf(format string, args ...interface{}) error {
return log.Warningf(format, args...)
}
func (*simpleLogger) Error(args ...interface{}) error {
return log.Error(args[0].(string), args[1:])
}
func (*simpleLogger) Errorf(format string, args ...interface{}) error {
return log.Errorf(format, args...)
}
func (*simpleLogger) Errore(err error) error {
return log.Errore(err)
}
func (*simpleLogger) Fatal(args ...interface{}) error {
return log.Fatal(args[0].(string), args[1:])
}
func (*simpleLogger) Fatalf(format string, args ...interface{}) error {
return log.Fatalf(format, args...)
}
func (*simpleLogger) Fatale(err error) error {
return log.Fatale(err)
}
func (*simpleLogger) SetLevel(level log.LogLevel) {
log.SetLevel(level)
}
func (*simpleLogger) SetPrintStackTrace(printStackTraceFlag bool) {
log.SetPrintStackTrace(printStackTraceFlag)
}
================================================
FILE: go/base/load_map.go
================================================
/*
Copyright 2016 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"fmt"
"sort"
"strconv"
"strings"
)
// LoadMap is a mapping of status variable & threshold
// e.g. [Threads_connected: 100, Threads_running: 50]
type LoadMap map[string]int64
func NewLoadMap() LoadMap {
result := make(map[string]int64)
return result
}
// NewLoadMap parses a `--*-load` flag (e.g. `--max-load`), which is in multiple
// key-value format, such as:
//
// 'Threads_running=100,Threads_connected=500'
func ParseLoadMap(loadList string) (LoadMap, error) {
result := NewLoadMap()
if loadList == "" {
return result, nil
}
loadConditions := strings.Split(loadList, ",")
for _, loadCondition := range loadConditions {
loadTokens := strings.Split(loadCondition, "=")
if len(loadTokens) != 2 {
return result, fmt.Errorf("Error parsing load condition: %s", loadCondition)
}
if loadTokens[0] == "" {
return result, fmt.Errorf("Error parsing status variable in load condition: %s", loadCondition)
}
if n, err := strconv.ParseInt(loadTokens[1], 10, 0); err != nil {
return result, fmt.Errorf("Error parsing numeric value in load condition: %s", loadCondition)
} else {
result[loadTokens[0]] = n
}
}
return result, nil
}
// Duplicate creates a clone of this map
func (this *LoadMap) Duplicate() LoadMap {
dup := make(map[string]int64)
for k, v := range *this {
dup[k] = v
}
return dup
}
// String() returns a string representation of this map
func (this *LoadMap) String() string {
tokens := []string{}
for key, val := range *this {
token := fmt.Sprintf("%s=%d", key, val)
tokens = append(tokens, token)
}
sort.Strings(tokens)
return strings.Join(tokens, ",")
}
================================================
FILE: go/base/load_map_test.go
================================================
/*
Copyright 2016 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"testing"
"github.com/openark/golib/log"
"github.com/stretchr/testify/require"
)
func init() {
log.SetLevel(log.ERROR)
}
func TestParseLoadMap(t *testing.T) {
{
loadList := ""
m, err := ParseLoadMap(loadList)
require.NoError(t, err)
require.Len(t, m, 0)
}
{
loadList := "threads_running=20,threads_connected=10"
m, err := ParseLoadMap(loadList)
require.NoError(t, err)
require.Len(t, m, 2)
require.Equal(t, int64(20), m["threads_running"])
require.Equal(t, int64(10), m["threads_connected"])
}
{
loadList := "threads_running=20=30,threads_connected=10"
_, err := ParseLoadMap(loadList)
require.Error(t, err)
}
{
loadList := "threads_running=20,threads_connected"
_, err := ParseLoadMap(loadList)
require.Error(t, err)
}
}
func TestString(t *testing.T) {
{
m, _ := ParseLoadMap("")
s := m.String()
require.Equal(t, "", s)
}
{
loadList := "threads_running=20,threads_connected=10"
m, _ := ParseLoadMap(loadList)
s := m.String()
require.Equal(t, "threads_connected=10,threads_running=20", s)
}
}
================================================
FILE: go/base/utils.go
================================================
/*
Copyright 2022 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"fmt"
"os"
"regexp"
"strings"
"time"
gosql "database/sql"
"github.com/github/gh-ost/go/mysql"
)
var (
prettifyDurationRegexp = regexp.MustCompile("([.][0-9]+)")
)
func PrettifyDurationOutput(d time.Duration) string {
if d < time.Second {
return "0s"
}
return prettifyDurationRegexp.ReplaceAllString(d.String(), "")
}
func FileExists(fileName string) bool {
if _, err := os.Stat(fileName); err == nil {
return true
}
return false
}
func TouchFile(fileName string) error {
f, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE, 0755)
if err != nil {
return err
}
return f.Close()
}
// StringContainsAll returns true if `s` contains all non empty given `substrings`
// The function returns `false` if no non-empty arguments are given.
func StringContainsAll(s string, substrings ...string) bool {
nonEmptyStringsFound := false
for _, substring := range substrings {
if substring == "" {
continue
}
if strings.Contains(s, substring) {
nonEmptyStringsFound = true
} else {
// Immediate failure
return false
}
}
return nonEmptyStringsFound
}
func ValidateConnection(db *gosql.DB, connectionConfig *mysql.ConnectionConfig, migrationContext *MigrationContext, name string) (string, error) {
versionQuery := `select @@global.version`
var version string
if err := db.QueryRow(versionQuery).Scan(&version); err != nil {
return "", err
}
if migrationContext.SkipPortValidation {
return version, nil
}
var extraPort int
extraPortQuery := `select @@global.extra_port`
if err := db.QueryRow(extraPortQuery).Scan(&extraPort); err != nil { //nolint:staticcheck
// swallow this error. not all servers support extra_port
}
// AliyunRDS set users port to "NULL", replace it by gh-ost param
// GCP set users port to "NULL", replace it by gh-ost param
// Azure MySQL set users port to a different value by design, replace it by gh-ost para
var port int
if migrationContext.AliyunRDS || migrationContext.GoogleCloudPlatform || migrationContext.AzureMySQL {
port = connectionConfig.Key.Port
} else {
portQuery := `select @@global.port`
if err := db.QueryRow(portQuery).Scan(&port); err != nil {
return "", err
}
}
if connectionConfig.Key.Port == port || (extraPort > 0 && connectionConfig.Key.Port == extraPort) {
migrationContext.Log.Infof("%s connection validated on %+v", name, connectionConfig.Key)
return version, nil
} else if extraPort == 0 {
return "", fmt.Errorf("Unexpected database port reported: %+v", port)
} else {
return "", fmt.Errorf("Unexpected database port reported: %+v / extra_port: %+v", port, extraPort)
}
}
================================================
FILE: go/base/utils_test.go
================================================
/*
Copyright 2016 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package base
import (
"testing"
"github.com/openark/golib/log"
"github.com/stretchr/testify/require"
)
func init() {
log.SetLevel(log.ERROR)
}
func TestStringContainsAll(t *testing.T) {
s := `insert,delete,update`
require.False(t, StringContainsAll(s))
require.False(t, StringContainsAll(s, ""))
require.False(t, StringContainsAll(s, "drop"))
require.True(t, StringContainsAll(s, "insert"))
require.False(t, StringContainsAll(s, "insert", "drop"))
require.True(t, StringContainsAll(s, "insert", ""))
require.True(t, StringContainsAll(s, "insert", "update", "delete"))
}
================================================
FILE: go/binlog/binlog_dml_event.go
================================================
/*
Copyright 2016 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package binlog
import (
"fmt"
"strings"
"github.com/github/gh-ost/go/sql"
)
type EventDML string
const (
NotDML EventDML = "NoDML"
InsertDML EventDML = "Insert"
UpdateDML EventDML = "Update"
DeleteDML EventDML = "Delete"
)
func ToEventDML(description string) EventDML {
// description can be a statement (`UPDATE my_table ...`) or a RBR event name (`UpdateRowsEventV2`)
description = strings.TrimSpace(strings.Split(description, " ")[0])
switch strings.ToLower(description) {
case "insert":
return InsertDML
case "update":
return UpdateDML
case "delete":
return DeleteDML
}
if strings.HasPrefix(description, "WriteRows") {
return InsertDML
}
if strings.HasPrefix(description, "UpdateRows") {
return UpdateDML
}
if strings.HasPrefix(description, "DeleteRows") {
return DeleteDML
}
return NotDML
}
// BinlogDMLEvent is a binary log rows (DML) event entry, with data
type BinlogDMLEvent struct {
DatabaseName string
TableName string
DML EventDML
WhereColumnValues *sql.ColumnValues
NewColumnValues *sql.ColumnValues
}
func NewBinlogDMLEvent(databaseName, tableName string, dml EventDML) *BinlogDMLEvent {
event := &BinlogDMLEvent{
DatabaseName: databaseName,
TableName: tableName,
DML: dml,
}
return event
}
func (this *BinlogDMLEvent) String() string {
return fmt.Sprintf("[%+v on %s:%s]", this.DML, this.DatabaseName, this.TableName)
}
================================================
FILE: go/binlog/binlog_entry.go
================================================
/*
Copyright 2022 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package binlog
import (
"fmt"
"github.com/github/gh-ost/go/mysql"
)
// BinlogEntry describes an entry in the binary log
type BinlogEntry struct {
Coordinates mysql.BinlogCoordinates
DmlEvent *BinlogDMLEvent
}
// NewBinlogEntryAt creates an empty, ready to go BinlogEntry object
func NewBinlogEntryAt(coordinates mysql.BinlogCoordinates) *BinlogEntry {
binlogEntry := &BinlogEntry{
Coordinates: coordinates,
}
return binlogEntry
}
// String() returns a string representation of this binlog entry
func (this *BinlogEntry) String() string {
return fmt.Sprintf("[BinlogEntry at %+v; dml:%+v]", this.Coordinates, this.DmlEvent)
}
================================================
FILE: go/binlog/binlog_reader.go
================================================
/*
Copyright 2016 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package binlog
// BinlogReader is a general interface whose implementations can choose their methods of reading
// a binary log file and parsing it into binlog entries
type BinlogReader interface {
StreamEvents(canStopStreaming func() bool, entriesChannel chan<- *BinlogEntry) error
Reconnect() error
}
================================================
FILE: go/binlog/gomysql_reader.go
================================================
/*
Copyright 2022 GitHub Inc.
See https://github.com/github/gh-ost/blob/master/LICENSE
*/
package binlog
import (
"fmt"
"sync"
"github.com/github/gh-ost/go/base"
"github.com/github/gh-ost/go/mysql"
"github.com/github/gh-ost/go/sql"
"time"
gomysql "github.com/go-mysql-org/go-mysql/mysql"
"github.com/go-mysql-org/go-mysql/replication"
uuid "github.com/google/uuid"
"golang.org/x/net/context"
)
type GoMySQLReader struct {
migrationContext *base.MigrationContext
connectionConfig *mysql.ConnectionConfig
binlogSyncer *replication.BinlogSyncer
binlogStreamer *replication.BinlogStreamer
currentCoordinates mysql.BinlogCoordinates
currentCoordinatesMutex *sync.Mutex
// LastTrxCoords are the coordinates of the last transaction completely read.
// If using the file coordinates it is binlog position of the transaction's XID event.
LastTrxCoords mysql.BinlogCoordinates
}
func NewGoMySQLReader(migrationContext *base.MigrationContext) *GoMySQLReader {
connectionConfig := migrationContext.InspectorConnectionConfig
return &GoMySQLReader{
migrationContext: migrationContext,
connectionConfig: connectionConfig,
currentCoordinatesMutex: &sync.Mutex{},
binlogSyncer: replication.NewBinlogSyncer(replication.BinlogSyncerConfig{
ServerID: uint32(migrationContext.ReplicaServerId),
Flavor: gomysql.MySQLFlavor,
Host: connectionConfig.Key.Hostname,
Port: uint16(connectionConfig.Key.Port),
User: connectionConfig.User,
Password: connectionConfig.Password,
TLSConfig: connectionConfig.TLSConfig(),
UseDecimal: true,
TimestampStringLocation: time.UTC,
MaxReconnectAttempts: migrationContext.BinlogSyncerMaxReconnectAttempts,
}),
}
}
// ConnectBinlogStreamer
func (this *GoMySQLReader) ConnectBinlogStreamer(coordinates mysql.BinlogCoordinates) (err error) {
if coordinates.IsEmpty() {
return this.migrationContext.Log.Errorf("Empty coordinates at ConnectBinlogStreamer()")
}
this.currentCoordinatesMutex.Lock()
defer this.currentCoordinatesMutex.Unlock()
this.currentCoordinates = coordinates
this.migrationContext.Log.Infof("Connecting binlog streamer at %+v", coordinates)
// Start sync with specified GTID set or binlog file and position
if this.migrationContext.UseGTIDs {
coords := coordinates.(*mysql.GTIDBinlogCoordinates)
this.binlogStreamer, err = this.binlogSyncer.StartSyncGTID(coords.GTIDSet)
} else {
coords := this.currentCoordinates.(*mysql.FileBinlogCoordinates)
this.binlogStreamer, err = this.binlogSyncer.StartSync(gomysql.Position{
Name: coords.LogFile,
Pos: uint32(coords.LogPos)},
)
}
return err
}
func (this *GoMySQLReader) GetCurrentBinlogCoordinates() mysql.BinlogCoordinates {
this.currentCoordinatesMutex.Lock()
defer this.currentCoordinatesMutex.Unlock()
return this.currentCoordinates.Clone()
}
func (this *GoMySQLReader) handleRowsEvent(ev *replication.BinlogEvent, rowsEvent *replication.RowsEvent, entriesChannel chan<- *BinlogEntry) error {
currentCoords := this.GetCurrentBinlogCoordinates()
dml := ToEventDML(ev.Header.EventType.String())
if dml == NotDML {
return fmt.Errorf("Unknown DML type: %s", ev.Header.EventType.String())
}
for i, row := range rowsEvent.Rows {
if dml == UpdateDML && i%2 == 1 {
// An update has two rows (WHERE+SET)
// We do both at the same time
continue
}
binlogEntry := NewBinlogEntryAt(currentCoords)
binlogEntry.DmlEvent = NewBinlogDMLEvent(
string(rowsEvent.Table.Schema),
string(rowsEvent.Table.Table),
dml,
)
switch dml {
case InsertDML:
{
binlogEntry.DmlEvent.NewColumnValues = sql.ToColumnValues(row)
}
case UpdateDML:
{
binlogEntry.DmlEvent.WhereColumnValues = sql.ToColumnValues(row)
binlogEntry.DmlEvent.NewColumnValues = sql.ToColumnValues(rowsEvent.Rows[i+1])
}
case DeleteDML:
{
binlogEntry.DmlEvent.WhereColumnValues = sql.ToColumnValues(row)
}
}
// The channel will do the throttling. Whoever is reading from the channel
// decides whether action is taken synchronously (meaning we wait before
// next iteration) or asynchronously (we keep pushing more events)
// In reality, reads will be synchronous
entriesChannel <- binlogEntry
}
return nil
}
// StreamEvents
func (this *GoMySQLReader) StreamEvents(canStopStreaming func() bool, entriesChannel chan<- *BinlogEntry) error {
if canStopStreaming() {
return nil
}
for {
if canStopStreaming() {
break
}
ev, err := this.binlogStreamer.GetEvent(context.Background())
if err != nil {
return err
}
// Update binlog coords if using file-based coords.
// GTID coordinates are updated on receiving GTID events.
if !this.migrationContext.UseGTIDs {
this.currentCoordinatesMutex.Lock()
coords := this.currentCoordinates.(*mysql.FileBinlogCoordinates)
prevCoords := coords.Clone().(*mysql.FileBinlogCoordinates)
coords.LogPos = int64(ev.Header.LogPos)
coords.EventSize = int64(ev.Header.EventSize)
if coords.IsLogPosOverflowBeyond4Bytes(prevCoords) {
this.currentCoordinatesMutex.Unlock()
return fmt.Errorf("Unexpected rows event at %+v, the binlog end_log_pos is overflow 4 bytes", coords)
}
this.currentCoordinatesMutex.Unlock()
}
switch event := ev.Event.(type) {
case *replication.GTIDEvent:
if !this.migrationContext.UseGTIDs {
continue
}
sid, err := uuid.FromBytes(event.SID)
if err != nil {
return err
}
this.currentCoordinatesMutex.Lock()
if this.LastTrxCoords != nil {
this.currentCoordinates = this.LastTrxCoords.Clone()
}
coords := this.currentCoordinates.(*mysql.GTIDBinlogCoordinates)
trxGset := gomysql.NewUUIDSet(sid, gomysql.Interval{Start: event.GNO, Stop: event.GNO + 1})
coords.GTIDSet.AddSet(trxGset)
this.currentCoordinatesMutex.Unlock()
case *replication.RotateEvent:
if this.migrationContext.UseGTIDs {
continue
}
this.currentCoordinatesMutex.Lock
gitextract_0igtfzyc/
├── .github/
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── ci.yml
│ ├── codeql.yml
│ ├── golangci-lint.yml
│ └── replica-tests.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile.packaging
├── Dockerfile.test
├── LICENSE
├── README.md
├── build.sh
├── doc/
│ ├── azure.md
│ ├── cheatsheet.md
│ ├── coding-ghost.md
│ ├── command-line-flags.md
│ ├── cut-over.md
│ ├── hooks.md
│ ├── interactive-commands.md
│ ├── local-tests.md
│ ├── migrating-with-sbr.md
│ ├── perks.md
│ ├── questions.md
│ ├── rds.md
│ ├── requirements-and-limitations.md
│ ├── resume.md
│ ├── revert.md
│ ├── shared-key.md
│ ├── subsecond-lag.md
│ ├── testing-on-replica.md
│ ├── the-fine-print.md
│ ├── throttle.md
│ ├── triggerless-design.md
│ ├── understanding-output.md
│ ├── what-if.md
│ └── why-triggerless.md
├── docker-compose.yml
├── go/
│ ├── base/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── default_logger.go
│ │ ├── load_map.go
│ │ ├── load_map_test.go
│ │ ├── utils.go
│ │ └── utils_test.go
│ ├── binlog/
│ │ ├── binlog_dml_event.go
│ │ ├── binlog_entry.go
│ │ ├── binlog_reader.go
│ │ ├── gomysql_reader.go
│ │ └── testdata/
│ │ ├── mysql-bin.000066
│ │ ├── mysql-bin.000070
│ │ ├── rbr-sample-0.txt
│ │ ├── rbr-sample-1.txt
│ │ └── rbr-sample-2.txt
│ ├── cmd/
│ │ └── gh-ost/
│ │ └── main.go
│ ├── logic/
│ │ ├── applier.go
│ │ ├── applier_test.go
│ │ ├── checkpoint.go
│ │ ├── hooks.go
│ │ ├── hooks_test.go
│ │ ├── inspect.go
│ │ ├── inspect_test.go
│ │ ├── migrator.go
│ │ ├── migrator_test.go
│ │ ├── my.cnf.test
│ │ ├── server.go
│ │ ├── server_test.go
│ │ ├── streamer.go
│ │ ├── streamer_test.go
│ │ ├── test_utils.go
│ │ └── throttler.go
│ ├── mysql/
│ │ ├── binlog.go
│ │ ├── binlog_file.go
│ │ ├── binlog_file_test.go
│ │ ├── binlog_gtid.go
│ │ ├── connection.go
│ │ ├── connection_test.go
│ │ ├── instance_key.go
│ │ ├── instance_key_map.go
│ │ ├── instance_key_test.go
│ │ ├── replica_terminology_map.go
│ │ └── utils.go
│ └── sql/
│ ├── builder.go
│ ├── builder_test.go
│ ├── encoding.go
│ ├── parser.go
│ ├── parser_test.go
│ ├── types.go
│ └── types_test.go
├── go.mod
├── go.sum
├── localtests/
│ ├── alter-charset/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── alter-charset-all-dml/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── attempt-instant-ddl/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── autoinc-copy-deletes/
│ │ ├── create.sql
│ │ └── expect_table_structure
│ ├── autoinc-copy-deletes-user-defined/
│ │ ├── create.sql
│ │ ├── expect_table_structure
│ │ └── extra_args
│ ├── autoinc-copy-simple/
│ │ ├── create.sql
│ │ └── expect_table_structure
│ ├── autoinc-zero-value/
│ │ └── create.sql
│ ├── bigint-change-nullable/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── binary-to-varbinary/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── bit-add/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── bit-dml/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── compound-pk/
│ │ └── create.sql
│ ├── compound-pk-ts/
│ │ └── create.sql
│ ├── convert-utf8mb4/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── copy-retries-exhausted/
│ │ ├── after.sql
│ │ ├── before.sql
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── datetime/
│ │ └── create.sql
│ ├── datetime-1970/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ ├── orig_columns
│ │ └── sql_mode
│ ├── datetime-submillis/
│ │ └── create.sql
│ ├── datetime-submillis-zeroleading/
│ │ └── create.sql
│ ├── datetime-to-timestamp/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── datetime-to-timestamp-pk-fail/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── datetime-with-zero/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── decimal/
│ │ └── create.sql
│ ├── discard-fk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── docker-compose.yml
│ ├── drop-null-add-not-null/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── enum/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── enum-pk/
│ │ └── create.sql
│ ├── enum-to-varchar/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── existing-datetime-with-zero/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── fail-datetime-with-zero/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-drop-pk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-existing-datetime-with-zero/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-fk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── ignore_versions
│ ├── fail-fk-parent/
│ │ ├── create.sql
│ │ ├── destroy.sql
│ │ ├── expect_failure
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── fail-float-unique-key/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-no-shared-uk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-no-unique-key/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-rename-table/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── fail-update-pk-column/
│ │ └── create.sql
│ ├── gbk-charset/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── generated-columns/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── generated-columns-add/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ ├── ignore_versions
│ │ ├── order_by
│ │ └── orig_columns
│ ├── generated-columns-rename/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── ignore_versions
│ ├── generated-columns-unique/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── geometry/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── gtid/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── gtid_mode
│ │ └── ignore_versions
│ ├── json/
│ │ └── create.sql
│ ├── json-dml/
│ │ └── create.sql
│ ├── keyword-column/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── latin1/
│ │ └── create.sql
│ ├── latin1text/
│ │ └── create.sql
│ ├── mixed-charset/
│ │ └── create.sql
│ ├── modify-change-case/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── modify-change-case-pk/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-duplicate-unique-values-on-column-type-change/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-duplicate-values-for-unique-index/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/
│ │ ├── create.sql
│ │ ├── expect_failure
│ │ ├── extra_args
│ │ └── test.sh
│ ├── rename/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-inserts-only/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-none-column/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-none-comment/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── rename-reorder-column/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── rename-reorder-columns/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── reorder-columns/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── shared-uk/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── spatial/
│ │ ├── create.sql
│ │ └── ignore_versions
│ ├── swap-pk-uk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── order_by
│ ├── swap-uk/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── swap-uk-uk/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ └── order_by
│ ├── sysbench/
│ │ └── create.sql
│ ├── test.sh
│ ├── timestamp/
│ │ └── create.sql
│ ├── timestamp-datetime/
│ │ └── create.sql
│ ├── timestamp-to-datetime/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trigger-advanced-features/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trigger-ghost-name-conflict/
│ │ ├── create.sql
│ │ ├── destroy.sql
│ │ ├── expect_failure
│ │ └── extra_args
│ ├── trigger-long-name-validation/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── trivial/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── tz/
│ │ └── create.sql
│ ├── tz-datetime/
│ │ └── create.sql
│ ├── tz-datetime-ts/
│ │ ├── create.sql
│ │ └── extra_args
│ ├── unsigned/
│ │ └── create.sql
│ ├── unsigned-modify/
│ │ └── create.sql
│ ├── unsigned-rename/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── unsigned-reorder/
│ │ ├── create.sql
│ │ ├── extra_args
│ │ ├── ghost_columns
│ │ └── orig_columns
│ ├── utf8/
│ │ └── create.sql
│ ├── utf8mb4/
│ │ └── create.sql
│ └── varbinary/
│ └── create.sql
├── resources/
│ └── hooks-sample/
│ ├── gh-ost-on-before-cut-over-hook
│ ├── gh-ost-on-before-row-copy-hook
│ ├── gh-ost-on-begin-postponed-hook
│ ├── gh-ost-on-failure-hook
│ ├── gh-ost-on-interactive-command-hook
│ ├── gh-ost-on-row-copy-complete-hook
│ ├── gh-ost-on-rowcount-complete-hook
│ ├── gh-ost-on-start-replication-hook
│ ├── gh-ost-on-startup-hook
│ ├── gh-ost-on-status-hook
│ ├── gh-ost-on-stop-replication-hook
│ ├── gh-ost-on-success-hook
│ ├── gh-ost-on-success-hook-2
│ └── gh-ost-on-validated-hook
├── script/
│ ├── bootstrap
│ ├── build
│ ├── build-deploy-tarball
│ ├── cibuild
│ ├── cibuild-gh-ost-build-deploy-tarball
│ ├── dock
│ ├── docker-gh-ost-replica-tests
│ ├── ensure-go-installed
│ ├── ensure-golangci-lint-installed
│ ├── gh-ost-test-mysql-master
│ ├── gh-ost-test-mysql-replica
│ ├── go
│ ├── lint
│ └── test
├── test.sh
├── tmp/
│ └── .gitkeep
└── vendor/
├── dario.cat/
│ └── mergo/
│ ├── .deepsource.toml
│ ├── .gitignore
│ ├── .travis.yml
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── README.md
│ ├── SECURITY.md
│ ├── doc.go
│ ├── map.go
│ ├── merge.go
│ └── mergo.go
├── filippo.io/
│ └── edwards25519/
│ ├── LICENSE
│ ├── README.md
│ ├── doc.go
│ ├── edwards25519.go
│ ├── extra.go
│ ├── field/
│ │ ├── fe.go
│ │ ├── fe_amd64.go
│ │ ├── fe_amd64.s
│ │ ├── fe_amd64_noasm.go
│ │ ├── fe_arm64.go
│ │ ├── fe_arm64.s
│ │ ├── fe_arm64_noasm.go
│ │ ├── fe_extra.go
│ │ └── fe_generic.go
│ ├── scalar.go
│ ├── scalar_fiat.go
│ ├── scalarmult.go
│ └── tables.go
├── github.com/
│ ├── Azure/
│ │ └── go-ansiterm/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── constants.go
│ │ ├── context.go
│ │ ├── csi_entry_state.go
│ │ ├── csi_param_state.go
│ │ ├── escape_intermediate_state.go
│ │ ├── escape_state.go
│ │ ├── event_handler.go
│ │ ├── ground_state.go
│ │ ├── osc_string_state.go
│ │ ├── parser.go
│ │ ├── parser_action_helpers.go
│ │ ├── parser_actions.go
│ │ ├── states.go
│ │ ├── utilities.go
│ │ └── winterm/
│ │ ├── ansi.go
│ │ ├── api.go
│ │ ├── attr_translation.go
│ │ ├── cursor_helpers.go
│ │ ├── erase_helpers.go
│ │ ├── scroll_helper.go
│ │ ├── utilities.go
│ │ └── win_event_handler.go
│ ├── Masterminds/
│ │ └── semver/
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── collection.go
│ │ ├── constraints.go
│ │ ├── doc.go
│ │ ├── version.go
│ │ └── version_fuzz.go
│ ├── Microsoft/
│ │ └── go-winio/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODEOWNERS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── backup.go
│ │ ├── doc.go
│ │ ├── ea.go
│ │ ├── file.go
│ │ ├── fileinfo.go
│ │ ├── hvsock.go
│ │ ├── internal/
│ │ │ ├── fs/
│ │ │ │ ├── doc.go
│ │ │ │ ├── fs.go
│ │ │ │ ├── security.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── socket/
│ │ │ │ ├── rawaddr.go
│ │ │ │ ├── socket.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ └── stringbuffer/
│ │ │ └── wstring.go
│ │ ├── pipe.go
│ │ ├── pkg/
│ │ │ └── guid/
│ │ │ ├── guid.go
│ │ │ ├── guid_nonwindows.go
│ │ │ ├── guid_windows.go
│ │ │ └── variant_string.go
│ │ ├── privilege.go
│ │ ├── reparse.go
│ │ ├── sd.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── cenkalti/
│ │ └── backoff/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backoff.go
│ │ ├── context.go
│ │ ├── exponential.go
│ │ ├── retry.go
│ │ ├── ticker.go
│ │ ├── timer.go
│ │ └── tries.go
│ ├── containerd/
│ │ ├── log/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── context.go
│ │ └── platforms/
│ │ ├── .gitattributes
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── compare.go
│ │ ├── cpuinfo.go
│ │ ├── cpuinfo_linux.go
│ │ ├── cpuinfo_other.go
│ │ ├── database.go
│ │ ├── defaults.go
│ │ ├── defaults_darwin.go
│ │ ├── defaults_freebsd.go
│ │ ├── defaults_unix.go
│ │ ├── defaults_windows.go
│ │ ├── errors.go
│ │ ├── platform_compat_windows.go
│ │ ├── platforms.go
│ │ ├── platforms_other.go
│ │ └── platforms_windows.go
│ ├── cpuguy83/
│ │ └── dockercfg/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auth.go
│ │ ├── config.go
│ │ └── load.go
│ ├── davecgh/
│ │ └── go-spew/
│ │ ├── LICENSE
│ │ └── spew/
│ │ ├── bypass.go
│ │ ├── bypasssafe.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── dump.go
│ │ ├── format.go
│ │ └── spew.go
│ ├── distribution/
│ │ └── reference/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE-OF-CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── GOVERNANCE.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── helpers.go
│ │ ├── normalize.go
│ │ ├── reference.go
│ │ ├── regexp.go
│ │ └── sort.go
│ ├── docker/
│ │ ├── docker/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── common.go
│ │ │ │ ├── swagger-gen.yaml
│ │ │ │ ├── swagger.yaml
│ │ │ │ └── types/
│ │ │ │ ├── blkiodev/
│ │ │ │ │ └── blkio.go
│ │ │ │ ├── checkpoint/
│ │ │ │ │ ├── list.go
│ │ │ │ │ └── options.go
│ │ │ │ ├── client.go
│ │ │ │ ├── common/
│ │ │ │ │ └── id_response.go
│ │ │ │ ├── container/
│ │ │ │ │ ├── change_type.go
│ │ │ │ │ ├── change_types.go
│ │ │ │ │ ├── commit.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── create_request.go
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── exec.go
│ │ │ │ │ ├── filesystem_change.go
│ │ │ │ │ ├── health.go
│ │ │ │ │ ├── hostconfig.go
│ │ │ │ │ ├── hostconfig_unix.go
│ │ │ │ │ ├── hostconfig_windows.go
│ │ │ │ │ ├── network_settings.go
│ │ │ │ │ ├── options.go
│ │ │ │ │ ├── port.go
│ │ │ │ │ ├── stats.go
│ │ │ │ │ ├── top_response.go
│ │ │ │ │ ├── update_response.go
│ │ │ │ │ ├── wait_exit_error.go
│ │ │ │ │ ├── wait_response.go
│ │ │ │ │ └── waitcondition.go
│ │ │ │ ├── error_response.go
│ │ │ │ ├── error_response_ext.go
│ │ │ │ ├── events/
│ │ │ │ │ └── events.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── parse.go
│ │ │ │ ├── image/
│ │ │ │ │ ├── delete_response.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── image_history.go
│ │ │ │ │ ├── image_inspect.go
│ │ │ │ │ ├── manifest.go
│ │ │ │ │ ├── opts.go
│ │ │ │ │ └── summary.go
│ │ │ │ ├── mount/
│ │ │ │ │ └── mount.go
│ │ │ │ ├── network/
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── endpoint.go
│ │ │ │ │ ├── ipam.go
│ │ │ │ │ └── network.go
│ │ │ │ ├── plugin.go
│ │ │ │ ├── plugin_device.go
│ │ │ │ ├── plugin_env.go
│ │ │ │ ├── plugin_interface_type.go
│ │ │ │ ├── plugin_mount.go
│ │ │ │ ├── plugin_responses.go
│ │ │ │ ├── registry/
│ │ │ │ │ ├── authconfig.go
│ │ │ │ │ ├── authenticate.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ └── search.go
│ │ │ │ ├── storage/
│ │ │ │ │ └── driver_data.go
│ │ │ │ ├── strslice/
│ │ │ │ │ └── strslice.go
│ │ │ │ ├── swarm/
│ │ │ │ │ ├── common.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── network.go
│ │ │ │ │ ├── node.go
│ │ │ │ │ ├── runtime/
│ │ │ │ │ │ ├── gen.go
│ │ │ │ │ │ ├── plugin.pb.go
│ │ │ │ │ │ └── plugin.proto
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ ├── secret.go
│ │ │ │ │ ├── service.go
│ │ │ │ │ ├── service_create_response.go
│ │ │ │ │ ├── service_update_response.go
│ │ │ │ │ ├── swarm.go
│ │ │ │ │ └── task.go
│ │ │ │ ├── system/
│ │ │ │ │ ├── info.go
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ └── security_opts.go
│ │ │ │ ├── time/
│ │ │ │ │ └── timestamp.go
│ │ │ │ ├── types.go
│ │ │ │ ├── types_deprecated.go
│ │ │ │ ├── versions/
│ │ │ │ │ └── compare.go
│ │ │ │ └── volume/
│ │ │ │ ├── cluster_volume.go
│ │ │ │ ├── create_options.go
│ │ │ │ ├── list_response.go
│ │ │ │ ├── options.go
│ │ │ │ ├── volume.go
│ │ │ │ └── volume_update.go
│ │ │ ├── client/
│ │ │ │ ├── README.md
│ │ │ │ ├── build_cancel.go
│ │ │ │ ├── build_prune.go
│ │ │ │ ├── checkpoint.go
│ │ │ │ ├── checkpoint_create.go
│ │ │ │ ├── checkpoint_delete.go
│ │ │ │ ├── checkpoint_list.go
│ │ │ │ ├── client.go
│ │ │ │ ├── client_deprecated.go
│ │ │ │ ├── client_interfaces.go
│ │ │ │ ├── client_unix.go
│ │ │ │ ├── client_windows.go
│ │ │ │ ├── config_create.go
│ │ │ │ ├── config_inspect.go
│ │ │ │ ├── config_list.go
│ │ │ │ ├── config_remove.go
│ │ │ │ ├── config_update.go
│ │ │ │ ├── container_attach.go
│ │ │ │ ├── container_commit.go
│ │ │ │ ├── container_copy.go
│ │ │ │ ├── container_create.go
│ │ │ │ ├── container_diff.go
│ │ │ │ ├── container_exec.go
│ │ │ │ ├── container_export.go
│ │ │ │ ├── container_inspect.go
│ │ │ │ ├── container_kill.go
│ │ │ │ ├── container_list.go
│ │ │ │ ├── container_logs.go
│ │ │ │ ├── container_pause.go
│ │ │ │ ├── container_prune.go
│ │ │ │ ├── container_remove.go
│ │ │ │ ├── container_rename.go
│ │ │ │ ├── container_resize.go
│ │ │ │ ├── container_restart.go
│ │ │ │ ├── container_start.go
│ │ │ │ ├── container_stats.go
│ │ │ │ ├── container_stop.go
│ │ │ │ ├── container_top.go
│ │ │ │ ├── container_unpause.go
│ │ │ │ ├── container_update.go
│ │ │ │ ├── container_wait.go
│ │ │ │ ├── disk_usage.go
│ │ │ │ ├── distribution_inspect.go
│ │ │ │ ├── envvars.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── events.go
│ │ │ │ ├── hijack.go
│ │ │ │ ├── image_build.go
│ │ │ │ ├── image_create.go
│ │ │ │ ├── image_history.go
│ │ │ │ ├── image_history_opts.go
│ │ │ │ ├── image_import.go
│ │ │ │ ├── image_inspect.go
│ │ │ │ ├── image_inspect_opts.go
│ │ │ │ ├── image_list.go
│ │ │ │ ├── image_load.go
│ │ │ │ ├── image_load_opts.go
│ │ │ │ ├── image_prune.go
│ │ │ │ ├── image_pull.go
│ │ │ │ ├── image_push.go
│ │ │ │ ├── image_remove.go
│ │ │ │ ├── image_save.go
│ │ │ │ ├── image_save_opts.go
│ │ │ │ ├── image_search.go
│ │ │ │ ├── image_tag.go
│ │ │ │ ├── info.go
│ │ │ │ ├── login.go
│ │ │ │ ├── network_connect.go
│ │ │ │ ├── network_create.go
│ │ │ │ ├── network_disconnect.go
│ │ │ │ ├── network_inspect.go
│ │ │ │ ├── network_list.go
│ │ │ │ ├── network_prune.go
│ │ │ │ ├── network_remove.go
│ │ │ │ ├── node_inspect.go
│ │ │ │ ├── node_list.go
│ │ │ │ ├── node_remove.go
│ │ │ │ ├── node_update.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ping.go
│ │ │ │ ├── plugin_create.go
│ │ │ │ ├── plugin_disable.go
│ │ │ │ ├── plugin_enable.go
│ │ │ │ ├── plugin_inspect.go
│ │ │ │ ├── plugin_install.go
│ │ │ │ ├── plugin_list.go
│ │ │ │ ├── plugin_push.go
│ │ │ │ ├── plugin_remove.go
│ │ │ │ ├── plugin_set.go
│ │ │ │ ├── plugin_upgrade.go
│ │ │ │ ├── request.go
│ │ │ │ ├── secret_create.go
│ │ │ │ ├── secret_inspect.go
│ │ │ │ ├── secret_list.go
│ │ │ │ ├── secret_remove.go
│ │ │ │ ├── secret_update.go
│ │ │ │ ├── service_create.go
│ │ │ │ ├── service_inspect.go
│ │ │ │ ├── service_list.go
│ │ │ │ ├── service_logs.go
│ │ │ │ ├── service_remove.go
│ │ │ │ ├── service_update.go
│ │ │ │ ├── swarm_get_unlock_key.go
│ │ │ │ ├── swarm_init.go
│ │ │ │ ├── swarm_inspect.go
│ │ │ │ ├── swarm_join.go
│ │ │ │ ├── swarm_leave.go
│ │ │ │ ├── swarm_unlock.go
│ │ │ │ ├── swarm_update.go
│ │ │ │ ├── task_inspect.go
│ │ │ │ ├── task_list.go
│ │ │ │ ├── task_logs.go
│ │ │ │ ├── utils.go
│ │ │ │ ├── version.go
│ │ │ │ ├── volume_create.go
│ │ │ │ ├── volume_inspect.go
│ │ │ │ ├── volume_list.go
│ │ │ │ ├── volume_prune.go
│ │ │ │ ├── volume_remove.go
│ │ │ │ └── volume_update.go
│ │ │ ├── errdefs/
│ │ │ │ ├── defs.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── http_helpers.go
│ │ │ │ └── is.go
│ │ │ ├── internal/
│ │ │ │ ├── lazyregexp/
│ │ │ │ │ └── lazyregexp.go
│ │ │ │ └── multierror/
│ │ │ │ └── multierror.go
│ │ │ └── pkg/
│ │ │ ├── archive/
│ │ │ │ ├── archive.go
│ │ │ │ ├── archive_linux.go
│ │ │ │ ├── archive_other.go
│ │ │ │ ├── archive_unix.go
│ │ │ │ ├── archive_windows.go
│ │ │ │ ├── changes.go
│ │ │ │ ├── changes_linux.go
│ │ │ │ ├── changes_other.go
│ │ │ │ ├── changes_unix.go
│ │ │ │ ├── changes_windows.go
│ │ │ │ ├── copy.go
│ │ │ │ ├── copy_unix.go
│ │ │ │ ├── copy_windows.go
│ │ │ │ ├── dev_freebsd.go
│ │ │ │ ├── dev_unix.go
│ │ │ │ ├── diff.go
│ │ │ │ ├── diff_unix.go
│ │ │ │ ├── diff_windows.go
│ │ │ │ ├── path.go
│ │ │ │ ├── path_unix.go
│ │ │ │ ├── path_windows.go
│ │ │ │ ├── time.go
│ │ │ │ ├── time_nonwindows.go
│ │ │ │ ├── time_windows.go
│ │ │ │ ├── whiteouts.go
│ │ │ │ ├── wrap.go
│ │ │ │ ├── xattr_supported.go
│ │ │ │ ├── xattr_supported_linux.go
│ │ │ │ ├── xattr_supported_unix.go
│ │ │ │ └── xattr_unsupported.go
│ │ │ ├── idtools/
│ │ │ │ ├── idtools.go
│ │ │ │ ├── idtools_unix.go
│ │ │ │ └── idtools_windows.go
│ │ │ ├── jsonmessage/
│ │ │ │ └── jsonmessage.go
│ │ │ └── stdcopy/
│ │ │ └── stdcopy.go
│ │ ├── go-connections/
│ │ │ ├── LICENSE
│ │ │ ├── nat/
│ │ │ │ ├── nat.go
│ │ │ │ ├── parse.go
│ │ │ │ └── sort.go
│ │ │ ├── sockets/
│ │ │ │ ├── README.md
│ │ │ │ ├── inmem_socket.go
│ │ │ │ ├── proxy.go
│ │ │ │ ├── sockets.go
│ │ │ │ ├── sockets_unix.go
│ │ │ │ ├── sockets_windows.go
│ │ │ │ ├── tcp_socket.go
│ │ │ │ └── unix_socket.go
│ │ │ └── tlsconfig/
│ │ │ ├── certpool.go
│ │ │ ├── config.go
│ │ │ └── config_client_ciphers.go
│ │ └── go-units/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── circle.yml
│ │ ├── duration.go
│ │ ├── size.go
│ │ └── ulimit.go
│ ├── ebitengine/
│ │ └── purego/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── abi_amd64.h
│ │ ├── abi_arm64.h
│ │ ├── cgo.go
│ │ ├── dlerror.go
│ │ ├── dlfcn.go
│ │ ├── dlfcn_android.go
│ │ ├── dlfcn_darwin.go
│ │ ├── dlfcn_freebsd.go
│ │ ├── dlfcn_linux.go
│ │ ├── dlfcn_nocgo_freebsd.go
│ │ ├── dlfcn_nocgo_linux.go
│ │ ├── dlfcn_playground.go
│ │ ├── dlfcn_stubs.s
│ │ ├── func.go
│ │ ├── go_runtime.go
│ │ ├── internal/
│ │ │ ├── cgo/
│ │ │ │ ├── dlfcn_cgo_unix.go
│ │ │ │ ├── empty.go
│ │ │ │ └── syscall_cgo_unix.go
│ │ │ ├── fakecgo/
│ │ │ │ ├── abi_amd64.h
│ │ │ │ ├── abi_arm64.h
│ │ │ │ ├── asm_amd64.s
│ │ │ │ ├── asm_arm64.s
│ │ │ │ ├── callbacks.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── freebsd.go
│ │ │ │ ├── go_darwin_amd64.go
│ │ │ │ ├── go_darwin_arm64.go
│ │ │ │ ├── go_freebsd_amd64.go
│ │ │ │ ├── go_freebsd_arm64.go
│ │ │ │ ├── go_libinit.go
│ │ │ │ ├── go_linux_amd64.go
│ │ │ │ ├── go_linux_arm64.go
│ │ │ │ ├── go_setenv.go
│ │ │ │ ├── go_util.go
│ │ │ │ ├── iscgo.go
│ │ │ │ ├── libcgo.go
│ │ │ │ ├── libcgo_darwin.go
│ │ │ │ ├── libcgo_freebsd.go
│ │ │ │ ├── libcgo_linux.go
│ │ │ │ ├── setenv.go
│ │ │ │ ├── symbols.go
│ │ │ │ ├── symbols_darwin.go
│ │ │ │ ├── symbols_freebsd.go
│ │ │ │ ├── symbols_linux.go
│ │ │ │ ├── trampolines_amd64.s
│ │ │ │ ├── trampolines_arm64.s
│ │ │ │ └── trampolines_stubs.s
│ │ │ └── strings/
│ │ │ └── strings.go
│ │ ├── is_ios.go
│ │ ├── nocgo.go
│ │ ├── struct_amd64.go
│ │ ├── struct_arm64.go
│ │ ├── struct_other.go
│ │ ├── sys_amd64.s
│ │ ├── sys_arm64.s
│ │ ├── sys_unix_arm64.s
│ │ ├── syscall.go
│ │ ├── syscall_cgo_linux.go
│ │ ├── syscall_sysv.go
│ │ ├── syscall_windows.go
│ │ ├── zcallback_amd64.s
│ │ └── zcallback_arm64.s
│ ├── felixge/
│ │ └── httpsnoop/
│ │ ├── .gitignore
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── capture_metrics.go
│ │ ├── docs.go
│ │ ├── wrap_generated_gteq_1.8.go
│ │ └── wrap_generated_lt_1.8.go
│ ├── go-ini/
│ │ └── ini/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── codecov.yml
│ │ ├── data_source.go
│ │ ├── deprecated.go
│ │ ├── error.go
│ │ ├── file.go
│ │ ├── helper.go
│ │ ├── ini.go
│ │ ├── key.go
│ │ ├── parser.go
│ │ ├── section.go
│ │ └── struct.go
│ ├── go-logr/
│ │ ├── logr/
│ │ │ ├── .golangci.yaml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── context.go
│ │ │ ├── context_noslog.go
│ │ │ ├── context_slog.go
│ │ │ ├── discard.go
│ │ │ ├── funcr/
│ │ │ │ ├── funcr.go
│ │ │ │ └── slogsink.go
│ │ │ ├── logr.go
│ │ │ ├── sloghandler.go
│ │ │ ├── slogr.go
│ │ │ └── slogsink.go
│ │ └── stdr/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stdr.go
│ ├── go-mysql-org/
│ │ └── go-mysql/
│ │ ├── LICENSE
│ │ ├── client/
│ │ │ ├── auth.go
│ │ │ ├── conn.go
│ │ │ ├── pool.go
│ │ │ ├── pool_options.go
│ │ │ ├── req.go
│ │ │ ├── resp.go
│ │ │ ├── stmt.go
│ │ │ └── tls.go
│ │ ├── compress/
│ │ │ └── zlib.go
│ │ ├── mysql/
│ │ │ ├── const.go
│ │ │ ├── errcode.go
│ │ │ ├── errname.go
│ │ │ ├── error.go
│ │ │ ├── field.go
│ │ │ ├── gtid.go
│ │ │ ├── mariadb_gtid.go
│ │ │ ├── mysql_gtid.go
│ │ │ ├── parse_binary.go
│ │ │ ├── position.go
│ │ │ ├── result.go
│ │ │ ├── resultset.go
│ │ │ ├── resultset_helper.go
│ │ │ ├── rowdata.go
│ │ │ ├── state.go
│ │ │ ├── util.go
│ │ │ └── validate.go
│ │ ├── packet/
│ │ │ └── conn.go
│ │ ├── replication/
│ │ │ ├── backup.go
│ │ │ ├── binlogstreamer.go
│ │ │ ├── binlogsyncer.go
│ │ │ ├── const.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── generic_event.go
│ │ │ ├── json_binary.go
│ │ │ ├── parser.go
│ │ │ ├── row_event.go
│ │ │ ├── time.go
│ │ │ └── transaction_payload_event.go
│ │ └── utils/
│ │ ├── byte_slice_pool.go
│ │ ├── bytes_buffer_pool.go
│ │ ├── now.go
│ │ ├── now_unix.go
│ │ └── zeroalloc.go
│ ├── go-ole/
│ │ └── go-ole/
│ │ ├── .travis.yml
│ │ ├── ChangeLog.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── com.go
│ │ ├── com_func.go
│ │ ├── connect.go
│ │ ├── constants.go
│ │ ├── error.go
│ │ ├── error_func.go
│ │ ├── error_windows.go
│ │ ├── guid.go
│ │ ├── iconnectionpoint.go
│ │ ├── iconnectionpoint_func.go
│ │ ├── iconnectionpoint_windows.go
│ │ ├── iconnectionpointcontainer.go
│ │ ├── iconnectionpointcontainer_func.go
│ │ ├── iconnectionpointcontainer_windows.go
│ │ ├── idispatch.go
│ │ ├── idispatch_func.go
│ │ ├── idispatch_windows.go
│ │ ├── ienumvariant.go
│ │ ├── ienumvariant_func.go
│ │ ├── ienumvariant_windows.go
│ │ ├── iinspectable.go
│ │ ├── iinspectable_func.go
│ │ ├── iinspectable_windows.go
│ │ ├── iprovideclassinfo.go
│ │ ├── iprovideclassinfo_func.go
│ │ ├── iprovideclassinfo_windows.go
│ │ ├── itypeinfo.go
│ │ ├── itypeinfo_func.go
│ │ ├── itypeinfo_windows.go
│ │ ├── iunknown.go
│ │ ├── iunknown_func.go
│ │ ├── iunknown_windows.go
│ │ ├── ole.go
│ │ ├── oleutil/
│ │ │ ├── connection.go
│ │ │ ├── connection_func.go
│ │ │ ├── connection_windows.go
│ │ │ ├── go-get.go
│ │ │ └── oleutil.go
│ │ ├── safearray.go
│ │ ├── safearray_func.go
│ │ ├── safearray_windows.go
│ │ ├── safearrayconversion.go
│ │ ├── safearrayslices.go
│ │ ├── utility.go
│ │ ├── variables.go
│ │ ├── variant.go
│ │ ├── variant_386.go
│ │ ├── variant_amd64.go
│ │ ├── variant_arm.go
│ │ ├── variant_arm64.go
│ │ ├── variant_date_386.go
│ │ ├── variant_date_amd64.go
│ │ ├── variant_date_arm.go
│ │ ├── variant_date_arm64.go
│ │ ├── variant_ppc64le.go
│ │ ├── variant_s390x.go
│ │ ├── vt_string.go
│ │ ├── winrt.go
│ │ └── winrt_doc.go
│ ├── go-sql-driver/
│ │ └── mysql/
│ │ ├── .gitignore
│ │ ├── AUTHORS
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── atomic_bool.go
│ │ ├── atomic_bool_go118.go
│ │ ├── auth.go
│ │ ├── buffer.go
│ │ ├── collations.go
│ │ ├── conncheck.go
│ │ ├── conncheck_dummy.go
│ │ ├── connection.go
│ │ ├── connector.go
│ │ ├── const.go
│ │ ├── driver.go
│ │ ├── dsn.go
│ │ ├── errors.go
│ │ ├── fields.go
│ │ ├── infile.go
│ │ ├── nulltime.go
│ │ ├── packets.go
│ │ ├── result.go
│ │ ├── rows.go
│ │ ├── statement.go
│ │ ├── transaction.go
│ │ └── utils.go
│ ├── goccy/
│ │ └── go-json/
│ │ ├── .codecov.yml
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── color.go
│ │ ├── decode.go
│ │ ├── docker-compose.yml
│ │ ├── encode.go
│ │ ├── error.go
│ │ ├── internal/
│ │ │ ├── decoder/
│ │ │ │ ├── anonymous_field.go
│ │ │ │ ├── array.go
│ │ │ │ ├── assign.go
│ │ │ │ ├── bool.go
│ │ │ │ ├── bytes.go
│ │ │ │ ├── compile.go
│ │ │ │ ├── compile_norace.go
│ │ │ │ ├── compile_race.go
│ │ │ │ ├── context.go
│ │ │ │ ├── float.go
│ │ │ │ ├── func.go
│ │ │ │ ├── int.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── invalid.go
│ │ │ │ ├── map.go
│ │ │ │ ├── number.go
│ │ │ │ ├── option.go
│ │ │ │ ├── path.go
│ │ │ │ ├── ptr.go
│ │ │ │ ├── slice.go
│ │ │ │ ├── stream.go
│ │ │ │ ├── string.go
│ │ │ │ ├── struct.go
│ │ │ │ ├── type.go
│ │ │ │ ├── uint.go
│ │ │ │ ├── unmarshal_json.go
│ │ │ │ ├── unmarshal_text.go
│ │ │ │ └── wrapped_string.go
│ │ │ ├── encoder/
│ │ │ │ ├── code.go
│ │ │ │ ├── compact.go
│ │ │ │ ├── compiler.go
│ │ │ │ ├── compiler_norace.go
│ │ │ │ ├── compiler_race.go
│ │ │ │ ├── context.go
│ │ │ │ ├── decode_rune.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── indent.go
│ │ │ │ ├── int.go
│ │ │ │ ├── map112.go
│ │ │ │ ├── map113.go
│ │ │ │ ├── opcode.go
│ │ │ │ ├── option.go
│ │ │ │ ├── optype.go
│ │ │ │ ├── query.go
│ │ │ │ ├── string.go
│ │ │ │ ├── string_table.go
│ │ │ │ ├── vm/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── hack.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ ├── vm_color/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── hack.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ ├── vm_color_indent/
│ │ │ │ │ ├── debug_vm.go
│ │ │ │ │ ├── util.go
│ │ │ │ │ └── vm.go
│ │ │ │ └── vm_indent/
│ │ │ │ ├── debug_vm.go
│ │ │ │ ├── hack.go
│ │ │ │ ├── util.go
│ │ │ │ └── vm.go
│ │ │ ├── errors/
│ │ │ │ └── error.go
│ │ │ └── runtime/
│ │ │ ├── rtype.go
│ │ │ ├── struct_field.go
│ │ │ └── type.go
│ │ ├── json.go
│ │ ├── option.go
│ │ ├── path.go
│ │ └── query.go
│ ├── gogo/
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ └── proto/
│ │ ├── Makefile
│ │ ├── clone.go
│ │ ├── custom_gogo.go
│ │ ├── decode.go
│ │ ├── deprecated.go
│ │ ├── discard.go
│ │ ├── duration.go
│ │ ├── duration_gogo.go
│ │ ├── encode.go
│ │ ├── encode_gogo.go
│ │ ├── equal.go
│ │ ├── extensions.go
│ │ ├── extensions_gogo.go
│ │ ├── lib.go
│ │ ├── lib_gogo.go
│ │ ├── message_set.go
│ │ ├── pointer_reflect.go
│ │ ├── pointer_reflect_gogo.go
│ │ ├── pointer_unsafe.go
│ │ ├── pointer_unsafe_gogo.go
│ │ ├── properties.go
│ │ ├── properties_gogo.go
│ │ ├── skip_gogo.go
│ │ ├── table_marshal.go
│ │ ├── table_marshal_gogo.go
│ │ ├── table_merge.go
│ │ ├── table_unmarshal.go
│ │ ├── table_unmarshal_gogo.go
│ │ ├── text.go
│ │ ├── text_gogo.go
│ │ ├── text_parser.go
│ │ ├── timestamp.go
│ │ ├── timestamp_gogo.go
│ │ ├── wrappers.go
│ │ └── wrappers_gogo.go
│ ├── google/
│ │ └── uuid/
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dce.go
│ │ ├── doc.go
│ │ ├── hash.go
│ │ ├── marshal.go
│ │ ├── node.go
│ │ ├── node_js.go
│ │ ├── node_net.go
│ │ ├── null.go
│ │ ├── sql.go
│ │ ├── time.go
│ │ ├── util.go
│ │ ├── uuid.go
│ │ ├── version1.go
│ │ ├── version4.go
│ │ ├── version6.go
│ │ └── version7.go
│ ├── hashicorp/
│ │ └── go-version/
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── constraint.go
│ │ ├── version.go
│ │ └── version_collection.go
│ ├── klauspost/
│ │ └── compress/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .goreleaser.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── compressible.go
│ │ ├── flate/
│ │ │ ├── deflate.go
│ │ │ ├── dict_decoder.go
│ │ │ ├── fast_encoder.go
│ │ │ ├── huffman_bit_writer.go
│ │ │ ├── huffman_code.go
│ │ │ ├── huffman_sortByFreq.go
│ │ │ ├── huffman_sortByLiteral.go
│ │ │ ├── inflate.go
│ │ │ ├── inflate_gen.go
│ │ │ ├── level1.go
│ │ │ ├── level2.go
│ │ │ ├── level3.go
│ │ │ ├── level4.go
│ │ │ ├── level5.go
│ │ │ ├── level6.go
│ │ │ ├── matchlen_amd64.go
│ │ │ ├── matchlen_amd64.s
│ │ │ ├── matchlen_generic.go
│ │ │ ├── regmask_amd64.go
│ │ │ ├── regmask_other.go
│ │ │ ├── stateless.go
│ │ │ └── token.go
│ │ ├── fse/
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── bytereader.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ └── fse.go
│ │ ├── gen.sh
│ │ ├── huff0/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ ├── decompress_amd64.go
│ │ │ ├── decompress_amd64.s
│ │ │ ├── decompress_generic.go
│ │ │ └── huff0.go
│ │ ├── internal/
│ │ │ ├── cpuinfo/
│ │ │ │ ├── cpuinfo.go
│ │ │ │ ├── cpuinfo_amd64.go
│ │ │ │ └── cpuinfo_amd64.s
│ │ │ └── snapref/
│ │ │ ├── LICENSE
│ │ │ ├── decode.go
│ │ │ ├── decode_other.go
│ │ │ ├── encode.go
│ │ │ ├── encode_other.go
│ │ │ └── snappy.go
│ │ ├── s2sx.mod
│ │ ├── s2sx.sum
│ │ ├── zlib/
│ │ │ ├── reader.go
│ │ │ └── writer.go
│ │ └── zstd/
│ │ ├── README.md
│ │ ├── bitreader.go
│ │ ├── bitwriter.go
│ │ ├── blockdec.go
│ │ ├── blockenc.go
│ │ ├── blocktype_string.go
│ │ ├── bytebuf.go
│ │ ├── bytereader.go
│ │ ├── decodeheader.go
│ │ ├── decoder.go
│ │ ├── decoder_options.go
│ │ ├── dict.go
│ │ ├── enc_base.go
│ │ ├── enc_best.go
│ │ ├── enc_better.go
│ │ ├── enc_dfast.go
│ │ ├── enc_fast.go
│ │ ├── encoder.go
│ │ ├── encoder_options.go
│ │ ├── framedec.go
│ │ ├── frameenc.go
│ │ ├── fse_decoder.go
│ │ ├── fse_decoder_amd64.go
│ │ ├── fse_decoder_amd64.s
│ │ ├── fse_decoder_generic.go
│ │ ├── fse_encoder.go
│ │ ├── fse_predefined.go
│ │ ├── hash.go
│ │ ├── history.go
│ │ ├── internal/
│ │ │ └── xxhash/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── xxhash.go
│ │ │ ├── xxhash_amd64.s
│ │ │ ├── xxhash_arm64.s
│ │ │ ├── xxhash_asm.go
│ │ │ ├── xxhash_other.go
│ │ │ └── xxhash_safe.go
│ │ ├── matchlen_amd64.go
│ │ ├── matchlen_amd64.s
│ │ ├── matchlen_generic.go
│ │ ├── seqdec.go
│ │ ├── seqdec_amd64.go
│ │ ├── seqdec_amd64.s
│ │ ├── seqdec_generic.go
│ │ ├── seqenc.go
│ │ ├── snappy.go
│ │ ├── zip.go
│ │ └── zstd.go
│ ├── lufia/
│ │ └── plan9stats/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── cpu.go
│ │ ├── doc.go
│ │ ├── host.go
│ │ ├── int.go
│ │ ├── opts.go
│ │ └── stats.go
│ ├── magiconair/
│ │ └── properties/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── decode.go
│ │ ├── doc.go
│ │ ├── integrate.go
│ │ ├── lex.go
│ │ ├── load.go
│ │ ├── parser.go
│ │ ├── properties.go
│ │ └── rangecheck.go
│ ├── moby/
│ │ ├── docker-image-spec/
│ │ │ ├── LICENSE
│ │ │ └── specs-go/
│ │ │ └── v1/
│ │ │ └── image.go
│ │ ├── patternmatcher/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── ignorefile/
│ │ │ │ └── ignorefile.go
│ │ │ └── patternmatcher.go
│ │ └── sys/
│ │ ├── sequential/
│ │ │ ├── LICENSE
│ │ │ ├── doc.go
│ │ │ ├── sequential_unix.go
│ │ │ └── sequential_windows.go
│ │ ├── user/
│ │ │ ├── LICENSE
│ │ │ ├── lookup_unix.go
│ │ │ ├── user.go
│ │ │ └── user_fuzzer.go
│ │ └── userns/
│ │ ├── LICENSE
│ │ ├── userns.go
│ │ ├── userns_linux.go
│ │ ├── userns_linux_fuzzer.go
│ │ └── userns_unsupported.go
│ ├── morikuni/
│ │ └── aec/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── aec.go
│ │ ├── ansi.go
│ │ ├── builder.go
│ │ └── sgr.go
│ ├── openark/
│ │ └── golib/
│ │ ├── LICENSE
│ │ ├── log/
│ │ │ └── log.go
│ │ └── sqlutils/
│ │ ├── dialect.go
│ │ ├── sqlite_dialect.go
│ │ └── sqlutils.go
│ ├── opencontainers/
│ │ ├── go-digest/
│ │ │ ├── .mailmap
│ │ │ ├── .pullapprove.yml
│ │ │ ├── .travis.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── LICENSE.docs
│ │ │ ├── MAINTAINERS
│ │ │ ├── README.md
│ │ │ ├── algorithm.go
│ │ │ ├── digest.go
│ │ │ ├── digester.go
│ │ │ ├── doc.go
│ │ │ └── verifiers.go
│ │ └── image-spec/
│ │ ├── LICENSE
│ │ └── specs-go/
│ │ ├── v1/
│ │ │ ├── annotations.go
│ │ │ ├── config.go
│ │ │ ├── descriptor.go
│ │ │ ├── index.go
│ │ │ ├── layout.go
│ │ │ ├── manifest.go
│ │ │ └── mediatype.go
│ │ ├── version.go
│ │ └── versioned.go
│ ├── pingcap/
│ │ ├── errors/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── compatible_shim.go
│ │ │ ├── errors.go
│ │ │ ├── group.go
│ │ │ ├── juju_adaptor.go
│ │ │ ├── normalize.go
│ │ │ └── stack.go
│ │ └── tidb/
│ │ └── pkg/
│ │ └── parser/
│ │ ├── LICENSE
│ │ ├── charset/
│ │ │ ├── BUILD.bazel
│ │ │ ├── charset.go
│ │ │ ├── encoding.go
│ │ │ ├── encoding_ascii.go
│ │ │ ├── encoding_base.go
│ │ │ ├── encoding_bin.go
│ │ │ ├── encoding_gbk.go
│ │ │ ├── encoding_latin1.go
│ │ │ ├── encoding_table.go
│ │ │ └── encoding_utf8.go
│ │ ├── format/
│ │ │ ├── BUILD.bazel
│ │ │ └── format.go
│ │ ├── mysql/
│ │ │ ├── BUILD.bazel
│ │ │ ├── charset.go
│ │ │ ├── const.go
│ │ │ ├── errcode.go
│ │ │ ├── errname.go
│ │ │ ├── error.go
│ │ │ ├── locale_format.go
│ │ │ ├── privs.go
│ │ │ ├── state.go
│ │ │ ├── type.go
│ │ │ └── util.go
│ │ └── terror/
│ │ ├── BUILD.bazel
│ │ └── terror.go
│ ├── pkg/
│ │ └── errors/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── appveyor.yml
│ │ ├── errors.go
│ │ ├── go113.go
│ │ └── stack.go
│ ├── pmezard/
│ │ └── go-difflib/
│ │ ├── LICENSE
│ │ └── difflib/
│ │ └── difflib.go
│ ├── power-devops/
│ │ └── perfstat/
│ │ ├── LICENSE
│ │ ├── c_helpers.c
│ │ ├── c_helpers.h
│ │ ├── config.go
│ │ ├── cpustat.go
│ │ ├── diskstat.go
│ │ ├── doc.go
│ │ ├── fsstat.go
│ │ ├── helpers.go
│ │ ├── lparstat.go
│ │ ├── lvmstat.go
│ │ ├── memstat.go
│ │ ├── netstat.go
│ │ ├── procstat.go
│ │ ├── sysconf.go
│ │ ├── systemcfg.go
│ │ ├── types_cpu.go
│ │ ├── types_disk.go
│ │ ├── types_fs.go
│ │ ├── types_lpar.go
│ │ ├── types_lvm.go
│ │ ├── types_memory.go
│ │ ├── types_network.go
│ │ ├── types_process.go
│ │ └── uptime.go
│ ├── shirou/
│ │ └── gopsutil/
│ │ └── v4/
│ │ ├── LICENSE
│ │ ├── common/
│ │ │ └── env.go
│ │ ├── cpu/
│ │ │ ├── cpu.go
│ │ │ ├── cpu_aix.go
│ │ │ ├── cpu_aix_cgo.go
│ │ │ ├── cpu_aix_nocgo.go
│ │ │ ├── cpu_darwin.go
│ │ │ ├── cpu_darwin_arm64.go
│ │ │ ├── cpu_darwin_fallback.go
│ │ │ ├── cpu_dragonfly.go
│ │ │ ├── cpu_dragonfly_amd64.go
│ │ │ ├── cpu_fallback.go
│ │ │ ├── cpu_freebsd.go
│ │ │ ├── cpu_freebsd_386.go
│ │ │ ├── cpu_freebsd_amd64.go
│ │ │ ├── cpu_freebsd_arm.go
│ │ │ ├── cpu_freebsd_arm64.go
│ │ │ ├── cpu_linux.go
│ │ │ ├── cpu_netbsd.go
│ │ │ ├── cpu_netbsd_amd64.go
│ │ │ ├── cpu_netbsd_arm.go
│ │ │ ├── cpu_netbsd_arm64.go
│ │ │ ├── cpu_openbsd.go
│ │ │ ├── cpu_openbsd_386.go
│ │ │ ├── cpu_openbsd_amd64.go
│ │ │ ├── cpu_openbsd_arm.go
│ │ │ ├── cpu_openbsd_arm64.go
│ │ │ ├── cpu_openbsd_riscv64.go
│ │ │ ├── cpu_plan9.go
│ │ │ ├── cpu_solaris.go
│ │ │ └── cpu_windows.go
│ │ ├── internal/
│ │ │ └── common/
│ │ │ ├── binary.go
│ │ │ ├── common.go
│ │ │ ├── common_darwin.go
│ │ │ ├── common_freebsd.go
│ │ │ ├── common_linux.go
│ │ │ ├── common_netbsd.go
│ │ │ ├── common_openbsd.go
│ │ │ ├── common_unix.go
│ │ │ ├── common_windows.go
│ │ │ ├── endian.go
│ │ │ ├── sleep.go
│ │ │ └── warnings.go
│ │ ├── mem/
│ │ │ ├── ex_linux.go
│ │ │ ├── ex_windows.go
│ │ │ ├── mem.go
│ │ │ ├── mem_aix.go
│ │ │ ├── mem_aix_cgo.go
│ │ │ ├── mem_aix_nocgo.go
│ │ │ ├── mem_bsd.go
│ │ │ ├── mem_darwin.go
│ │ │ ├── mem_fallback.go
│ │ │ ├── mem_freebsd.go
│ │ │ ├── mem_linux.go
│ │ │ ├── mem_netbsd.go
│ │ │ ├── mem_openbsd.go
│ │ │ ├── mem_openbsd_386.go
│ │ │ ├── mem_openbsd_amd64.go
│ │ │ ├── mem_openbsd_arm.go
│ │ │ ├── mem_openbsd_arm64.go
│ │ │ ├── mem_openbsd_riscv64.go
│ │ │ ├── mem_plan9.go
│ │ │ ├── mem_solaris.go
│ │ │ └── mem_windows.go
│ │ ├── net/
│ │ │ ├── net.go
│ │ │ ├── net_aix.go
│ │ │ ├── net_aix_cgo.go
│ │ │ ├── net_aix_nocgo.go
│ │ │ ├── net_darwin.go
│ │ │ ├── net_fallback.go
│ │ │ ├── net_freebsd.go
│ │ │ ├── net_linux.go
│ │ │ ├── net_openbsd.go
│ │ │ ├── net_solaris.go
│ │ │ ├── net_unix.go
│ │ │ └── net_windows.go
│ │ └── process/
│ │ ├── process.go
│ │ ├── process_bsd.go
│ │ ├── process_darwin.go
│ │ ├── process_darwin_amd64.go
│ │ ├── process_darwin_arm64.go
│ │ ├── process_fallback.go
│ │ ├── process_freebsd.go
│ │ ├── process_freebsd_386.go
│ │ ├── process_freebsd_amd64.go
│ │ ├── process_freebsd_arm.go
│ │ ├── process_freebsd_arm64.go
│ │ ├── process_linux.go
│ │ ├── process_openbsd.go
│ │ ├── process_openbsd_386.go
│ │ ├── process_openbsd_amd64.go
│ │ ├── process_openbsd_arm.go
│ │ ├── process_openbsd_arm64.go
│ │ ├── process_openbsd_riscv64.go
│ │ ├── process_plan9.go
│ │ ├── process_posix.go
│ │ ├── process_solaris.go
│ │ ├── process_windows.go
│ │ ├── process_windows_32bit.go
│ │ └── process_windows_64bit.go
│ ├── shopspring/
│ │ └── decimal/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── decimal-go.go
│ │ ├── decimal.go
│ │ └── rounding.go
│ ├── siddontang/
│ │ └── go-log/
│ │ ├── LICENSE
│ │ ├── log/
│ │ │ ├── doc.go
│ │ │ ├── filehandler.go
│ │ │ ├── handler.go
│ │ │ ├── log.go
│ │ │ └── logger.go
│ │ └── loggers/
│ │ └── loggers.go
│ ├── stretchr/
│ │ └── testify/
│ │ ├── LICENSE
│ │ ├── assert/
│ │ │ ├── assertion_compare.go
│ │ │ ├── assertion_format.go
│ │ │ ├── assertion_format.go.tmpl
│ │ │ ├── assertion_forward.go
│ │ │ ├── assertion_forward.go.tmpl
│ │ │ ├── assertion_order.go
│ │ │ ├── assertions.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── forward_assertions.go
│ │ │ ├── http_assertions.go
│ │ │ └── yaml/
│ │ │ ├── yaml_custom.go
│ │ │ ├── yaml_default.go
│ │ │ └── yaml_fail.go
│ │ ├── require/
│ │ │ ├── doc.go
│ │ │ ├── forward_requirements.go
│ │ │ ├── require.go
│ │ │ ├── require.go.tmpl
│ │ │ ├── require_forward.go
│ │ │ ├── require_forward.go.tmpl
│ │ │ └── requirements.go
│ │ └── suite/
│ │ ├── doc.go
│ │ ├── interfaces.go
│ │ ├── stats.go
│ │ └── suite.go
│ ├── tklauser/
│ │ ├── go-sysconf/
│ │ │ ├── .cirrus.yml
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── sysconf.go
│ │ │ ├── sysconf_bsd.go
│ │ │ ├── sysconf_darwin.go
│ │ │ ├── sysconf_dragonfly.go
│ │ │ ├── sysconf_freebsd.go
│ │ │ ├── sysconf_generic.go
│ │ │ ├── sysconf_linux.go
│ │ │ ├── sysconf_netbsd.go
│ │ │ ├── sysconf_openbsd.go
│ │ │ ├── sysconf_posix.go
│ │ │ ├── sysconf_solaris.go
│ │ │ ├── sysconf_unsupported.go
│ │ │ ├── zsysconf_defs_darwin.go
│ │ │ ├── zsysconf_defs_dragonfly.go
│ │ │ ├── zsysconf_defs_freebsd.go
│ │ │ ├── zsysconf_defs_linux.go
│ │ │ ├── zsysconf_defs_netbsd.go
│ │ │ ├── zsysconf_defs_openbsd.go
│ │ │ ├── zsysconf_defs_solaris.go
│ │ │ ├── zsysconf_values_freebsd_386.go
│ │ │ ├── zsysconf_values_freebsd_amd64.go
│ │ │ ├── zsysconf_values_freebsd_arm.go
│ │ │ ├── zsysconf_values_freebsd_arm64.go
│ │ │ ├── zsysconf_values_freebsd_riscv64.go
│ │ │ ├── zsysconf_values_linux_386.go
│ │ │ ├── zsysconf_values_linux_amd64.go
│ │ │ ├── zsysconf_values_linux_arm.go
│ │ │ ├── zsysconf_values_linux_arm64.go
│ │ │ ├── zsysconf_values_linux_loong64.go
│ │ │ ├── zsysconf_values_linux_mips.go
│ │ │ ├── zsysconf_values_linux_mips64.go
│ │ │ ├── zsysconf_values_linux_mips64le.go
│ │ │ ├── zsysconf_values_linux_mipsle.go
│ │ │ ├── zsysconf_values_linux_ppc64.go
│ │ │ ├── zsysconf_values_linux_ppc64le.go
│ │ │ ├── zsysconf_values_linux_riscv64.go
│ │ │ ├── zsysconf_values_linux_s390x.go
│ │ │ ├── zsysconf_values_netbsd_386.go
│ │ │ ├── zsysconf_values_netbsd_amd64.go
│ │ │ ├── zsysconf_values_netbsd_arm.go
│ │ │ └── zsysconf_values_netbsd_arm64.go
│ │ └── numcpus/
│ │ ├── .cirrus.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── numcpus.go
│ │ ├── numcpus_bsd.go
│ │ ├── numcpus_linux.go
│ │ ├── numcpus_solaris.go
│ │ ├── numcpus_unsupported.go
│ │ └── numcpus_windows.go
│ └── yusufpapurcu/
│ └── wmi/
│ ├── LICENSE
│ ├── README.md
│ ├── swbemservices.go
│ └── wmi.go
├── go.opentelemetry.io/
│ ├── auto/
│ │ └── sdk/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── VERSIONING.md
│ │ ├── doc.go
│ │ ├── internal/
│ │ │ └── telemetry/
│ │ │ ├── attr.go
│ │ │ ├── doc.go
│ │ │ ├── id.go
│ │ │ ├── number.go
│ │ │ ├── resource.go
│ │ │ ├── scope.go
│ │ │ ├── span.go
│ │ │ ├── status.go
│ │ │ ├── traces.go
│ │ │ └── value.go
│ │ ├── limit.go
│ │ ├── span.go
│ │ ├── tracer.go
│ │ └── tracer_provider.go
│ ├── contrib/
│ │ └── instrumentation/
│ │ └── net/
│ │ └── http/
│ │ └── otelhttp/
│ │ ├── LICENSE
│ │ ├── client.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── handler.go
│ │ ├── internal/
│ │ │ └── semconvutil/
│ │ │ ├── gen.go
│ │ │ ├── httpconv.go
│ │ │ └── netconv.go
│ │ ├── labeler.go
│ │ ├── transport.go
│ │ ├── version.go
│ │ └── wrap.go
│ └── otel/
│ ├── .codespellignore
│ ├── .codespellrc
│ ├── .gitattributes
│ ├── .gitignore
│ ├── .golangci.yml
│ ├── .lycheeignore
│ ├── .markdownlint.yaml
│ ├── CHANGELOG.md
│ ├── CODEOWNERS
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── Makefile
│ ├── README.md
│ ├── RELEASING.md
│ ├── VERSIONING.md
│ ├── attribute/
│ │ ├── README.md
│ │ ├── doc.go
│ │ ├── encoder.go
│ │ ├── filter.go
│ │ ├── iterator.go
│ │ ├── key.go
│ │ ├── kv.go
│ │ ├── set.go
│ │ ├── type_string.go
│ │ └── value.go
│ ├── baggage/
│ │ ├── README.md
│ │ ├── baggage.go
│ │ ├── context.go
│ │ └── doc.go
│ ├── codes/
│ │ ├── README.md
│ │ ├── codes.go
│ │ └── doc.go
│ ├── dependencies.Dockerfile
│ ├── doc.go
│ ├── error_handler.go
│ ├── get_main_pkgs.sh
│ ├── handler.go
│ ├── internal/
│ │ ├── attribute/
│ │ │ └── attribute.go
│ │ ├── baggage/
│ │ │ ├── baggage.go
│ │ │ └── context.go
│ │ ├── gen.go
│ │ ├── global/
│ │ │ ├── handler.go
│ │ │ ├── instruments.go
│ │ │ ├── internal_logging.go
│ │ │ ├── meter.go
│ │ │ ├── propagator.go
│ │ │ ├── state.go
│ │ │ └── trace.go
│ │ └── rawhelpers.go
│ ├── internal_logging.go
│ ├── metric/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asyncfloat64.go
│ │ ├── asyncint64.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── embedded/
│ │ │ ├── README.md
│ │ │ └── embedded.go
│ │ ├── instrument.go
│ │ ├── meter.go
│ │ ├── syncfloat64.go
│ │ └── syncint64.go
│ ├── metric.go
│ ├── propagation/
│ │ ├── README.md
│ │ ├── baggage.go
│ │ ├── doc.go
│ │ ├── propagation.go
│ │ └── trace_context.go
│ ├── propagation.go
│ ├── renovate.json
│ ├── requirements.txt
│ ├── semconv/
│ │ ├── v1.20.0/
│ │ │ ├── README.md
│ │ │ ├── attribute_group.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── exception.go
│ │ │ ├── http.go
│ │ │ ├── resource.go
│ │ │ ├── schema.go
│ │ │ └── trace.go
│ │ └── v1.26.0/
│ │ ├── README.md
│ │ ├── attribute_group.go
│ │ ├── doc.go
│ │ ├── exception.go
│ │ ├── metric.go
│ │ └── schema.go
│ ├── trace/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── auto.go
│ │ ├── config.go
│ │ ├── context.go
│ │ ├── doc.go
│ │ ├── embedded/
│ │ │ ├── README.md
│ │ │ └── embedded.go
│ │ ├── internal/
│ │ │ └── telemetry/
│ │ │ ├── attr.go
│ │ │ ├── doc.go
│ │ │ ├── id.go
│ │ │ ├── number.go
│ │ │ ├── resource.go
│ │ │ ├── scope.go
│ │ │ ├── span.go
│ │ │ ├── status.go
│ │ │ ├── traces.go
│ │ │ └── value.go
│ │ ├── nonrecording.go
│ │ ├── noop/
│ │ │ ├── README.md
│ │ │ └── noop.go
│ │ ├── noop.go
│ │ ├── provider.go
│ │ ├── span.go
│ │ ├── trace.go
│ │ ├── tracer.go
│ │ └── tracestate.go
│ ├── trace.go
│ ├── verify_readmes.sh
│ ├── verify_released_changelog.sh
│ ├── version.go
│ └── versions.yaml
├── golang.org/
│ └── x/
│ ├── crypto/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── blowfish/
│ │ │ ├── block.go
│ │ │ ├── cipher.go
│ │ │ └── const.go
│ │ ├── chacha20/
│ │ │ ├── chacha_arm64.go
│ │ │ ├── chacha_arm64.s
│ │ │ ├── chacha_generic.go
│ │ │ ├── chacha_noasm.go
│ │ │ ├── chacha_ppc64x.go
│ │ │ ├── chacha_ppc64x.s
│ │ │ ├── chacha_s390x.go
│ │ │ ├── chacha_s390x.s
│ │ │ └── xor.go
│ │ ├── curve25519/
│ │ │ └── curve25519.go
│ │ ├── internal/
│ │ │ ├── alias/
│ │ │ │ ├── alias.go
│ │ │ │ └── alias_purego.go
│ │ │ └── poly1305/
│ │ │ ├── mac_noasm.go
│ │ │ ├── poly1305.go
│ │ │ ├── sum_amd64.s
│ │ │ ├── sum_asm.go
│ │ │ ├── sum_generic.go
│ │ │ ├── sum_loong64.s
│ │ │ ├── sum_ppc64x.s
│ │ │ ├── sum_s390x.go
│ │ │ └── sum_s390x.s
│ │ └── ssh/
│ │ ├── buffer.go
│ │ ├── certs.go
│ │ ├── channel.go
│ │ ├── cipher.go
│ │ ├── client.go
│ │ ├── client_auth.go
│ │ ├── common.go
│ │ ├── connection.go
│ │ ├── doc.go
│ │ ├── handshake.go
│ │ ├── internal/
│ │ │ └── bcrypt_pbkdf/
│ │ │ └── bcrypt_pbkdf.go
│ │ ├── kex.go
│ │ ├── keys.go
│ │ ├── mac.go
│ │ ├── messages.go
│ │ ├── mux.go
│ │ ├── server.go
│ │ ├── session.go
│ │ ├── ssh_gss.go
│ │ ├── streamlocal.go
│ │ ├── tcpip.go
│ │ └── transport.go
│ ├── net/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ └── context/
│ │ └── context.go
│ ├── sync/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ └── errgroup/
│ │ └── errgroup.go
│ ├── sys/
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── cpu/
│ │ │ ├── asm_aix_ppc64.s
│ │ │ ├── asm_darwin_x86_gc.s
│ │ │ ├── byteorder.go
│ │ │ ├── cpu.go
│ │ │ ├── cpu_aix.go
│ │ │ ├── cpu_arm.go
│ │ │ ├── cpu_arm64.go
│ │ │ ├── cpu_arm64.s
│ │ │ ├── cpu_darwin_x86.go
│ │ │ ├── cpu_gc_arm64.go
│ │ │ ├── cpu_gc_s390x.go
│ │ │ ├── cpu_gc_x86.go
│ │ │ ├── cpu_gc_x86.s
│ │ │ ├── cpu_gccgo_arm64.go
│ │ │ ├── cpu_gccgo_s390x.go
│ │ │ ├── cpu_gccgo_x86.c
│ │ │ ├── cpu_gccgo_x86.go
│ │ │ ├── cpu_linux.go
│ │ │ ├── cpu_linux_arm.go
│ │ │ ├── cpu_linux_arm64.go
│ │ │ ├── cpu_linux_loong64.go
│ │ │ ├── cpu_linux_mips64x.go
│ │ │ ├── cpu_linux_noinit.go
│ │ │ ├── cpu_linux_ppc64x.go
│ │ │ ├── cpu_linux_riscv64.go
│ │ │ ├── cpu_linux_s390x.go
│ │ │ ├── cpu_loong64.go
│ │ │ ├── cpu_loong64.s
│ │ │ ├── cpu_mips64x.go
│ │ │ ├── cpu_mipsx.go
│ │ │ ├── cpu_netbsd_arm64.go
│ │ │ ├── cpu_openbsd_arm64.go
│ │ │ ├── cpu_openbsd_arm64.s
│ │ │ ├── cpu_other_arm.go
│ │ │ ├── cpu_other_arm64.go
│ │ │ ├── cpu_other_mips64x.go
│ │ │ ├── cpu_other_ppc64x.go
│ │ │ ├── cpu_other_riscv64.go
│ │ │ ├── cpu_other_x86.go
│ │ │ ├── cpu_ppc64x.go
│ │ │ ├── cpu_riscv64.go
│ │ │ ├── cpu_s390x.go
│ │ │ ├── cpu_s390x.s
│ │ │ ├── cpu_wasm.go
│ │ │ ├── cpu_x86.go
│ │ │ ├── cpu_zos.go
│ │ │ ├── cpu_zos_s390x.go
│ │ │ ├── endian_big.go
│ │ │ ├── endian_little.go
│ │ │ ├── hwcap_linux.go
│ │ │ ├── parse.go
│ │ │ ├── proc_cpuinfo_linux.go
│ │ │ ├── runtime_auxv.go
│ │ │ ├── runtime_auxv_go121.go
│ │ │ ├── syscall_aix_gccgo.go
│ │ │ ├── syscall_aix_ppc64_gc.go
│ │ │ └── syscall_darwin_x86_gc.go
│ │ ├── plan9/
│ │ │ ├── asm.s
│ │ │ ├── asm_plan9_386.s
│ │ │ ├── asm_plan9_amd64.s
│ │ │ ├── asm_plan9_arm.s
│ │ │ ├── const_plan9.go
│ │ │ ├── dir_plan9.go
│ │ │ ├── env_plan9.go
│ │ │ ├── errors_plan9.go
│ │ │ ├── mkall.sh
│ │ │ ├── mkerrors.sh
│ │ │ ├── mksysnum_plan9.sh
│ │ │ ├── pwd_go15_plan9.go
│ │ │ ├── pwd_plan9.go
│ │ │ ├── race.go
│ │ │ ├── race0.go
│ │ │ ├── str.go
│ │ │ ├── syscall.go
│ │ │ ├── syscall_plan9.go
│ │ │ ├── zsyscall_plan9_386.go
│ │ │ ├── zsyscall_plan9_amd64.go
│ │ │ ├── zsyscall_plan9_arm.go
│ │ │ └── zsysnum_plan9.go
│ │ ├── unix/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── affinity_linux.go
│ │ │ ├── aliases.go
│ │ │ ├── asm_aix_ppc64.s
│ │ │ ├── asm_bsd_386.s
│ │ │ ├── asm_bsd_amd64.s
│ │ │ ├── asm_bsd_arm.s
│ │ │ ├── asm_bsd_arm64.s
│ │ │ ├── asm_bsd_ppc64.s
│ │ │ ├── asm_bsd_riscv64.s
│ │ │ ├── asm_linux_386.s
│ │ │ ├── asm_linux_amd64.s
│ │ │ ├── asm_linux_arm.s
│ │ │ ├── asm_linux_arm64.s
│ │ │ ├── asm_linux_loong64.s
│ │ │ ├── asm_linux_mips64x.s
│ │ │ ├── asm_linux_mipsx.s
│ │ │ ├── asm_linux_ppc64x.s
│ │ │ ├── asm_linux_riscv64.s
│ │ │ ├── asm_linux_s390x.s
│ │ │ ├── asm_openbsd_mips64.s
│ │ │ ├── asm_solaris_amd64.s
│ │ │ ├── asm_zos_s390x.s
│ │ │ ├── auxv.go
│ │ │ ├── auxv_unsupported.go
│ │ │ ├── bluetooth_linux.go
│ │ │ ├── bpxsvc_zos.go
│ │ │ ├── bpxsvc_zos.s
│ │ │ ├── cap_freebsd.go
│ │ │ ├── constants.go
│ │ │ ├── dev_aix_ppc.go
│ │ │ ├── dev_aix_ppc64.go
│ │ │ ├── dev_darwin.go
│ │ │ ├── dev_dragonfly.go
│ │ │ ├── dev_freebsd.go
│ │ │ ├── dev_linux.go
│ │ │ ├── dev_netbsd.go
│ │ │ ├── dev_openbsd.go
│ │ │ ├── dev_zos.go
│ │ │ ├── dirent.go
│ │ │ ├── endian_big.go
│ │ │ ├── endian_little.go
│ │ │ ├── env_unix.go
│ │ │ ├── fcntl.go
│ │ │ ├── fcntl_darwin.go
│ │ │ ├── fcntl_linux_32bit.go
│ │ │ ├── fdset.go
│ │ │ ├── gccgo.go
│ │ │ ├── gccgo_c.c
│ │ │ ├── gccgo_linux_amd64.go
│ │ │ ├── ifreq_linux.go
│ │ │ ├── ioctl_linux.go
│ │ │ ├── ioctl_signed.go
│ │ │ ├── ioctl_unsigned.go
│ │ │ ├── ioctl_zos.go
│ │ │ ├── mkall.sh
│ │ │ ├── mkerrors.sh
│ │ │ ├── mmap_nomremap.go
│ │ │ ├── mremap.go
│ │ │ ├── pagesize_unix.go
│ │ │ ├── pledge_openbsd.go
│ │ │ ├── ptrace_darwin.go
│ │ │ ├── ptrace_ios.go
│ │ │ ├── race.go
│ │ │ ├── race0.go
│ │ │ ├── readdirent_getdents.go
│ │ │ ├── readdirent_getdirentries.go
│ │ │ ├── sockcmsg_dragonfly.go
│ │ │ ├── sockcmsg_linux.go
│ │ │ ├── sockcmsg_unix.go
│ │ │ ├── sockcmsg_unix_other.go
│ │ │ ├── sockcmsg_zos.go
│ │ │ ├── symaddr_zos_s390x.s
│ │ │ ├── syscall.go
│ │ │ ├── syscall_aix.go
│ │ │ ├── syscall_aix_ppc.go
│ │ │ ├── syscall_aix_ppc64.go
│ │ │ ├── syscall_bsd.go
│ │ │ ├── syscall_darwin.go
│ │ │ ├── syscall_darwin_amd64.go
│ │ │ ├── syscall_darwin_arm64.go
│ │ │ ├── syscall_darwin_libSystem.go
│ │ │ ├── syscall_dragonfly.go
│ │ │ ├── syscall_dragonfly_amd64.go
│ │ │ ├── syscall_freebsd.go
│ │ │ ├── syscall_freebsd_386.go
│ │ │ ├── syscall_freebsd_amd64.go
│ │ │ ├── syscall_freebsd_arm.go
│ │ │ ├── syscall_freebsd_arm64.go
│ │ │ ├── syscall_freebsd_riscv64.go
│ │ │ ├── syscall_hurd.go
│ │ │ ├── syscall_hurd_386.go
│ │ │ ├── syscall_illumos.go
│ │ │ ├── syscall_linux.go
│ │ │ ├── syscall_linux_386.go
│ │ │ ├── syscall_linux_alarm.go
│ │ │ ├── syscall_linux_amd64.go
│ │ │ ├── syscall_linux_amd64_gc.go
│ │ │ ├── syscall_linux_arm.go
│ │ │ ├── syscall_linux_arm64.go
│ │ │ ├── syscall_linux_gc.go
│ │ │ ├── syscall_linux_gc_386.go
│ │ │ ├── syscall_linux_gc_arm.go
│ │ │ ├── syscall_linux_gccgo_386.go
│ │ │ ├── syscall_linux_gccgo_arm.go
│ │ │ ├── syscall_linux_loong64.go
│ │ │ ├── syscall_linux_mips64x.go
│ │ │ ├── syscall_linux_mipsx.go
│ │ │ ├── syscall_linux_ppc.go
│ │ │ ├── syscall_linux_ppc64x.go
│ │ │ ├── syscall_linux_riscv64.go
│ │ │ ├── syscall_linux_s390x.go
│ │ │ ├── syscall_linux_sparc64.go
│ │ │ ├── syscall_netbsd.go
│ │ │ ├── syscall_netbsd_386.go
│ │ │ ├── syscall_netbsd_amd64.go
│ │ │ ├── syscall_netbsd_arm.go
│ │ │ ├── syscall_netbsd_arm64.go
│ │ │ ├── syscall_openbsd.go
│ │ │ ├── syscall_openbsd_386.go
│ │ │ ├── syscall_openbsd_amd64.go
│ │ │ ├── syscall_openbsd_arm.go
│ │ │ ├── syscall_openbsd_arm64.go
│ │ │ ├── syscall_openbsd_libc.go
│ │ │ ├── syscall_openbsd_mips64.go
│ │ │ ├── syscall_openbsd_ppc64.go
│ │ │ ├── syscall_openbsd_riscv64.go
│ │ │ ├── syscall_solaris.go
│ │ │ ├── syscall_solaris_amd64.go
│ │ │ ├── syscall_unix.go
│ │ │ ├── syscall_unix_gc.go
│ │ │ ├── syscall_unix_gc_ppc64x.go
│ │ │ ├── syscall_zos_s390x.go
│ │ │ ├── sysvshm_linux.go
│ │ │ ├── sysvshm_unix.go
│ │ │ ├── sysvshm_unix_other.go
│ │ │ ├── timestruct.go
│ │ │ ├── unveil_openbsd.go
│ │ │ ├── vgetrandom_linux.go
│ │ │ ├── vgetrandom_unsupported.go
│ │ │ ├── xattr_bsd.go
│ │ │ ├── zerrors_aix_ppc.go
│ │ │ ├── zerrors_aix_ppc64.go
│ │ │ ├── zerrors_darwin_amd64.go
│ │ │ ├── zerrors_darwin_arm64.go
│ │ │ ├── zerrors_dragonfly_amd64.go
│ │ │ ├── zerrors_freebsd_386.go
│ │ │ ├── zerrors_freebsd_amd64.go
│ │ │ ├── zerrors_freebsd_arm.go
│ │ │ ├── zerrors_freebsd_arm64.go
│ │ │ ├── zerrors_freebsd_riscv64.go
│ │ │ ├── zerrors_linux.go
│ │ │ ├── zerrors_linux_386.go
│ │ │ ├── zerrors_linux_amd64.go
│ │ │ ├── zerrors_linux_arm.go
│ │ │ ├── zerrors_linux_arm64.go
│ │ │ ├── zerrors_linux_loong64.go
│ │ │ ├── zerrors_linux_mips.go
│ │ │ ├── zerrors_linux_mips64.go
│ │ │ ├── zerrors_linux_mips64le.go
│ │ │ ├── zerrors_linux_mipsle.go
│ │ │ ├── zerrors_linux_ppc.go
│ │ │ ├── zerrors_linux_ppc64.go
│ │ │ ├── zerrors_linux_ppc64le.go
│ │ │ ├── zerrors_linux_riscv64.go
│ │ │ ├── zerrors_linux_s390x.go
│ │ │ ├── zerrors_linux_sparc64.go
│ │ │ ├── zerrors_netbsd_386.go
│ │ │ ├── zerrors_netbsd_amd64.go
│ │ │ ├── zerrors_netbsd_arm.go
│ │ │ ├── zerrors_netbsd_arm64.go
│ │ │ ├── zerrors_openbsd_386.go
│ │ │ ├── zerrors_openbsd_amd64.go
│ │ │ ├── zerrors_openbsd_arm.go
│ │ │ ├── zerrors_openbsd_arm64.go
│ │ │ ├── zerrors_openbsd_mips64.go
│ │ │ ├── zerrors_openbsd_ppc64.go
│ │ │ ├── zerrors_openbsd_riscv64.go
│ │ │ ├── zerrors_solaris_amd64.go
│ │ │ ├── zerrors_zos_s390x.go
│ │ │ ├── zptrace_armnn_linux.go
│ │ │ ├── zptrace_linux_arm64.go
│ │ │ ├── zptrace_mipsnn_linux.go
│ │ │ ├── zptrace_mipsnnle_linux.go
│ │ │ ├── zptrace_x86_linux.go
│ │ │ ├── zsymaddr_zos_s390x.s
│ │ │ ├── zsyscall_aix_ppc.go
│ │ │ ├── zsyscall_aix_ppc64.go
│ │ │ ├── zsyscall_aix_ppc64_gc.go
│ │ │ ├── zsyscall_aix_ppc64_gccgo.go
│ │ │ ├── zsyscall_darwin_amd64.go
│ │ │ ├── zsyscall_darwin_amd64.s
│ │ │ ├── zsyscall_darwin_arm64.go
│ │ │ ├── zsyscall_darwin_arm64.s
│ │ │ ├── zsyscall_dragonfly_amd64.go
│ │ │ ├── zsyscall_freebsd_386.go
│ │ │ ├── zsyscall_freebsd_amd64.go
│ │ │ ├── zsyscall_freebsd_arm.go
│ │ │ ├── zsyscall_freebsd_arm64.go
│ │ │ ├── zsyscall_freebsd_riscv64.go
│ │ │ ├── zsyscall_illumos_amd64.go
│ │ │ ├── zsyscall_linux.go
│ │ │ ├── zsyscall_linux_386.go
│ │ │ ├── zsyscall_linux_amd64.go
│ │ │ ├── zsyscall_linux_arm.go
│ │ │ ├── zsyscall_linux_arm64.go
│ │ │ ├── zsyscall_linux_loong64.go
│ │ │ ├── zsyscall_linux_mips.go
│ │ │ ├── zsyscall_linux_mips64.go
│ │ │ ├── zsyscall_linux_mips64le.go
│ │ │ ├── zsyscall_linux_mipsle.go
│ │ │ ├── zsyscall_linux_ppc.go
│ │ │ ├── zsyscall_linux_ppc64.go
│ │ │ ├── zsyscall_linux_ppc64le.go
│ │ │ ├── zsyscall_linux_riscv64.go
│ │ │ ├── zsyscall_linux_s390x.go
│ │ │ ├── zsyscall_linux_sparc64.go
│ │ │ ├── zsyscall_netbsd_386.go
│ │ │ ├── zsyscall_netbsd_amd64.go
│ │ │ ├── zsyscall_netbsd_arm.go
│ │ │ ├── zsyscall_netbsd_arm64.go
│ │ │ ├── zsyscall_openbsd_386.go
│ │ │ ├── zsyscall_openbsd_386.s
│ │ │ ├── zsyscall_openbsd_amd64.go
│ │ │ ├── zsyscall_openbsd_amd64.s
│ │ │ ├── zsyscall_openbsd_arm.go
│ │ │ ├── zsyscall_openbsd_arm.s
│ │ │ ├── zsyscall_openbsd_arm64.go
│ │ │ ├── zsyscall_openbsd_arm64.s
│ │ │ ├── zsyscall_openbsd_mips64.go
│ │ │ ├── zsyscall_openbsd_mips64.s
│ │ │ ├── zsyscall_openbsd_ppc64.go
│ │ │ ├── zsyscall_openbsd_ppc64.s
│ │ │ ├── zsyscall_openbsd_riscv64.go
│ │ │ ├── zsyscall_openbsd_riscv64.s
│ │ │ ├── zsyscall_solaris_amd64.go
│ │ │ ├── zsyscall_zos_s390x.go
│ │ │ ├── zsysctl_openbsd_386.go
│ │ │ ├── zsysctl_openbsd_amd64.go
│ │ │ ├── zsysctl_openbsd_arm.go
│ │ │ ├── zsysctl_openbsd_arm64.go
│ │ │ ├── zsysctl_openbsd_mips64.go
│ │ │ ├── zsysctl_openbsd_ppc64.go
│ │ │ ├── zsysctl_openbsd_riscv64.go
│ │ │ ├── zsysnum_darwin_amd64.go
│ │ │ ├── zsysnum_darwin_arm64.go
│ │ │ ├── zsysnum_dragonfly_amd64.go
│ │ │ ├── zsysnum_freebsd_386.go
│ │ │ ├── zsysnum_freebsd_amd64.go
│ │ │ ├── zsysnum_freebsd_arm.go
│ │ │ ├── zsysnum_freebsd_arm64.go
│ │ │ ├── zsysnum_freebsd_riscv64.go
│ │ │ ├── zsysnum_linux_386.go
│ │ │ ├── zsysnum_linux_amd64.go
│ │ │ ├── zsysnum_linux_arm.go
│ │ │ ├── zsysnum_linux_arm64.go
│ │ │ ├── zsysnum_linux_loong64.go
│ │ │ ├── zsysnum_linux_mips.go
│ │ │ ├── zsysnum_linux_mips64.go
│ │ │ ├── zsysnum_linux_mips64le.go
│ │ │ ├── zsysnum_linux_mipsle.go
│ │ │ ├── zsysnum_linux_ppc.go
│ │ │ ├── zsysnum_linux_ppc64.go
│ │ │ ├── zsysnum_linux_ppc64le.go
│ │ │ ├── zsysnum_linux_riscv64.go
│ │ │ ├── zsysnum_linux_s390x.go
│ │ │ ├── zsysnum_linux_sparc64.go
│ │ │ ├── zsysnum_netbsd_386.go
│ │ │ ├── zsysnum_netbsd_amd64.go
│ │ │ ├── zsysnum_netbsd_arm.go
│ │ │ ├── zsysnum_netbsd_arm64.go
│ │ │ ├── zsysnum_openbsd_386.go
│ │ │ ├── zsysnum_openbsd_amd64.go
│ │ │ ├── zsysnum_openbsd_arm.go
│ │ │ ├── zsysnum_openbsd_arm64.go
│ │ │ ├── zsysnum_openbsd_mips64.go
│ │ │ ├── zsysnum_openbsd_ppc64.go
│ │ │ ├── zsysnum_openbsd_riscv64.go
│ │ │ ├── zsysnum_zos_s390x.go
│ │ │ ├── ztypes_aix_ppc.go
│ │ │ ├── ztypes_aix_ppc64.go
│ │ │ ├── ztypes_darwin_amd64.go
│ │ │ ├── ztypes_darwin_arm64.go
│ │ │ ├── ztypes_dragonfly_amd64.go
│ │ │ ├── ztypes_freebsd_386.go
│ │ │ ├── ztypes_freebsd_amd64.go
│ │ │ ├── ztypes_freebsd_arm.go
│ │ │ ├── ztypes_freebsd_arm64.go
│ │ │ ├── ztypes_freebsd_riscv64.go
│ │ │ ├── ztypes_linux.go
│ │ │ ├── ztypes_linux_386.go
│ │ │ ├── ztypes_linux_amd64.go
│ │ │ ├── ztypes_linux_arm.go
│ │ │ ├── ztypes_linux_arm64.go
│ │ │ ├── ztypes_linux_loong64.go
│ │ │ ├── ztypes_linux_mips.go
│ │ │ ├── ztypes_linux_mips64.go
│ │ │ ├── ztypes_linux_mips64le.go
│ │ │ ├── ztypes_linux_mipsle.go
│ │ │ ├── ztypes_linux_ppc.go
│ │ │ ├── ztypes_linux_ppc64.go
│ │ │ ├── ztypes_linux_ppc64le.go
│ │ │ ├── ztypes_linux_riscv64.go
│ │ │ ├── ztypes_linux_s390x.go
│ │ │ ├── ztypes_linux_sparc64.go
│ │ │ ├── ztypes_netbsd_386.go
│ │ │ ├── ztypes_netbsd_amd64.go
│ │ │ ├── ztypes_netbsd_arm.go
│ │ │ ├── ztypes_netbsd_arm64.go
│ │ │ ├── ztypes_openbsd_386.go
│ │ │ ├── ztypes_openbsd_amd64.go
│ │ │ ├── ztypes_openbsd_arm.go
│ │ │ ├── ztypes_openbsd_arm64.go
│ │ │ ├── ztypes_openbsd_mips64.go
│ │ │ ├── ztypes_openbsd_ppc64.go
│ │ │ ├── ztypes_openbsd_riscv64.go
│ │ │ ├── ztypes_solaris_amd64.go
│ │ │ └── ztypes_zos_s390x.go
│ │ └── windows/
│ │ ├── aliases.go
│ │ ├── dll_windows.go
│ │ ├── env_windows.go
│ │ ├── eventlog.go
│ │ ├── exec_windows.go
│ │ ├── memory_windows.go
│ │ ├── mkerrors.bash
│ │ ├── mkknownfolderids.bash
│ │ ├── mksyscall.go
│ │ ├── race.go
│ │ ├── race0.go
│ │ ├── security_windows.go
│ │ ├── service.go
│ │ ├── setupapi_windows.go
│ │ ├── str.go
│ │ ├── syscall.go
│ │ ├── syscall_windows.go
│ │ ├── types_windows.go
│ │ ├── types_windows_386.go
│ │ ├── types_windows_amd64.go
│ │ ├── types_windows_arm.go
│ │ ├── types_windows_arm64.go
│ │ ├── zerrors_windows.go
│ │ ├── zknownfolderids_windows.go
│ │ └── zsyscall_windows.go
│ ├── term/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ ├── README.md
│ │ ├── codereview.cfg
│ │ ├── term.go
│ │ ├── term_plan9.go
│ │ ├── term_unix.go
│ │ ├── term_unix_bsd.go
│ │ ├── term_unix_other.go
│ │ ├── term_unsupported.go
│ │ ├── term_windows.go
│ │ └── terminal.go
│ └── text/
│ ├── LICENSE
│ ├── PATENTS
│ ├── encoding/
│ │ ├── charmap/
│ │ │ ├── charmap.go
│ │ │ └── tables.go
│ │ ├── encoding.go
│ │ ├── internal/
│ │ │ ├── identifier/
│ │ │ │ ├── identifier.go
│ │ │ │ └── mib.go
│ │ │ └── internal.go
│ │ ├── japanese/
│ │ │ ├── all.go
│ │ │ ├── eucjp.go
│ │ │ ├── iso2022jp.go
│ │ │ ├── shiftjis.go
│ │ │ └── tables.go
│ │ ├── korean/
│ │ │ ├── euckr.go
│ │ │ └── tables.go
│ │ ├── simplifiedchinese/
│ │ │ ├── all.go
│ │ │ ├── gbk.go
│ │ │ ├── hzgb2312.go
│ │ │ └── tables.go
│ │ ├── traditionalchinese/
│ │ │ ├── big5.go
│ │ │ └── tables.go
│ │ └── unicode/
│ │ ├── override.go
│ │ └── unicode.go
│ ├── internal/
│ │ └── utf8internal/
│ │ └── utf8internal.go
│ ├── runes/
│ │ ├── cond.go
│ │ └── runes.go
│ └── transform/
│ └── transform.go
├── gopkg.in/
│ ├── natefinch/
│ │ └── lumberjack.v2/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── chown.go
│ │ ├── chown_linux.go
│ │ └── lumberjack.go
│ └── yaml.v3/
│ ├── LICENSE
│ ├── NOTICE
│ ├── README.md
│ ├── apic.go
│ ├── decode.go
│ ├── emitterc.go
│ ├── encode.go
│ ├── parserc.go
│ ├── readerc.go
│ ├── resolve.go
│ ├── scannerc.go
│ ├── sorter.go
│ ├── writerc.go
│ ├── yaml.go
│ ├── yamlh.go
│ └── yamlprivateh.go
└── modules.txt
Showing preview only (6,872K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (83352 symbols across 1544 files)
FILE: go/base/context.go
type RowsEstimateMethod (line 30) | type RowsEstimateMethod
constant TableStatusRowsEstimate (line 33) | TableStatusRowsEstimate RowsEstimateMethod = "TableStatusRowsEstimate"
constant ExplainRowsEstimate (line 34) | ExplainRowsEstimate RowsEstimateMethod = "ExplainRowsEstimate"
constant CountRowsEstimate (line 35) | CountRowsEstimate RowsEstimateMethod = "CountRowsEstimate"
type CutOver (line 38) | type CutOver
constant CutOverAtomic (line 41) | CutOverAtomic CutOver = iota
constant CutOverTwoStep (line 42) | CutOverTwoStep
type ThrottleReasonHint (line 45) | type ThrottleReasonHint
constant NoThrottleReasonHint (line 48) | NoThrottleReasonHint ThrottleReasonHint = "NoThrottleRea...
constant UserCommandThrottleReasonHint (line 49) | UserCommandThrottleReasonHint ThrottleReasonHint = "UserCommandTh...
constant LeavingHibernationThrottleReasonHint (line 50) | LeavingHibernationThrottleReasonHint ThrottleReasonHint = "LeavingHibern...
constant HTTPStatusOK (line 54) | HTTPStatusOK = 200
constant MaxEventsBatchSize (line 55) | MaxEventsBatchSize = 1000
constant ETAUnknown (line 56) | ETAUnknown = math.MinInt64
type ThrottleCheckResult (line 63) | type ThrottleCheckResult struct
function NewThrottleCheckResult (line 69) | func NewThrottleCheckResult(throttle bool, reason string, reasonHint Thr...
type MigrationContext (line 79) | type MigrationContext struct
method SetConnectionConfig (line 335) | func (this *MigrationContext) SetConnectionConfig(storageEngine string...
method SetConnectionCharset (line 348) | func (this *MigrationContext) SetConnectionCharset(charset string) {
method GetGhostTableName (line 368) | func (this *MigrationContext) GetGhostTableName() string {
method GetOldTableName (line 381) | func (this *MigrationContext) GetOldTableName() string {
method GetChangelogTableName (line 405) | func (this *MigrationContext) GetChangelogTableName() string {
method GetCheckpointTableName (line 414) | func (this *MigrationContext) GetCheckpointTableName() string {
method GetVoluntaryLockName (line 424) | func (this *MigrationContext) GetVoluntaryLockName() string {
method RequiresBinlogFormatChange (line 429) | func (this *MigrationContext) RequiresBinlogFormatChange() bool {
method GetApplierHostname (line 434) | func (this *MigrationContext) GetApplierHostname() string {
method GetInspectorHostname (line 445) | func (this *MigrationContext) GetInspectorHostname() string {
method InspectorIsAlsoApplier (line 458) | func (this *MigrationContext) InspectorIsAlsoApplier() bool {
method HasMigrationRange (line 464) | func (this *MigrationContext) HasMigrationRange() bool {
method SetCutOverLockTimeoutSeconds (line 468) | func (this *MigrationContext) SetCutOverLockTimeoutSeconds(timeoutSeco...
method SetExponentialBackoffMaxInterval (line 479) | func (this *MigrationContext) SetExponentialBackoffMaxInterval(interva...
method SetDefaultNumRetries (line 487) | func (this *MigrationContext) SetDefaultNumRetries(retries int64) {
method MaxRetries (line 495) | func (this *MigrationContext) MaxRetries() int64 {
method IsTransactionalTable (line 502) | func (this *MigrationContext) IsTransactionalTable() bool {
method SetCountTableRowsCancelFunc (line 521) | func (this *MigrationContext) SetCountTableRowsCancelFunc(f func()) {
method IsCountingTableRows (line 529) | func (this *MigrationContext) IsCountingTableRows() bool {
method CancelTableRowsCount (line 538) | func (this *MigrationContext) CancelTableRowsCount() {
method ElapsedTime (line 551) | func (this *MigrationContext) ElapsedTime() time.Duration {
method MarkRowCopyStartTime (line 556) | func (this *MigrationContext) MarkRowCopyStartTime() {
method ElapsedRowCopyTime (line 563) | func (this *MigrationContext) ElapsedRowCopyTime() time.Duration {
method MarkRowCopyEndTime (line 579) | func (this *MigrationContext) MarkRowCopyEndTime() {
method TimeSinceLastHeartbeatOnChangelog (line 585) | func (this *MigrationContext) TimeSinceLastHeartbeatOnChangelog() time...
method GetCurrentLagDuration (line 589) | func (this *MigrationContext) GetCurrentLagDuration() time.Duration {
method GetProgressPct (line 593) | func (this *MigrationContext) GetProgressPct() float64 {
method SetProgressPct (line 597) | func (this *MigrationContext) SetProgressPct(progressPct float64) {
method GetETADuration (line 601) | func (this *MigrationContext) GetETADuration() time.Duration {
method SetETADuration (line 605) | func (this *MigrationContext) SetETADuration(etaDuration time.Duration) {
method GetETASeconds (line 609) | func (this *MigrationContext) GetETASeconds() int64 {
method GetTotalRowsCopied (line 621) | func (this *MigrationContext) GetTotalRowsCopied() int64 {
method GetIteration (line 625) | func (this *MigrationContext) GetIteration() int64 {
method SetNextIterationRangeMinValues (line 629) | func (this *MigrationContext) SetNextIterationRangeMinValues() {
method MarkPointOfInterest (line 636) | func (this *MigrationContext) MarkPointOfInterest() int64 {
method TimeSincePointOfInterest (line 644) | func (this *MigrationContext) TimeSincePointOfInterest() time.Duration {
method SetLastHeartbeatOnChangelogTime (line 651) | func (this *MigrationContext) SetLastHeartbeatOnChangelogTime(t time.T...
method GetLastHeartbeatOnChangelogTime (line 658) | func (this *MigrationContext) GetLastHeartbeatOnChangelogTime() time.T...
method SetHeartbeatIntervalMilliseconds (line 665) | func (this *MigrationContext) SetHeartbeatIntervalMilliseconds(heartbe...
method SetMaxLagMillisecondsThrottleThreshold (line 675) | func (this *MigrationContext) SetMaxLagMillisecondsThrottleThreshold(m...
method SetChunkSize (line 682) | func (this *MigrationContext) SetChunkSize(chunkSize int64) {
method SetDMLBatchSize (line 692) | func (this *MigrationContext) SetDMLBatchSize(batchSize int64) {
method SetThrottleGeneralCheckResult (line 702) | func (this *MigrationContext) SetThrottleGeneralCheckResult(checkResul...
method GetThrottleGeneralCheckResult (line 709) | func (this *MigrationContext) GetThrottleGeneralCheckResult() *Throttl...
method SetThrottled (line 716) | func (this *MigrationContext) SetThrottled(throttle bool, reason strin...
method IsThrottled (line 724) | func (this *MigrationContext) IsThrottled() (bool, string, ThrottleRea...
method GetThrottleQuery (line 740) | func (this *MigrationContext) GetThrottleQuery() string {
method SetThrottleQuery (line 748) | func (this *MigrationContext) SetThrottleQuery(newQuery string) {
method GetThrottleHTTP (line 755) | func (this *MigrationContext) GetThrottleHTTP() string {
method SetThrottleHTTP (line 763) | func (this *MigrationContext) SetThrottleHTTP(throttleHTTP string) {
method SetIgnoreHTTPErrors (line 770) | func (this *MigrationContext) SetIgnoreHTTPErrors(ignoreHTTPErrors boo...
method GetMaxLoad (line 777) | func (this *MigrationContext) GetMaxLoad() LoadMap {
method GetCriticalLoad (line 784) | func (this *MigrationContext) GetCriticalLoad() LoadMap {
method GetNiceRatio (line 791) | func (this *MigrationContext) GetNiceRatio() float64 {
method SetNiceRatio (line 798) | func (this *MigrationContext) SetNiceRatio(newRatio float64) {
method GetRecentBinlogCoordinates (line 811) | func (this *MigrationContext) GetRecentBinlogCoordinates() mysql.Binlo...
method SetRecentBinlogCoordinates (line 818) | func (this *MigrationContext) SetRecentBinlogCoordinates(coordinates m...
method ReadMaxLoad (line 827) | func (this *MigrationContext) ReadMaxLoad(maxLoadList string) error {
method ReadCriticalLoad (line 842) | func (this *MigrationContext) ReadCriticalLoad(criticalLoadList string...
method GetControlReplicasLagResult (line 854) | func (this *MigrationContext) GetControlReplicasLagResult() mysql.Repl...
method SetControlReplicasLagResult (line 862) | func (this *MigrationContext) SetControlReplicasLagResult(lagResult *m...
method GetThrottleControlReplicaKeys (line 872) | func (this *MigrationContext) GetThrottleControlReplicaKeys() *mysql.I...
method ReadThrottleControlReplicaKeys (line 881) | func (this *MigrationContext) ReadThrottleControlReplicaKeys(throttleC...
method AddThrottleControlReplicaKey (line 894) | func (this *MigrationContext) AddThrottleControlReplicaKey(key mysql.I...
method ApplyCredentials (line 903) | func (this *MigrationContext) ApplyCredentials() {
method SetupTLS (line 923) | func (this *MigrationContext) SetupTLS() error {
method ReadConfigFile (line 931) | func (this *MigrationContext) ReadConfigFile() error {
method GetGhostTriggerName (line 987) | func (this *MigrationContext) GetGhostTriggerName(triggerName string) ...
method ValidateGhostTriggerLengthBelowMaxLength (line 997) | func (this *MigrationContext) ValidateGhostTriggerLengthBelowMaxLength...
method GetContext (line 1002) | func (this *MigrationContext) GetContext() context.Context {
method SetAbortError (line 1008) | func (this *MigrationContext) SetAbortError(err error) {
method GetAbortError (line 1017) | func (this *MigrationContext) GetAbortError() error {
method CancelContext (line 1025) | func (this *MigrationContext) CancelContext() {
type Logger (line 276) | type Logger interface
type ContextConfig (line 293) | type ContextConfig struct
function NewMigrationContext (line 306) | func NewMigrationContext() *MigrationContext {
function getSafeTableName (line 357) | func getSafeTableName(baseName string, suffix string) string {
function SendWithContext (line 1043) | func SendWithContext[T any](ctx context.Context, ch chan<- T, val T) err...
FILE: go/base/context_test.go
function init (line 20) | func init() {
function TestGetTableNames (line 24) | func TestGetTableNames(t *testing.T) {
function TestGetTriggerNames (line 64) | func TestGetTriggerNames(t *testing.T) {
function TestValidateGhostTriggerLengthBelowMaxLength (line 90) | func TestValidateGhostTriggerLengthBelowMaxLength(t *testing.T) {
function TestReadConfigFile (line 157) | func TestReadConfigFile(t *testing.T) {
function TestSetAbortError_StoresFirstError (line 219) | func TestSetAbortError_StoresFirstError(t *testing.T) {
function TestSetAbortError_ThreadSafe (line 234) | func TestSetAbortError_ThreadSafe(t *testing.T) {
FILE: go/base/default_logger.go
type simpleLogger (line 12) | type simpleLogger struct
method Debug (line 18) | func (*simpleLogger) Debug(args ...interface{}) {
method Debugf (line 22) | func (*simpleLogger) Debugf(format string, args ...interface{}) {
method Info (line 26) | func (*simpleLogger) Info(args ...interface{}) {
method Infof (line 30) | func (*simpleLogger) Infof(format string, args ...interface{}) {
method Warning (line 34) | func (*simpleLogger) Warning(args ...interface{}) error {
method Warningf (line 38) | func (*simpleLogger) Warningf(format string, args ...interface{}) error {
method Error (line 42) | func (*simpleLogger) Error(args ...interface{}) error {
method Errorf (line 46) | func (*simpleLogger) Errorf(format string, args ...interface{}) error {
method Errore (line 50) | func (*simpleLogger) Errore(err error) error {
method Fatal (line 54) | func (*simpleLogger) Fatal(args ...interface{}) error {
method Fatalf (line 58) | func (*simpleLogger) Fatalf(format string, args ...interface{}) error {
method Fatale (line 62) | func (*simpleLogger) Fatale(err error) error {
method SetLevel (line 66) | func (*simpleLogger) SetLevel(level log.LogLevel) {
method SetPrintStackTrace (line 70) | func (*simpleLogger) SetPrintStackTrace(printStackTraceFlag bool) {
function NewDefaultLogger (line 14) | func NewDefaultLogger() *simpleLogger {
FILE: go/base/load_map.go
type LoadMap (line 17) | type LoadMap
method Duplicate (line 54) | func (this *LoadMap) Duplicate() LoadMap {
method String (line 63) | func (this *LoadMap) String() string {
function NewLoadMap (line 19) | func NewLoadMap() LoadMap {
function ParseLoadMap (line 28) | func ParseLoadMap(loadList string) (LoadMap, error) {
FILE: go/base/load_map_test.go
function init (line 15) | func init() {
function TestParseLoadMap (line 19) | func TestParseLoadMap(t *testing.T) {
function TestString (line 46) | func TestString(t *testing.T) {
FILE: go/base/utils.go
function PrettifyDurationOutput (line 24) | func PrettifyDurationOutput(d time.Duration) string {
function FileExists (line 31) | func FileExists(fileName string) bool {
function TouchFile (line 38) | func TouchFile(fileName string) error {
function StringContainsAll (line 48) | func StringContainsAll(s string, substrings ...string) bool {
function ValidateConnection (line 64) | func ValidateConnection(db *gosql.DB, connectionConfig *mysql.Connection...
FILE: go/base/utils_test.go
function init (line 15) | func init() {
function TestStringContainsAll (line 19) | func TestStringContainsAll(t *testing.T) {
FILE: go/binlog/binlog_dml_event.go
type EventDML (line 15) | type EventDML
constant NotDML (line 18) | NotDML EventDML = "NoDML"
constant InsertDML (line 19) | InsertDML EventDML = "Insert"
constant UpdateDML (line 20) | UpdateDML EventDML = "Update"
constant DeleteDML (line 21) | DeleteDML EventDML = "Delete"
function ToEventDML (line 24) | func ToEventDML(description string) EventDML {
type BinlogDMLEvent (line 48) | type BinlogDMLEvent struct
method String (line 65) | func (this *BinlogDMLEvent) String() string {
function NewBinlogDMLEvent (line 56) | func NewBinlogDMLEvent(databaseName, tableName string, dml EventDML) *Bi...
FILE: go/binlog/binlog_entry.go
type BinlogEntry (line 15) | type BinlogEntry struct
method String (line 29) | func (this *BinlogEntry) String() string {
function NewBinlogEntryAt (line 21) | func NewBinlogEntryAt(coordinates mysql.BinlogCoordinates) *BinlogEntry {
FILE: go/binlog/binlog_reader.go
type BinlogReader (line 10) | type BinlogReader interface
FILE: go/binlog/gomysql_reader.go
type GoMySQLReader (line 24) | type GoMySQLReader struct
method ConnectBinlogStreamer (line 58) | func (this *GoMySQLReader) ConnectBinlogStreamer(coordinates mysql.Bin...
method GetCurrentBinlogCoordinates (line 82) | func (this *GoMySQLReader) GetCurrentBinlogCoordinates() mysql.BinlogC...
method handleRowsEvent (line 88) | func (this *GoMySQLReader) handleRowsEvent(ev *replication.BinlogEvent...
method StreamEvents (line 132) | func (this *GoMySQLReader) StreamEvents(canStopStreaming func() bool, ...
method Close (line 203) | func (this *GoMySQLReader) Close() error {
function NewGoMySQLReader (line 36) | func NewGoMySQLReader(migrationContext *base.MigrationContext) *GoMySQLR...
FILE: go/cmd/gh-ost/main.go
function acceptSignals (line 29) | func acceptSignals(migrationContext *base.MigrationContext) {
function main (line 49) | func main() {
FILE: go/logic/applier.go
constant GhostChangelogTableComment (line 33) | GhostChangelogTableComment = "gh-ost changelog"
constant atomicCutOverMagicHint (line 34) | atomicCutOverMagicHint = "ghost-cut-over-sentry"
type dmlBuildResult (line 40) | type dmlBuildResult struct
function newDmlBuildResult (line 47) | func newDmlBuildResult(query string, args []interface{}, rowsDelta int64...
function newDmlBuildResultError (line 56) | func newDmlBuildResultError(err error) *dmlBuildResult {
type Applier (line 67) | type Applier struct
method compileMigrationKeyWarningRegex (line 101) | func (this *Applier) compileMigrationKeyWarningRegex() (*regexp.Regexp...
method InitDBConnections (line 112) | func (this *Applier) InitDBConnections() (err error) {
method prepareQueries (line 148) | func (this *Applier) prepareQueries() (err error) {
method validateAndReadGlobalVariables (line 189) | func (this *Applier) validateAndReadGlobalVariables() error {
method generateSqlModeQuery (line 206) | func (this *Applier) generateSqlModeQuery() string {
method generateInstantDDLQuery (line 221) | func (this *Applier) generateInstantDDLQuery() string {
method readTableColumns (line 230) | func (this *Applier) readTableColumns() (err error) {
method showTableStatus (line 240) | func (this *Applier) showTableStatus(tableName string) (rowMap sqlutil...
method tableExists (line 250) | func (this *Applier) tableExists(tableName string) (tableFound bool) {
method ValidateOrDropExistingTables (line 257) | func (this *Applier) ValidateOrDropExistingTables() error {
method AttemptInstantDDL (line 295) | func (this *Applier) AttemptInstantDDL() error {
method CreateGhostTable (line 338) | func (this *Applier) CreateGhostTable() error {
method AlterGhost (line 379) | func (this *Applier) AlterGhost() error {
method AlterGhostAutoIncrement (line 420) | func (this *Applier) AlterGhostAutoIncrement() error {
method CreateChangelogTable (line 439) | func (this *Applier) CreateChangelogTable() error {
method CreateCheckpointTable (line 469) | func (this *Applier) CreateCheckpointTable() error {
method dropTable (line 510) | func (this *Applier) dropTable(tableName string) error {
method StateMetadataLockInstrument (line 528) | func (this *Applier) StateMetadataLockInstrument() error {
method DropTriggersFromGhost (line 555) | func (this *Applier) DropTriggersFromGhost() error {
method createTriggers (line 571) | func (this *Applier) createTriggers(tableName string) error {
method CreateTriggersOnGhost (line 599) | func (this *Applier) CreateTriggersOnGhost() error {
method DropChangelogTable (line 605) | func (this *Applier) DropChangelogTable() error {
method DropCheckpointTable (line 610) | func (this *Applier) DropCheckpointTable() error {
method DropOldTable (line 615) | func (this *Applier) DropOldTable() error {
method DropGhostTable (line 620) | func (this *Applier) DropGhostTable() error {
method WriteChangelog (line 626) | func (this *Applier) WriteChangelog(hint, value string) (string, error) {
method WriteAndLogChangelog (line 653) | func (this *Applier) WriteAndLogChangelog(hint, value string) (string,...
method WriteChangelogState (line 658) | func (this *Applier) WriteChangelogState(value string) (string, error) {
method WriteCheckpoint (line 663) | func (this *Applier) WriteCheckpoint(chk *Checkpoint) (int64, error) {
method ReadLastCheckpoint (line 680) | func (this *Applier) ReadLastCheckpoint() (*Checkpoint, error) {
method InitiateHeartbeat (line 718) | func (this *Applier) InitiateHeartbeat() {
method ExecuteThrottleQuery (line 767) | func (this *Applier) ExecuteThrottleQuery() (int64, error) {
method readMigrationMinValues (line 781) | func (this *Applier) readMigrationMinValues(tx *gosql.Tx, uniqueKey *s...
method readMigrationMaxValues (line 806) | func (this *Applier) readMigrationMaxValues(tx *gosql.Tx, uniqueKey *s...
method ReadMigrationRangeValues (line 847) | func (this *Applier) ReadMigrationRangeValues() error {
method CalculateNextIterationRangeEndValues (line 872) | func (this *Applier) CalculateNextIterationRangeEndValues() (hasFurthe...
method ApplyIterationInsertQuery (line 919) | func (this *Applier) ApplyIterationInsertQuery() (chunkSize int64, row...
method LockOriginalTable (line 1014) | func (this *Applier) LockOriginalTable() error {
method UnlockTables (line 1032) | func (this *Applier) UnlockTables() error {
method SwapTablesQuickAndBumpy (line 1046) | func (this *Applier) SwapTablesQuickAndBumpy() error {
method RenameTablesRollback (line 1074) | func (this *Applier) RenameTablesRollback() (renameError error) {
method StopSlaveIOThread (line 1118) | func (this *Applier) StopSlaveIOThread() error {
method StartSlaveIOThread (line 1130) | func (this *Applier) StartSlaveIOThread() error {
method StopSlaveSQLThread (line 1142) | func (this *Applier) StopSlaveSQLThread() error {
method StartSlaveSQLThread (line 1154) | func (this *Applier) StartSlaveSQLThread() error {
method StopReplication (line 1166) | func (this *Applier) StopReplication() error {
method StartReplication (line 1183) | func (this *Applier) StartReplication() error {
method GetSessionLockName (line 1195) | func (this *Applier) GetSessionLockName(sessionId int64) string {
method ExpectUsedLock (line 1200) | func (this *Applier) ExpectUsedLock(sessionId int64) error {
method ExpectProcess (line 1212) | func (this *Applier) ExpectProcess(sessionId int64, stateHint, infoHin...
method DropAtomicCutOverSentryTableIfExists (line 1238) | func (this *Applier) DropAtomicCutOverSentryTableIfExists() error {
method CreateAtomicCutOverSentryTable (line 1254) | func (this *Applier) CreateAtomicCutOverSentryTable() error {
method InitAtomicCutOverWaitTimeout (line 1283) | func (this *Applier) InitAtomicCutOverWaitTimeout(tx *gosql.Tx) error {
method RevertAtomicCutOverWaitTimeout (line 1292) | func (this *Applier) RevertAtomicCutOverWaitTimeout() {
method AtomicCutOverMagicLock (line 1303) | func (this *Applier) AtomicCutOverMagicLock(sessionIdChan chan int64, ...
method AtomicCutoverRename (line 1426) | func (this *Applier) AtomicCutoverRename(sessionIdChan chan int64, tab...
method ShowStatusVariable (line 1468) | func (this *Applier) ShowStatusVariable(variableName string) (result i...
method updateModifiesUniqueKeyColumns (line 1479) | func (this *Applier) updateModifiesUniqueKeyColumns(dmlEvent *binlog.B...
method buildDMLEventQuery (line 1494) | func (this *Applier) buildDMLEventQuery(dmlEvent *binlog.BinlogDMLEven...
method ApplyDMLEventQueries (line 1526) | func (this *Applier) ApplyDMLEventQueries(dmlEvents [](*binlog.BinlogD...
method Teardown (line 1661) | func (this *Applier) Teardown() {
method ExpectMetadataLock (line 1668) | func (this *Applier) ExpectMetadataLock(sessionId int64) error {
function NewApplier (line 88) | func NewApplier(migrationContext *base.MigrationContext) *Applier {
function retryOnLockWaitTimeout (line 317) | func retryOnLockWaitTimeout(operation func() error, logger base.Logger) ...
FILE: go/logic/applier_test.go
function TestApplierGenerateSqlModeQuery (line 31) | func TestApplierGenerateSqlModeQuery(t *testing.T) {
function TestApplierUpdateModifiesUniqueKeyColumns (line 67) | func TestApplierUpdateModifiesUniqueKeyColumns(t *testing.T) {
function TestApplierBuildDMLEventQuery (line 103) | func TestApplierBuildDMLEventQuery(t *testing.T) {
function TestApplierInstantDDL (line 190) | func TestApplierInstantDDL(t *testing.T) {
function TestRetryOnLockWaitTimeout (line 204) | func TestRetryOnLockWaitTimeout(t *testing.T) {
type ApplierTestSuite (line 269) | type ApplierTestSuite struct
method SetupSuite (line 276) | func (suite *ApplierTestSuite) SetupSuite() {
method TeardownSuite (line 298) | func (suite *ApplierTestSuite) TeardownSuite() {
method SetupTest (line 303) | func (suite *ApplierTestSuite) SetupTest() {
method TearDownTest (line 309) | func (suite *ApplierTestSuite) TearDownTest() {
method TestInitDBConnections (line 318) | func (suite *ApplierTestSuite) TestInitDBConnections() {
method TestApplyDMLEventQueries (line 347) | func (suite *ApplierTestSuite) TestApplyDMLEventQueries() {
method TestValidateOrDropExistingTables (line 412) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTables() {
method TestValidateOrDropExistingTablesWithGhostTableExisting (line 441) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTablesWithGho...
method TestValidateOrDropExistingTablesWithGhostTableExistingAndInitiallyDropGhostTableSet (line 474) | func (suite *ApplierTestSuite) TestValidateOrDropExistingTablesWithGho...
method TestCreateGhostTable (line 511) | func (suite *ApplierTestSuite) TestCreateGhostTable() {
method TestPanicOnWarningsInApplyIterationInsertQuerySucceedsWithUniqueKeyWarningInsertedByDMLEvent (line 556) | func (suite *ApplierTestSuite) TestPanicOnWarningsInApplyIterationInse...
method TestPanicOnWarningsInApplyIterationInsertQueryFailsWithTruncationWarning (line 647) | func (suite *ApplierTestSuite) TestPanicOnWarningsInApplyIterationInse...
method TestWriteCheckpoint (line 705) | func (suite *ApplierTestSuite) TestWriteCheckpoint() {
method TestPanicOnWarningsWithDuplicateKeyOnNonMigrationIndex (line 793) | func (suite *ApplierTestSuite) TestPanicOnWarningsWithDuplicateKeyOnNo...
method TestPanicOnWarningsWithDuplicateCompositeUniqueKey (line 882) | func (suite *ApplierTestSuite) TestPanicOnWarningsWithDuplicateComposi...
method TestUpdateModifyingUniqueKeyWithDuplicateOnOtherIndex (line 984) | func (suite *ApplierTestSuite) TestUpdateModifyingUniqueKeyWithDuplica...
method TestNormalUpdateWithPanicOnWarnings (line 1079) | func (suite *ApplierTestSuite) TestNormalUpdateWithPanicOnWarnings() {
method TestDuplicateOnMigrationKeyAllowedInBinlogReplay (line 1159) | func (suite *ApplierTestSuite) TestDuplicateOnMigrationKeyAllowedInBin...
method TestRegexMetacharactersInIndexName (line 1249) | func (suite *ApplierTestSuite) TestRegexMetacharactersInIndexName() {
method TestPanicOnWarningsDisabled (line 1351) | func (suite *ApplierTestSuite) TestPanicOnWarningsDisabled() {
function TestApplier (line 1438) | func TestApplier(t *testing.T) {
FILE: go/logic/checkpoint.go
type Checkpoint (line 16) | type Checkpoint struct
FILE: go/logic/hooks.go
constant onStartup (line 21) | onStartup = "gh-ost-on-startup"
constant onValidated (line 22) | onValidated = "gh-ost-on-validated"
constant onRowCountComplete (line 23) | onRowCountComplete = "gh-ost-on-rowcount-complete"
constant onBeforeRowCopy (line 24) | onBeforeRowCopy = "gh-ost-on-before-row-copy"
constant onRowCopyComplete (line 25) | onRowCopyComplete = "gh-ost-on-row-copy-complete"
constant onBeginPostponed (line 26) | onBeginPostponed = "gh-ost-on-begin-postponed"
constant onBeforeCutOver (line 27) | onBeforeCutOver = "gh-ost-on-before-cut-over"
constant onInteractiveCommand (line 28) | onInteractiveCommand = "gh-ost-on-interactive-command"
constant onSuccess (line 29) | onSuccess = "gh-ost-on-success"
constant onFailure (line 30) | onFailure = "gh-ost-on-failure"
constant onBatchCopyRetry (line 31) | onBatchCopyRetry = "gh-ost-on-batch-copy-retry"
constant onStatus (line 32) | onStatus = "gh-ost-on-status"
constant onStopReplication (line 33) | onStopReplication = "gh-ost-on-stop-replication"
constant onStartReplication (line 34) | onStartReplication = "gh-ost-on-start-replication"
type HooksExecutor (line 37) | type HooksExecutor struct
method applyEnvironmentVariables (line 49) | func (this *HooksExecutor) applyEnvironmentVariables(extraVariables .....
method executeHook (line 81) | func (this *HooksExecutor) executeHook(hook string, extraVariables ......
method detectHooks (line 91) | func (this *HooksExecutor) detectHooks(baseName string) (hooks []strin...
method executeHooks (line 100) | func (this *HooksExecutor) executeHooks(baseName string, extraVariable...
method onStartup (line 114) | func (this *HooksExecutor) onStartup() error {
method onValidated (line 118) | func (this *HooksExecutor) onValidated() error {
method onRowCountComplete (line 122) | func (this *HooksExecutor) onRowCountComplete() error {
method onBeforeRowCopy (line 125) | func (this *HooksExecutor) onBeforeRowCopy() error {
method onBatchCopyRetry (line 129) | func (this *HooksExecutor) onBatchCopyRetry(errorMessage string) error {
method onRowCopyComplete (line 134) | func (this *HooksExecutor) onRowCopyComplete() error {
method onBeginPostponed (line 138) | func (this *HooksExecutor) onBeginPostponed() error {
method onBeforeCutOver (line 142) | func (this *HooksExecutor) onBeforeCutOver() error {
method onInteractiveCommand (line 146) | func (this *HooksExecutor) onInteractiveCommand(command string) error {
method onSuccess (line 151) | func (this *HooksExecutor) onSuccess() error {
method onFailure (line 155) | func (this *HooksExecutor) onFailure() error {
method onStatus (line 159) | func (this *HooksExecutor) onStatus(statusMessage string) error {
method onStopReplication (line 164) | func (this *HooksExecutor) onStopReplication() error {
method onStartReplication (line 168) | func (this *HooksExecutor) onStartReplication() error {
function NewHooksExecutor (line 42) | func NewHooksExecutor(migrationContext *base.MigrationContext) *HooksExe...
FILE: go/logic/hooks_test.go
function TestHooksExecutorExecuteHooks (line 24) | func TestHooksExecutorExecuteHooks(t *testing.T) {
FILE: go/logic/inspect.go
constant startReplicationPostWait (line 25) | startReplicationPostWait = 250 * time.Millisecond
constant startReplicationMaxWait (line 26) | startReplicationMaxWait = 2 * time.Second
type Inspector (line 30) | type Inspector struct
method InitDBConnections (line 47) | func (this *Inspector) InitDBConnections() (err error) {
method ValidateOriginalTable (line 88) | func (this *Inspector) ValidateOriginalTable() (err error) {
method InspectTableColumnsAndUniqueKeys (line 104) | func (this *Inspector) InspectTableColumnsAndUniqueKeys(tableName stri...
method InspectOriginalTable (line 120) | func (this *Inspector) InspectOriginalTable() (err error) {
method inspectOriginalAndGhostTables (line 134) | func (this *Inspector) inspectOriginalAndGhostTables() (err error) {
method validateConnection (line 221) | func (this *Inspector) validateConnection() error {
method validateGrants (line 229) | func (this *Inspector) validateGrants() error {
method restartReplication (line 292) | func (this *Inspector) restartReplication() error {
method validateReplicationRestarted (line 335) | func (this *Inspector) validateReplicationRestarted() (bool, error) {
method applyBinlogFormat (line 359) | func (this *Inspector) applyBinlogFormat() error {
method validateBinlogs (line 386) | func (this *Inspector) validateBinlogs() error {
method validateGTIDConfig (line 427) | func (this *Inspector) validateGTIDConfig() error {
method validateLogSlaveUpdates (line 443) | func (this *Inspector) validateLogSlaveUpdates() error {
method validateTable (line 473) | func (this *Inspector) validateTable() error {
method validateTableForeignKeys (line 500) | func (this *Inspector) validateTableForeignKeys(allowChildForeignKeys ...
method validateTableTriggers (line 552) | func (this *Inspector) validateTableTriggers() error {
method validateGhostTriggersDontExist (line 594) | func (this *Inspector) validateGhostTriggersDontExist() error {
method validateGhostTriggersLength (line 622) | func (this *Inspector) validateGhostTriggersLength() error {
method estimateTableRowsViaExplain (line 639) | func (this *Inspector) estimateTableRowsViaExplain() error {
method CountTableRows (line 661) | func (this *Inspector) CountTableRows(ctx context.Context) error {
method applyColumnTypes (line 701) | func (this *Inspector) applyColumnTypes(databaseName, tableName string...
method getAutoIncrementValue (line 764) | func (this *Inspector) getAutoIncrementValue(tableName string) (autoIn...
method getCandidateUniqueKeys (line 782) | func (this *Inspector) getCandidateUniqueKeys(tableName string) (uniqu...
method getSharedUniqueKeys (line 864) | func (this *Inspector) getSharedUniqueKeys(originalUniqueKeys, ghostUn...
method getSharedColumns (line 882) | func (this *Inspector) getSharedColumns(originalColumns, ghostColumns ...
method showCreateTable (line 928) | func (this *Inspector) showCreateTable(tableName string) (createTableS...
method readChangelogState (line 936) | func (this *Inspector) readChangelogState(hint string) (string, error) {
method getMasterConnectionConfig (line 954) | func (this *Inspector) getMasterConnectionConfig() (applierConfig *mys...
method getReplicationLag (line 960) | func (this *Inspector) getReplicationLag() (replicationLag time.Durati...
method Teardown (line 968) | func (this *Inspector) Teardown() {
function NewInspector (line 39) | func NewInspector(migrationContext *base.MigrationContext) *Inspector {
FILE: go/logic/inspect_test.go
function TestInspectGetSharedUniqueKeys (line 15) | func TestInspectGetSharedUniqueKeys(t *testing.T) {
FILE: go/logic/migrator.go
type ChangelogState (line 32) | type ChangelogState
constant AllEventsUpToLockProcessed (line 35) | AllEventsUpToLockProcessed ChangelogState = "AllEventsUpToLockProcessed"
constant GhostTableMigrated (line 36) | GhostTableMigrated ChangelogState = "GhostTableMigrated"
constant Migrated (line 37) | Migrated ChangelogState = "Migrated"
constant ReadMigrationRangeValues (line 38) | ReadMigrationRangeValues ChangelogState = "ReadMigrationRangeValues"
function ReadChangelogState (line 41) | func ReadChangelogState(s string) ChangelogState {
type tableWriteFunc (line 45) | type tableWriteFunc
type lockProcessedStruct (line 47) | type lockProcessedStruct struct
type applyEventStruct (line 52) | type applyEventStruct struct
function newApplyEventStructByFunc (line 58) | func newApplyEventStructByFunc(writeFunc *tableWriteFunc) *applyEventStr...
function newApplyEventStructByDML (line 63) | func newApplyEventStructByDML(dmlEntry *binlog.BinlogEntry) *applyEventS...
type PrintStatusRule (line 68) | type PrintStatusRule
constant NoPrintStatusRule (line 71) | NoPrintStatusRule PrintStatusRule = iota
constant HeuristicPrintStatusRule (line 72) | HeuristicPrintStatusRule = iota
constant ForcePrintStatusRule (line 73) | ForcePrintStatusRule = iota
constant ForcePrintStatusOnlyRule (line 74) | ForcePrintStatusOnlyRule = iota
constant ForcePrintStatusAndHintRule (line 75) | ForcePrintStatusAndHintRule = iota
type Migrator (line 79) | type Migrator struct
method sleepWhileTrue (line 125) | func (this *Migrator) sleepWhileTrue(operation func() (bool, error)) e...
method retryBatchCopyWithHooks (line 142) | func (this *Migrator) retryBatchCopyWithHooks(operation func() error, ...
method retryOperation (line 156) | func (this *Migrator) retryOperation(operation func() error, notFatalH...
method retryOperationWithExponentialBackoff (line 181) | func (this *Migrator) retryOperationWithExponentialBackoff(operation f...
method consumeRowCopyComplete (line 207) | func (this *Migrator) consumeRowCopyComplete() {
method canStopStreaming (line 227) | func (this *Migrator) canStopStreaming() bool {
method onChangelogEvent (line 232) | func (this *Migrator) onChangelogEvent(dmlEntry *binlog.BinlogEntry) (...
method onChangelogStateEvent (line 244) | func (this *Migrator) onChangelogStateEvent(dmlEntry *binlog.BinlogEnt...
method onChangelogHeartbeatEvent (line 277) | func (this *Migrator) onChangelogHeartbeatEvent(dmlEntry *binlog.Binlo...
method abort (line 295) | func (this *Migrator) abort(err error) {
method listenOnPanicAbort (line 307) | func (this *Migrator) listenOnPanicAbort() {
method validateAlterStatement (line 316) | func (this *Migrator) validateAlterStatement() (err error) {
method countTableRows (line 331) | func (this *Migrator) countTableRows() (err error) {
method createFlagFiles (line 365) | func (this *Migrator) createFlagFiles() (err error) {
method checkAbort (line 378) | func (this *Migrator) checkAbort() error {
method Migrate (line 400) | func (this *Migrator) Migrate() (err error) {
method Revert (line 615) | func (this *Migrator) Revert() error {
method ExecOnFailureHook (line 724) | func (this *Migrator) ExecOnFailureHook() (err error) {
method handleCutOverResult (line 728) | func (this *Migrator) handleCutOverResult(cutOverError error) (err err...
method cutOver (line 760) | func (this *Migrator) cutOver() (err error) {
method waitForEventsUpToLock (line 841) | func (this *Migrator) waitForEventsUpToLock() error {
method cutOverTwoStep (line 885) | func (this *Migrator) cutOverTwoStep() (err error) {
method atomicCutOver (line 917) | func (this *Migrator) atomicCutOver() (err error) {
method initiateServer (line 1017) | func (this *Migrator) initiateServer() (err error) {
method initiateInspector (line 1040) | func (this *Migrator) initiateInspector() (err error) {
method initiateStatus (line 1100) | func (this *Migrator) initiateStatus() {
method printMigrationStatusHint (line 1123) | func (this *Migrator) printMigrationStatusHint(writers ...io.Writer) {
method getProgressPercent (line 1201) | func (this *Migrator) getProgressPercent(rowsEstimate int64) (progress...
method getMigrationETA (line 1210) | func (this *Migrator) getMigrationETA(rowsEstimate int64) (eta string,...
method getMigrationStateAndETA (line 1251) | func (this *Migrator) getMigrationStateAndETA(rowsEstimate int64) (sta...
method shouldPrintStatus (line 1266) | func (this *Migrator) shouldPrintStatus(rule PrintStatusRule, elapsedS...
method shouldPrintMigrationStatusHint (line 1290) | func (this *Migrator) shouldPrintMigrationStatusHint(rule PrintStatusR...
method printStatus (line 1304) | func (this *Migrator) printStatus(rule PrintStatusRule, writers ...io....
method initiateStreaming (line 1372) | func (this *Migrator) initiateStreaming() error {
method addDMLEventsListener (line 1411) | func (this *Migrator) addDMLEventsListener() error {
method initiateThrottler (line 1426) | func (this *Migrator) initiateThrottler() {
method initiateApplier (line 1438) | func (this *Migrator) initiateApplier() error {
method iterateChunks (line 1495) | func (this *Migrator) iterateChunks() error {
method onApplyEventStruct (line 1595) | func (this *Migrator) onApplyEventStruct(eventStruct *applyEventStruct...
method Checkpoint (line 1654) | func (this *Migrator) Checkpoint(ctx context.Context) (*Checkpoint, er...
method CheckpointAfterCutOver (line 1688) | func (this *Migrator) CheckpointAfterCutOver() (*Checkpoint, error) {
method checkpointLoop (line 1716) | func (this *Migrator) checkpointLoop() {
method executeWriteFuncs (line 1750) | func (this *Migrator) executeWriteFuncs() error {
method executeDMLWriteFuncs (line 1804) | func (this *Migrator) executeDMLWriteFuncs() error {
method finalCleanup (line 1830) | func (this *Migrator) finalCleanup() error {
method teardown (line 1877) | func (this *Migrator) teardown() {
function NewMigrator (line 105) | func NewMigrator(context *base.MigrationContext, appVersion string) *Mig...
FILE: go/logic/migrator_test.go
function TestMigratorOnChangelogEvent (line 37) | func TestMigratorOnChangelogEvent(t *testing.T) {
function TestMigratorValidateStatement (line 137) | func TestMigratorValidateStatement(t *testing.T) {
function TestMigratorCreateFlagFiles (line 191) | func TestMigratorCreateFlagFiles(t *testing.T) {
function TestMigratorGetProgressPercent (line 208) | func TestMigratorGetProgressPercent(t *testing.T) {
function TestMigratorGetMigrationStateAndETA (line 221) | func TestMigratorGetMigrationStateAndETA(t *testing.T) {
function TestMigratorShouldPrintStatus (line 275) | func TestMigratorShouldPrintStatus(t *testing.T) {
type MigratorTestSuite (line 290) | type MigratorTestSuite struct
method SetupSuite (line 297) | func (suite *MigratorTestSuite) SetupSuite() {
method TeardownSuite (line 318) | func (suite *MigratorTestSuite) TeardownSuite() {
method SetupTest (line 323) | func (suite *MigratorTestSuite) SetupTest() {
method TearDownTest (line 332) | func (suite *MigratorTestSuite) TearDownTest() {
method TestMigrateEmpty (line 345) | func (suite *MigratorTestSuite) TestMigrateEmpty() {
method TestRetryBatchCopyWithHooks (line 389) | func (suite *MigratorTestSuite) TestRetryBatchCopyWithHooks() {
method TestCopierIntPK (line 509) | func (suite *MigratorTestSuite) TestCopierIntPK() {
method TestCopierCompositePK (line 580) | func (suite *MigratorTestSuite) TestCopierCompositePK() {
method TestCutOverLossDataCaseLockGhostBeforeRename (line 717) | func (suite *MigratorTestSuite) TestCutOverLossDataCaseLockGhostBefore...
method TestRevertEmpty (line 797) | func (suite *MigratorTestSuite) TestRevertEmpty() {
method TestRevert (line 846) | func (suite *MigratorTestSuite) TestRevert() {
function TestMigratorRetry (line 651) | func TestMigratorRetry(t *testing.T) {
function TestMigratorRetryWithExponentialBackoff (line 680) | func TestMigratorRetryWithExponentialBackoff(t *testing.T) {
function TestMigrator (line 929) | func TestMigrator(t *testing.T) {
function TestPanicAbort_PropagatesError (line 933) | func TestPanicAbort_PropagatesError(t *testing.T) {
function TestPanicAbort_FirstErrorWins (line 965) | func TestPanicAbort_FirstErrorWins(t *testing.T) {
function TestAbort_AfterRowCopy (line 992) | func TestAbort_AfterRowCopy(t *testing.T) {
function TestAbort_DuringInspection (line 1033) | func TestAbort_DuringInspection(t *testing.T) {
function TestAbort_DuringStreaming (line 1064) | func TestAbort_DuringStreaming(t *testing.T) {
function TestRetryExhaustion_TriggersAbort (line 1099) | func TestRetryExhaustion_TriggersAbort(t *testing.T) {
function TestRevert_AbortsOnError (line 1145) | func TestRevert_AbortsOnError(t *testing.T) {
function TestCheckAbort_ReturnsNilWhenNoError (line 1189) | func TestCheckAbort_ReturnsNilWhenNoError(t *testing.T) {
function TestCheckAbort_DetectsContextCancellation (line 1200) | func TestCheckAbort_DetectsContextCancellation(t *testing.T) {
FILE: go/logic/server.go
type printStatusFunc (line 34) | type printStatusFunc
type Server (line 37) | type Server struct
method runCPUProfile (line 54) | func (this *Server) runCPUProfile(args string) (io.Reader, error) {
method createPostponeCutOverFlagFile (line 102) | func (this *Server) createPostponeCutOverFlagFile(filePath string) (er...
method BindSocketFile (line 112) | func (this *Server) BindSocketFile() (err error) {
method RemoveSocketFile (line 127) | func (this *Server) RemoveSocketFile() (err error) {
method BindTCPPort (line 132) | func (this *Server) BindTCPPort() (err error) {
method Serve (line 145) | func (this *Server) Serve() (err error) {
method handleConnection (line 171) | func (this *Server) handleConnection(conn net.Conn) (err error) {
method onServerCommand (line 183) | func (this *Server) onServerCommand(command string, writer *bufio.Writ...
method applyServerCommand (line 196) | func (this *Server) applyServerCommand(command string, writer *bufio.W...
function NewServer (line 46) | func NewServer(migrationContext *base.MigrationContext, hooksExecutor *H...
FILE: go/logic/server_test.go
function TestServerRunCPUProfile (line 13) | func TestServerRunCPUProfile(t *testing.T) {
function TestServerCreatePostponeCutOverFlagFile (line 72) | func TestServerCreatePostponeCutOverFlagFile(t *testing.T) {
FILE: go/logic/streamer.go
type BinlogEventListener (line 23) | type BinlogEventListener struct
constant EventsChannelBufferSize (line 31) | EventsChannelBufferSize = 1
constant ReconnectStreamerSleepSeconds (line 32) | ReconnectStreamerSleepSeconds = 1
type EventsStreamer (line 37) | type EventsStreamer struct
method AddListener (line 63) | func (this *EventsStreamer) AddListener(
method notifyListeners (line 86) | func (this *EventsStreamer) notifyListeners(binlogEntry *binlog.Binlog...
method InitDBConnections (line 108) | func (this *EventsStreamer) InitDBConnections() (err error) {
method initBinlogReader (line 131) | func (this *EventsStreamer) initBinlogReader(binlogCoordinates mysql.B...
method GetCurrentBinlogCoordinates (line 140) | func (this *EventsStreamer) GetCurrentBinlogCoordinates() mysql.Binlog...
method readCurrentBinlogCoordinates (line 145) | func (this *EventsStreamer) readCurrentBinlogCoordinates() error {
method StreamEvents (line 178) | func (this *EventsStreamer) StreamEvents(canStopStreaming func() bool)...
method Close (line 236) | func (this *EventsStreamer) Close() (err error) {
method Teardown (line 242) | func (this *EventsStreamer) Teardown() {
function NewEventsStreamer (line 50) | func NewEventsStreamer(migrationContext *base.MigrationContext) *EventsS...
FILE: go/logic/streamer_test.go
type EventsStreamerTestSuite (line 19) | type EventsStreamerTestSuite struct
method SetupSuite (line 26) | func (suite *EventsStreamerTestSuite) SetupSuite() {
method TeardownSuite (line 46) | func (suite *EventsStreamerTestSuite) TeardownSuite() {
method SetupTest (line 51) | func (suite *EventsStreamerTestSuite) SetupTest() {
method TearDownTest (line 58) | func (suite *EventsStreamerTestSuite) TearDownTest() {
method TestStreamEvents (line 67) | func (suite *EventsStreamerTestSuite) TestStreamEvents() {
method TestStreamEventsAutomaticallyReconnects (line 143) | func (suite *EventsStreamerTestSuite) TestStreamEventsAutomaticallyRec...
function TestEventsStreamer (line 262) | func TestEventsStreamer(t *testing.T) {
FILE: go/logic/test_utils.go
function getTestTableName (line 23) | func getTestTableName() string {
function getTestGhostTableName (line 27) | func getTestGhostTableName() string {
function getTestRevertedTableName (line 31) | func getTestRevertedTableName() string {
function getTestOldTableName (line 35) | func getTestOldTableName() string {
function getTestConnectionConfig (line 39) | func getTestConnectionConfig(ctx context.Context, container testcontaine...
function newTestMigrationContext (line 59) | func newTestMigrationContext() *base.MigrationContext {
FILE: go/logic/throttler.go
constant frenoMagicHint (line 41) | frenoMagicHint = "freno"
type Throttler (line 45) | type Throttler struct
method throttleHttpMessage (line 67) | func (this *Throttler) throttleHttpMessage(statusCode int) string {
method shouldThrottle (line 81) | func (this *Throttler) shouldThrottle() (result bool, reason string, r...
method parseChangelogHeartbeat (line 130) | func (this *Throttler) parseChangelogHeartbeat(heartbeatValue string) ...
method collectReplicationLag (line 140) | func (this *Throttler) collectReplicationLag(firstThrottlingCollected ...
method collectControlReplicasLag (line 182) | func (this *Throttler) collectControlReplicasLag() {
method criticalLoadIsMet (line 275) | func (this *Throttler) criticalLoadIsMet() (met bool, variableName str...
method collectThrottleHTTPStatus (line 290) | func (this *Throttler) collectThrottleHTTPStatus(firstThrottlingCollec...
method collectGeneralThrottleMetrics (line 352) | func (this *Throttler) collectGeneralThrottleMetrics() error {
method initiateThrottlerCollection (line 447) | func (this *Throttler) initiateThrottlerCollection(firstThrottlingColl...
method initiateThrottlerChecks (line 469) | func (this *Throttler) initiateThrottlerChecks() {
method throttle (line 508) | func (this *Throttler) throttle(onThrottled func()) {
method Teardown (line 522) | func (this *Throttler) Teardown() {
function NewThrottler (line 55) | func NewThrottler(migrationContext *base.MigrationContext, applier *Appl...
function parseChangelogHeartbeat (line 120) | func parseChangelogHeartbeat(heartbeatValue string) (lag time.Duration, ...
FILE: go/mysql/binlog.go
type BinlogCoordinates (line 9) | type BinlogCoordinates interface
FILE: go/mysql/binlog_file.go
function init (line 19) | func init() {
type FileBinlogCoordinates (line 24) | type FileBinlogCoordinates struct
method DisplayString (line 52) | func (this *FileBinlogCoordinates) DisplayString() string {
method String (line 57) | func (this FileBinlogCoordinates) String() string {
method Equals (line 62) | func (this *FileBinlogCoordinates) Equals(other BinlogCoordinates) bool {
method IsEmpty (line 71) | func (this *FileBinlogCoordinates) IsEmpty() bool {
method SmallerThan (line 76) | func (this *FileBinlogCoordinates) SmallerThan(other BinlogCoordinates...
method SmallerThanOrEquals (line 91) | func (this *FileBinlogCoordinates) SmallerThanOrEquals(other BinlogCoo...
method FileNumberDistance (line 104) | func (this *FileBinlogCoordinates) FileNumberDistance(other *FileBinlo...
method FileNumber (line 112) | func (this *FileBinlogCoordinates) FileNumber() (int, int) {
method PreviousFileCoordinatesBy (line 124) | func (this *FileBinlogCoordinates) PreviousFileCoordinatesBy(offset in...
method PreviousFileCoordinates (line 141) | func (this *FileBinlogCoordinates) PreviousFileCoordinates() (BinlogCo...
method NextFileCoordinates (line 146) | func (this *FileBinlogCoordinates) NextFileCoordinates() (BinlogCoordi...
method DetachedCoordinates (line 160) | func (this *FileBinlogCoordinates) DetachedCoordinates() (isDetached b...
method Clone (line 168) | func (this *FileBinlogCoordinates) Clone() BinlogCoordinates {
method IsLogPosOverflowBeyond4Bytes (line 181) | func (this *FileBinlogCoordinates) IsLogPosOverflowBeyond4Bytes(preCoo...
function NewFileBinlogCoordinates (line 30) | func NewFileBinlogCoordinates(logFile string, logPos int64) *FileBinlogC...
function ParseFileBinlogCoordinates (line 38) | func ParseFileBinlogCoordinates(logFileLogPos string) (*FileBinlogCoordi...
FILE: go/mysql/binlog_file_test.go
function init (line 17) | func init() {
function TestBinlogCoordinates (line 21) | func TestBinlogCoordinates(t *testing.T) {
function TestBinlogCoordinatesAsKey (line 79) | func TestBinlogCoordinatesAsKey(t *testing.T) {
function TestIsLogPosOverflowBeyond4Bytes (line 95) | func TestIsLogPosOverflowBeyond4Bytes(t *testing.T) {
function TestBinlogCoordinates_LogFileZeroPaddedTransition (line 138) | func TestBinlogCoordinates_LogFileZeroPaddedTransition(t *testing.T) {
function TestBinlogCoordinates_SameLogFileDifferentPosition (line 145) | func TestBinlogCoordinates_SameLogFileDifferentPosition(t *testing.T) {
FILE: go/mysql/binlog_gtid.go
type GTIDBinlogCoordinates (line 13) | type GTIDBinlogCoordinates struct
method DisplayString (line 27) | func (this *GTIDBinlogCoordinates) DisplayString() string {
method String (line 35) | func (this GTIDBinlogCoordinates) String() string {
method Equals (line 40) | func (this *GTIDBinlogCoordinates) Equals(other BinlogCoordinates) bool {
method IsEmpty (line 54) | func (this *GTIDBinlogCoordinates) IsEmpty() bool {
method SmallerThan (line 59) | func (this *GTIDBinlogCoordinates) SmallerThan(other BinlogCoordinates...
method SmallerThanOrEquals (line 74) | func (this *GTIDBinlogCoordinates) SmallerThanOrEquals(other BinlogCoo...
method Clone (line 78) | func (this *GTIDBinlogCoordinates) Clone() BinlogCoordinates {
function NewGTIDBinlogCoordinates (line 19) | func NewGTIDBinlogCoordinates(gtidSet string) (*GTIDBinlogCoordinates, e...
FILE: go/mysql/connection.go
constant TLS_CONFIG_KEY (line 21) | TLS_CONFIG_KEY = "ghost"
type ConnectionConfig (line 25) | type ConnectionConfig struct
method DuplicateCredentials (line 45) | func (this *ConnectionConfig) DuplicateCredentials(key InstanceKey) *C...
method Duplicate (line 69) | func (this *ConnectionConfig) Duplicate() *ConnectionConfig {
method String (line 73) | func (this *ConnectionConfig) String() string {
method Equals (line 77) | func (this *ConnectionConfig) Equals(other *ConnectionConfig) bool {
method UseTLS (line 81) | func (this *ConnectionConfig) UseTLS(caCertificatePath, clientCertific...
method RegisterTLSConfig (line 119) | func (this *ConnectionConfig) RegisterTLSConfig() error {
method TLSConfig (line 132) | func (this *ConnectionConfig) TLSConfig() *tls.Config {
method GetDBUri (line 136) | func (this *ConnectionConfig) GetDBUri(databaseName string) string {
function NewConnectionConfig (line 36) | func NewConnectionConfig() *ConnectionConfig {
function GetDBTLSConfigKey (line 169) | func GetDBTLSConfigKey(tlsServerName string) string {
FILE: go/mysql/connection_test.go
constant transactionIsolation (line 17) | transactionIsolation = "REPEATABLE-READ"
function init (line 20) | func init() {
function TestNewConnectionConfig (line 24) | func TestNewConnectionConfig(t *testing.T) {
function TestDuplicateCredentials (line 36) | func TestDuplicateCredentials(t *testing.T) {
function TestDuplicate (line 63) | func TestDuplicate(t *testing.T) {
function TestGetDBUri (line 83) | func TestGetDBUri(t *testing.T) {
function TestGetDBUriWithTLSSetup (line 96) | func TestGetDBUriWithTLSSetup(t *testing.T) {
function TestGetDBTLSConfigKey (line 112) | func TestGetDBTLSConfigKey(t *testing.T) {
FILE: go/mysql/instance_key.go
constant DefaultInstancePort (line 16) | DefaultInstancePort = 3306
type InstanceKey (line 29) | type InstanceKey struct
method Equals (line 70) | func (this *InstanceKey) Equals(other *InstanceKey) bool {
method SmallerThan (line 79) | func (this *InstanceKey) SmallerThan(other *InstanceKey) bool {
method IsDetached (line 90) | func (this *InstanceKey) IsDetached() bool {
method IsValid (line 95) | func (this *InstanceKey) IsValid() bool {
method DetachedKey (line 106) | func (this *InstanceKey) DetachedKey() *InstanceKey {
method ReattachedKey (line 114) | func (this *InstanceKey) ReattachedKey() *InstanceKey {
method StringCode (line 122) | func (this *InstanceKey) StringCode() string {
method DisplayString (line 127) | func (this *InstanceKey) DisplayString() string {
method String (line 132) | func (this InstanceKey) String() string {
constant detachHint (line 34) | detachHint = "//"
function NewRawInstanceKey (line 37) | func NewRawInstanceKey(hostPort string) (*InstanceKey, error) {
function ParseInstanceKey (line 65) | func ParseInstanceKey(hostPort string) (*InstanceKey, error) {
FILE: go/mysql/instance_key_map.go
type InstanceKeyMap (line 14) | type InstanceKeyMap
method Len (line 20) | func (this *InstanceKeyMap) Len() int {
method AddKey (line 25) | func (this *InstanceKeyMap) AddKey(key InstanceKey) {
method AddKeys (line 30) | func (this *InstanceKeyMap) AddKeys(keys []InstanceKey) {
method HasKey (line 37) | func (this *InstanceKeyMap) HasKey(key InstanceKey) bool {
method GetInstanceKeys (line 43) | func (this *InstanceKeyMap) GetInstanceKeys() []InstanceKey {
method MarshalJSON (line 52) | func (this *InstanceKeyMap) MarshalJSON() ([]byte, error) {
method ToJSON (line 57) | func (this *InstanceKeyMap) ToJSON() (string, error) {
method ToJSONString (line 63) | func (this *InstanceKeyMap) ToJSONString() string {
method ToCommaDelimitedList (line 69) | func (this *InstanceKeyMap) ToCommaDelimitedList() string {
method ReadJson (line 78) | func (this *InstanceKeyMap) ReadJson(jsonString string) error {
method ReadCommaDelimitedList (line 89) | func (this *InstanceKeyMap) ReadCommaDelimitedList(list string) error {
function NewInstanceKeyMap (line 16) | func NewInstanceKeyMap() *InstanceKeyMap {
FILE: go/mysql/instance_key_test.go
function init (line 15) | func init() {
function TestParseInstanceKey (line 19) | func TestParseInstanceKey(t *testing.T) {
FILE: go/mysql/replica_terminology_map.go
constant MysqlVersionCutoff (line 8) | MysqlVersionCutoff = "8.4"
function ReplicaTermFor (line 27) | func ReplicaTermFor(mysqlVersion string, term string) string {
FILE: go/mysql/utils.go
constant MaxTableNameLength (line 22) | MaxTableNameLength = 64
constant MaxDBPoolConnections (line 23) | MaxDBPoolConnections = 3
type ReplicationLagResult (line 26) | type ReplicationLagResult struct
method HasLag (line 43) | func (this *ReplicationLagResult) HasLag() bool {
type Trigger (line 32) | type Trigger struct
function NewNoReplicationLagResult (line 39) | func NewNoReplicationLagResult() *ReplicationLagResult {
function GetDB (line 51) | func GetDB(migrationUuid string, mysql_uri string) (db *gosql.DB, exists...
function GetReplicationLagFromSlaveStatus (line 70) | func GetReplicationLagFromSlaveStatus(dbVersion string, informationSchem...
function GetMasterKeyFromSlaveStatus (line 88) | func GetMasterKeyFromSlaveStatus(dbVersion string, connectionConfig *Con...
function GetMasterConnectionConfigSafe (line 132) | func GetMasterConnectionConfigSafe(dbVersion string, connectionConfig *C...
function GetReplicationBinlogCoordinates (line 162) | func GetReplicationBinlogCoordinates(dbVersion string, db *gosql.DB, gti...
function GetSelfBinlogCoordinates (line 189) | func GetSelfBinlogCoordinates(dbVersion string, db *gosql.DB, gtid bool)...
function GetInstanceKey (line 206) | func GetInstanceKey(db *gosql.DB) (instanceKey *InstanceKey, err error) {
function GetTableColumns (line 213) | func GetTableColumns(db *gosql.DB, databaseName, tableName string) (*sql...
function Kill (line 244) | func Kill(db *gosql.DB, connectionID string) error {
function GetTriggers (line 250) | func GetTriggers(db *gosql.DB, databaseName, tableName string) (triggers...
FILE: go/sql/builder.go
type ValueComparisonSign (line 14) | type ValueComparisonSign
constant LessThanComparisonSign (line 17) | LessThanComparisonSign ValueComparisonSign = "<"
constant LessThanOrEqualsComparisonSign (line 18) | LessThanOrEqualsComparisonSign ValueComparisonSign = "<="
constant EqualsComparisonSign (line 19) | EqualsComparisonSign ValueComparisonSign = "="
constant GreaterThanOrEqualsComparisonSign (line 20) | GreaterThanOrEqualsComparisonSign ValueComparisonSign = ">="
constant GreaterThanComparisonSign (line 21) | GreaterThanComparisonSign ValueComparisonSign = ">"
constant NotEqualsComparisonSign (line 22) | NotEqualsComparisonSign ValueComparisonSign = "!="
constant MaxColumnNameLength (line 23) | MaxColumnNameLength = 64
function EscapeName (line 29) | func EscapeName(name string) string {
function TruncateColumnName (line 38) | func TruncateColumnName(name string, limit int) string {
function buildColumnsPreparedValues (line 51) | func buildColumnsPreparedValues(columns *ColumnList) []string {
function buildPreparedValues (line 69) | func buildPreparedValues(length int) []string {
function duplicateNames (line 77) | func duplicateNames(names []string) []string {
function BuildValueComparison (line 83) | func BuildValueComparison(column string, value string, comparisonSign Va...
function BuildEqualsComparison (line 94) | func BuildEqualsComparison(columns []string, values []string) (result st...
function BuildEqualsPreparedComparison (line 115) | func BuildEqualsPreparedComparison(columns []string) (result string, err...
type CheckpointInsertQueryBuilder (line 121) | type CheckpointInsertQueryBuilder struct
method BuildQuery (line 166) | func (b *CheckpointInsertQueryBuilder) BuildQuery(uniqueKeyArgs []inte...
function NewCheckpointQueryBuilder (line 126) | func NewCheckpointQueryBuilder(databaseName, tableName string, uniqueKey...
function BuildSetPreparedClause (line 182) | func BuildSetPreparedClause(columns *ColumnList) (result string, err err...
function BuildRangeComparison (line 203) | func BuildRangeComparison(columns []string, values []string, args []inte...
function BuildRangePreparedComparison (line 258) | func BuildRangePreparedComparison(columns *ColumnList, args []interface{...
function BuildRangeInsertQuery (line 263) | func BuildRangeInsertQuery(databaseName, originalTableName, ghostTableNa...
function BuildRangeInsertPreparedQuery (line 326) | func BuildRangeInsertPreparedQuery(databaseName, originalTableName, ghos...
function BuildUniqueKeyRangeEndPreparedQueryViaOffset (line 332) | func BuildUniqueKeyRangeEndPreparedQueryViaOffset(databaseName, tableNam...
function BuildUniqueKeyRangeEndPreparedQueryViaTemptable (line 385) | func BuildUniqueKeyRangeEndPreparedQueryViaTemptable(databaseName, table...
function BuildUniqueKeyMinValuesPreparedQuery (line 445) | func BuildUniqueKeyMinValuesPreparedQuery(databaseName, tableName string...
function BuildUniqueKeyMaxValuesPreparedQuery (line 449) | func BuildUniqueKeyMaxValuesPreparedQuery(databaseName, tableName string...
function buildUniqueKeyMinMaxValuesPreparedQuery (line 453) | func buildUniqueKeyMinMaxValuesPreparedQuery(databaseName, tableName str...
type DMLDeleteQueryBuilder (line 487) | type DMLDeleteQueryBuilder struct
method BuildQuery (line 529) | func (b *DMLDeleteQueryBuilder) BuildQuery(args []interface{}) (string...
function NewDMLDeleteQueryBuilder (line 496) | func NewDMLDeleteQueryBuilder(databaseName, tableName string, tableColum...
type DMLInsertQueryBuilder (line 544) | type DMLInsertQueryBuilder struct
method BuildQuery (line 591) | func (b *DMLInsertQueryBuilder) BuildQuery(args []interface{}) (string...
function NewDMLInsertQueryBuilder (line 553) | func NewDMLInsertQueryBuilder(databaseName, tableName string, tableColum...
type DMLUpdateQueryBuilder (line 606) | type DMLUpdateQueryBuilder struct
method BuildQuery (line 664) | func (b *DMLUpdateQueryBuilder) BuildQuery(valueArgs, whereArgs []inte...
function NewDMLUpdateQueryBuilder (line 615) | func NewDMLUpdateQueryBuilder(databaseName, tableName string, tableColum...
FILE: go/sql/builder_test.go
function init (line 22) | func init() {
function normalizeQuery (line 26) | func normalizeQuery(name string) string {
function TestEscapeName (line 33) | func TestEscapeName(t *testing.T) {
function TestBuildEqualsComparison (line 41) | func TestBuildEqualsComparison(t *testing.T) {
function TestBuildEqualsPreparedComparison (line 70) | func TestBuildEqualsPreparedComparison(t *testing.T) {
function TestBuildSetPreparedClause (line 79) | func TestBuildSetPreparedClause(t *testing.T) {
function TestBuildRangeComparison (line 99) | func TestBuildRangeComparison(t *testing.T) {
function TestBuildRangeInsertQuery (line 161) | func TestBuildRangeInsertQuery(t *testing.T) {
function TestBuildRangeInsertQueryRenameMap (line 230) | func TestBuildRangeInsertQueryRenameMap(t *testing.T) {
function TestBuildRangeInsertPreparedQuery (line 297) | func TestBuildRangeInsertPreparedQuery(t *testing.T) {
function TestBuildUniqueKeyRangeEndPreparedQueryViaOffset (line 328) | func TestBuildUniqueKeyRangeEndPreparedQueryViaOffset(t *testing.T) {
function TestBuildUniqueKeyRangeEndPreparedQueryViaTemptable (line 355) | func TestBuildUniqueKeyRangeEndPreparedQueryViaTemptable(t *testing.T) {
function TestBuildUniqueKeyMinValuesPreparedQuery (line 387) | func TestBuildUniqueKeyMinValuesPreparedQuery(t *testing.T) {
function TestBuildDMLDeleteQuery (line 422) | func TestBuildDMLDeleteQuery(t *testing.T) {
function TestBuildDMLDeleteQuerySignedUnsigned (line 489) | func TestBuildDMLDeleteQuerySignedUnsigned(t *testing.T) {
function TestBuildDMLInsertQuery (line 529) | func TestBuildDMLInsertQuery(t *testing.T) {
function TestBuildDMLInsertQuerySignedUnsigned (line 578) | func TestBuildDMLInsertQuerySignedUnsigned(t *testing.T) {
function TestBuildDMLUpdateQuery (line 639) | func TestBuildDMLUpdateQuery(t *testing.T) {
function TestBuildDMLUpdateQuerySignedUnsigned (line 745) | func TestBuildDMLUpdateQuerySignedUnsigned(t *testing.T) {
function TestCheckpointQueryBuilder (line 787) | func TestCheckpointQueryBuilder(t *testing.T) {
FILE: go/sql/encoding.go
type charsetEncoding (line 14) | type charsetEncoding
function init (line 18) | func init() {
FILE: go/sql/parser.go
type AlterTableParser (line 39) | type AlterTableParser struct
method tokenizeAlterStatement (line 65) | func (this *AlterTableParser) tokenizeAlterStatement(alterStatement st...
method sanitizeQuotesFromAlterStatement (line 92) | func (this *AlterTableParser) sanitizeQuotesFromAlterStatement(alterSt...
method parseAlterToken (line 98) | func (this *AlterTableParser) parseAlterToken(alterToken string) {
method ParseAlterStatement (line 136) | func (this *AlterTableParser) ParseAlterStatement(alterStatement strin...
method GetNonTrivialRenames (line 161) | func (this *AlterTableParser) GetNonTrivialRenames() map[string]string {
method HasNonTrivialRenames (line 171) | func (this *AlterTableParser) HasNonTrivialRenames() bool {
method DroppedColumnsMap (line 175) | func (this *AlterTableParser) DroppedColumnsMap() map[string]bool {
method IsRenameTable (line 179) | func (this *AlterTableParser) IsRenameTable() bool {
method IsAutoIncrementDefined (line 183) | func (this *AlterTableParser) IsAutoIncrementDefined() bool {
method GetExplicitSchema (line 187) | func (this *AlterTableParser) GetExplicitSchema() string {
method HasExplicitSchema (line 191) | func (this *AlterTableParser) HasExplicitSchema() bool {
method GetExplicitTable (line 195) | func (this *AlterTableParser) GetExplicitTable() string {
method HasExplicitTable (line 199) | func (this *AlterTableParser) HasExplicitTable() bool {
method GetAlterStatementOptions (line 203) | func (this *AlterTableParser) GetAlterStatementOptions() string {
function NewAlterTableParser (line 52) | func NewAlterTableParser() *AlterTableParser {
function NewParserFromAlterStatement (line 59) | func NewParserFromAlterStatement(alterStatement string) *AlterTableParser {
function ParseEnumValues (line 207) | func ParseEnumValues(enumColumnType string) string {
FILE: go/sql/parser_test.go
function init (line 15) | func init() {
function TestParseAlterStatement (line 19) | func TestParseAlterStatement(t *testing.T) {
function TestParseAlterStatementrivialRename (line 29) | func TestParseAlterStatementrivialRename(t *testing.T) {
function TestParseAlterStatementWithAutoIncrement (line 41) | func TestParseAlterStatementWithAutoIncrement(t *testing.T) {
function TestParseAlterStatementrivialRenames (line 60) | func TestParseAlterStatementrivialRenames(t *testing.T) {
function TestParseAlterStatementNonTrivial (line 73) | func TestParseAlterStatementNonTrivial(t *testing.T) {
function TestTokenizeAlterStatement (line 97) | func TestTokenizeAlterStatement(t *testing.T) {
function TestSanitizeQuotesFromAlterStatement (line 136) | func TestSanitizeQuotesFromAlterStatement(t *testing.T) {
function TestParseAlterStatementDroppedColumns (line 150) | func TestParseAlterStatementDroppedColumns(t *testing.T) {
function TestParseAlterStatementRenameTable (line 189) | func TestParseAlterStatementRenameTable(t *testing.T) {
function TestParseAlterStatementExplicitTable (line 228) | func TestParseAlterStatementExplicitTable(t *testing.T) {
function TestParseEnumValues (line 321) | func TestParseEnumValues(t *testing.T) {
FILE: go/sql/types.go
type ColumnType (line 16) | type ColumnType
constant UnknownColumnType (line 19) | UnknownColumnType ColumnType = iota
constant TimestampColumnType (line 20) | TimestampColumnType
constant DateTimeColumnType (line 21) | DateTimeColumnType
constant EnumColumnType (line 22) | EnumColumnType
constant MediumIntColumnType (line 23) | MediumIntColumnType
constant JSONColumnType (line 24) | JSONColumnType
constant FloatColumnType (line 25) | FloatColumnType
constant BinaryColumnType (line 26) | BinaryColumnType
constant maxMediumintUnsigned (line 29) | maxMediumintUnsigned int32 = 16777215
type TimezoneConversion (line 31) | type TimezoneConversion struct
type CharacterSetConversion (line 35) | type CharacterSetConversion struct
type Column (line 40) | type Column struct
method convertArg (line 60) | func (this *Column) convertArg(arg interface{}) interface{} {
function NewColumns (line 122) | func NewColumns(names []string) []Column {
function ParseColumns (line 130) | func ParseColumns(names string) []Column {
type ColumnsMap (line 136) | type ColumnsMap
function NewEmptyColumnsMap (line 138) | func NewEmptyColumnsMap() ColumnsMap {
function NewColumnsMap (line 143) | func NewColumnsMap(orderedColumns []Column) ColumnsMap {
type ColumnList (line 152) | type ColumnList struct
method Columns (line 175) | func (this *ColumnList) Columns() []Column {
method Names (line 179) | func (this *ColumnList) Names() []string {
method GetColumn (line 187) | func (this *ColumnList) GetColumn(columnName string) *Column {
method SetUnsigned (line 194) | func (this *ColumnList) SetUnsigned(columnName string) {
method IsUnsigned (line 198) | func (this *ColumnList) IsUnsigned(columnName string) bool {
method SetCharset (line 202) | func (this *ColumnList) SetCharset(columnName string, charset string) {
method GetCharset (line 206) | func (this *ColumnList) GetCharset(columnName string) string {
method SetColumnType (line 210) | func (this *ColumnList) SetColumnType(columnName string, columnType Co...
method GetColumnType (line 214) | func (this *ColumnList) GetColumnType(columnName string) ColumnType {
method SetConvertDatetimeToTimestamp (line 218) | func (this *ColumnList) SetConvertDatetimeToTimestamp(columnName strin...
method HasTimezoneConversion (line 222) | func (this *ColumnList) HasTimezoneConversion(columnName string) bool {
method SetEnumToTextConversion (line 226) | func (this *ColumnList) SetEnumToTextConversion(columnName string) {
method IsEnumToTextConversion (line 230) | func (this *ColumnList) IsEnumToTextConversion(columnName string) bool {
method SetEnumValues (line 234) | func (this *ColumnList) SetEnumValues(columnName string, enumValues st...
method String (line 238) | func (this *ColumnList) String() string {
method Equals (line 242) | func (this *ColumnList) Equals(other *ColumnList) bool {
method EqualsByNames (line 246) | func (this *ColumnList) EqualsByNames(other *ColumnList) bool {
method IsSubsetOf (line 252) | func (this *ColumnList) IsSubsetOf(other *ColumnList) bool {
method FilterBy (line 261) | func (this *ColumnList) FilterBy(f func(Column) bool) *ColumnList {
method Len (line 271) | func (this *ColumnList) Len() int {
method SetCharsetConversion (line 275) | func (this *ColumnList) SetCharsetConversion(columnName string, fromCh...
function NewColumnList (line 158) | func NewColumnList(names []string) *ColumnList {
function ParseColumnList (line 167) | func ParseColumnList(names string) *ColumnList {
type UniqueKey (line 280) | type UniqueKey struct
method IsPrimary (line 289) | func (this *UniqueKey) IsPrimary() bool {
method Len (line 293) | func (this *UniqueKey) Len() int {
method String (line 297) | func (this *UniqueKey) String() string {
type ColumnValues (line 305) | type ColumnValues struct
method AbstractValues (line 334) | func (this *ColumnValues) AbstractValues() []interface{} {
method StringColumn (line 338) | func (this *ColumnValues) StringColumn(index int) string {
method String (line 346) | func (this *ColumnValues) String() string {
method Clone (line 354) | func (this *ColumnValues) Clone() *ColumnValues {
function NewColumnValues (line 310) | func NewColumnValues(length int) *ColumnValues {
function ToColumnValues (line 322) | func ToColumnValues(abstractValues []interface{}) *ColumnValues {
FILE: go/sql/types_test.go
function init (line 15) | func init() {
function TestParseColumnList (line 19) | func TestParseColumnList(t *testing.T) {
function TestGetColumn (line 30) | func TestGetColumn(t *testing.T) {
function TestBinaryToString (line 44) | func TestBinaryToString(t *testing.T) {
function TestConvertArgCharsetDecoding (line 53) | func TestConvertArgCharsetDecoding(t *testing.T) {
function TestConvertArgBinaryColumnPadding (line 69) | func TestConvertArgBinaryColumnPadding(t *testing.T) {
function TestConvertArgBinaryColumnNoPaddingWhenFull (line 98) | func TestConvertArgBinaryColumnNoPaddingWhenFull(t *testing.T) {
FILE: localtests/alter-charset-all-dml/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/alter-charset/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/attempt-instant-ddl/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/autoinc-copy-deletes-user-defined/create.sql
type gh_ost_test (line 4) | create table gh_ost_test (
FILE: localtests/autoinc-copy-deletes/create.sql
type gh_ost_test (line 4) | create table gh_ost_test (
FILE: localtests/autoinc-copy-simple/create.sql
type gh_ost_test (line 4) | create table gh_ost_test (
FILE: localtests/autoinc-zero-value/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/bigint-change-nullable/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/binary-to-varbinary/create.sql
type gh_ost_test (line 7) | create table gh_ost_test (
FILE: localtests/bit-add/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/bit-dml/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/compound-pk-ts/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/compound-pk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/convert-utf8mb4/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/copy-retries-exhausted/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime-1970/create.sql
type gh_ost_test (line 4) | create table gh_ost_test (
FILE: localtests/datetime-submillis-zeroleading/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime-submillis/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime-to-timestamp-pk-fail/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime-to-timestamp/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime-with-zero/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/datetime/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/decimal/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/discard-fk/create.sql
type gh_ost_test_fk_parent (line 4) | create table gh_ost_test_fk_parent (
type gh_ost_test (line 9) | create table gh_ost_test (
FILE: localtests/drop-null-add-not-null/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/enum-pk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/enum-to-varchar/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/enum/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/existing-datetime-with-zero/create.sql
type gh_ost_test (line 3) | create table gh_ost_test (
FILE: localtests/fail-datetime-with-zero/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-drop-pk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-existing-datetime-with-zero/create.sql
type gh_ost_test (line 3) | create table gh_ost_test (
FILE: localtests/fail-fk-parent/create.sql
type gh_ost_test (line 3) | create table gh_ost_test (
type gh_ost_test_child (line 8) | create table gh_ost_test_child (
FILE: localtests/fail-fk/create.sql
type gh_ost_test_fk_parent (line 4) | create table gh_ost_test_fk_parent (
type gh_ost_test (line 9) | create table gh_ost_test (
FILE: localtests/fail-float-unique-key/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-no-shared-uk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-no-unique-key/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-rename-table/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/fail-update-pk-column/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/gbk-charset/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/generated-columns-add/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/generated-columns-rename/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/generated-columns-unique/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/generated-columns/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/geometry/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/gtid/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/json-dml/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/json/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/keyword-column/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/latin1/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/latin1text/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/mixed-charset/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/modify-change-case-pk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/modify-change-case/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/panic-on-warnings-duplicate-unique-values-on-column-type-change/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
type name_index (line 8) | create unique index name_index on gh_ost_test (name)
FILE: localtests/panic-on-warnings-duplicate-values-for-unique-index/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/panic-on-warnings-update-pk-with-duplicate-on-new-unique-index/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename-inserts-only/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename-none-column/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename-none-comment/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename-reorder-column/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename-reorder-columns/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/rename/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/reorder-columns/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/shared-uk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/spatial/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/swap-pk-uk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/swap-uk-uk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/swap-uk/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/timestamp-datetime/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/timestamp-to-datetime/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/timestamp/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/trigger-advanced-features/create.sql
type gh_ost_test (line 15) | create table gh_ost_test (
type gh_ost_test_log (line 25) | create table gh_ost_test_log (
type gh_ost_test_stats (line 35) | create table gh_ost_test_stats (
FILE: localtests/trigger-ghost-name-conflict/create.sql
type gh_ost_test (line 10) | create table gh_ost_test (
type gh_ost_test_other (line 24) | create table gh_ost_test_other (
FILE: localtests/trigger-long-name-validation/create.sql
type gh_ost_test (line 8) | create table gh_ost_test (
FILE: localtests/trivial/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/tz-datetime-ts/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/tz-datetime/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/tz/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/unsigned-modify/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/unsigned-rename/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/unsigned-reorder/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/unsigned/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/utf8/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/utf8mb4/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: localtests/varbinary/create.sql
type gh_ost_test (line 2) | create table gh_ost_test (
FILE: vendor/dario.cat/mergo/map.go
function changeInitialCase (line 18) | func changeInitialCase(s string, mapper func(rune) rune) string {
function isExported (line 26) | func isExported(field reflect.StructField) bool {
function deepMap (line 34) | func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth i...
function Map (line 132) | func Map(dst, src interface{}, opts ...func(*Config)) error {
function MapWithOverwrite (line 139) | func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error {
function _map (line 143) | func _map(dst, src interface{}, opts ...func(*Config)) error {
FILE: vendor/dario.cat/mergo/merge.go
function hasMergeableFields (line 16) | func hasMergeableFields(dst reflect.Value) (exported bool) {
function isExportedComponent (line 28) | func isExportedComponent(field *reflect.StructField) bool {
type Config (line 40) | type Config struct
type Transformers (line 52) | type Transformers interface
function deepMerge (line 59) | func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth...
function Merge (line 318) | func Merge(dst, src interface{}, opts ...func(*Config)) error {
function MergeWithOverwrite (line 325) | func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) err...
function WithTransformers (line 330) | func WithTransformers(transformers Transformers) func(*Config) {
function WithOverride (line 337) | func WithOverride(config *Config) {
function WithOverwriteWithEmptyValue (line 342) | func WithOverwriteWithEmptyValue(config *Config) {
function WithOverrideEmptySlice (line 348) | func WithOverrideEmptySlice(config *Config) {
function WithoutDereference (line 354) | func WithoutDereference(config *Config) {
function WithAppendSlice (line 359) | func WithAppendSlice(config *Config) {
function WithTypeCheck (line 364) | func WithTypeCheck(config *Config) {
function WithSliceDeepCopy (line 369) | func WithSliceDeepCopy(config *Config) {
function merge (line 374) | func merge(dst, src interface{}, opts ...func(*Config)) error {
function isReflectNil (line 399) | func isReflectNil(v reflect.Value) bool {
FILE: vendor/dario.cat/mergo/mergo.go
type visit (line 30) | type visit struct
function isEmptyValue (line 37) | func isEmptyValue(v reflect.Value, shouldDereference bool) bool {
function resolveValues (line 65) | func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err ...
FILE: vendor/filippo.io/edwards25519/edwards25519.go
type projP1xP1 (line 15) | type projP1xP1 struct
method Add (line 273) | func (v *projP1xP1) Add(p *Point, q *projCached) *projP1xP1 {
method Sub (line 293) | func (v *projP1xP1) Sub(p *Point, q *projCached) *projP1xP1 {
method AddAffine (line 313) | func (v *projP1xP1) AddAffine(p *Point, q *affineCached) *projP1xP1 {
method SubAffine (line 332) | func (v *projP1xP1) SubAffine(p *Point, q *affineCached) *projP1xP1 {
method Double (line 353) | func (v *projP1xP1) Double(p *projP2) *projP1xP1 {
type projP2 (line 19) | type projP2 struct
method Zero (line 59) | func (v *projP2) Zero() *projP2 {
method FromP1xP1 (line 196) | func (v *projP2) FromP1xP1(p *projP1xP1) *projP2 {
method FromP3 (line 203) | func (v *projP2) FromP3(p *Point) *projP2 {
type Point (line 29) | type Point struct
method Set (line 107) | func (v *Point) Set(u *Point) *Point {
method Bytes (line 116) | func (v *Point) Bytes() []byte {
method bytes (line 123) | func (v *Point) bytes(buf *[32]byte) []byte {
method SetBytes (line 145) | func (v *Point) SetBytes(x []byte) (*Point, error) {
method fromP1xP1 (line 210) | func (v *Point) fromP1xP1(p *projP1xP1) *Point {
method fromP2 (line 218) | func (v *Point) fromP2(p *projP2) *Point {
method Add (line 258) | func (v *Point) Add(p, q *Point) *Point {
method Subtract (line 266) | func (v *Point) Subtract(p, q *Point) *Point {
method Negate (line 374) | func (v *Point) Negate(p *Point) *Point {
method Equal (line 384) | func (v *Point) Equal(u *Point) int {
type incomparable (line 39) | type incomparable
function checkInitialized (line 41) | func checkInitialized(points ...*Point) {
type projCached (line 49) | type projCached struct
method Zero (line 89) | func (v *projCached) Zero() *projCached {
method FromP3 (line 234) | func (v *projCached) FromP3(p *Point) *projCached {
method Select (line 399) | func (v *projCached) Select(a, b *projCached, cond int) *projCached {
method CondNeg (line 416) | func (v *projCached) CondNeg(cond int) *projCached {
type affineCached (line 53) | type affineCached struct
method Zero (line 97) | func (v *affineCached) Zero() *affineCached {
method FromP3 (line 242) | func (v *affineCached) FromP3(p *Point) *affineCached {
method Select (line 408) | func (v *affineCached) Select(a, b *affineCached, cond int) *affineCac...
method CondNeg (line 423) | func (v *affineCached) CondNeg(cond int) *affineCached {
function NewIdentityPoint (line 72) | func NewIdentityPoint() *Point {
function NewGeneratorPoint (line 85) | func NewGeneratorPoint() *Point {
function copyFieldElement (line 189) | func copyFieldElement(buf *[32]byte, v *field.Element) []byte {
FILE: vendor/filippo.io/edwards25519/extra.go
method ExtendedCoordinates (line 18) | func (v *Point) ExtendedCoordinates() (X, Y, Z, T *field.Element) {
method extendedCoordinates (line 27) | func (v *Point) extendedCoordinates(e *[4]field.Element) (X, Y, Z, T *fi...
method SetExtendedCoordinates (line 42) | func (v *Point) SetExtendedCoordinates(X, Y, Z, T *field.Element) (*Poin...
function isOnCurve (line 53) | func isOnCurve(X, Y, Z, T *field.Element) bool {
method BytesMontgomery (line 88) | func (v *Point) BytesMontgomery() []byte {
method bytesMontgomery (line 95) | func (v *Point) bytesMontgomery(buf *[32]byte) []byte {
method MultByCofactor (line 115) | func (v *Point) MultByCofactor(p *Point) *Point {
method pow2k (line 128) | func (s *Scalar) pow2k(k int) {
method Invert (line 137) | func (s *Scalar) Invert(t *Scalar) *Scalar {
method MultiScalarMult (line 243) | func (v *Point) MultiScalarMult(scalars []*Scalar, points []*Point) *Poi...
method VarTimeMultiScalarMult (line 297) | func (v *Point) VarTimeMultiScalarMult(scalars []*Scalar, points []*Poin...
FILE: vendor/filippo.io/edwards25519/field/fe.go
type Element (line 23) | type Element struct
method Zero (line 40) | func (v *Element) Zero() *Element {
method One (line 48) | func (v *Element) One() *Element {
method reduce (line 54) | func (v *Element) reduce() *Element {
method Add (line 87) | func (v *Element) Add(a, b *Element) *Element {
method Subtract (line 101) | func (v *Element) Subtract(a, b *Element) *Element {
method Negate (line 113) | func (v *Element) Negate(a *Element) *Element {
method Invert (line 120) | func (v *Element) Invert(z *Element) *Element {
method Set (line 185) | func (v *Element) Set(a *Element) *Element {
method SetBytes (line 198) | func (v *Element) SetBytes(x []byte) (*Element, error) {
method Bytes (line 224) | func (v *Element) Bytes() []byte {
method bytes (line 231) | func (v *Element) bytes(out *[32]byte) []byte {
method Equal (line 252) | func (v *Element) Equal(u *Element) int {
method Select (line 261) | func (v *Element) Select(a, b *Element, cond int) *Element {
method Swap (line 272) | func (v *Element) Swap(u *Element, cond int) {
method IsNegative (line 292) | func (v *Element) IsNegative() int {
method Absolute (line 297) | func (v *Element) Absolute(u *Element) *Element {
method Multiply (line 302) | func (v *Element) Multiply(x, y *Element) *Element {
method Square (line 308) | func (v *Element) Square(x *Element) *Element {
method Mult32 (line 314) | func (v *Element) Mult32(x *Element, y uint32) *Element {
method Pow22523 (line 339) | func (v *Element) Pow22523(x *Element) *Element {
method SqrtRatio (line 398) | func (r *Element) SqrtRatio(u, v *Element) (R *Element, wasSquare int) {
constant maskLow51Bits (line 35) | maskLow51Bits uint64 = (1 << 51) - 1
function mask64Bits (line 258) | func mask64Bits(cond int) uint64 { return ^(uint64(cond) - 1) }
function mul51 (line 331) | func mul51(a uint64, b uint32) (lo uint64, hi uint64) {
FILE: vendor/filippo.io/edwards25519/field/fe_amd64.go
function feMul (line 11) | func feMul(out *Element, a *Element, b *Element)
function feSquare (line 16) | func feSquare(out *Element, a *Element)
FILE: vendor/filippo.io/edwards25519/field/fe_amd64_noasm.go
function feMul (line 10) | func feMul(v, x, y *Element) { feMulGeneric(v, x, y) }
function feSquare (line 12) | func feSquare(v, x *Element) { feSquareGeneric(v, x) }
FILE: vendor/filippo.io/edwards25519/field/fe_arm64.go
function carryPropagate (line 11) | func carryPropagate(v *Element)
method carryPropagate (line 13) | func (v *Element) carryPropagate() *Element {
FILE: vendor/filippo.io/edwards25519/field/fe_arm64_noasm.go
method carryPropagate (line 10) | func (v *Element) carryPropagate() *Element {
FILE: vendor/filippo.io/edwards25519/field/fe_extra.go
method SetWideBytes (line 19) | func (v *Element) SetWideBytes(x []byte) (*Element, error) {
FILE: vendor/filippo.io/edwards25519/field/fe_generic.go
type uint128 (line 11) | type uint128 struct
function mul64 (line 16) | func mul64(a, b uint64) uint128 {
function addMul64 (line 22) | func addMul64(v uint128, a, b uint64) uint128 {
function shiftRightBy51 (line 30) | func shiftRightBy51(a uint128) uint64 {
function feMulGeneric (line 34) | func feMulGeneric(v, a, b *Element) {
function feSquareGeneric (line 165) | func feSquareGeneric(v, a *Element) {
method carryPropagateGeneric (line 250) | func (v *Element) carryPropagateGeneric() *Element {
FILE: vendor/filippo.io/edwards25519/scalar.go
type Scalar (line 22) | type Scalar struct
method MultiplyAdd (line 63) | func (s *Scalar) MultiplyAdd(x, y, z *Scalar) *Scalar {
method Add (line 70) | func (s *Scalar) Add(x, y *Scalar) *Scalar {
method Subtract (line 77) | func (s *Scalar) Subtract(x, y *Scalar) *Scalar {
method Negate (line 84) | func (s *Scalar) Negate(x *Scalar) *Scalar {
method Multiply (line 91) | func (s *Scalar) Multiply(x, y *Scalar) *Scalar {
method Set (line 98) | func (s *Scalar) Set(x *Scalar) *Scalar {
method SetUniformBytes (line 109) | func (s *Scalar) SetUniformBytes(x []byte) (*Scalar, error) {
method setShortBytes (line 144) | func (s *Scalar) setShortBytes(x []byte) *Scalar {
method SetCanonicalBytes (line 158) | func (s *Scalar) SetCanonicalBytes(x []byte) (*Scalar, error) {
method SetBytesWithClamping (line 204) | func (s *Scalar) SetBytesWithClamping(x []byte) (*Scalar, error) {
method Bytes (line 224) | func (s *Scalar) Bytes() []byte {
method bytes (line 231) | func (s *Scalar) bytes(out *[32]byte) []byte {
method Equal (line 239) | func (s *Scalar) Equal(t *Scalar) int {
method nonAdjacentForm (line 256) | func (s *Scalar) nonAdjacentForm(w uint) [256]int8 {
method signedRadix16 (line 321) | func (s *Scalar) signedRadix16() [64]int8 {
function NewScalar (line 57) | func NewScalar() *Scalar {
function isReduced (line 177) | func isReduced(s []byte) bool {
FILE: vendor/filippo.io/edwards25519/scalar_fiat.go
type fiatScalarUint1 (line 43) | type fiatScalarUint1
type fiatScalarInt1 (line 44) | type fiatScalarInt1
type fiatScalarMontgomeryDomainFieldElement (line 49) | type fiatScalarMontgomeryDomainFieldElement
type fiatScalarNonMontgomeryDomainFieldElement (line 54) | type fiatScalarNonMontgomeryDomainFieldElement
function fiatScalarCmovznzU64 (line 71) | func fiatScalarCmovznzU64(out1 *uint64, arg1 fiatScalarUint1, arg2 uint6...
function fiatScalarMul (line 88) | func fiatScalarMul(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
function fiatScalarAdd (line 384) | func fiatScalarAdd(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
function fiatScalarSub (line 436) | func fiatScalarSub(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
function fiatScalarOpp (line 478) | func fiatScalarOpp(out1 *fiatScalarMontgomeryDomainFieldElement, arg1 *f...
function fiatScalarNonzero (line 527) | func fiatScalarNonzero(out1 *uint64, arg1 *[4]uint64) {
function fiatScalarFromMontgomery (line 542) | func fiatScalarFromMontgomery(out1 *fiatScalarNonMontgomeryDomainFieldEl...
function fiatScalarToMontgomery (line 698) | func fiatScalarToMontgomery(out1 *fiatScalarMontgomeryDomainFieldElement...
function fiatScalarToBytes (line 969) | func fiatScalarToBytes(out1 *[32]uint8, arg1 *[4]uint64) {
function fiatScalarFromBytes (line 1082) | func fiatScalarFromBytes(out1 *[4]uint64, arg1 *[32]uint8) {
FILE: vendor/filippo.io/edwards25519/scalarmult.go
function basepointTable (line 11) | func basepointTable() *[32]affineLookupTable {
method ScalarBaseMult (line 33) | func (v *Point) ScalarBaseMult(x *Scalar) *Point {
method ScalarMult (line 85) | func (v *Point) ScalarMult(x *Scalar, q *Point) *Point {
function basepointNafTable (line 127) | func basepointNafTable() *nafLookupTable8 {
method VarTimeDoubleScalarBaseMult (line 143) | func (v *Point) VarTimeDoubleScalarBaseMult(a *Scalar, A *Point, b *Scal...
FILE: vendor/filippo.io/edwards25519/tables.go
type projLookupTable (line 12) | type projLookupTable struct
method FromP3 (line 34) | func (v *projLookupTable) FromP3(q *Point) {
method SelectInto (line 90) | func (v *projLookupTable) SelectInto(dest *projCached, x int8) {
type affineLookupTable (line 17) | type affineLookupTable struct
method FromP3 (line 49) | func (v *affineLookupTable) FromP3(q *Point) {
method SelectInto (line 106) | func (v *affineLookupTable) SelectInto(dest *affineCached, x int8) {
type nafLookupTable5 (line 22) | type nafLookupTable5 struct
method FromP3 (line 62) | func (v *nafLookupTable5) FromP3(q *Point) {
method SelectInto (line 122) | func (v *nafLookupTable5) SelectInto(dest *projCached, x int8) {
type nafLookupTable8 (line 27) | type nafLookupTable8 struct
method FromP3 (line 76) | func (v *nafLookupTable8) FromP3(q *Point) {
method SelectInto (line 127) | func (v *nafLookupTable8) SelectInto(dest *affineCached, x int8) {
FILE: vendor/github.com/Azure/go-ansiterm/constants.go
constant LogEnv (line 3) | LogEnv = "DEBUG_TERMINAL"
constant ANSI_SGR_RESET (line 21) | ANSI_SGR_RESET = 0
constant ANSI_SGR_BOLD (line 22) | ANSI_SGR_BOLD = 1
constant ANSI_SGR_DIM (line 23) | ANSI_SGR_DIM = 2
constant _ANSI_SGR_ITALIC (line 24) | _ANSI_SGR_ITALIC = 3
constant ANSI_SGR_UNDERLINE (line 25) | ANSI_SGR_UNDERLINE = 4
constant _ANSI_SGR_BLINKSLOW (line 26) | _ANSI_SGR_BLINKSLOW = 5
constant _ANSI_SGR_BLINKFAST (line 27) | _ANSI_SGR_BLINKFAST = 6
constant ANSI_SGR_REVERSE (line 28) | ANSI_SGR_REVERSE = 7
constant _ANSI_SGR_INVISIBLE (line 29) | _ANSI_SGR_INVISIBLE = 8
constant _ANSI_SGR_LINETHROUGH (line 30) | _ANSI_SGR_LINETHROUGH = 9
constant _ANSI_SGR_FONT_00 (line 31) | _ANSI_SGR_FONT_00 = 10
constant _ANSI_SGR_FONT_01 (line 32) | _ANSI_SGR_FONT_01 = 11
constant _ANSI_SGR_FONT_02 (line 33) | _ANSI_SGR_FONT_02 = 12
constant _ANSI_SGR_FONT_03 (line 34) | _ANSI_SGR_FONT_03 = 13
constant _ANSI_SGR_FONT_04 (line 35) | _ANSI_SGR_FONT_04 = 14
constant _ANSI_SGR_FONT_05 (line 36) | _ANSI_SGR_FONT_05 = 15
constant _ANSI_SGR_FONT_06 (line 37) | _ANSI_SGR_FONT_06 = 16
constant _ANSI_SGR_FONT_07 (line 38) | _ANSI_SGR_FONT_07 = 17
constant _ANSI_SGR_FONT_08 (line 39) | _ANSI_SGR_FONT_08 = 18
constant _ANSI_SGR_FONT_09 (line 40) | _ANSI_SGR_FONT_09 = 19
constant _ANSI_SGR_FONT_10 (line 41) | _ANSI_SGR_FONT_10 = 20
constant _ANSI_SGR_DOUBLEUNDERLINE (line 42) | _ANSI_SGR_DOUBLEUNDERLINE = 21
constant ANSI_SGR_BOLD_DIM_OFF (line 43) | ANSI_SGR_BOLD_DIM_OFF = 22
constant _ANSI_SGR_ITALIC_OFF (line 44) | _ANSI_SGR_ITALIC_OFF = 23
constant ANSI_SGR_UNDERLINE_OFF (line 45) | ANSI_SGR_UNDERLINE_OFF = 24
constant _ANSI_SGR_BLINK_OFF (line 46) | _ANSI_SGR_BLINK_OFF = 25
constant _ANSI_SGR_RESERVED_00 (line 47) | _ANSI_SGR_RESERVED_00 = 26
constant ANSI_SGR_REVERSE_OFF (line 48) | ANSI_SGR_REVERSE_OFF = 27
constant _ANSI_SGR_INVISIBLE_OFF (line 49) | _ANSI_SGR_INVISIBLE_OFF = 28
constant _ANSI_SGR_LINETHROUGH_OFF (line 50) | _ANSI_SGR_LINETHROUGH_OFF = 29
constant ANSI_SGR_FOREGROUND_BLACK (line 51) | ANSI_SGR_FOREGROUND_BLACK = 30
constant ANSI_SGR_FOREGROUND_RED (line 52) | ANSI_SGR_FOREGROUND_RED = 31
constant ANSI_SGR_FOREGROUND_GREEN (line 53) | ANSI_SGR_FOREGROUND_GREEN = 32
constant ANSI_SGR_FOREGROUND_YELLOW (line 54) | ANSI_SGR_FOREGROUND_YELLOW = 33
constant ANSI_SGR_FOREGROUND_BLUE (line 55) | ANSI_SGR_FOREGROUND_BLUE = 34
constant ANSI_SGR_FOREGROUND_MAGENTA (line 56) | ANSI_SGR_FOREGROUND_MAGENTA = 35
constant ANSI_SGR_FOREGROUND_CYAN (line 57) | ANSI_SGR_FOREGROUND_CYAN = 36
constant ANSI_SGR_FOREGROUND_WHITE (line 58) | ANSI_SGR_FOREGROUND_WHITE = 37
constant _ANSI_SGR_RESERVED_01 (line 59) | _ANSI_SGR_RESERVED_01 = 38
constant ANSI_SGR_FOREGROUND_DEFAULT (line 60) | ANSI_SGR_FOREGROUND_DEFAULT = 39
constant ANSI_SGR_BACKGROUND_BLACK (line 61) | ANSI_SGR_BACKGROUND_BLACK = 40
constant ANSI_SGR_BACKGROUND_RED (line 62) | ANSI_SGR_BACKGROUND_RED = 41
constant ANSI_SGR_BACKGROUND_GREEN (line 63) | ANSI_SGR_BACKGROUND_GREEN = 42
constant ANSI_SGR_BACKGROUND_YELLOW (line 64) | ANSI_SGR_BACKGROUND_YELLOW = 43
constant ANSI_SGR_BACKGROUND_BLUE (line 65) | ANSI_SGR_BACKGROUND_BLUE = 44
constant ANSI_SGR_BACKGROUND_MAGENTA (line 66) | ANSI_SGR_BACKGROUND_MAGENTA = 45
constant ANSI_SGR_BACKGROUND_CYAN (line 67) | ANSI_SGR_BACKGROUND_CYAN = 46
constant ANSI_SGR_BACKGROUND_WHITE (line 68) | ANSI_SGR_BACKGROUND_WHITE = 47
constant _ANSI_SGR_RESERVED_02 (line 69) | _ANSI_SGR_RESERVED_02 = 48
constant ANSI_SGR_BACKGROUND_DEFAULT (line 70) | ANSI_SGR_BACKGROUND_DEFAULT = 49
constant ANSI_MAX_CMD_LENGTH (line 73) | ANSI_MAX_CMD_LENGTH = 4096
constant MAX_INPUT_EVENTS (line 75) | MAX_INPUT_EVENTS = 128
constant DEFAULT_WIDTH (line 76) | DEFAULT_WIDTH = 80
constant DEFAULT_HEIGHT (line 77) | DEFAULT_HEIGHT = 24
constant ANSI_BEL (line 79) | ANSI_BEL = 0x07
constant ANSI_BACKSPACE (line 80) | ANSI_BACKSPACE = 0x08
constant ANSI_TAB (line 81) | ANSI_TAB = 0x09
constant ANSI_LINE_FEED (line 82) | ANSI_LINE_FEED = 0x0A
constant ANSI_VERTICAL_TAB (line 83) | ANSI_VERTICAL_TAB = 0x0B
constant ANSI_FORM_FEED (line 84) | ANSI_FORM_FEED = 0x0C
constant ANSI_CARRIAGE_RETURN (line 85) | ANSI_CARRIAGE_RETURN = 0x0D
constant ANSI_ESCAPE_PRIMARY (line 86) | ANSI_ESCAPE_PRIMARY = 0x1B
constant ANSI_ESCAPE_SECONDARY (line 87) | ANSI_ESCAPE_SECONDARY = 0x5B
constant ANSI_OSC_STRING_ENTRY (line 88) | ANSI_OSC_STRING_ENTRY = 0x5D
constant ANSI_COMMAND_FIRST (line 89) | ANSI_COMMAND_FIRST = 0x40
constant ANSI_COMMAND_LAST (line 90) | ANSI_COMMAND_LAST = 0x7E
constant DCS_ENTRY (line 91) | DCS_ENTRY = 0x90
constant CSI_ENTRY (line 92) | CSI_ENTRY = 0x9B
constant OSC_STRING (line 93) | OSC_STRING = 0x9D
constant ANSI_PARAMETER_SEP (line 94) | ANSI_PARAMETER_SEP = ";"
constant ANSI_CMD_G0 (line 95) | ANSI_CMD_G0 = '('
constant ANSI_CMD_G1 (line 96) | ANSI_CMD_G1 = ')'
constant ANSI_CMD_G2 (line 97) | ANSI_CMD_G2 = '*'
constant ANSI_CMD_G3 (line 98) | ANSI_CMD_G3 = '+'
constant ANSI_CMD_DECPNM (line 99) | ANSI_CMD_DECPNM = '>'
constant ANSI_CMD_DECPAM (line 100) | ANSI_CMD_DECPAM = '='
constant ANSI_CMD_OSC (line 101) | ANSI_CMD_OSC = ']'
constant ANSI_CMD_STR_TERM (line 102) | ANSI_CMD_STR_TERM = '\\'
constant KEY_CONTROL_PARAM_2 (line 104) | KEY_CONTROL_PARAM_2 = ";2"
constant KEY_CONTROL_PARAM_3 (line 105) | KEY_CONTROL_PARAM_3 = ";3"
constant KEY_CONTROL_PARAM_4 (line 106) | KEY_CONTROL_PARAM_4 = ";4"
constant KEY_CONTROL_PARAM_5 (line 107) | KEY_CONTROL_PARAM_5 = ";5"
constant KEY_CONTROL_PARAM_6 (line 108) | KEY_CONTROL_PARAM_6 = ";6"
constant KEY_CONTROL_PARAM_7 (line 109) | KEY_CONTROL_PARAM_7 = ";7"
constant KEY_CONTROL_PARAM_8 (line 110) | KEY_CONTROL_PARAM_8 = ";8"
constant KEY_ESC_CSI (line 111) | KEY_ESC_CSI = "\x1B["
constant KEY_ESC_N (line 112) | KEY_ESC_N = "\x1BN"
constant KEY_ESC_O (line 113) | KEY_ESC_O = "\x1BO"
constant FILL_CHARACTER (line 115) | FILL_CHARACTER = ' '
function getByteRange (line 118) | func getByteRange(start byte, end byte) []byte {
function getEscapeToGroundBytes (line 157) | func getEscapeToGroundBytes() []byte {
function getExecuteBytes (line 167) | func getExecuteBytes() []byte {
function getToGroundBytes (line 174) | func getToGroundBytes() []byte {
FILE: vendor/github.com/Azure/go-ansiterm/context.go
type ansiContext (line 3) | type ansiContext struct
FILE: vendor/github.com/Azure/go-ansiterm/csi_entry_state.go
type csiEntryState (line 3) | type csiEntryState struct
method Handle (line 7) | func (csiState csiEntryState) Handle(b byte) (s state, e error) {
method Transition (line 27) | func (csiState csiEntryState) Transition(s state) error {
method Enter (line 46) | func (csiState csiEntryState) Enter() error {
FILE: vendor/github.com/Azure/go-ansiterm/csi_param_state.go
type csiParamState (line 3) | type csiParamState struct
method Handle (line 7) | func (csiState csiParamState) Handle(b byte) (s state, e error) {
method Transition (line 28) | func (csiState csiParamState) Transition(s state) error {
FILE: vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go
type escapeIntermediateState (line 3) | type escapeIntermediateState struct
method Handle (line 7) | func (escState escapeIntermediateState) Handle(b byte) (s state, e err...
method Transition (line 26) | func (escState escapeIntermediateState) Transition(s state) error {
FILE: vendor/github.com/Azure/go-ansiterm/escape_state.go
type escapeState (line 3) | type escapeState struct
method Handle (line 7) | func (escState escapeState) Handle(b byte) (s state, e error) {
method Transition (line 30) | func (escState escapeState) Transition(s state) error {
method Enter (line 44) | func (escState escapeState) Enter() error {
FILE: vendor/github.com/Azure/go-ansiterm/event_handler.go
type AnsiEventHandler (line 3) | type AnsiEventHandler interface
FILE: vendor/github.com/Azure/go-ansiterm/ground_state.go
type groundState (line 3) | type groundState struct
method Handle (line 7) | func (gs groundState) Handle(b byte) (s state, e error) {
FILE: vendor/github.com/Azure/go-ansiterm/osc_string_state.go
type oscStringState (line 3) | type oscStringState struct
method Handle (line 7) | func (oscState oscStringState) Handle(b byte) (s state, e error) {
function isOscStringTerminator (line 24) | func isOscStringTerminator(b byte) bool {
FILE: vendor/github.com/Azure/go-ansiterm/parser.go
type AnsiParser (line 9) | type AnsiParser struct
method Parse (line 97) | func (ap *AnsiParser) Parse(bytes []byte) (int, error) {
method handle (line 107) | func (ap *AnsiParser) handle(b byte) error {
method changeState (line 128) | func (ap *AnsiParser) changeState(newState state) error {
type Option (line 26) | type Option
function WithLogf (line 28) | func WithLogf(f func(string, ...interface{})) Option {
function CreateParser (line 34) | func CreateParser(initialState string, evtHandler AnsiEventHandler, opts...
function getState (line 87) | func getState(name string, states []state) state {
FILE: vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go
function parseParams (line 7) | func parseParams(bytes []byte) ([]string, error) {
function parseCmd (line 33) | func parseCmd(context ansiContext) (string, error) {
function getInt (line 37) | func getInt(params []string, dflt int) int {
function getInts (line 42) | func getInts(params []string, minCount int, dflt int) []int {
method modeDispatch (line 64) | func (ap *AnsiParser) modeDispatch(param string, set bool) error {
method hDispatch (line 76) | func (ap *AnsiParser) hDispatch(params []string) error {
method lDispatch (line 84) | func (ap *AnsiParser) lDispatch(params []string) error {
function getEraseParam (line 92) | func getEraseParam(params []string) int {
FILE: vendor/github.com/Azure/go-ansiterm/parser_actions.go
method collectParam (line 3) | func (ap *AnsiParser) collectParam() error {
method collectInter (line 10) | func (ap *AnsiParser) collectInter() error {
method escDispatch (line 17) | func (ap *AnsiParser) escDispatch() error {
method csiDispatch (line 39) | func (ap *AnsiParser) csiDispatch() error {
method print (line 108) | func (ap *AnsiParser) print() error {
method clear (line 112) | func (ap *AnsiParser) clear() error {
method execute (line 117) | func (ap *AnsiParser) execute() error {
FILE: vendor/github.com/Azure/go-ansiterm/states.go
type stateID (line 3) | type stateID
type state (line 5) | type state interface
type baseState (line 13) | type baseState struct
method Enter (line 18) | func (base baseState) Enter() error {
method Exit (line 22) | func (base baseState) Exit() error {
method Handle (line 26) | func (base baseState) Handle(b byte) (s state, e error) {
method Name (line 44) | func (base baseState) Name() string {
method Transition (line 48) | func (base baseState) Transition(s state) error {
type dcsEntryState (line 65) | type dcsEntryState struct
type errorState (line 69) | type errorState struct
FILE: vendor/github.com/Azure/go-ansiterm/utilities.go
function sliceContains (line 7) | func sliceContains(bytes []byte, b byte) bool {
function convertBytesToInteger (line 17) | func convertBytesToInteger(bytes []byte) int {
FILE: vendor/github.com/Azure/go-ansiterm/winterm/ansi.go
constant VK_PRIOR (line 19) | VK_PRIOR = 0x21
constant VK_NEXT (line 20) | VK_NEXT = 0x22
constant VK_END (line 21) | VK_END = 0x23
constant VK_HOME (line 22) | VK_HOME = 0x24
constant VK_LEFT (line 23) | VK_LEFT = 0x25
constant VK_UP (line 24) | VK_UP = 0x26
constant VK_RIGHT (line 25) | VK_RIGHT = 0x27
constant VK_DOWN (line 26) | VK_DOWN = 0x28
constant VK_SELECT (line 27) | VK_SELECT = 0x29
constant VK_PRINT (line 28) | VK_PRINT = 0x2A
constant VK_EXECUTE (line 29) | VK_EXECUTE = 0x2B
constant VK_SNAPSHOT (line 30) | VK_SNAPSHOT = 0x2C
constant VK_INSERT (line 31) | VK_INSERT = 0x2D
constant VK_DELETE (line 32) | VK_DELETE = 0x2E
constant VK_HELP (line 33) | VK_HELP = 0x2F
constant VK_F1 (line 34) | VK_F1 = 0x70
constant VK_F2 (line 35) | VK_F2 = 0x71
constant VK_F3 (line 36) | VK_F3 = 0x72
constant VK_F4 (line 37) | VK_F4 = 0x73
constant VK_F5 (line 38) | VK_F5 = 0x74
constant VK_F6 (line 39) | VK_F6 = 0x75
constant VK_F7 (line 40) | VK_F7 = 0x76
constant VK_F8 (line 41) | VK_F8 = 0x77
constant VK_F9 (line 42) | VK_F9 = 0x78
constant VK_F10 (line 43) | VK_F10 = 0x79
constant VK_F11 (line 44) | VK_F11 = 0x7A
constant VK_F12 (line 45) | VK_F12 = 0x7B
constant RIGHT_ALT_PRESSED (line 47) | RIGHT_ALT_PRESSED = 0x0001
constant LEFT_ALT_PRESSED (line 48) | LEFT_ALT_PRESSED = 0x0002
constant RIGHT_CTRL_PRESSED (line 49) | RIGHT_CTRL_PRESSED = 0x0004
constant LEFT_CTRL_PRESSED (line 50) | LEFT_CTRL_PRESSED = 0x0008
constant SHIFT_PRESSED (line 51) | SHIFT_PRESSED = 0x0010
constant NUMLOCK_ON (line 52) | NUMLOCK_ON = 0x0020
constant SCROLLLOCK_ON (line 53) | SCROLLLOCK_ON = 0x0040
constant CAPSLOCK_ON (line 54) | CAPSLOCK_ON = 0x0080
constant ENHANCED_KEY (line 55) | ENHANCED_KEY = 0x0100
type ansiCommand (line 58) | type ansiCommand struct
method paramAsSHORT (line 99) | func (ac *ansiCommand) paramAsSHORT(index int, defaultValue int16) int...
method String (line 112) | func (ac *ansiCommand) String() string {
function newAnsiCommand (line 65) | func newAnsiCommand(command []byte) *ansiCommand {
function isAnsiCommandChar (line 121) | func isAnsiCommandChar(b byte) bool {
function isXtermOscSequence (line 135) | func isXtermOscSequence(command []byte, current byte) bool {
function isCharacterSelectionCmdChar (line 139) | func isCharacterSelectionCmdChar(b byte) bool {
function bytesToHex (line 144) | func bytesToHex(b []byte) string {
function ensureInRange (line 154) | func ensureInRange(n int16, min int16, max int16) int16 {
function GetStdFile (line 164) | func GetStdFile(nFile int) (*os.File, uintptr) {
FILE: vendor/github.com/Azure/go-ansiterm/winterm/api.go
constant ENABLE_PROCESSED_INPUT (line 52) | ENABLE_PROCESSED_INPUT = 0x0001
constant ENABLE_LINE_INPUT (line 53) | ENABLE_LINE_INPUT = 0x0002
constant ENABLE_ECHO_INPUT (line 54) | ENABLE_ECHO_INPUT = 0x0004
constant ENABLE_WINDOW_INPUT (line 55) | ENABLE_WINDOW_INPUT = 0x0008
constant ENABLE_MOUSE_INPUT (line 56) | ENABLE_MOUSE_INPUT = 0x0010
constant ENABLE_INSERT_MODE (line 57) | ENABLE_INSERT_MODE = 0x0020
constant ENABLE_QUICK_EDIT_MODE (line 58) | ENABLE_QUICK_EDIT_MODE = 0x0040
constant ENABLE_EXTENDED_FLAGS (line 59) | ENABLE_EXTENDED_FLAGS = 0x0080
constant ENABLE_AUTO_POSITION (line 60) | ENABLE_AUTO_POSITION = 0x0100
constant ENABLE_VIRTUAL_TERMINAL_INPUT (line 61) | ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200
constant ENABLE_PROCESSED_OUTPUT (line 63) | ENABLE_PROCESSED_OUTPUT = 0x0001
constant ENABLE_WRAP_AT_EOL_OUTPUT (line 64) | ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
constant ENABLE_VIRTUAL_TERMINAL_PROCESSING (line 65) | ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
constant DISABLE_NEWLINE_AUTO_RETURN (line 66) | DISABLE_NEWLINE_AUTO_RETURN = 0x0008
constant ENABLE_LVB_GRID_WORLDWIDE (line 67) | ENABLE_LVB_GRID_WORLDWIDE = 0x0010
constant FOREGROUND_BLUE (line 74) | FOREGROUND_BLUE uint16 = 0x0001
constant FOREGROUND_GREEN (line 75) | FOREGROUND_GREEN uint16 = 0x0002
constant FOREGROUND_RED (line 76) | FOREGROUND_RED uint16 = 0x0004
constant FOREGROUND_INTENSITY (line 77) | FOREGROUND_INTENSITY uint16 = 0x0008
constant FOREGROUND_MASK (line 78) | FOREGROUND_MASK uint16 = 0x000F
constant BACKGROUND_BLUE (line 80) | BACKGROUND_BLUE uint16 = 0x0010
constant BACKGROUND_GREEN (line 81) | BACKGROUND_GREEN uint16 = 0x0020
constant BACKGROUND_RED (line 82) | BACKGROUND_RED uint16 = 0x0040
constant BACKGROUND_INTENSITY (line 83) | BACKGROUND_INTENSITY uint16 = 0x0080
constant BACKGROUND_MASK (line 84) | BACKGROUND_MASK uint16 = 0x00F0
constant COMMON_LVB_MASK (line 86) | COMMON_LVB_MASK uint16 = 0xFF00
constant COMMON_LVB_REVERSE_VIDEO (line 87) | COMMON_LVB_REVERSE_VIDEO uint16 = 0x4000
constant COMMON_LVB_UNDERSCORE (line 88) | COMMON_LVB_UNDERSCORE uint16 = 0x8000
constant KEY_EVENT (line 92) | KEY_EVENT = 0x0001
constant MOUSE_EVENT (line 93) | MOUSE_EVENT = 0x0002
constant WINDOW_BUFFER_SIZE_EVENT (line 94) | WINDOW_BUFFER_SIZE_EVENT = 0x0004
constant MENU_EVENT (line 95) | MENU_EVENT = 0x0008
constant FOCUS_EVENT (line 96) | FOCUS_EVENT = 0x0010
constant WAIT_ABANDONED (line 99) | WAIT_ABANDONED = 0x00000080
constant WAIT_FAILED (line 100) | WAIT_FAILED = 0xFFFFFFFF
constant WAIT_SIGNALED (line 101) | WAIT_SIGNALED = 0x0000000
constant WAIT_TIMEOUT (line 102) | WAIT_TIMEOUT = 0x00000102
constant WAIT_INFINITE (line 105) | WAIT_INFINITE = 0xFFFFFFFF
constant WAIT_ONE_SECOND (line 106) | WAIT_ONE_SECOND = 1000
constant WAIT_HALF_SECOND (line 107) | WAIT_HALF_SECOND = 500
constant WAIT_QUARTER_SECOND (line 108) | WAIT_QUARTER_SECOND = 250
type CHAR_INFO (line 115) | type CHAR_INFO struct
type CONSOLE_CURSOR_INFO (line 120) | type CONSOLE_CURSOR_INFO struct
type CONSOLE_SCREEN_BUFFER_INFO (line 125) | type CONSOLE_SCREEN_BUFFER_INFO struct
method String (line 293) | func (info CONSOLE_SCREEN_BUFFER_INFO) String() string {
type COORD (line 133) | type COORD struct
method String (line 297) | func (coord COORD) String() string {
type SMALL_RECT (line 138) | type SMALL_RECT struct
method String (line 301) | func (rect SMALL_RECT) String() string {
type INPUT_RECORD (line 147) | type INPUT_RECORD struct
type KEY_EVENT_RECORD (line 152) | type KEY_EVENT_RECORD struct
type WINDOW_BUFFER_SIZE (line 161) | type WINDOW_BUFFER_SIZE struct
function boolToBOOL (line 167) | func boolToBOOL(f bool) int32 {
function GetConsoleCursorInfo (line 177) | func GetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INF...
function SetConsoleCursorInfo (line 184) | func SetConsoleCursorInfo(handle uintptr, cursorInfo *CONSOLE_CURSOR_INF...
function SetConsoleCursorPosition (line 191) | func SetConsoleCursorPosition(handle uintptr, coord COORD) error {
function GetConsoleMode (line 199) | func GetConsoleMode(handle uintptr) (mode uint32, err error) {
function SetConsoleMode (line 206) | func SetConsoleMode(handle uintptr, mode uint32) error {
function GetConsoleScreenBufferInfo (line 214) | func GetConsoleScreenBufferInfo(handle uintptr) (*CONSOLE_SCREEN_BUFFER_...
function ScrollConsoleScreenBuffer (line 223) | func ScrollConsoleScreenBuffer(handle uintptr, scrollRect SMALL_RECT, cl...
function SetConsoleScreenBufferSize (line 234) | func SetConsoleScreenBufferSize(handle uintptr, coord COORD) error {
function SetConsoleTextAttribute (line 243) | func SetConsoleTextAttribute(handle uintptr, attribute uint16) error {
function SetConsoleWindowInfo (line 252) | func SetConsoleWindowInfo(handle uintptr, isAbsolute bool, rect SMALL_RE...
function WriteConsoleOutput (line 261) | func WriteConsoleOutput(handle uintptr, buffer []CHAR_INFO, bufferSize C...
function ReadConsoleInput (line 271) | func ReadConsoleInput(handle uintptr, buffer []INPUT_RECORD, count *uint...
function WaitForSingleObject (line 280) | func WaitForSingleObject(handle uintptr, msWait uint32) (bool, error) {
function checkError (line 306) | func checkError(r1, r2 uintptr, err error) error {
function coordToPointer (line 320) | func coordToPointer(c COORD) uintptr {
function use (line 327) | func use(p interface{}) {}
FILE: vendor/github.com/Azure/go-ansiterm/winterm/attr_translation.go
constant FOREGROUND_COLOR_MASK (line 8) | FOREGROUND_COLOR_MASK = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
constant BACKGROUND_COLOR_MASK (line 9) | BACKGROUND_COLOR_MASK = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
function collectAnsiIntoWindowsAttributes (line 14) | func collectAnsiIntoWindowsAttributes(windowsMode uint16, inverted bool,...
function invertAttributes (line 98) | func invertAttributes(windowsMode uint16) uint16 {
FILE: vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go
constant horizontal (line 6) | horizontal = iota
constant vertical (line 7) | vertical
method getCursorWindow (line 10) | func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_B...
method setCursorPosition (line 30) | func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, wind...
method moveCursorVertical (line 41) | func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error {
method moveCursorHorizontal (line 45) | func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error {
method moveCursor (line 49) | func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) er...
method moveCursorLine (line 70) | func (h *windowsAnsiEventHandler) moveCursorLine(param int) error {
method moveCursorColumn (line 87) | func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error {
FILE: vendor/github.com/Azure/go-ansiterm/winterm/erase_helpers.go
method clearRange (line 7) | func (h *windowsAnsiEventHandler) clearRange(attributes uint16, fromCoor...
method clearRect (line 61) | func (h *windowsAnsiEventHandler) clearRect(attributes uint16, fromCoord...
FILE: vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go
method effectiveSr (line 6) | func (h *windowsAnsiEventHandler) effectiveSr(window SMALL_RECT) scrollR...
method scrollUp (line 16) | func (h *windowsAnsiEventHandler) scrollUp(param int) error {
method scrollDown (line 26) | func (h *windowsAnsiEventHandler) scrollDown(param int) error {
method deleteLines (line 30) | func (h *windowsAnsiEventHandler) deleteLines(param int) error {
method insertLines (line 47) | func (h *windowsAnsiEventHandler) insertLines(param int) error {
method scroll (line 52) | func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, inf...
method deleteCharacters (line 81) | func (h *windowsAnsiEventHandler) deleteCharacters(param int) error {
method insertCharacters (line 89) | func (h *windowsAnsiEventHandler) insertCharacters(param int) error {
method scrollLine (line 94) | func (h *windowsAnsiEventHandler) scrollLine(columns int, position COORD...
FILE: vendor/github.com/Azure/go-ansiterm/winterm/utilities.go
function addInRange (line 7) | func addInRange(n int16, increment int16, min int16, max int16) int16 {
FILE: vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go
type windowsAnsiEventHandler (line 14) | type windowsAnsiEventHandler struct
method simulateLF (line 88) | func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, er...
method executeLF (line 154) | func (h *windowsAnsiEventHandler) executeLF() error {
method Print (line 180) | func (h *windowsAnsiEventHandler) Print(b byte) error {
method Execute (line 203) | func (h *windowsAnsiEventHandler) Execute(b byte) error {
method CUU (line 285) | func (h *windowsAnsiEventHandler) CUU(param int) error {
method CUD (line 294) | func (h *windowsAnsiEventHandler) CUD(param int) error {
method CUF (line 303) | func (h *windowsAnsiEventHandler) CUF(param int) error {
method CUB (line 312) | func (h *windowsAnsiEventHandler) CUB(param int) error {
method CNL (line 321) | func (h *windowsAnsiEventHandler) CNL(param int) error {
method CPL (line 330) | func (h *windowsAnsiEventHandler) CPL(param int) error {
method CHA (line 339) | func (h *windowsAnsiEventHandler) CHA(param int) error {
method VPA (line 348) | func (h *windowsAnsiEventHandler) VPA(param int) error {
method CUP (line 364) | func (h *windowsAnsiEventHandler) CUP(row int, col int) error {
method HVP (line 380) | func (h *windowsAnsiEventHandler) HVP(row int, col int) error {
method DECTCEM (line 389) | func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error {
method DECOM (line 398) | func (h *windowsAnsiEventHandler) DECOM(enable bool) error {
method DECCOLM (line 408) | func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error {
method ED (line 447) | func (h *windowsAnsiEventHandler) ED(param int) error {
method EL (line 506) | func (h *windowsAnsiEventHandler) EL(param int) error {
method IL (line 547) | func (h *windowsAnsiEventHandler) IL(param int) error {
method DL (line 556) | func (h *windowsAnsiEventHandler) DL(param int) error {
method ICH (line 565) | func (h *windowsAnsiEventHandler) ICH(param int) error {
method DCH (line 574) | func (h *windowsAnsiEventHandler) DCH(param int) error {
method SGR (line 583) | func (h *windowsAnsiEventHandler) SGR(params []int) error {
method SU (line 622) | func (h *windowsAnsiEventHandler) SU(param int) error {
method SD (line 631) | func (h *windowsAnsiEventHandler) SD(param int) error {
method DA (line 640) | func (h *windowsAnsiEventHandler) DA(params []string) error {
method DECSTBM (line 647) | func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error {
method RI (line 662) | func (h *windowsAnsiEventHandler) RI() error {
method IND (line 682) | func (h *windowsAnsiEventHandler) IND() error {
method Flush (line 687) | func (h *windowsAnsiEventHandler) Flush() error {
method getCurrentInfo (line 718) | func (h *windowsAnsiEventHandler) getCurrentInfo() (COORD, *CONSOLE_SC...
method updatePos (line 730) | func (h *windowsAnsiEventHandler) updatePos(pos COORD) {
method clearWrap (line 740) | func (h *windowsAnsiEventHandler) clearWrap() {
type Option (line 31) | type Option
function WithLogf (line 33) | func WithLogf(f func(string, ...interface{})) Option {
function CreateWinEventHandler (line 39) | func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) an...
type scrollRegion (line 76) | type scrollRegion struct
FILE: vendor/github.com/Masterminds/semver/collection.go
type Collection (line 6) | type Collection
method Len (line 10) | func (c Collection) Len() int {
method Less (line 16) | func (c Collection) Less(i, j int) bool {
method Swap (line 22) | func (c Collection) Swap(i, j int) {
FILE: vendor/github.com/Masterminds/semver/constraints.go
type Constraints (line 12) | type Constraints struct
method Check (line 44) | func (cs Constraints) Check(v *Version) bool {
method Validate (line 65) | func (cs Constraints) Validate(v *Version) (bool, []error) {
function NewConstraint (line 18) | func NewConstraint(c string) (*Constraints, error) {
function init (line 107) | func init() {
type constraint (line 154) | type constraint struct
method check (line 175) | func (c *constraint) check(v *Version) bool {
type cfunc (line 179) | type cfunc
function parseConstraint (line 181) | func parseConstraint(c string) (*constraint, error) {
function constraintNotEqual (line 226) | func constraintNotEqual(v *Version, c *constraint) bool {
function constraintGreaterThan (line 251) | func constraintGreaterThan(v *Version, c *constraint) bool {
function constraintLessThan (line 263) | func constraintLessThan(v *Version, c *constraint) bool {
function constraintGreaterThanEqual (line 284) | func constraintGreaterThanEqual(v *Version, c *constraint) bool {
function constraintLessThanEqual (line 296) | func constraintLessThanEqual(v *Version, c *constraint) bool {
function constraintTilde (line 323) | func constraintTilde(v *Version, c *constraint) bool {
function constraintTildeOrEqual (line 355) | func constraintTildeOrEqual(v *Version, c *constraint) bool {
function constraintCaret (line 377) | func constraintCaret(v *Version, c *constraint) bool {
constant cvRegex (line 398) | cvRegex string = `v?([0-9|x|X|\*]+)(\.[0-9|x|X|\*]+)?(\.[0-9|x|X|\*]+)?` +
function isX (line 402) | func isX(x string) bool {
function rewriteRange (line 411) | func rewriteRange(i string) string {
FILE: vendor/github.com/Masterminds/semver/version.go
constant SemVerRegex (line 31) | SemVerRegex string = `v?([0-9]+)(\.[0-9]+)?(\.[0-9]+)?` +
constant ValidPrerelease (line 37) | ValidPrerelease string = `^([0-9A-Za-z\-]+(\.[0-9A-Za-z\-]+)*)$`
type Version (line 40) | type Version struct
method String (line 110) | func (v *Version) String() string {
method Original (line 125) | func (v *Version) Original() string {
method Major (line 130) | func (v *Version) Major() int64 {
method Minor (line 135) | func (v *Version) Minor() int64 {
method Patch (line 140) | func (v *Version) Patch() int64 {
method Prerelease (line 145) | func (v *Version) Prerelease() string {
method Metadata (line 150) | func (v *Version) Metadata() string {
method originalVPrefix (line 155) | func (v *Version) originalVPrefix() string {
method IncPatch (line 169) | func (v Version) IncPatch() Version {
method IncMinor (line 192) | func (v Version) IncMinor() Version {
method IncMajor (line 208) | func (v Version) IncMajor() Version {
method SetPrerelease (line 221) | func (v Version) SetPrerelease(prerelease string) (Version, error) {
method SetMetadata (line 233) | func (v Version) SetMetadata(metadata string) (Version, error) {
method LessThan (line 244) | func (v *Version) LessThan(o *Version) bool {
method GreaterThan (line 249) | func (v *Version) GreaterThan(o *Version) bool {
method Equal (line 256) | func (v *Version) Equal(o *Version) bool {
method Compare (line 265) | func (v *Version) Compare(o *Version) int {
method UnmarshalJSON (line 296) | func (v *Version) UnmarshalJSON(b []byte) error {
method MarshalJSON (line 316) | func (v *Version) MarshalJSON() ([]byte, error) {
function init (line 47) | func init() {
function NewVersion (line 54) | func NewVersion(v string) (*Version, error) {
function MustParse (line 97) | func MustParse(v string) *Version {
function compareSegment (line 320) | func compareSegment(v, o int64) int {
function comparePrerelease (line 331) | func comparePrerelease(v, o string) int {
function comparePrePart (line 374) | func comparePrePart(s, o string) int {
FILE: vendor/github.com/Masterminds/semver/version_fuzz.go
function Fuzz (line 5) | func Fuzz(data []byte) int {
FILE: vendor/github.com/Microsoft/go-winio/backup.go
constant BackupData (line 23) | BackupData = uint32(iota + 1)
constant BackupEaData (line 24) | BackupEaData
constant BackupSecurity (line 25) | BackupSecurity
constant BackupAlternateData (line 26) | BackupAlternateData
constant BackupLink (line 27) | BackupLink
constant BackupPropertyData (line 28) | BackupPropertyData
constant BackupObjectId (line 29) | BackupObjectId
constant BackupReparseData (line 30) | BackupReparseData
constant BackupSparseBlock (line 31) | BackupSparseBlock
constant BackupTxfsData (line 32) | BackupTxfsData
constant StreamSparseAttributes (line 36) | StreamSparseAttributes = uint32(8)
constant WRITE_DAC (line 41) | WRITE_DAC = windows.WRITE_DAC
constant WRITE_OWNER (line 42) | WRITE_OWNER = windows.WRITE_OWNER
constant ACCESS_SYSTEM_SECURITY (line 43) | ACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY
type BackupHeader (line 47) | type BackupHeader struct
type win32StreamID (line 56) | type win32StreamID struct
type BackupStreamReader (line 65) | type BackupStreamReader struct
method Next (line 77) | func (r *BackupStreamReader) Next() (*BackupHeader, error) {
method Read (line 120) | func (r *BackupStreamReader) Read(b []byte) (int, error) {
function NewBackupStreamReader (line 71) | func NewBackupStreamReader(r io.Reader) *BackupStreamReader {
type BackupStreamWriter (line 138) | type BackupStreamWriter struct
method WriteHeader (line 149) | func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {
method Write (line 182) | func (w *BackupStreamWriter) Write(b []byte) (int, error) {
function NewBackupStreamWriter (line 144) | func NewBackupStreamWriter(w io.Writer) *BackupStreamWriter {
type BackupFileReader (line 192) | type BackupFileReader struct
method Read (line 206) | func (r *BackupFileReader) Read(b []byte) (int, error) {
method Close (line 221) | func (r *BackupFileReader) Close() error {
function NewBackupFileReader (line 200) | func NewBackupFileReader(f *os.File, includeSecurity bool) *BackupFileRe...
type BackupFileWriter (line 231) | type BackupFileWriter struct
method Write (line 245) | func (w *BackupFileWriter) Write(b []byte) (int, error) {
method Close (line 260) | func (w *BackupFileWriter) Close() error {
function NewBackupFileWriter (line 239) | func NewBackupFileWriter(f *os.File, includeSecurity bool) *BackupFileWr...
function OpenForBackup (line 273) | func OpenForBackup(path string, access uint32, share uint32, createmode ...
FILE: vendor/github.com/Microsoft/go-winio/ea.go
type fileFullEaInformation (line 9) | type fileFullEaInformation struct
type ExtendedAttribute (line 25) | type ExtendedAttribute struct
function parseEa (line 31) | func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
function DecodeExtendedAttributes (line 60) | func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err er...
function writeEa (line 73) | func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {
function EncodeExtendedAttributes (line 123) | func EncodeExtendedAttributes(eas []ExtendedAttribute) ([]byte, error) {
FILE: vendor/github.com/Microsoft/go-winio/file.go
type timeoutError (line 29) | type timeoutError struct
method Error (line 31) | func (*timeoutError) Error() string { return "i/o timeout" }
method Timeout (line 32) | func (*timeoutError) Timeout() bool { return true }
method Temporary (line 33) | func (*timeoutError) Temporary() bool { return true }
type timeoutChan (line 35) | type timeoutChan
type ioResult (line 41) | type ioResult struct
type ioOperation (line 47) | type ioOperation struct
function initIO (line 52) | func initIO() {
type win32File (line 63) | type win32File struct
method closeHandle (line 114) | func (f *win32File) closeHandle() {
method Close (line 131) | func (f *win32File) Close() error {
method IsClosed (line 137) | func (f *win32File) IsClosed() bool {
method prepareIO (line 143) | func (f *win32File) prepareIO() (*ioOperation, error) {
method asyncIO (line 174) | func (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes ...
method Read (line 221) | func (f *win32File) Read(b []byte) (int, error) {
method Write (line 247) | func (f *win32File) Write(b []byte) (int, error) {
method SetReadDeadline (line 265) | func (f *win32File) SetReadDeadline(deadline time.Time) error {
method SetWriteDeadline (line 269) | func (f *win32File) SetWriteDeadline(deadline time.Time) error {
method Flush (line 273) | func (f *win32File) Flush() error {
method Fd (line 277) | func (f *win32File) Fd() uintptr {
type deadlineHandler (line 73) | type deadlineHandler struct
method set (line 281) | func (d *deadlineHandler) set(deadline time.Time) error {
function makeWin32File (line 82) | func makeWin32File(h windows.Handle) (*win32File, error) {
function MakeOpenFile (line 99) | func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
function NewOpenFile (line 103) | func NewOpenFile(h windows.Handle) (io.ReadWriteCloser, error) {
function ioCompletionProcessor (line 157) | func ioCompletionProcessor(h windows.Handle) {
FILE: vendor/github.com/Microsoft/go-winio/fileinfo.go
type FileBasicInfo (line 15) | type FileBasicInfo struct
type alignedFileBasicInfo (line 24) | type alignedFileBasicInfo struct
function GetFileBasicInfo (line 31) | func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
function SetFileBasicInfo (line 48) | func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
type FileStandardInfo (line 67) | type FileStandardInfo struct
function GetFileStandardInfo (line 74) | func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {
type FileIDInfo (line 88) | type FileIDInfo struct
function GetFileID (line 94) | func GetFileID(f *os.File) (*FileIDInfo, error) {
FILE: vendor/github.com/Microsoft/go-winio/hvsock.go
constant afHVSock (line 22) | afHVSock = 34
function HvsockGUIDWildcard (line 28) | func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-0000000...
function HvsockGUIDBroadcast (line 33) | func HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffff...
function HvsockGUIDLoopback (line 43) | func HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a15...
function HvsockGUIDSiloHost (line 55) | func HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b65...
function HvsockGUIDChildren (line 65) | func HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac...
function HvsockGUIDParent (line 80) | func HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878
function hvsockVsockServiceTemplate (line 90) | func hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58...
type HvsockAddr (line 99) | type HvsockAddr struct
method Network (line 114) | func (*HvsockAddr) Network() string {
method String (line 118) | func (addr *HvsockAddr) String() string {
method raw (line 129) | func (addr *HvsockAddr) raw() rawHvsockAddr {
method fromRaw (line 137) | func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) {
type rawHvsockAddr (line 104) | type rawHvsockAddr struct
method Sockaddr (line 146) | func (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) {
method FromBytes (line 151) | func (r *rawHvsockAddr) FromBytes(b []byte) error {
function VsockServiceID (line 123) | func VsockServiceID(port uint32) guid.GUID {
type HvsockListener (line 167) | type HvsockListener struct
method opErr (line 223) | func (l *HvsockListener) opErr(op string, err error) error {
method Addr (line 228) | func (l *HvsockListener) Addr() net.Addr {
method Accept (line 233) | func (l *HvsockListener) Accept() (_ net.Conn, err error) {
method Close (line 284) | func (l *HvsockListener) Close() error {
type HvsockConn (line 175) | type HvsockConn struct
method opErr (line 443) | func (conn *HvsockConn) opErr(op string, err error) error {
method Read (line 451) | func (conn *HvsockConn) Read(b []byte) (int, error) {
method Write (line 473) | func (conn *HvsockConn) Write(b []byte) (int, error) {
method write (line 486) | func (conn *HvsockConn) write(b []byte) (int, error) {
method Close (line 507) | func (conn *HvsockConn) Close() error {
method IsClosed (line 511) | func (conn *HvsockConn) IsClosed() bool {
method shutdown (line 516) | func (conn *HvsockConn) shutdown(how int) error {
method CloseRead (line 534) | func (conn *HvsockConn) CloseRead() error {
method CloseWrite (line 544) | func (conn *HvsockConn) CloseWrite() error {
method LocalAddr (line 553) | func (conn *HvsockConn) LocalAddr() net.Addr {
method RemoteAddr (line 558) | func (conn *HvsockConn) RemoteAddr() net.Addr {
method SetDeadline (line 563) | func (conn *HvsockConn) SetDeadline(t time.Time) error {
method SetReadDeadline (line 575) | func (conn *HvsockConn) SetReadDeadline(t time.Time) error {
method SetWriteDeadline (line 580) | func (conn *HvsockConn) SetWriteDeadline(t time.Time) error {
function newHVSocket (line 182) | func newHVSocket() (*win32File, error) {
function ListenHvsock (line 197) | func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) {
type HvsockDialer (line 289) | type HvsockDialer struct
method Dial (line 315) | func (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (co...
method redialWait (line 406) | func (d *HvsockDialer) redialWait(ctx context.Context) (err error) {
function Dial (line 306) | func Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err ...
function canRedial (line 432) | func canRedial(err error) bool {
FILE: vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
constant NullHandle (line 16) | NullHandle windows.Handle = 0
constant FILE_ANY_ACCESS (line 50) | FILE_ANY_ACCESS AccessMask = 0
constant GENERIC_READ (line 52) | GENERIC_READ AccessMask = 0x8000_0000
constant GENERIC_WRITE (line 53) | GENERIC_WRITE AccessMask = 0x4000_0000
constant GENERIC_EXECUTE (line 54) | GENERIC_EXECUTE AccessMask = 0x2000_0000
constant GENERIC_ALL (line 55) | GENERIC_ALL AccessMask = 0x1000_0000
constant ACCESS_SYSTEM_SECURITY (line 56) | ACCESS_SYSTEM_SECURITY AccessMask = 0x0100_0000
constant FILE_READ_DATA (line 61) | FILE_READ_DATA AccessMask = (0x0001)
constant FILE_LIST_DIRECTORY (line 62) | FILE_LIST_DIRECTORY AccessMask = (0x0001)
constant FILE_WRITE_DATA (line 64) | FILE_WRITE_DATA AccessMask = (0x0002)
constant FILE_ADD_FILE (line 65) | FILE_ADD_FILE AccessMask = (0x0002)
constant FILE_APPEND_DATA (line 67) | FILE_APPEND_DATA AccessMask = (0x0004)
constant FILE_ADD_SUBDIRECTORY (line 68) | FILE_ADD_SUBDIRECTORY AccessMask = (0x0004)
constant FILE_CREATE_PIPE_INSTANCE (line 69) | FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004)
constant FILE_READ_EA (line 71) | FILE_READ_EA AccessMask = (0x0008)
constant FILE_READ_PROPERTIES (line 72) | FILE_READ_PROPERTIES AccessMask = FILE_READ_EA
constant FILE_WRITE_EA (line 74) | FILE_WRITE_EA AccessMask = (0x0010)
constant FILE_WRITE_PROPERTIES (line 75) | FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA
constant FILE_EXECUTE (line 77) | FILE_EXECUTE AccessMask = (0x0020)
constant FILE_TRAVERSE (line 78) | FILE_TRAVERSE AccessMask = (0x0020)
constant FILE_DELETE_CHILD (line 80) | FILE_DELETE_CHILD AccessMask = (0x0040)
constant FILE_READ_ATTRIBUTES (line 82) | FILE_READ_ATTRIBUTES AccessMask = (0x0080)
constant FILE_WRITE_ATTRIBUTES (line 84) | FILE_WRITE_ATTRIBUTES AccessMask = (0x0100)
constant FILE_ALL_ACCESS (line 86) | FILE_ALL_ACCESS AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZ...
constant FILE_GENERIC_READ (line 87) | FILE_GENERIC_READ AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA...
constant FILE_GENERIC_WRITE (line 88) | FILE_GENERIC_WRITE AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DA...
constant FILE_GENERIC_EXECUTE (line 89) | FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_A...
constant SPECIFIC_RIGHTS_ALL (line 91) | SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF
constant DELETE (line 96) | DELETE AccessMask = 0x0001_0000
constant READ_CONTROL (line 97) | READ_CONTROL AccessMask = 0x0002_0000
constant WRITE_DAC (line 98) | WRITE_DAC AccessMask = 0x0004_0000
constant WRITE_OWNER (line 99) | WRITE_OWNER AccessMask = 0x0008_0000
constant SYNCHRONIZE (line 100) | SYNCHRONIZE AccessMask = 0x0010_0000
constant STANDARD_RIGHTS_REQUIRED (line 102) | STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000
constant STANDARD_RIGHTS_READ (line 104) | STANDARD_RIGHTS_READ AccessMask = READ_CONTROL
constant STANDARD_RIGHTS_WRITE (line 105) | STANDARD_RIGHTS_WRITE AccessMask = READ_CONTROL
constant STANDARD_RIGHTS_EXECUTE (line 106) | STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL
constant STANDARD_RIGHTS_ALL (line 108) | STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000
type FileShareMode (line 111) | type FileShareMode
constant FILE_SHARE_NONE (line 115) | FILE_SHARE_NONE FileShareMode = 0x00
constant FILE_SHARE_READ (line 116) | FILE_SHARE_READ FileShareMode = 0x01
constant FILE_SHARE_WRITE (line 117) | FILE_SHARE_WRITE FileShareMode = 0x02
constant FILE_SHARE_DELETE (line 118) | FILE_SHARE_DELETE FileShareMode = 0x04
constant FILE_SHARE_VALID_FLAGS (line 119) | FILE_SHARE_VALID_FLAGS FileShareMode = 0x07
type FileCreationDisposition (line 122) | type FileCreationDisposition
constant CREATE_NEW (line 128) | CREATE_NEW FileCreationDisposition = 0x01
constant CREATE_ALWAYS (line 129) | CREATE_ALWAYS FileCreationDisposition = 0x02
constant OPEN_EXISTING (line 130) | OPEN_EXISTING FileCreationDisposition = 0x03
constant OPEN_ALWAYS (line 131) | OPEN_ALWAYS FileCreationDisposition = 0x04
constant TRUNCATE_EXISTING (line 132) | TRUNCATE_EXISTING FileCreationDisposition = 0x05
type NTFileCreationDisposition (line 136) | type NTFileCreationDisposition
constant FILE_SUPERSEDE (line 142) | FILE_SUPERSEDE NTFileCreationDisposition = 0x00
constant FILE_OPEN (line 143) | FILE_OPEN NTFileCreationDisposition = 0x01
constant FILE_CREATE (line 144) | FILE_CREATE NTFileCreationDisposition = 0x02
constant FILE_OPEN_IF (line 145) | FILE_OPEN_IF NTFileCreationDisposition = 0x03
constant FILE_OVERWRITE (line 146) | FILE_OVERWRITE NTFileCreationDisposition = 0x04
constant FILE_OVERWRITE_IF (line 147) | FILE_OVERWRITE_IF NTFileCreationDisposition = 0x05
constant FILE_MAXIMUM_DISPOSITION (line 148) | FILE_MAXIMUM_DISPOSITION NTFileCreationDisposition = 0x05
type FileFlagOrAttribute (line 155) | type FileFlagOrAttribute
constant FILE_FLAG_WRITE_THROUGH (line 161) | FILE_FLAG_WRITE_THROUGH FileFlagOrAttribute = 0x8000_0000
constant FILE_FLAG_OVERLAPPED (line 162) | FILE_FLAG_OVERLAPPED FileFlagOrAttribute = 0x4000_0000
constant FILE_FLAG_NO_BUFFERING (line 163) | FILE_FLAG_NO_BUFFERING FileFlagOrAttribute = 0x2000_0000
constant FILE_FLAG_RANDOM_ACCESS (line 164) | FILE_FLAG_RANDOM_ACCESS FileFlagOrAttribute = 0x1000_0000
constant FILE_FLAG_SEQUENTIAL_SCAN (line 165) | FILE_FLAG_SEQUENTIAL_SCAN FileFlagOrAttribute = 0x0800_0000
constant FILE_FLAG_DELETE_ON_CLOSE (line 166) | FILE_FLAG_DELETE_ON_CLOSE FileFlagOrAttribute = 0x0400_0000
constant FILE_FLAG_BACKUP_SEMANTICS (line 167) | FILE_FLAG_BACKUP_SEMANTICS FileFlagOrAttribute = 0x0200_0000
constant FILE_FLAG_POSIX_SEMANTICS (line 168) | FILE_FLAG_POSIX_SEMANTICS FileFlagOrAttribute = 0x0100_0000
constant FILE_FLAG_OPEN_REPARSE_POINT (line 169) | FILE_FLAG_OPEN_REPARSE_POINT FileFlagOrAttribute = 0x0020_0000
constant FILE_FLAG_OPEN_NO_RECALL (line 170) | FILE_FLAG_OPEN_NO_RECALL FileFlagOrAttribute = 0x0010_0000
constant FILE_FLAG_FIRST_PIPE_INSTANCE (line 171) | FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000
type NTCreateOptions (line 179) | type NTCreateOptions
constant FILE_DIRECTORY_FILE (line 185) | FILE_DIRECTORY_FILE NTCreateOptions = 0x0000_0001
constant FILE_WRITE_THROUGH (line 186) | FILE_WRITE_THROUGH NTCreateOptions = 0x0000_0002
constant FILE_SEQUENTIAL_ONLY (line 187) | FILE_SEQUENTIAL_ONLY NTCreateOptions = 0x0000_0004
constant FILE_NO_INTERMEDIATE_BUFFERING (line 188) | FILE_NO_INTERMEDIATE_BUFFERING NTCreateOptions = 0x0000_0008
constant FILE_SYNCHRONOUS_IO_ALERT (line 190) | FILE_SYNCHRONOUS_IO_ALERT NTCreateOptions = 0x0000_0010
constant FILE_SYNCHRONOUS_IO_NONALERT (line 191) | FILE_SYNCHRONOUS_IO_NONALERT NTCreateOptions = 0x0000_0020
constant FILE_NON_DIRECTORY_FILE (line 192) | FILE_NON_DIRECTORY_FILE NTCreateOptions = 0x0000_0040
constant FILE_CREATE_TREE_CONNECTION (line 193) | FILE_CREATE_TREE_CONNECTION NTCreateOptions = 0x0000_0080
constant FILE_COMPLETE_IF_OPLOCKED (line 195) | FILE_COMPLETE_IF_OPLOCKED NTCreateOptions = 0x0000_0100
constant FILE_NO_EA_KNOWLEDGE (line 196) | FILE_NO_EA_KNOWLEDGE NTCreateOptions = 0x0000_0200
constant FILE_DISABLE_TUNNELING (line 197) | FILE_DISABLE_TUNNELING NTCreateOptions = 0x0000_0400
constant FILE_RANDOM_ACCESS (line 198) | FILE_RANDOM_ACCESS NTCreateOptions = 0x0000_0800
constant FILE_DELETE_ON_CLOSE (line 200) | FILE_DELETE_ON_CLOSE NTCreateOptions = 0x0000_1000
constant FILE_OPEN_BY_FILE_ID (line 201) | FILE_OPEN_BY_FILE_ID NTCreateOptions = 0x0000_2000
constant FILE_OPEN_FOR_BACKUP_INTENT (line 202) | FILE_OPEN_FOR_BACKUP_INTENT NTCreateOptions = 0x0000_4000
constant FILE_NO_COMPRESSION (line 203) | FILE_NO_COMPRESSION NTCreateOptions = 0x0000_8000
constant SECURITY_ANONYMOUS (line 212) | SECURITY_ANONYMOUS FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16)
constant SECURITY_IDENTIFICATION (line 213) | SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification...
constant SECURITY_IMPERSONATION (line 214) | SECURITY_IMPERSONATION FileSQSFlag = FileSQSFlag(SecurityImpersonation ...
constant SECURITY_DELEGATION (line 215) | SECURITY_DELEGATION FileSQSFlag = FileSQSFlag(SecurityDelegation << 16)
constant SECURITY_SQOS_PRESENT (line 217) | SECURITY_SQOS_PRESENT FileSQSFlag = 0x0010_0000
constant SECURITY_VALID_SQOS_FLAGS (line 218) | SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F_0000
type GetFinalPathFlag (line 224) | type GetFinalPathFlag
constant GetFinalPathDefaultFlag (line 228) | GetFinalPathDefaultFlag GetFinalPathFlag = 0x0
constant FILE_NAME_NORMALIZED (line 230) | FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0
constant FILE_NAME_OPENED (line 231) | FILE_NAME_OPENED GetFinalPathFlag = 0x8
constant VOLUME_NAME_DOS (line 233) | VOLUME_NAME_DOS GetFinalPathFlag = 0x0
constant VOLUME_NAME_GUID (line 234) | VOLUME_NAME_GUID GetFinalPathFlag = 0x1
constant VOLUME_NAME_NT (line 235) | VOLUME_NAME_NT GetFinalPathFlag = 0x2
constant VOLUME_NAME_NONE (line 236) | VOLUME_NAME_NONE GetFinalPathFlag = 0x4
function GetFinalPathNameByHandle (line 244) | func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) ...
FILE: vendor/github.com/Microsoft/go-winio/internal/fs/security.go
type SecurityImpersonationLevel (line 4) | type SecurityImpersonationLevel
constant SecurityAnonymous (line 8) | SecurityAnonymous SecurityImpersonationLevel = 0
constant SecurityIdentification (line 9) | SecurityIdentification SecurityImpersonationLevel = 1
constant SecurityImpersonation (line 10) | SecurityImpersonation SecurityImpersonationLevel = 2
constant SecurityDelegation (line 11) | SecurityDelegation SecurityImpersonationLevel = 3
FILE: vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
function CreateFile (line 45) | func CreateFile(name string, access AccessMask, mode FileShareMode, sa *...
function _CreateFile (line 54) | func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa...
FILE: vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
type RawSockaddr (line 13) | type RawSockaddr interface
FILE: vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
constant socketError (line 23) | socketError = uintptr(^uint32(0))
function GetSockName (line 38) | func GetSockName(s windows.Handle, rsa RawSockaddr) error {
function GetPeerName (line 52) | func GetPeerName(s windows.Handle, rsa RawSockaddr) error {
function Bind (line 61) | func Bind(s windows.Handle, rsa RawSockaddr) (err error) {
type runtimeFunc (line 79) | type runtimeFunc struct
method Load (line 86) | func (f *runtimeFunc) Load() error {
function ConnectEx (line 122) | func ConnectEx(
function connectEx (line 150) | func connectEx(
FILE: vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
function bind (line 47) | func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err err...
function getpeername (line 55) | func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) ...
function getsockname (line 63) | func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) ...
FILE: vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
constant MinWStringCap (line 13) | MinWStringCap = 310
function newBuffer (line 25) | func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) }
function freeBuffer (line 29) | func freeBuffer(b []uint16) { pathPool.Put(&b) }
type WString (line 36) | type WString struct
method Free (line 54) | func (b *WString) Free() {
method ResizeTo (line 64) | func (b *WString) ResizeTo(c uint32) uint32 {
method Buffer (line 88) | func (b *WString) Buffer() []uint16 {
method Pointer (line 97) | func (b *WString) Pointer() *uint16 {
method String (line 107) | func (b *WString) String() string {
method Cap (line 124) | func (b *WString) Cap() uint32 {
method cap (line 131) | func (b *WString) cap() uint32 { return uint32(cap(b.b)) }
method empty (line 132) | func (b *WString) empty() bool { return b == nil || b.cap() == 0 }
function NewWString (line 48) | func NewWString() *WString {
FILE: vendor/github.com/Microsoft/go-winio/pipe.go
type PipeConn (line 32) | type PipeConn interface
type ioStatusBlock (line 46) | type ioStatusBlock struct
type objectAttributes (line 60) | type objectAttributes struct
type unicodeString (line 69) | type unicodeString struct
type securityDescriptor (line 86) | type securityDescriptor struct
type ntStatus (line 96) | type ntStatus
method Err (line 98) | func (status ntStatus) Err() error {
type win32Pipe (line 112) | type win32Pipe struct
method LocalAddr (line 127) | func (f *win32Pipe) LocalAddr() net.Addr {
method RemoteAddr (line 131) | func (f *win32Pipe) RemoteAddr() net.Addr {
method SetDeadline (line 135) | func (f *win32Pipe) SetDeadline(t time.Time) error {
method Disconnect (line 142) | func (f *win32Pipe) Disconnect() error {
type win32MessageBytePipe (line 119) | type win32MessageBytePipe struct
method CloseWrite (line 147) | func (f *win32MessageBytePipe) CloseWrite() error {
method Write (line 165) | func (f *win32MessageBytePipe) Write(b []byte) (int, error) {
method Read (line 177) | func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
type pipeAddress (line 125) | type pipeAddress
method Network (line 198) | func (pipeAddress) Network() string {
method String (line 202) | func (s pipeAddress) String() string {
function tryDialPipe (line 207) | func tryDialPipe(ctx context.Context, path *string, access fs.AccessMask...
function DialPipe (line 237) | func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
function DialPipeContext (line 255) | func DialPipeContext(ctx context.Context, path string) (net.Conn, error) {
type PipeImpLevel (line 261) | type PipeImpLevel
constant PipeImpLevelAnonymous (line 264) | PipeImpLevelAnonymous = PipeImpLevel(fs.SECURITY_ANONYMOUS)
constant PipeImpLevelIdentification (line 265) | PipeImpLevelIdentification = PipeImpLevel(fs.SECURITY_IDENTIFICATION)
constant PipeImpLevelImpersonation (line 266) | PipeImpLevelImpersonation = PipeImpLevel(fs.SECURITY_IMPERSONATION)
constant PipeImpLevelDelegation (line 267) | PipeImpLevelDelegation = PipeImpLevel(fs.SECURITY_DELEGATION)
function DialPipeAccess (line 272) | func DialPipeAccess(ctx context.Context, path string, access uint32) (ne...
function DialPipeAccessImpLevel (line 279) | func DialPipeAccessImpLevel(ctx context.Context, path string, access uin...
type acceptResponse (line 309) | type acceptResponse struct
type win32PipeListener (line 314) | type win32PipeListener struct
method makeServerPipe (line 416) | func (l *win32PipeListener) makeServerPipe() (*win32File, error) {
method makeConnectedServerPipe (line 429) | func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, err...
method listenerRoutine (line 459) | func (l *win32PipeListener) listenerRoutine() {
method Accept (line 555) | func (l *win32PipeListener) Accept() (net.Conn, error) {
method Close (line 575) | func (l *win32PipeListener) Close() error {
method Addr (line 584) | func (l *win32PipeListener) Addr() net.Addr {
function makeServerPipeHandle (line 323) | func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first b...
type PipeConfig (line 489) | type PipeConfig struct
function ListenPipe (line 510) | func ListenPipe(path string, c *PipeConfig) (net.Listener, error) {
function connectPipe (line 540) | func connectPipe(p *win32File) error {
FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
type Variant (line 21) | type Variant
constant VariantUnknown (line 27) | VariantUnknown Variant = iota
constant VariantNCS (line 28) | VariantNCS
constant VariantRFC4122 (line 29) | VariantRFC4122
constant VariantMicrosoft (line 30) | VariantMicrosoft
constant VariantFuture (line 31) | VariantFuture
type Version (line 37) | type Version
method String (line 39) | func (v Version) String() string {
function NewV4 (line 47) | func NewV4() (GUID, error) {
function NewV5 (line 67) | func NewV5(namespace GUID, name []byte) (GUID, error) {
function fromArray (line 83) | func fromArray(b [16]byte, order binary.ByteOrder) GUID {
method toArray (line 92) | func (g GUID) toArray(order binary.ByteOrder) [16]byte {
function FromArray (line 102) | func FromArray(b [16]byte) GUID {
method ToArray (line 108) | func (g GUID) ToArray() [16]byte {
function FromWindowsArray (line 113) | func FromWindowsArray(b [16]byte) GUID {
method ToWindowsArray (line 119) | func (g GUID) ToWindowsArray() [16]byte {
method String (line 123) | func (g GUID) String() string {
function FromString (line 136) | func FromString(s string) (GUID, error) {
method setVariant (line 175) | func (g *GUID) setVariant(v Variant) {
method Variant (line 195) | func (g GUID) Variant() Variant {
method setVersion (line 209) | func (g *GUID) setVersion(v Version) {
method Version (line 214) | func (g GUID) Version() Version {
method MarshalText (line 219) | func (g GUID) MarshalText() ([]byte, error) {
method UnmarshalText (line 225) | func (g *GUID) UnmarshalText(text []byte) error {
FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
type GUID (line 11) | type GUID struct
FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
type GUID (line 13) | type GUID
FILE: vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
function _ (line 7) | func _() {
constant _Variant_name (line 18) | _Variant_name = "UnknownNCSRFC 4122MicrosoftFuture"
method String (line 22) | func (i Variant) String() string {
FILE: vendor/github.com/Microsoft/go-winio/privilege.go
constant SE_PRIVILEGE_ENABLED (line 28) | SE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED
constant ERROR_NOT_ALL_ASSIGNED (line 31) | ERROR_NOT_ALL_ASSIGNED windows.Errno = windows.ERROR_NOT_ALL_ASSIGNED
constant SeBackupPrivilege (line 33) | SeBackupPrivilege = "SeBackupPrivilege"
constant SeRestorePrivilege (line 34) | SeRestorePrivilege = "SeRestorePrivilege"
constant SeSecurityPrivilege (line 35) | SeSecurityPrivilege = "SeSecurityPrivilege"
type PrivilegeError (line 44) | type PrivilegeError struct
method Error (line 48) | func (e *PrivilegeError) Error() string {
function RunWithPrivilege (line 65) | func RunWithPrivilege(name string, fn func() error) error {
function RunWithPrivileges (line 70) | func RunWithPrivileges(names []string, fn func() error) error {
function mapPrivileges (line 89) | func mapPrivileges(names []string) ([]uint64, error) {
function EnableProcessPrivileges (line 108) | func EnableProcessPrivileges(names []string) error {
function DisableProcessPrivileges (line 113) | func DisableProcessPrivileges(names []string) error {
function enableDisableProcessPrivilege (line 117) | func enableDisableProcessPrivilege(names []string, action uint32) error {
function adjustPrivileges (line 134) | func adjustPrivileges(token windows.Token, privileges []uint64, action u...
function getPrivilegeName (line 153) | func getPrivilegeName(luid uint64) string {
function newThreadToken (line 172) | func newThreadToken() (windows.Token, error) {
function releaseThreadToken (line 190) | func releaseThreadToken(h windows.Token) {
FILE: vendor/github.com/Microsoft/go-winio/reparse.go
constant reparseTagMountPoint (line 16) | reparseTagMountPoint = 0xA0000003
constant reparseTagSymlink (line 17) | reparseTagSymlink = 0xA000000C
type reparseDataBuffer (line 20) | type reparseDataBuffer struct
type ReparsePoint (line 31) | type ReparsePoint struct
type UnsupportedReparsePointError (line 38) | type UnsupportedReparsePointError struct
method Error (line 42) | func (e *UnsupportedReparsePointError) Error() string {
function DecodeReparsePoint (line 48) | func DecodeReparsePoint(b []byte) (*ReparsePoint, error) {
function DecodeReparsePointData (line 53) | func DecodeReparsePointData(tag uint32, b []byte) (*ReparsePoint, error) {
function isDriveLetter (line 75) | func isDriveLetter(c byte) bool {
function EncodeReparsePoint (line 81) | func EncodeReparsePoint(rp *ReparsePoint) []byte {
FILE: vendor/github.com/Microsoft/go-winio/sd.go
type AccountLookupError (line 19) | type AccountLookupError struct
method Error (line 24) | func (e *AccountLookupError) Error() string {
method Unwrap (line 40) | func (e *AccountLookupError) Unwrap() error { return e.Err }
type SddlConversionError (line 42) | type SddlConversionError struct
method Error (line 47) | func (e *SddlConversionError) Error() string {
method Unwrap (line 51) | func (e *SddlConversionError) Unwrap() error { return e.Err }
function LookupSidByName (line 56) | func LookupSidByName(name string) (sid string, err error) {
function LookupNameBySid (line 85) | func LookupNameBySid(sid string) (name string, err error) {
function SddlToSecurityDescriptor (line 118) | func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
function SecurityDescriptorToSddl (line 127) | func SecurityDescriptorToSddl(sd []byte) (string, error) {
FILE: vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
constant errnoERROR_IO_PENDING (line 19) | errnoERROR_IO_PENDING = 997
function errnoErr (line 29) | func errnoErr(e syscall.Errno) error {
function adjustTokenPrivileges (line 75) | func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *...
function convertSidToStringSid (line 88) | func convertSidToStringSid(sid *byte, str **uint16) (err error) {
function convertStringSidToSid (line 96) | func convertStringSidToSid(str *uint16, sid **byte) (err error) {
function impersonateSelf (line 104) | func impersonateSelf(level uint32) (err error) {
function lookupAccountName (line 112) | func lookupAccountName(systemName *uint16, accountName string, sid *byte...
function _lookupAccountName (line 121) | func _lookupAccountName(systemName *uint16, accountName *uint16, sid *by...
function lookupAccountSid (line 129) | func lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameS...
function lookupPrivilegeDisplayName (line 137) | func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer ...
function _lookupPrivilegeDisplayName (line 146) | func _lookupPrivilegeDisplayName(systemName *uint16, name *uint16, buffe...
function lookupPrivilegeName (line 154) | func lookupPrivilegeName(systemName string, luid *uint64, buffer *uint16...
function _lookupPrivilegeName (line 163) | func _lookupPrivilegeName(systemName *uint16, luid *uint64, buffer *uint...
function lookupPrivilegeValue (line 171) | func lookupPrivilegeValue(systemName string, name string, luid *uint64) ...
function _lookupPrivilegeValue (line 185) | func _lookupPrivilegeValue(systemName *uint16, name *uint16, luid *uint6...
function openThreadToken (line 193) | func openThreadToken(thread windows.Handle, accessMask uint32, openAsSel...
function revertToSelf (line 205) | func revertToSelf() (err error) {
function backupRead (line 213) | func backupRead(h windows.Handle, b []byte, bytesRead *uint32, abort boo...
function backupWrite (line 233) | func backupWrite(h windows.Handle, b []byte, bytesWritten *uint32, abort...
function cancelIoEx (line 253) | func cancelIoEx(file windows.Handle, o *windows.Overlapped) (err error) {
function connectNamedPipe (line 261) | func connectNamedPipe(pipe windows.Handle, o *windows.Overlapped) (err e...
function createIoCompletionPort (line 269) | func createIoCompletionPort(file windows.Handle, port windows.Handle, ke...
function createNamedPipe (line 278) | func createNamedPipe(name string, flags uint32, pipeMode uint32, maxInst...
function _createNamedPipe (line 287) | func _createNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxIn...
function disconnectNamedPipe (line 296) | func disconnectNamedPipe(pipe windows.Handle) (err error) {
function getCurrentThread (line 304) | func getCurrentThread() (h windows.Handle) {
function getNamedPipeHandleState (line 310) | func getNamedPipeHandleState(pipe windows.Handle, state *uint32, curInst...
function getNamedPipeInfo (line 318) | func getNamedPipeInfo(pipe windows.Handle, flags *uint32, outSize *uint3...
function getQueuedCompletionStatus (line 326) | func getQueuedCompletionStatus(port windows.Handle, bytes *uint32, key *...
function setFileCompletionNotificationModes (line 334) | func setFileCompletionNotificationModes(h windows.Handle, flags uint8) (...
function ntCreateNamedPipeFile (line 342) | func ntCreateNamedPipeFile(pipe *windows.Handle, access ntAccessMask, oa...
function rtlDefaultNpAcl (line 348) | func rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) {
function rtlDosPathNameToNtPathName (line 354) | func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, fil...
function rtlNtStatusToDosError (line 360) | func rtlNtStatusToDosError(status ntStatus) (winerr error) {
function wsaGetOverlappedResult (line 368) | func wsaGetOverlappedResult(h windows.Handle, o *windows.Overlapped, byt...
FILE: vendor/github.com/cenkalti/backoff/v4/backoff.go
type BackOff (line 16) | type BackOff interface
constant Stop (line 36) | Stop time.Duration = -1
type ZeroBackOff (line 40) | type ZeroBackOff struct
method Reset (line 42) | func (b *ZeroBackOff) Reset() {}
method NextBackOff (line 44) | func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 }
type StopBackOff (line 48) | type StopBackOff struct
method Reset (line 50) | func (b *StopBackOff) Reset() {}
method NextBackOff (line 52) | func (b *StopBackOff) NextBackOff() time.Duration { return Stop }
type ConstantBackOff (line 57) | type ConstantBackOff struct
method Reset (line 61) | func (b *ConstantBackOff) Reset() {}
method NextBackOff (line 62) | func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Inter...
function NewConstantBackOff (line 64) | func NewConstantBackOff(d time.Duration) *ConstantBackOff {
FILE: vendor/github.com/cenkalti/backoff/v4/context.go
type BackOffContext (line 10) | type BackOffContext interface
type backOffContext (line 15) | type backOffContext struct
method Context (line 51) | func (b *backOffContext) Context() context.Context {
method NextBackOff (line 55) | func (b *backOffContext) NextBackOff() time.Duration {
function WithContext (line 23) | func WithContext(b BackOff, ctx context.Context) BackOffContext { // nol...
function getContext (line 41) | func getContext(b BackOff) context.Context {
FILE: vendor/github.com/cenkalti/backoff/v4/exponential.go
type ExponentialBackOff (line 54) | type ExponentialBackOff struct
method Reset (line 109) | func (b *ExponentialBackOff) Reset() {
method NextBackOff (line 116) | func (b *ExponentialBackOff) NextBackOff() time.Duration {
method GetElapsedTime (line 133) | func (b *ExponentialBackOff) GetElapsedTime() time.Duration {
method incrementCurrentInterval (line 138) | func (b *ExponentialBackOff) incrementCurrentInterval() {
type Clock (line 70) | type Clock interface
constant DefaultInitialInterval (line 76) | DefaultInitialInterval = 500 * time.Millisecond
constant DefaultRandomizationFactor (line 77) | DefaultRandomizationFactor = 0.5
constant DefaultMultiplier (line 78) | DefaultMultiplier = 1.5
constant DefaultMaxInterval (line 79) | DefaultMaxInterval = 60 * time.Second
constant DefaultMaxElapsedTime (line 80) | DefaultMaxElapsedTime = 15 * time.Minute
function NewExponentialBackOff (line 84) | func NewExponentialBackOff() *ExponentialBackOff {
type systemClock (line 98) | type systemClock struct
method Now (line 100) | func (t systemClock) Now() time.Time {
function getRandomValueFromInterval (line 149) | func getRandomValueFromInterval(randomizationFactor, random float64, cur...
FILE: vendor/github.com/cenkalti/backoff/v4/retry.go
type OperationWithData (line 10) | type OperationWithData
type Operation (line 14) | type Operation
method withEmptyData (line 16) | func (o Operation) withEmptyData() OperationWithData[struct{}] {
type Notify (line 27) | type Notify
function Retry (line 37) | func Retry(o Operation, b BackOff) error {
function RetryWithData (line 42) | func RetryWithData[T any](o OperationWithData[T], b BackOff) (T, error) {
function RetryNotify (line 48) | func RetryNotify(operation Operation, b BackOff, notify Notify) error {
function RetryNotifyWithData (line 53) | func RetryNotifyWithData[T any](operation OperationWithData[T], b BackOf...
function RetryNotifyWithTimer (line 60) | func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify,...
function RetryNotifyWithTimerAndData (line 66) | func RetryNotifyWithTimerAndData[T any](operation OperationWithData[T], ...
function doRetryNotify (line 70) | func doRetryNotify[T any](operation OperationWithData[T], b BackOff, not...
type PermanentError (line 121) | type PermanentError struct
method Error (line 125) | func (e *PermanentError) Error() string {
method Unwrap (line 129) | func (e *PermanentError) Unwrap() error {
method Is (line 133) | func (e *PermanentError) Is(target error) bool {
function Permanent (line 139) | func Permanent(err error) error {
FILE: vendor/github.com/cenkalti/backoff/v4/ticker.go
type Ticker (line 13) | type Ticker struct
method Stop (line 54) | func (t *Ticker) Stop() {
method run (line 58) | func (t *Ticker) run() {
method send (line 82) | func (t *Ticker) send(tick time.Time) <-chan time.Time {
function NewTicker (line 29) | func NewTicker(b BackOff) *Ticker {
function NewTickerWithTimer (line 35) | func NewTickerWithTimer(b BackOff, timer Timer) *Ticker {
FILE: vendor/github.com/cenkalti/backoff/v4/timer.go
type Timer (line 5) | type Timer interface
type defaultTimer (line 12) | type defaultTimer struct
method C (line 17) | func (t *defaultTimer) C() <-chan time.Time {
method Start (line 22) | func (t *defaultTimer) Start(duration time.Duration) {
method Stop (line 31) | func (t *defaultTimer) Stop() {
FILE: vendor/github.com/cenkalti/backoff/v4/tries.go
function WithMaxRetries (line 12) | func WithMaxRetries(b BackOff, max uint64) BackOff {
type backOffTries (line 16) | type backOffTries struct
method NextBackOff (line 22) | func (b *backOffTries) NextBackOff() time.Duration {
method Reset (line 35) | func (b *backOffTries) Reset() {
FILE: vendor/github.com/containerd/log/context.go
type loggerKey (line 60) | type loggerKey struct
constant RFC3339NanoFixed (line 76) | RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00"
constant TraceLevel (line 85) | TraceLevel Level = logrus.TraceLevel
constant DebugLevel (line 89) | DebugLevel Level = logrus.DebugLevel
constant InfoLevel (line 93) | InfoLevel Level = logrus.InfoLevel
constant WarnLevel (line 96) | WarnLevel Level = logrus.WarnLevel
constant ErrorLevel (line 100) | ErrorLevel Level = logrus.ErrorLevel
constant FatalLevel (line 104) | FatalLevel Level = logrus.FatalLevel
constant PanicLevel (line 108) | PanicLevel Level = logrus.PanicLevel
function SetLevel (line 123) | func SetLevel(level string) error {
function GetLevel (line 134) | func GetLevel() Level {
type OutputFormat (line 139) | type OutputFormat
constant TextFormat (line 144) | TextFormat OutputFormat = "text"
constant JSONFormat (line 147) | JSONFormat OutputFormat = "json"
function SetFormat (line 151) | func SetFormat(format OutputFormat) error {
function WithLogger (line 171) | func WithLogger(ctx context.Context, logger *Entry) context.Context {
function GetLogger (line 177) | func GetLogger(ctx context.Context) *Entry {
FILE: vendor/github.com/containerd/platforms/compare.go
type MatchComparer (line 28) | type MatchComparer interface
function platformVector (line 36) | func platformVector(platform specs.Platform) []specs.Platform {
function Only (line 94) | func Only(platform specs.Platform) MatchComparer {
function OnlyStrict (line 106) | func OnlyStrict(platform specs.Platform) MatchComparer {
function Ordered (line 112) | func Ordered(platforms ...specs.Platform) MatchComparer {
function Any (line 124) | func Any(platforms ...specs.Platform) MatchComparer {
type orderedPlatformComparer (line 138) | type orderedPlatformComparer struct
method Match (line 142) | func (c orderedPlatformComparer) Match(platform specs.Platform) bool {
method Less (line 151) | func (c orderedPlatformComparer) Less(p1 specs.Platform, p2 specs.Plat...
type anyPlatformComparer (line 165) | type anyPlatformComparer struct
method Match (line 169) | func (c anyPlatformComparer) Match(platform specs.Platform) bool {
method Less (line 178) | func (c anyPlatformComparer) Less(p1, p2 specs.Platform) bool {
type allPlatformComparer (line 195) | type allPlatformComparer struct
method Match (line 197) | func (allPlatformComparer) Match(specs.Platform) bool {
method Less (line 201) | func (allPlatformComparer) Less(specs.Platform, specs.Platform) bool {
FILE: vendor/github.com/containerd/platforms/cpuinfo.go
function cpuVariant (line 32) | func cpuVariant() string {
FILE: vendor/github.com/containerd/platforms/cpuinfo_linux.go
function getMachineArch (line 32) | func getMachineArch() (string, error) {
function getCPUInfo (line 47) | func getCPUInfo(pattern string) (info string, err error) {
function getCPUVariantFromArch (line 77) | func getCPUVariantFromArch(arch string) (string, error) {
function getCPUVariant (line 114) | func getCPUVariant() (string, error) {
FILE: vendor/github.com/containerd/platforms/cpuinfo_other.go
function getCPUVariant (line 26) | func getCPUVariant() (string, error) {
FILE: vendor/github.com/containerd/platforms/database.go
function isKnownOS (line 32) | func isKnownOS(os string) bool {
function isArmArch (line 43) | func isArmArch(arch string) bool {
function isKnownArch (line 54) | func isKnownArch(arch string) bool {
function normalizeOS (line 62) | func normalizeOS(os string) string {
function normalizeArch (line 76) | func normalizeArch(arch, variant string) (string, string) {
FILE: vendor/github.com/containerd/platforms/defaults.go
function DefaultString (line 22) | func DefaultString() string {
function DefaultStrict (line 27) | func DefaultStrict() MatchComparer {
FILE: vendor/github.com/containerd/platforms/defaults_darwin.go
function DefaultSpec (line 28) | func DefaultSpec() specs.Platform {
function Default (line 38) | func Default() MatchComparer {
FILE: vendor/github.com/containerd/platforms/defaults_freebsd.go
function DefaultSpec (line 26) | func DefaultSpec() specs.Platform {
function Default (line 36) | func Default() MatchComparer {
FILE: vendor/github.com/containerd/platforms/defaults_unix.go
function DefaultSpec (line 28) | func DefaultSpec() specs.Platform {
function Default (line 38) | func Default() MatchComparer {
FILE: vendor/github.com/containerd/platforms/defaults_windows.go
function DefaultSpec (line 30) | func DefaultSpec() specs.Platform {
type windowsmatcher (line 41) | type windowsmatcher struct
method Match (line 49) | func (m windowsmatcher) Match(p specs.Platform) bool {
method Less (line 86) | func (m windowsmatcher) Less(p1, p2 specs.Platform) bool {
function getOSVersion (line 66) | func getOSVersion(osVersionPrefix string) osVersion {
function revision (line 95) | func revision(v string) int {
function prefix (line 107) | func prefix(v string) string {
function Default (line 116) | func Default() MatchComparer {
FILE: vendor/github.com/containerd/platforms/platform_compat_windows.go
type osVersion (line 21) | type osVersion struct
constant rs5 (line 37) | rs5 = 17763
constant v21H2Server (line 40) | v21H2Server = 20348
constant v22H2Win11 (line 43) | v22H2Win11 = 22621
function checkHostAndContainerCompat (line 58) | func checkHostAndContainerCompat(host, ctr osVersion) bool {
FILE: vendor/github.com/containerd/platforms/platforms.go
constant osAndVersionFormat (line 128) | osAndVersionFormat = "%s(%s)"
type Matcher (line 134) | type Matcher interface
function NewMatcher (line 146) | func NewMatcher(platform specs.Platform) Matcher {
type matcher (line 150) | type matcher struct
method Match (line 154) | func (m *matcher) Match(platform specs.Platform) bool {
method String (line 161) | func (m *matcher) String() string {
function ParseAll (line 166) | func ParseAll(specifiers []string) ([]specs.Platform, error) {
function Parse (line 189) | func Parse(specifier string) (specs.Platform, error) {
function MustParse (line 268) | func MustParse(specifier string) specs.Platform {
function Format (line 277) | func Format(platform specs.Platform) string {
function FormatAll (line 287) | func FormatAll(platform specs.Platform) string {
function Normalize (line 303) | func Normalize(platform specs.Platform) specs.Platform {
FILE: vendor/github.com/containerd/platforms/platforms_other.go
function newDefaultMatcher (line 26) | func newDefaultMatcher(platform specs.Platform) Matcher {
FILE: vendor/github.com/containerd/platforms/platforms_windows.go
function newDefaultMatcher (line 25) | func newDefaultMatcher(platform specs.Platform) Matcher {
FILE: vendor/github.com/cpuguy83/dockercfg/auth.go
constant tokenUsername (line 18) | tokenUsername = "<token>"
function GetRegistryCredentials (line 24) | func GetRegistryCredentials(hostname string) (string, string, error) {
function ResolveRegistryHost (line 41) | func ResolveRegistryHost(host string) string {
method GetRegistryCredentials (line 54) | func (c *Config) GetRegistryCredentials(hostname string) (string, string...
function DecodeBase64Auth (line 91) | func DecodeBase64Auth(auth AuthConfig) (string, string, error) {
function GetCredentialsFromHelper (line 138) | func GetCredentialsFromHelper(helper, hostname string) (string, string, ...
function getCredentialHelper (line 198) | func getCredentialHelper() (string, error) {
FILE: vendor/github.com/cpuguy83/dockercfg/config.go
type Config (line 4) | type Config struct
type ProxyConfig (line 34) | type ProxyConfig struct
type AuthConfig (line 42) | type AuthConfig struct
type KubernetesConfig (line 63) | type KubernetesConfig struct
FILE: vendor/github.com/cpuguy83/dockercfg/load.go
function UserHomeConfigPath (line 11) | func UserHomeConfigPath() (string, error) {
function ConfigPath (line 24) | func ConfigPath() (string, error) {
function LoadDefaultConfig (line 32) | func LoadDefaultConfig() (Config, error) {
function FromFile (line 43) | func FromFile(configPath string, cfg *Config) error {
FILE: vendor/github.com/davecgh/go-spew/spew/bypass.go
constant UnsafeDisabled (line 33) | UnsafeDisabled = false
constant ptrSize (line 36) | ptrSize = unsafe.Sizeof((*byte)(nil))
type flag (line 39) | type flag
constant flagKindMask (line 54) | flagKindMask = flag(0x1f)
function flagField (line 80) | func flagField(v *reflect.Value) *flag {
function unsafeReflectValue (line 93) | func unsafeReflectValue(v reflect.Value) reflect.Value {
function init (line 105) | func init() {
FILE: vendor/github.com/davecgh/go-spew/spew/bypasssafe.go
constant UnsafeDisabled (line 28) | UnsafeDisabled = true
function unsafeReflectValue (line 36) | func unsafeReflectValue(v reflect.Value) reflect.Value {
FILE: vendor/github.com/davecgh/go-spew/spew/common.go
function catchPanic (line 72) | func catchPanic(w io.Writer, v reflect.Value) {
function handleMethods (line 85) | func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handl...
function printBool (line 144) | func printBool(w io.Writer, val bool) {
function printInt (line 153) | func printInt(w io.Writer, val int64, base int) {
function printUint (line 158) | func printUint(w io.Writer, val uint64, base int) {
function printFloat (line 164) | func printFloat(w io.Writer, val float64, precision int) {
function printComplex (line 170) | func printComplex(w io.Writer, c complex128, floatPrecision int) {
function printHexPtr (line 185) | func printHexPtr(w io.Writer, p uintptr) {
type valuesSorter (line 219) | type valuesSorter struct
method Len (line 279) | func (s *valuesSorter) Len() int {
method Swap (line 285) | func (s *valuesSorter) Swap(i, j int) {
method Less (line 326) | func (s *valuesSorter) Less(i, j int) bool {
function newValuesSorter (line 228) | func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Inter...
function canSortSimply (line 256) | func canSortSimply(kind reflect.Kind) bool {
function valueSortLess (line 295) | func valueSortLess(a, b reflect.Value) bool {
function sortValues (line 336) | func sortValues(values []reflect.Value, cs *ConfigState) {
FILE: vendor/github.com/davecgh/go-spew/spew/config.go
type ConfigState (line 37) | type ConfigState struct
method Errorf (line 115) | func (c *ConfigState) Errorf(format string, a ...interface{}) (err err...
method Fprint (line 127) | func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, er...
method Fprintf (line 139) | func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interfa...
method Fprintln (line 150) | func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, ...
method Print (line 162) | func (c *ConfigState) Print(a ...interface{}) (n int, err error) {
method Printf (line 174) | func (c *ConfigState) Printf(format string, a ...interface{}) (n int, ...
method Println (line 186) | func (c *ConfigState) Println(a ...interface{}) (n int, err error) {
method Sprint (line 197) | func (c *ConfigState) Sprint(a ...interface{}) string {
method Sprintf (line 208) | func (c *ConfigState) Sprintf(format string, a ...interface{}) string {
method Sprintln (line 219) | func (c *ConfigState) Sprintln(a ...interface{}) string {
method NewFormatter (line 240) | func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter {
method Fdump (line 246) | func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) {
method Dump (line 273) | func (c *ConfigState) Dump(a ...interface{}) {
method Sdump (line 279) | func (c *ConfigState) Sdump(a ...interface{}) string {
method convertArgs (line 288) | func (c *ConfigState) convertArgs(args []interface{}) (formatters []in...
function NewDefaultConfig (line 304) | func NewDefaultConfig() *ConfigState {
FILE: vendor/github.com/davecgh/go-spew/spew/dump.go
type dumpState (line 51) | type dumpState struct
method indent (line 62) | func (d *dumpState) indent() {
method unpackValue (line 73) | func (d *dumpState) unpackValue(v reflect.Value) reflect.Value {
method dumpPtr (line 81) | func (d *dumpState) dumpPtr(v reflect.Value) {
method dumpSlice (line 161) | func (d *dumpState) dumpSlice(v reflect.Value) {
method dump (line 251) | func (d *dumpState) dump(v reflect.Value) {
function fdump (line 453) | func fdump(cs *ConfigState, w io.Writer, a ...interface{}) {
function Fdump (line 472) | func Fdump(w io.Writer, a ...interface{}) {
function Sdump (line 478) | func Sdump(a ...interface{}) string {
function Dump (line 507) | func Dump(a ...interface{}) {
FILE: vendor/github.com/davecgh/go-spew/spew/format.go
constant supportedFlags (line 28) | supportedFlags = "0-+# "
type formatState (line 34) | type formatState struct
method buildDefaultFormat (line 47) | func (f *formatState) buildDefaultFormat() (format string) {
method constructOrigFormat (line 65) | func (f *formatState) constructOrigFormat(verb rune) (format string) {
method unpackValue (line 94) | func (f *formatState) unpackValue(v reflect.Value) reflect.Value {
method formatPtr (line 105) | func (f *formatState) formatPtr(v reflect.Value) {
method format (line 201) | func (f *formatState) format(v reflect.Value) {
method Format (line 371) | func (f *formatState) Format(fs fmt.State, verb rune) {
function newFormatter (line 394) | func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter {
function NewFormatter (line 417) | func NewFormatter(v interface{}) fmt.Formatter {
FILE: vendor/github.com/davecgh/go-spew/spew/spew.go
function Errorf (line 32) | func Errorf(format string, a ...interface{}) (err error) {
function Fprint (line 44) | func Fprint(w io.Writer, a ...interface{}) (n int, err error) {
function Fprintf (line 56) | func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err e...
function Fprintln (line 67) | func Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
function Print (line 79) | func Print(a ...interface{}) (n int, err error) {
function Printf (line 91) | func Printf(format string, a ...interface{}) (n int, err error) {
function Println (line 103) | func Println(a ...interface{}) (n int, err error) {
function Sprint (line 114) | func Sprint(a ...interface{}) string {
function Sprintf (line 125) | func Sprintf(format string, a ...interface{}) string {
function Sprintln (line 136) | func Sprintln(a ...interface{}) string {
function convertArgs (line 142) | func convertArgs(args []interface{}) (formatters []interface{}) {
FILE: vendor/github.com/distribution/reference/helpers.go
function IsNameOnly (line 6) | func IsNameOnly(ref Named) bool {
function FamiliarName (line 18) | func FamiliarName(ref Named) string {
function FamiliarString (line 27) | func FamiliarString(ref Reference) string {
function FamiliarMatch (line 36) | func FamiliarMatch(pattern string, ref Reference) (bool, error) {
FILE: vendor/github.com/distribution/reference/normalize.go
constant legacyDefaultDomain (line 20) | legacyDefaultDomain = "index.docker.io"
constant defaultDomain (line 31) | defaultDomain = "docker.io"
constant officialRepoPrefix (line 36) | officialRepoPrefix = "library/"
constant defaultTag (line 39) | defaultTag = "latest"
type normalizedNamed (line 47) | type normalizedNamed interface
function ParseNormalizedNamed (line 56) | func ParseNormalizedNamed(s string) (Named, error) {
type namedTaggedDigested (line 83) | type namedTaggedDigested interface
function ParseDockerRef (line 107) | func ParseDockerRef(ref string) (Named, error) {
function splitDockerDomain (line 126) | func splitDockerDomain(name string) (domain, remoteName string) {
function familiarizeName (line 179) | func familiarizeName(named namedRepository) repository {
method Familiar (line 202) | func (r reference) Familiar() Named {
method Familiar (line 210) | func (r repository) Familiar() Named {
method Familiar (line 214) | func (t taggedReference) Familiar() Named {
method Familiar (line 221) | func (c canonicalReference) Familiar() Named {
function TagNameOnly (line 230) | func TagNameOnly(ref Named) Named {
function ParseAnyReference (line 246) | func ParseAnyReference(ref string) (Reference, error) {
FILE: vendor/github.com/distribution/reference/reference.go
constant RepositoryNameTotalLengthMax (line 39) | RepositoryNameTotalLengthMax = 255
constant NameTotalLengthMax (line 44) | NameTotalLengthMax = RepositoryNameTotalLengthMax
type Reference (line 72) | type Reference interface
type Field (line 79) | type Field struct
method Reference (line 92) | func (f Field) Reference() Reference {
method MarshalText (line 98) | func (f Field) MarshalText() (p []byte, err error) {
method UnmarshalText (line 105) | func (f *Field) UnmarshalText(p []byte) error {
function AsField (line 84) | func AsField(reference Reference) Field {
type Named (line 116) | type Named interface
type Tagged (line 122) | type Tagged interface
type NamedTagged (line 128) | type NamedTagged interface
type Digested (line 135) | type Digested interface
type Canonical (line 142) | type Canonical interface
type namedRepository (line 149) | type namedRepository interface
function Domain (line 156) | func Domain(named Named) string {
function Path (line 165) | func Path(named Named) (name string) {
function splitDomain (line 176) | func splitDomain(name string) (string, string) {
function Parse (line 186) | func Parse(s string) (Reference, error) {
function ParseNamed (line 237) | func ParseNamed(s string) (Named, error) {
function WithName (line 250) | func WithName(name string) (Named, error) {
function WithTag (line 268) | func WithTag(name Named, tag string) (NamedTagged, error) {
function WithDigest (line 294) | func WithDigest(name Named, digest digest.Digest) (Canonical, error) {
function TrimNamed (line 319) | func TrimNamed(ref Named) Named {
function getBestReferenceType (line 329) | func getBestReferenceType(ref reference) Reference {
type reference (line 356) | type reference struct
method String (line 362) | func (r reference) String() string {
method Tag (line 366) | func (r reference) Tag() string {
method Digest (line 370) | func (r reference) Digest() digest.Digest {
type repository (line 374) | type repository struct
method String (line 379) | func (r repository) String() string {
method Name (line 383) | func (r repository) Name() string {
method Domain (line 390) | func (r repository) Domain() string {
method Path (line 394) | func (r repository) Path() string {
type digestReference (line 398) | type digestReference
method String (line 400) | func (d digestReference) String() string {
method Digest (line 404) | func (d digestReference) Digest() digest.Digest {
type taggedReference (line 408) | type taggedReference struct
method String (line 413) | func (t taggedReference) String() string {
method Tag (line 417) | func (t taggedReference) Tag() string {
type canonicalReference (line 421) | type canonicalReference struct
method String (line 426) | func (c canonicalReference) String() string {
method Digest (line 430) | func (c canonicalReference) Digest() digest.Digest {
FILE: vendor/github.com/distribution/reference/regexp.go
constant alphanumeric (line 44) | alphanumeric = `[a-z0-9]+`
constant separator (line 53) | separator = `(?:[._]|__|[-]+)`
constant localhost (line 57) | localhost = `localhost`
constant domainNameComponent (line 61) | domainNameComponent = `(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])`
constant optionalPort (line 65) | optionalPort = `(?::[0-9]+)?`
constant tag (line 68) | tag = `[\w][\w.-]{0,127}`
constant digestPat (line 81) | digestPat = `[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][[:xd...
constant identifier (line 85) | identifier = `([a-f0-9]{64})`
constant ipv6address (line 91) | ipv6address = `\[(?:[a-fA-F0-9:]+)\]`
function optional (line 145) | func optional(res ...string) string {
function anyTimes (line 151) | func anyTimes(res ...string) string {
function capture (line 156) | func capture(res ...string) string {
function anchored (line 161) | func anchored(res ...string) string {
FILE: vendor/github.com/distribution/reference/sort.go
function Sort (line 33) | func Sort(references []string) []string {
function refRank (line 61) | func refRank(ref Reference) uint8 {
FILE: vendor/github.com/docker/docker/api/common.go
constant DefaultVersion (line 6) | DefaultVersion = "1.48"
constant MinSupportedAPIVersion (line 15) | MinSupportedAPIVersion = "1.24"
constant NoBaseImageSpecifier (line 19) | NoBaseImageSpecifier = "scratch"
FILE: vendor/github.com/docker/docker/api/types/blkiodev/blkio.go
type WeightDevice (line 6) | type WeightDevice struct
method String (line 11) | func (w *WeightDevice) String() string {
type ThrottleDevice (line 16) | type ThrottleDevice struct
method String (line 21) | func (t *ThrottleDevice) String() string {
FILE: vendor/github.com/docker/docker/api/types/checkpoint/list.go
type Summary (line 4) | type Summary struct
FILE: vendor/github.com/docker/docker/api/types/checkpoint/options.go
type CreateOptions (line 4) | type CreateOptions struct
type ListOptions (line 11) | type ListOptions struct
type DeleteOptions (line 16) | type DeleteOptions struct
FILE: vendor/github.com/docker/docker/api/types/client.go
function NewHijackedResponse (line 15) | func NewHijackedResponse(conn net.Conn, mediaType string) HijackedRespon...
type HijackedResponse (line 20) | type HijackedResponse struct
method Close (line 27) | func (h *HijackedResponse) Close() {
method MediaType (line 33) | func (h *HijackedResponse) MediaType() (string, bool) {
method CloseWrite (line 47) | func (h *HijackedResponse) CloseWrite() error {
type CloseWriter (line 42) | type CloseWriter interface
type ImageBuildOptions (line 56) | type ImageBuildOptions struct
type ImageBuildOutput (line 109) | type ImageBuildOutput struct
type BuilderVersion (line 115) | type BuilderVersion
constant BuilderV1 (line 119) | BuilderV1 BuilderVersion = "1"
constant BuilderBuildKit (line 121) | BuilderBuildKit BuilderVersion = "2"
type ImageBuildResponse (line 127) | type ImageBuildResponse struct
type NodeListOptions (line 133) | type NodeListOptions struct
type NodeRemoveOptions (line 138) | type NodeRemoveOptions struct
type ServiceCreateOptions (line 143) | type ServiceCreateOptions struct
constant RegistryAuthFromSpec (line 159) | RegistryAuthFromSpec = "spec"
constant RegistryAuthFromPreviousSpec (line 160) | RegistryAuthFromPreviousSpec = "previous-spec"
type ServiceUpdateOptions (line 164) | type ServiceUpdateOptions struct
type ServiceListOptions (line 194) | type ServiceListOptions struct
type ServiceInspectOptions (line 204) | type ServiceInspectOptions struct
type TaskListOptions (line 209) | type TaskListOptions struct
type PluginRemoveOptions (line 214) | type PluginRemoveOptions struct
type PluginEnableOptions (line 219) | type PluginEnableOptions struct
type PluginDisableOptions (line 224) | type PluginDisableOptions struct
type PluginInstallOptions (line 229) | type PluginInstallOptions struct
type SwarmUnlockKeyResponse (line 248) | type SwarmUnlockKeyResponse struct
type PluginCreateOptions (line 254) | type PluginCreateOptions struct
FILE: vendor/github.com/docker/docker/api/types/common/id_response.go
type IDResponse (line 8) | type IDResponse struct
FILE: vendor/github.com/docker/docker/api/types/container/change_type.go
type ChangeType (line 15) | type ChangeType
FILE: vendor/github.com/docker/docker/api/types/container/change_types.go
constant ChangeModify (line 5) | ChangeModify ChangeType = 0
constant ChangeAdd (line 7) | ChangeAdd ChangeType = 1
constant ChangeDelete (line 9) | ChangeDelete ChangeType = 2
method String (line 12) | func (ct ChangeType) String() string {
FILE: vendor/github.com/docker/docker/api/types/container/config.go
constant MinimumDuration (line 15) | MinimumDuration = 1 * time.Millisecond
type StopOptions (line 18) | type StopOptions struct
type Config (line 44) | type Config struct
FILE: vendor/github.com/docker/docker/api/types/container/container.go
type PruneReport (line 25) | type PruneReport struct
type PathStat (line 33) | type PathStat struct
type CopyToContainerOptions (line 43) | type CopyToContainerOptions struct
type StatsResponseReader (line 55) | type StatsResponseReader struct
type MountPoint (line 62) | type MountPoint struct
type State (line 106) | type State struct
type Summary (line 123) | type Summary struct
type ContainerJSONBase (line 154) | type ContainerJSONBase struct
type InspectResponse (line 181) | type InspectResponse struct
FILE: vendor/github.com/docker/docker/api/types/container/create_request.go
type CreateRequest (line 9) | type CreateRequest struct
FILE: vendor/github.com/docker/docker/api/types/container/create_response.go
type CreateResponse (line 10) | type CreateResponse struct
FILE: vendor/github.com/docker/docker/api/types/container/errors.go
type errInvalidParameter (line 3) | type errInvalidParameter struct
method InvalidParameter (line 5) | func (e *errInvalidParameter) InvalidParameter() {}
method Unwrap (line 7) | func (e *errInvalidParameter) Unwrap() error {
FILE: vendor/github.com/docker/docker/api/types/container/exec.go
type ExecOptions (line 13) | type ExecOptions struct
type ExecStartOptions (line 30) | type ExecStartOptions struct
type ExecInspect (line 45) | type ExecInspect struct
FILE: vendor/github.com/docker/docker/api/types/container/filesystem_change.go
type FilesystemChange (line 9) | type FilesystemChange struct
FILE: vendor/github.com/docker/docker/api/types/container/health.go
constant NoHealthcheck (line 7) | NoHealthcheck = "none"
constant Starting (line 8) | Starting = "starting"
constant Healthy (line 9) | Healthy = "healthy"
constant Unhealthy (line 10) | Unhealthy = "unhealthy"
type Health (line 14) | type Health struct
type HealthcheckResult (line 21) | type HealthcheckResult struct
FILE: vendor/github.com/docker/docker/api/types/container/hostconfig.go
type CgroupnsMode (line 17) | type CgroupnsMode
method IsPrivate (line 27) | func (c CgroupnsMode) IsPrivate() bool {
method IsHost (line 32) | func (c CgroupnsMode) IsHost() bool {
method IsEmpty (line 37) | func (c CgroupnsMode) IsEmpty() bool {
method Valid (line 42) | func (c CgroupnsMode) Valid() bool {
constant CgroupnsModeEmpty (line 21) | CgroupnsModeEmpty CgroupnsMode = ""
constant CgroupnsModePrivate (line 22) | CgroupnsModePrivate CgroupnsMode = "private"
constant CgroupnsModeHost (line 23) | CgroupnsModeHost CgroupnsMode = "host"
type Isolation (line 48) | type Isolation
method IsDefault (line 60) | func (i Isolation) IsDefault() bool {
method IsHyperV (line 67) | func (i Isolation) IsHyperV() bool {
method IsProcess (line 73) | func (i Isolation) IsProcess() bool {
constant IsolationEmpty (line 52) | IsolationEmpty Isolation = ""
constant IsolationDefault (line 53) | IsolationDefault Isolation = "default"
constant IsolationProcess (line 54) | IsolationProcess Isolation = "process"
constant IsolationHyperV (line 55) | IsolationHyperV Isolation = "hyperv"
type IpcMode (line 79) | type IpcMode
method IsPrivate (line 91) | func (n IpcMode) IsPrivate() bool {
method IsHost (line 96) | func (n IpcMode) IsHost() bool {
method IsShareable (line 101) | func (n IpcMode) IsShareable() bool {
method IsContainer (line 106) | func (n IpcMode) IsContainer() bool {
method IsNone (line 112) | func (n IpcMode) IsNone() bool {
method IsEmpty (line 117) | func (n IpcMode) IsEmpty() bool {
method Valid (line 122) | func (n IpcMode) Valid() bool {
method Container (line 128) | func (n IpcMode) Container() (idOrName string) {
constant IPCModeNone (line 83) | IPCModeNone IpcMode = "none"
constant IPCModeHost (line 84) | IPCModeHost IpcMode = "host"
constant IPCModeContainer (line 85) | IPCModeContainer IpcMode = "container"
constant IPCModePrivate (line 86) | IPCModePrivate IpcMode = "private"
constant IPCModeShareable (line 87) | IPCModeShareable IpcMode = "shareable"
type NetworkMode (line 134) | type NetworkMode
method IsNone (line 137) | func (n NetworkMode) IsNone() bool {
method IsDefault (line 142) | func (n NetworkMode) IsDefault() bool {
method IsPrivate (line 147) | func (n NetworkMode) IsPrivate() bool {
method IsContainer (line 152) | func (n NetworkMode) IsContainer() bool {
method ConnectedContainer (line 158) | func (n NetworkMode) ConnectedContainer() (idOrName string) {
method UserDefined (line 164) | func (n NetworkMode) UserDefined() string {
type UsernsMode (line 172) | type UsernsMode
method IsHost (line 175) | func (n UsernsMode) IsHost() bool {
method IsPrivate (line 180) | func (n UsernsMode) IsPrivate() bool {
method Valid (line 185) | func (n UsernsMode) Valid() bool {
type CgroupSpec (line 190) | type CgroupSpec
method IsContainer (line 193) | func (c CgroupSpec) IsContainer() bool {
method Valid (line 199) | func (c CgroupSpec) Valid() bool {
method Container (line 205) | func (c CgroupSpec) Container() (idOrName string) {
type UTSMode (line 211) | type UTSMode
method IsPrivate (line 214) | func (n UTSMode) IsPrivate() bool {
method IsHost (line 219) | func (n UTSMode) IsHost() bool {
method Valid (line 224) | func (n UTSMode) Valid() bool {
type PidMode (line 229) | type PidMode
method IsPrivate (line 232) | func (n PidMode) IsPrivate() bool {
method IsHost (line 237) | func (n PidMode) IsHost() bool {
method IsContainer (line 242) | func (n PidMode) IsContainer() bool {
method Valid (line 248) | func (n PidMode) Valid() bool {
method Container (line 253) | func (n PidMode) Container() (idOrName string) {
type DeviceRequest (line 260) | type DeviceRequest struct
type DeviceMapping (line 269) | type DeviceMapping struct
type RestartPolicy (line 276) | type R
Copy disabled (too large)
Download .json
Condensed preview — 2299 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,998K chars).
[
{
"path": ".github/CODEOWNERS",
"chars": 37,
"preview": "* @rashiq @meiji163 @timvaillancourt\n"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 2169,
"preview": "## Contributing\n\nHi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keep"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 571,
"preview": "> This is the place to report a bug, ask a question, or suggest an enhancement.\n\n> This is also the place to make a disc"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 858,
"preview": "## A Pull Request should be associated with an Issue.\n\n> We wish to have discussions in Issues. A single issue may be ta"
},
{
"path": ".github/dependabot.yml",
"chars": 109,
"preview": "---\nversion: 2\nupdates:\n- package-ecosystem: github-actions\n directory: \"/\"\n schedule:\n interval: daily\n"
},
{
"path": ".github/workflows/ci.yml",
"chars": 431,
"preview": "name: CI\npermissions:\n contents: read\n\non: [pull_request]\n\njobs:\n build:\n\n runs-on: ubuntu-latest\n\n steps:\n -"
},
{
"path": ".github/workflows/codeql.yml",
"chars": 757,
"preview": "name: \"CodeQL analysis\"\n\non: \n push:\n branches: [ master ]\n pull_request:\n branches: [ master ]\n schedule:\n "
},
{
"path": ".github/workflows/golangci-lint.yml",
"chars": 518,
"preview": "name: golangci-lint\non:\n push:\n branches:\n - master\n pull_request:\npermissions:\n contents: read\n # Optional:"
},
{
"path": ".github/workflows/replica-tests.yml",
"chars": 1206,
"preview": "name: migration tests\npermissions:\n contents: read\n\non: [pull_request]\n\njobs:\n docker-tests:\n runs-on: ubuntu-22.04"
},
{
"path": ".gitignore",
"chars": 49,
"preview": "/.gopath/\n/bin/\n/libexec/\n/.vendor/\n.idea/\n*.tmp\n"
},
{
"path": ".golangci.yml",
"chars": 421,
"preview": "run:\n timeout: 5m\nlinters:\n disable:\n - errcheck\n enable:\n - bodyclose\n - containedctx\n - contextcheck\n "
},
{
"path": "Dockerfile.packaging",
"chars": 491,
"preview": "FROM golang:1.23-bullseye\n\nRUN apt-get update\nRUN apt-get install -y ruby ruby-dev rubygems build-essential\nRUN gem inst"
},
{
"path": "Dockerfile.test",
"chars": 253,
"preview": "FROM golang:1.23-bullseye\nLABEL maintainer=\"github@github.com\"\n\nRUN apt-get update\nRUN apt-get install -y lsb-release\nRU"
},
{
"path": "LICENSE",
"chars": 1073,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 GitHub\n\nPermission is hereby granted, free of charge, to any person obtaining "
},
{
"path": "README.md",
"chars": 7883,
"preview": "# gh-ost\n\n[](https://github.com/github/gh-ost/"
},
{
"path": "build.sh",
"chars": 2431,
"preview": "#!/bin/bash\n\nRELEASE_VERSION=\nbuildpath=\n\nfunction setuptree() {\n b=$( mktemp -d $buildpath/gh-ostXXXXXX ) || return 1\n"
},
{
"path": "doc/azure.md",
"chars": 1211,
"preview": "`gh-ost` has been updated to work with Azure Database for MySQL however due to GitHub does not use it, this documentatio"
},
{
"path": "doc/cheatsheet.md",
"chars": 7225,
"preview": "# Cheatsheet\n\n### Operation modes\n\n\n\n\n`gh-ost` operates by connecti"
},
{
"path": "doc/coding-ghost.md",
"chars": 1260,
"preview": "# Getting started with gh-ost development.\n\n## Overview\n\nGetting started with gh-ost development is simple!\n\n- First obt"
},
{
"path": "doc/command-line-flags.md",
"chars": 20630,
"preview": "# Command line flags\n\nA more in-depth discussion of various `gh-ost` command line flags: implementation, implication, us"
},
{
"path": "doc/cut-over.md",
"chars": 2390,
"preview": "# Cut-over step\n\nThe cut-over is the final major step of the migration: it's the moment where your original table is pus"
},
{
"path": "doc/hooks.md",
"chars": 4456,
"preview": "# Hooks\n\n`gh-ost` supports _hooks_: external processes which `gh-ost` executes at particular points of interest.\n\nUse ca"
},
{
"path": "doc/interactive-commands.md",
"chars": 5698,
"preview": "# Interactive commands\n\n`gh-ost` is designed to be operations friendly. To that effect, it allows the user to control it"
},
{
"path": "doc/local-tests.md",
"chars": 2083,
"preview": "# Local tests\n\n`gh-ost` is continuously tested in production via `--test-on-replica alter='engine=innodb'`. These tests "
},
{
"path": "doc/migrating-with-sbr.md",
"chars": 1924,
"preview": "# Migrating with Statement Based Replication\n\nEven though `gh-ost` relies on Row Based Replication (RBR), it does not me"
},
{
"path": "doc/perks.md",
"chars": 3359,
"preview": "# Perks\n\nListed below are some operation perks that make the DBA happy.\n\n### Dynamic reconfiguration\n\nYou started with a"
},
{
"path": "doc/questions.md",
"chars": 2076,
"preview": "# How?\n\n### How does the cut-over work? Is it really atomic?\n\nThe cut-over phase, where the original table is swapped aw"
},
{
"path": "doc/rds.md",
"chars": 4462,
"preview": "`gh-ost` has been updated to work with Amazon RDS however due to GitHub not using AWS for databases, this documentation "
},
{
"path": "doc/requirements-and-limitations.md",
"chars": 3920,
"preview": "# Requirements and limitations\n\n### Requirements\n\n- `gh-ost` currently requires MySQL versions 5.7 and greater.\n\n- You w"
},
{
"path": "doc/resume.md",
"chars": 1691,
"preview": "# Resuming Migrations\n\n`gh-ost` can attempt to resume an interrupted migration from a checkpoint if the following condit"
},
{
"path": "doc/revert.md",
"chars": 2850,
"preview": "# Reverting Migrations\n\n`gh-ost` can attempt to revert a previously completed migration if the follow conditions are met"
},
{
"path": "doc/shared-key.md",
"chars": 4658,
"preview": "# Shared key\n\ngh-ost requires for every migration that both the _before_ and _after_ versions of the table share the sam"
},
{
"path": "doc/subsecond-lag.md",
"chars": 1520,
"preview": "# Sub-second replication lag throttling\n\n`gh-ost` is able to utilize sub-second replication lag measurements.\n\nAt GitHub"
},
{
"path": "doc/testing-on-replica.md",
"chars": 3983,
"preview": "# Testing on replica\n\n`gh-ost`'s design allows for trusted and reliable tests of the migration without compromising prod"
},
{
"path": "doc/the-fine-print.md",
"chars": 2234,
"preview": "# The Fine Print: What are You Not Telling Me?\n\nHere are technical considerations you may be interested in. We write her"
},
{
"path": "doc/throttle.md",
"chars": 6917,
"preview": "# Throttle\n\nThroughout a migration operation, `gh-ost` is either actively copying and applying data, or is _throttling_."
},
{
"path": "doc/triggerless-design.md",
"chars": 12694,
"preview": "# Triggerless design\n\nA breakdown of the logic and algorithm behind `gh-ost`'s triggerless design, followed by the impli"
},
{
"path": "doc/understanding-output.md",
"chars": 10602,
"preview": "# Understanding gh-ost output\n\n`gh-ost` attempts to be verbose to the point where you really know what it's doing, witho"
},
{
"path": "doc/what-if.md",
"chars": 2201,
"preview": "# What if?\n\nTechnical questions and answers. This document will be updated as we go\n\n### What if I'm using Statement Bas"
},
{
"path": "doc/why-triggerless.md",
"chars": 4987,
"preview": "# Why triggerless?\n\nExisting MySQL schema migration tools:\n\n- [pt-online-schema-change](https://www.percona.com/doc/perc"
},
{
"path": "docker-compose.yml",
"chars": 109,
"preview": "version: \"3.5\"\nservices:\n app:\n image: app\n build:\n context: .\n dockerfile: Dockerfile.test\n"
},
{
"path": "go/base/context.go",
"chars": 33204,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/base/context_test.go",
"chars": 9046,
"preview": "/*\n Copyright 2021 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/base/default_logger.go",
"chars": 1627,
"preview": "/*\n Copyright 2022 GitHub Inc.\n See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimp"
},
{
"path": "go/base/load_map.go",
"chars": 1745,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/base/load_map_test.go",
"chars": 1178,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/base/utils.go",
"chars": 2739,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/base/utils_test.go",
"chars": 683,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage base\n\nimport (\n\t"
},
{
"path": "go/binlog/binlog_dml_event.go",
"chars": 1531,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
},
{
"path": "go/binlog/binlog_entry.go",
"chars": 739,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
},
{
"path": "go/binlog/binlog_reader.go",
"chars": 402,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\n// Binlo"
},
{
"path": "go/binlog/gomysql_reader.go",
"chars": 6923,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage binlog\n\nimport ("
},
{
"path": "go/binlog/testdata/rbr-sample-0.txt",
"chars": 9684,
"preview": "/*\n these are the statements that were used to execute the RBR log:\n \n create table samplet(id int primary key,"
},
{
"path": "go/binlog/testdata/rbr-sample-1.txt",
"chars": 1070,
"preview": "/*\n these are the statements that were used to execute the RBR log:\n\n drop table if exists samplet;\n create tab"
},
{
"path": "go/binlog/testdata/rbr-sample-2.txt",
"chars": 1722,
"preview": "drop table if exists samplet;\ncreate table samplet(id int primary key, license int, name varchar(64), b tinyblob, unique"
},
{
"path": "go/cmd/gh-ost/main.go",
"chars": 27300,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage main\n\nimport (\n\t"
},
{
"path": "go/logic/applier.go",
"chars": 62819,
"preview": "/*\n Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/applier_test.go",
"chars": 52475,
"preview": "/*\n Copyright 2025 GitHub Inc.\n See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
},
{
"path": "go/logic/checkpoint.go",
"chars": 797,
"preview": "/*\n Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/hooks.go",
"chars": 6400,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/hooks_test.go",
"chars": 3455,
"preview": "/*\n Copyright 2022 GitHub Inc.\n See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
},
{
"path": "go/logic/inspect.go",
"chars": 39421,
"preview": "/*\n Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/inspect_test.go",
"chars": 1034,
"preview": "/*\n Copyright 2022 GitHub Inc.\n See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
},
{
"path": "go/logic/migrator.go",
"chars": 72773,
"preview": "/*\n Copyright 2025 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/migrator_test.go",
"chars": 39468,
"preview": "/*\n Copyright 2022 GitHub Inc.\n See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nim"
},
{
"path": "go/logic/my.cnf.test",
"chars": 585,
"preview": "# mysql server configuration for testcontainer\n[mysqld]\nmax_connections = 200\ninnodb_log_file_size = 64M\ninnodb_flush_lo"
},
{
"path": "go/logic/server.go",
"chars": 16167,
"preview": "/*\n Copyright 2021 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/server_test.go",
"chars": 2634,
"preview": "package logic\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/github/gh-ost/go/base\"\n\t\"github.com/stretchr/test"
},
{
"path": "go/logic/streamer.go",
"chars": 7972,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/logic/streamer_test.go",
"chars": 7252,
"preview": "package logic\n\nimport (\n\t\"context\"\n\t\"database/sql\"\n\tgosql \"database/sql\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/github/"
},
{
"path": "go/logic/test_utils.go",
"chars": 2114,
"preview": "package logic\n\nimport (\n\t\"context\"\n\n\t\"fmt\"\n\t\"path/filepath\"\n\t\"runtime\"\n\n\t\"github.com/github/gh-ost/go/base\"\n\t\"github.com"
},
{
"path": "go/logic/throttler.go",
"chars": 19125,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage logic\n\nimport (\n"
},
{
"path": "go/mysql/binlog.go",
"chars": 417,
"preview": "/*\n Copyright 2015 Shlomi Noach, courtesy Booking.com\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
},
{
"path": "go/mysql/binlog_file.go",
"chars": 6810,
"preview": "/*\n Copyright 2015 Shlomi Noach, courtesy Booking.com\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
},
{
"path": "go/mysql/binlog_file_test.go",
"chars": 6888,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/mysql/binlog_gtid.go",
"chars": 2552,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/mysql/connection.go",
"chars": 4626,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/mysql/connection_test.go",
"chars": 3756,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/mysql/instance_key.go",
"chars": 4131,
"preview": "/*\n Copyright 2015 Shlomi Noach, courtesy Booking.com\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh"
},
{
"path": "go/mysql/instance_key_map.go",
"chars": 2369,
"preview": "/*\n Copyright 2015 Shlomi Noach, courtesy Booking.com\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\np"
},
{
"path": "go/mysql/instance_key_test.go",
"chars": 1687,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/mysql/replica_terminology_map.go",
"chars": 1131,
"preview": "package mysql\n\nimport (\n\tversion \"github.com/hashicorp/go-version\"\n)\n\nconst (\n\tMysqlVersionCutoff = \"8.4\"\n)\n\nvar MysqlRe"
},
{
"path": "go/mysql/utils.go",
"chars": 9060,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage mysql\n\nimport (\n"
},
{
"path": "go/sql/builder.go",
"chars": 25470,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/builder_test.go",
"chars": 27991,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/encoding.go",
"chars": 523,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/parser.go",
"chars": 6305,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/parser_test.go",
"chars": 11969,
"preview": "/*\n Copyright 2022 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/types.go",
"chars": 9029,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go/sql/types_test.go",
"chars": 3115,
"preview": "/*\n Copyright 2016 GitHub Inc.\n\t See https://github.com/github/gh-ost/blob/master/LICENSE\n*/\n\npackage sql\n\nimport (\n\t\""
},
{
"path": "go.mod",
"chars": 3843,
"preview": "module github.com/github/gh-ost\n\ngo 1.23.0\n\nrequire (\n\tgithub.com/go-ini/ini v1.67.0\n\tgithub.com/go-mysql-org/go-mysql v"
},
{
"path": "go.sum",
"chars": 23327,
"preview": "dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=\ndario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobSt"
},
{
"path": "localtests/alter-charset/create.sql",
"chars": 821,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n t1 varchar(128) charset latin1 "
},
{
"path": "localtests/alter-charset/extra_args",
"chars": 181,
"preview": "--alter='MODIFY `t1` varchar(128) CHARACTER SET utf8mb4 NOT NULL, MODIFY `t2` varchar(128) CHARACTER SET latin2 NOT NULL"
},
{
"path": "localtests/alter-charset-all-dml/create.sql",
"chars": 1171,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n t1 varchar(128) charset latin1 "
},
{
"path": "localtests/alter-charset-all-dml/extra_args",
"chars": 181,
"preview": "--alter='MODIFY `t1` varchar(128) CHARACTER SET utf8mb4 NOT NULL, MODIFY `t2` varchar(128) CHARACTER SET latin2 NOT NULL"
},
{
"path": "localtests/attempt-instant-ddl/create.sql",
"chars": 352,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n color varchar("
},
{
"path": "localtests/attempt-instant-ddl/extra_args",
"chars": 22,
"preview": "--attempt-instant-ddl\n"
},
{
"path": "localtests/autoinc-copy-deletes/create.sql",
"chars": 516,
"preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,"
},
{
"path": "localtests/autoinc-copy-deletes/expect_table_structure",
"chars": 17,
"preview": "AUTO_INCREMENT=8\n"
},
{
"path": "localtests/autoinc-copy-deletes-user-defined/create.sql",
"chars": 516,
"preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,"
},
{
"path": "localtests/autoinc-copy-deletes-user-defined/expect_table_structure",
"chars": 17,
"preview": "AUTO_INCREMENT=7\n"
},
{
"path": "localtests/autoinc-copy-deletes-user-defined/extra_args",
"chars": 27,
"preview": "--alter='AUTO_INCREMENT=7'\n"
},
{
"path": "localtests/autoinc-copy-simple/create.sql",
"chars": 350,
"preview": "drop event if exists gh_ost_test;\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,"
},
{
"path": "localtests/autoinc-copy-simple/expect_table_structure",
"chars": 17,
"preview": "AUTO_INCREMENT=5\n"
},
{
"path": "localtests/autoinc-zero-value/create.sql",
"chars": 229,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n primary key(id"
},
{
"path": "localtests/bigint-change-nullable/create.sql",
"chars": 570,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id bigint auto_increment,\n val bigint not null,\n primar"
},
{
"path": "localtests/bigint-change-nullable/extra_args",
"chars": 33,
"preview": "--alter=\"change val val bigint\" \n"
},
{
"path": "localtests/binary-to-varbinary/create.sql",
"chars": 1635,
"preview": "-- Test for https://github.com/github/gh-ost/issues/909 variant:\n-- Binary columns with trailing zeros should preserve t"
},
{
"path": "localtests/binary-to-varbinary/extra_args",
"chars": 36,
"preview": "--alter=\"MODIFY data varbinary(32)\"\n"
},
{
"path": "localtests/bit-add/create.sql",
"chars": 463,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n primary key(id"
},
{
"path": "localtests/bit-add/extra_args",
"chars": 49,
"preview": "--alter=\"add column is_good bit null default 0\" \n"
},
{
"path": "localtests/bit-add/ghost_columns",
"chars": 6,
"preview": "id, i\n"
},
{
"path": "localtests/bit-add/orig_columns",
"chars": 6,
"preview": "id, i\n"
},
{
"path": "localtests/bit-dml/create.sql",
"chars": 620,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n is_good bit nu"
},
{
"path": "localtests/bit-dml/extra_args",
"chars": 81,
"preview": "--alter=\"modify column is_good bit not null default 0\" --approve-renamed-columns\n"
},
{
"path": "localtests/compound-pk/create.sql",
"chars": 1436,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n v varchar(128)"
},
{
"path": "localtests/compound-pk-ts/create.sql",
"chars": 1456,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n ts0 timestamp("
},
{
"path": "localtests/convert-utf8mb4/create.sql",
"chars": 989,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n t varchar(128) charset utf8 coll"
},
{
"path": "localtests/convert-utf8mb4/extra_args",
"chars": 43,
"preview": "--alter='convert to character set utf8mb4'\n"
},
{
"path": "localtests/copy-retries-exhausted/after.sql",
"chars": 54,
"preview": "set global max_binlog_cache_size = 1073741824; -- 1GB\n"
},
{
"path": "localtests/copy-retries-exhausted/before.sql",
"chars": 41,
"preview": "set global max_binlog_cache_size = 1024;\n"
},
{
"path": "localtests/copy-retries-exhausted/create.sql",
"chars": 291,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n name mediumtext not null,\n prim"
},
{
"path": "localtests/copy-retries-exhausted/expect_failure",
"chars": 88,
"preview": "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage\n"
},
{
"path": "localtests/copy-retries-exhausted/extra_args",
"chars": 78,
"preview": "--alter \"modify column name mediumtext\" --default-retries=1 --chunk-size=1000\n"
},
{
"path": "localtests/datetime/create.sql",
"chars": 1380,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n dt0 datetime d"
},
{
"path": "localtests/datetime-1970/create.sql",
"chars": 770,
"preview": "set session time_zone='+00:00';\n\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n "
},
{
"path": "localtests/datetime-1970/extra_args",
"chars": 37,
"preview": "--alter='add column name varchar(1)'\n"
},
{
"path": "localtests/datetime-1970/ghost_columns",
"chars": 38,
"preview": "id, create_time, update_time, counter\n"
},
{
"path": "localtests/datetime-1970/orig_columns",
"chars": 38,
"preview": "id, create_time, update_time, counter\n"
},
{
"path": "localtests/datetime-1970/sql_mode",
"chars": 0,
"preview": ""
},
{
"path": "localtests/datetime-submillis/create.sql",
"chars": 848,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n dt0 datetime(6"
},
{
"path": "localtests/datetime-submillis-zeroleading/create.sql",
"chars": 836,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n dt0 datetime(6"
},
{
"path": "localtests/datetime-to-timestamp/create.sql",
"chars": 1020,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n i int not null,\n ts0 t"
},
{
"path": "localtests/datetime-to-timestamp/extra_args",
"chars": 43,
"preview": "--alter=\"change column t t timestamp null\"\n"
},
{
"path": "localtests/datetime-to-timestamp-pk-fail/create.sql",
"chars": 1044,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n i int not null,\n ts0 t"
},
{
"path": "localtests/datetime-to-timestamp-pk-fail/expect_failure",
"chars": 118,
"preview": "No support at this time for converting a column from DATETIME to TIMESTAMP that is also part of the chosen unique key\n"
},
{
"path": "localtests/datetime-to-timestamp-pk-fail/extra_args",
"chars": 64,
"preview": "--alter=\"change column t t timestamp default current_timestamp\"\n"
},
{
"path": "localtests/datetime-with-zero/create.sql",
"chars": 464,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n i int not null,\n dt da"
},
{
"path": "localtests/datetime-with-zero/extra_args",
"chars": 99,
"preview": "--allow-zero-in-date --alter=\"change column dt dt datetime not null default '1970-00-00 00:00:00'\"\n"
},
{
"path": "localtests/decimal/create.sql",
"chars": 787,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n dec0 decimal(65,30) unsigned NOT"
},
{
"path": "localtests/discard-fk/create.sql",
"chars": 890,
"preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ndrop table if exists gh_ost_test_fk_parent;\ncr"
},
{
"path": "localtests/discard-fk/extra_args",
"chars": 23,
"preview": "--discard-foreign-keys\n"
},
{
"path": "localtests/discard-fk/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/docker-compose.yml",
"chars": 1009,
"preview": "services:\n mysql-primary:\n image: $TEST_MYSQL_IMAGE\n container_name: mysql-primary\n command: --server-id=1 --l"
},
{
"path": "localtests/drop-null-add-not-null/create.sql",
"chars": 928,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n c1 int null,\n c2 int not null,\n"
},
{
"path": "localtests/drop-null-add-not-null/extra_args",
"chars": 64,
"preview": "--alter=\"drop column c1, add column c1 int not null default 47\"\n"
},
{
"path": "localtests/drop-null-add-not-null/ghost_columns",
"chars": 3,
"preview": "c2\n"
},
{
"path": "localtests/drop-null-add-not-null/orig_columns",
"chars": 3,
"preview": "c2\n"
},
{
"path": "localtests/enum/create.sql",
"chars": 881,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n e enum('red', "
},
{
"path": "localtests/enum/extra_args",
"chars": 108,
"preview": "--alter=\"change e e enum('red', 'green', 'blue', 'orange', 'yellow') null default null collate 'utf8_bin'\" \n"
},
{
"path": "localtests/enum-pk/create.sql",
"chars": 997,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n e enum('red', "
},
{
"path": "localtests/enum-to-varchar/create.sql",
"chars": 770,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n e enum('red', "
},
{
"path": "localtests/enum-to-varchar/extra_args",
"chars": 54,
"preview": "--alter=\"change e e varchar(32) not null default ''\" \n"
},
{
"path": "localtests/existing-datetime-with-zero/create.sql",
"chars": 528,
"preview": "set session sql_mode='';\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n"
},
{
"path": "localtests/existing-datetime-with-zero/extra_args",
"chars": 45,
"preview": "--allow-zero-in-date --alter=\"engine=innodb\"\n"
},
{
"path": "localtests/fail-datetime-with-zero/create.sql",
"chars": 464,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n i int not null,\n dt da"
},
{
"path": "localtests/fail-datetime-with-zero/expect_failure",
"chars": 31,
"preview": "Invalid default value for 'dt'\n"
},
{
"path": "localtests/fail-datetime-with-zero/extra_args",
"chars": 78,
"preview": "--alter=\"change column dt dt datetime not null default '1970-00-00 00:00:00'\"\n"
},
{
"path": "localtests/fail-drop-pk/create.sql",
"chars": 545,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n ts timestamp,\n"
},
{
"path": "localtests/fail-drop-pk/expect_failure",
"chars": 41,
"preview": "No PRIMARY nor UNIQUE key found in table\n"
},
{
"path": "localtests/fail-drop-pk/extra_args",
"chars": 46,
"preview": "--alter=\"change id id int, drop primary key\" \n"
},
{
"path": "localtests/fail-existing-datetime-with-zero/create.sql",
"chars": 528,
"preview": "set session sql_mode='';\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int unsigned auto_increment,\n"
},
{
"path": "localtests/fail-existing-datetime-with-zero/expect_failure",
"chars": 31,
"preview": "Invalid default value for 'dt'\n"
},
{
"path": "localtests/fail-existing-datetime-with-zero/extra_args",
"chars": 24,
"preview": "--alter=\"engine=innodb\"\n"
},
{
"path": "localtests/fail-fk/create.sql",
"chars": 890,
"preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ndrop table if exists gh_ost_test_fk_parent;\ncr"
},
{
"path": "localtests/fail-fk/expect_failure",
"chars": 55,
"preview": "Child-side foreign keys are not supported. Bailing out\n"
},
{
"path": "localtests/fail-fk/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/fail-fk-parent/create.sql",
"chars": 1083,
"preview": "drop table if exists gh_ost_test_child;\ndrop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_incre"
},
{
"path": "localtests/fail-fk-parent/destroy.sql",
"chars": 40,
"preview": "drop table if exists gh_ost_test_child;\n"
},
{
"path": "localtests/fail-fk-parent/expect_failure",
"chars": 43,
"preview": "Parent-side foreign keys are not supported\n"
},
{
"path": "localtests/fail-fk-parent/extra_args",
"chars": 23,
"preview": "--discard-foreign-keys\n"
},
{
"path": "localtests/fail-fk-parent/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/fail-float-unique-key/create.sql",
"chars": 241,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n f float,\n i int not null,\n ts timestamp default current"
},
{
"path": "localtests/fail-float-unique-key/expect_failure",
"chars": 34,
"preview": "No shared unique key can be found\n"
},
{
"path": "localtests/fail-float-unique-key/extra_args",
"chars": 35,
"preview": "--alter=\"add column v varchar(32)\"\n"
},
{
"path": "localtests/fail-no-shared-uk/create.sql",
"chars": 522,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int not null,\n i int not null,\n ts timestamp,\n prim"
},
{
"path": "localtests/fail-no-shared-uk/expect_failure",
"chars": 46,
"preview": "No shared unique key can be found after ALTER\n"
},
{
"path": "localtests/fail-no-shared-uk/extra_args",
"chars": 49,
"preview": "--alter=\"drop primary key, add primary key (i)\" \n"
},
{
"path": "localtests/fail-no-unique-key/create.sql",
"chars": 206,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n i int not null,\n ts timestamp default current_timestamp,"
},
{
"path": "localtests/fail-no-unique-key/expect_failure",
"chars": 41,
"preview": "No PRIMARY nor UNIQUE key found in table\n"
},
{
"path": "localtests/fail-no-unique-key/extra_args",
"chars": 35,
"preview": "--alter=\"add column v varchar(32)\"\n"
},
{
"path": "localtests/fail-rename-table/create.sql",
"chars": 545,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n ts timestamp,\n"
},
{
"path": "localtests/fail-rename-table/expect_failure",
"chars": 42,
"preview": "ALTER statement seems to RENAME the table\n"
},
{
"path": "localtests/fail-rename-table/extra_args",
"chars": 36,
"preview": "--alter=\"rename as something_else\" \n"
},
{
"path": "localtests/fail-update-pk-column/create.sql",
"chars": 1847,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n i int not null,\n primary key(id"
},
{
"path": "localtests/gbk-charset/create.sql",
"chars": 866,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int(11) NOT NULL AUTO_INCREMENT,\n name varchar(512) D"
},
{
"path": "localtests/gbk-charset/extra_args",
"chars": 0,
"preview": ""
},
{
"path": "localtests/generated-columns/create.sql",
"chars": 1094,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n a int not null,\n b int not null"
},
{
"path": "localtests/generated-columns/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/generated-columns-add/create.sql",
"chars": 961,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n a int not null,\n b int not null"
},
{
"path": "localtests/generated-columns-add/extra_args",
"chars": 60,
"preview": "--alter=\"add column sum_ab int as (a + b) virtual not null\"\n"
},
{
"path": "localtests/generated-columns-add/ghost_columns",
"chars": 9,
"preview": "id, a, b\n"
},
{
"path": "localtests/generated-columns-add/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/generated-columns-add/order_by",
"chars": 3,
"preview": "id\n"
},
{
"path": "localtests/generated-columns-add/orig_columns",
"chars": 9,
"preview": "id, a, b\n"
},
{
"path": "localtests/generated-columns-rename/create.sql",
"chars": 1003,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n a int not null,\n b int not null"
},
{
"path": "localtests/generated-columns-rename/extra_args",
"chars": 91,
"preview": "--alter=\"change sum_ab total_ab int as (a + b) virtual not null\" --approve-renamed-columns\n"
},
{
"path": "localtests/generated-columns-rename/ignore_versions",
"chars": 7,
"preview": "Percona"
},
{
"path": "localtests/generated-columns-unique/create.sql",
"chars": 1421,
"preview": "drop table if exists gh_ost_test;\ncreate table gh_ost_test (\n id int auto_increment,\n `idb` varchar(36) CHARACTER SET "
}
]
// ... and 2099 more files (download for full content)
About this extraction
This page contains the full source code of the github/gh-ost GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2299 files (21.9 MB), approximately 4.1M tokens, and a symbol index with 83352 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.