rubydb 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
- data/.github/workflows/benchmark.yml +26 -26
- data/.github/workflows/compatibility.yml +63 -63
- data/.github/workflows/fuzz.yml +33 -33
- data/.github/workflows/lint.yml +21 -21
- data/.github/workflows/operations.yml +24 -24
- data/.github/workflows/production-validation.yml +111 -111
- data/.github/workflows/release.yml +77 -77
- data/.github/workflows/security.yml +39 -37
- data/.github/workflows/test.yml +26 -26
- data/.github/workflows/workload.yml +58 -58
- data/.gitignore +12 -5
- data/.rubocop.yml +50 -44
- data/.standard.yml +9 -14
- data/ARCHITECTURE.md +21 -21
- data/CHANGELOG.md +43 -27
- data/CODE_OF_CONDUCT.md +13 -13
- data/CONTRIBUTING.md +29 -29
- data/GOVERNANCE.md +16 -16
- data/Gemfile +18 -17
- data/Gemfile.lock +125 -71
- data/README.md +249 -162
- data/ROADMAP.md +27 -27
- data/Rakefile +71 -71
- data/SECURITY.md +54 -54
- data/SUPPORT.md +14 -14
- data/adapters/activerecord/Gemfile +11 -11
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +873 -879
- data/adapters/activerecord/rubydb-activerecord.gemspec +20 -20
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +143 -143
- data/adapters/ruby/README.md +18 -18
- data/adapters/sequel/README.md +11 -11
- data/config/monitoring/prometheus-alerts.yml +39 -39
- data/config/production.yml +36 -36
- data/docs/README.md +75 -71
- data/docs/architecture/concurrency.md +14 -14
- data/docs/architecture/current-state.md +125 -125
- data/docs/architecture/execution-engine.md +25 -25
- data/docs/architecture/indexes.md +19 -19
- data/docs/architecture/mvcc.md +19 -19
- data/docs/architecture/overview.md +13 -13
- data/docs/architecture/pages.md +11 -11
- data/docs/architecture/production-roadmap.md +82 -82
- data/docs/architecture/query-planner.md +20 -20
- data/docs/architecture/recovery.md +18 -18
- data/docs/architecture/sql-engine.md +12 -12
- data/docs/architecture/storage-engine.md +14 -14
- data/docs/architecture/transactions.md +10 -10
- data/docs/architecture/wal.md +28 -28
- data/docs/cli-cheatsheet.md +98 -98
- data/docs/cli.md +275 -275
- data/docs/contributing/architecture.md +9 -9
- data/docs/contributing/benchmarking.md +14 -14
- data/docs/contributing/development.md +16 -16
- data/docs/contributing/release-process.md +49 -49
- data/docs/contributing/testing.md +16 -16
- data/docs/debugging.md +229 -229
- data/docs/developer/branching.md +10 -10
- data/docs/developer/database-diff.md +10 -10
- data/docs/developer/local-development.md +17 -17
- data/docs/developer/snapshots.md +9 -9
- data/docs/developer/temporal-data.md +10 -10
- data/docs/developer-guide.md +297 -297
- data/docs/getting-started/first-database.md +16 -16
- data/docs/getting-started/first-query.md +13 -13
- data/docs/getting-started/installation.md +19 -19
- data/docs/getting-started/local-to-production.md +300 -300
- data/docs/getting-started/quickstart.md +17 -17
- data/docs/getting-started/rails.md +16 -16
- data/docs/hardening_backlog.md +93 -93
- data/docs/lessons-learned.md +112 -112
- data/docs/operations/backups.md +33 -33
- data/docs/operations/disaster-recovery.md +31 -31
- data/docs/operations/failover.md +30 -30
- data/docs/operations/monitoring.md +25 -25
- data/docs/operations/production-guide.md +295 -295
- data/docs/operations/production-runbook.md +45 -45
- data/docs/operations/replication.md +33 -33
- data/docs/operations/restore.md +6 -6
- data/docs/operations/runbook.md +34 -34
- data/docs/operations/upgrades.md +14 -14
- data/docs/operations/workload-testing.md +17 -17
- data/docs/production-readiness.md +118 -118
- data/docs/production_validation.md +150 -150
- data/docs/rails/active-record.md +11 -11
- data/docs/rails/compatibility-guide.md +90 -90
- data/docs/rails/database-yml.md +92 -92
- data/docs/rails/installation.md +17 -17
- data/docs/rails/migrations.md +17 -17
- data/docs/rails/production.md +82 -82
- data/docs/rails/troubleshooting.md +18 -18
- data/docs/release.md +25 -25
- data/docs/server/architecture.md +10 -10
- data/docs/server/authentication.md +10 -10
- data/docs/server/configuration.md +16 -16
- data/docs/server/connection-pooling.md +10 -10
- data/docs/server/deployment.md +10 -10
- data/docs/server/protocol.md +12 -12
- data/docs/sql/compatibility-guide.md +82 -82
- data/docs/sql/compatibility.md +39 -39
- data/docs/sql/data-types.md +10 -10
- data/docs/sql/functions.md +9 -9
- data/docs/sql/joins.md +9 -9
- data/docs/sql/operators.md +9 -9
- data/docs/sql/sqlite-compatibility.md +21 -21
- data/docs/sql/syntax.md +10 -10
- data/docs/sql/transactions.md +10 -10
- data/docs/troubleshooting.md +244 -244
- data/lessons/01-foundations.md +73 -0
- data/lessons/02-local-development.md +121 -0
- data/lessons/03-embedded-rubydb.md +99 -0
- data/lessons/04-rails-complex-apps.md +138 -0
- data/lessons/05-rubydb-production-server.md +237 -0
- data/lessons/06-postgresql-massive-apps.md +96 -0
- data/lessons/07-hybrid-microservices.md +94 -0
- data/lessons/08-migrations-backups-recovery.md +86 -0
- data/lessons/09-observability-security-scale.md +87 -0
- data/lessons/10-release-readiness.md +125 -0
- data/lib/rubydb/backup/archive.rb +332 -334
- data/lib/rubydb/backup/backup.rb +400 -401
- data/lib/rubydb/backup/incremental.rb +349 -353
- data/lib/rubydb/backup/restore.rb +289 -290
- data/lib/rubydb/backup/snapshot.rb +265 -267
- data/lib/rubydb/backup/verification.rb +276 -279
- data/lib/rubydb/branching/branch.rb +181 -181
- data/lib/rubydb/branching/branch_manager.rb +307 -311
- data/lib/rubydb/branching/branch_metadata.rb +140 -140
- data/lib/rubydb/branching/checkout.rb +165 -166
- data/lib/rubydb/branching/copy_on_write.rb +272 -272
- data/lib/rubydb/branching/diff.rb +137 -138
- data/lib/rubydb/branching/merge.rb +282 -285
- data/lib/rubydb/build_info.rb +15 -15
- data/lib/rubydb/catalog/catalog.rb +391 -391
- data/lib/rubydb/catalog/column.rb +112 -112
- data/lib/rubydb/catalog/constraint.rb +180 -180
- data/lib/rubydb/catalog/database.rb +184 -184
- data/lib/rubydb/catalog/index.rb +97 -97
- data/lib/rubydb/catalog/schema.rb +103 -103
- data/lib/rubydb/catalog/sequence.rb +90 -90
- data/lib/rubydb/catalog/system_catalog.rb +698 -698
- data/lib/rubydb/catalog/table.rb +178 -178
- data/lib/rubydb/catalog/trigger.rb +102 -102
- data/lib/rubydb/catalog/view.rb +66 -66
- data/lib/rubydb/cli/application.rb +163 -163
- data/lib/rubydb/cli/commands/backup.rb +80 -81
- data/lib/rubydb/cli/commands/branch.rb +72 -72
- data/lib/rubydb/cli/commands/checkout.rb +54 -54
- data/lib/rubydb/cli/commands/create.rb +58 -58
- data/lib/rubydb/cli/commands/diff.rb +76 -77
- data/lib/rubydb/cli/commands/doctor.rb +74 -74
- data/lib/rubydb/cli/commands/drop.rb +57 -57
- data/lib/rubydb/cli/commands/init.rb +101 -102
- data/lib/rubydb/cli/commands/inspect.rb +95 -95
- data/lib/rubydb/cli/commands/merge.rb +63 -63
- data/lib/rubydb/cli/commands/migrate.rb +62 -62
- data/lib/rubydb/cli/commands/restart.rb +42 -39
- data/lib/rubydb/cli/commands/restore.rb +121 -121
- data/lib/rubydb/cli/commands/shell.rb +365 -365
- data/lib/rubydb/cli/commands/snapshot.rb +79 -79
- data/lib/rubydb/cli/commands/start.rb +88 -82
- data/lib/rubydb/cli/commands/status.rb +96 -92
- data/lib/rubydb/cli/commands/stop.rb +47 -47
- data/lib/rubydb/cli/commands/vacuum.rb +58 -58
- data/lib/rubydb/cli/formatter.rb +221 -221
- data/lib/rubydb/cli/output.rb +168 -168
- data/lib/rubydb/client/client.rb +302 -304
- data/lib/rubydb/client/connection.rb +414 -415
- data/lib/rubydb/client/connection_pool.rb +168 -168
- data/lib/rubydb/client/connection_url.rb +96 -96
- data/lib/rubydb/client/prepared_statement.rb +60 -60
- data/lib/rubydb/client/result.rb +123 -123
- data/lib/rubydb/client/statement.rb +52 -52
- data/lib/rubydb/client/transaction.rb +130 -130
- data/lib/rubydb/concurrency/concurrency.rb +19 -19
- data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
- data/lib/rubydb/concurrency/latch.rb +101 -101
- data/lib/rubydb/concurrency/lock_graph.rb +163 -165
- data/lib/rubydb/concurrency/mutex.rb +181 -183
- data/lib/rubydb/concurrency/rw_lock.rb +180 -180
- data/lib/rubydb/concurrency/scheduler.rb +248 -250
- data/lib/rubydb/concurrency/worker_pool.rb +145 -143
- data/lib/rubydb/configuration/config.rb +170 -170
- data/lib/rubydb/configuration/defaults.rb +179 -179
- data/lib/rubydb/configuration/environment.rb +152 -152
- data/lib/rubydb/configuration/parser.rb +185 -185
- data/lib/rubydb/configuration/validation.rb +221 -221
- data/lib/rubydb/constants.rb +74 -74
- data/lib/rubydb/constraints/check.rb +181 -181
- data/lib/rubydb/constraints/constraint.rb +101 -101
- data/lib/rubydb/constraints/foreign_key.rb +130 -130
- data/lib/rubydb/constraints/not_null.rb +64 -64
- data/lib/rubydb/constraints/primary_key.rb +99 -99
- data/lib/rubydb/constraints/unique.rb +106 -108
- data/lib/rubydb/constraints/validator.rb +349 -350
- data/lib/rubydb/errors/authentication_error.rb +10 -10
- data/lib/rubydb/errors/authorization_error.rb +23 -23
- data/lib/rubydb/errors/client_error.rb +10 -10
- data/lib/rubydb/errors/configuration_error.rb +10 -10
- data/lib/rubydb/errors/connection_error.rb +10 -10
- data/lib/rubydb/errors/constraint_error.rb +23 -23
- data/lib/rubydb/errors/corruption_error.rb +10 -10
- data/lib/rubydb/errors/database_error.rb +10 -10
- data/lib/rubydb/errors/error.rb +20 -20
- data/lib/rubydb/errors/execution_error.rb +10 -10
- data/lib/rubydb/errors/parser_error.rb +10 -10
- data/lib/rubydb/errors/recovery_error.rb +10 -10
- data/lib/rubydb/errors/replication_error.rb +10 -10
- data/lib/rubydb/errors/server_error.rb +6 -6
- data/lib/rubydb/errors/storage_error.rb +10 -10
- data/lib/rubydb/errors/transaction_error.rb +10 -10
- data/lib/rubydb/execution/aggregate_executor.rb +134 -138
- data/lib/rubydb/execution/delete_executor.rb +110 -112
- data/lib/rubydb/execution/distinct_executor.rb +131 -135
- data/lib/rubydb/execution/executor.rb +1182 -1188
- data/lib/rubydb/execution/expression.rb +191 -193
- data/lib/rubydb/execution/index_scan.rb +142 -142
- data/lib/rubydb/execution/insert_executor.rb +215 -217
- data/lib/rubydb/execution/join_executor.rb +243 -249
- data/lib/rubydb/execution/limit_executor.rb +83 -85
- data/lib/rubydb/execution/optimizer.rb +227 -215
- data/lib/rubydb/execution/plan.rb +355 -353
- data/lib/rubydb/execution/planner.rb +542 -536
- data/lib/rubydb/execution/predicate.rb +235 -235
- data/lib/rubydb/execution/scan.rb +49 -49
- data/lib/rubydb/execution/sequential_scan.rb +63 -63
- data/lib/rubydb/execution/sort_executor.rb +180 -185
- data/lib/rubydb/execution/update_executor.rb +160 -162
- data/lib/rubydb/functions/aggregate.rb +70 -70
- data/lib/rubydb/functions/date_functions.rb +274 -278
- data/lib/rubydb/functions/function.rb +85 -85
- data/lib/rubydb/functions/json_functions.rb +231 -215
- data/lib/rubydb/functions/numeric_functions.rb +346 -346
- data/lib/rubydb/functions/scalar.rb +52 -52
- data/lib/rubydb/functions/string_functions.rb +383 -383
- data/lib/rubydb/functions/system_functions.rb +258 -246
- data/lib/rubydb/history/as_of.rb +238 -238
- data/lib/rubydb/history/change.rb +105 -105
- data/lib/rubydb/history/history.rb +131 -131
- data/lib/rubydb/history/history_manager.rb +228 -229
- data/lib/rubydb/history/temporal_query.rb +202 -202
- data/lib/rubydb/history/timeline.rb +144 -144
- data/lib/rubydb/indexes/btree.rb +186 -186
- data/lib/rubydb/indexes/btree_cursor.rb +258 -258
- data/lib/rubydb/indexes/btree_node.rb +384 -385
- data/lib/rubydb/indexes/hash_index.rb +150 -150
- data/lib/rubydb/indexes/index.rb +71 -71
- data/lib/rubydb/indexes/index_manager.rb +408 -406
- data/lib/rubydb/indexes/index_scan.rb +466 -470
- data/lib/rubydb/migrations/migration.rb +253 -254
- data/lib/rubydb/migrations/migration_lock.rb +146 -146
- data/lib/rubydb/migrations/migration_manager.rb +187 -176
- data/lib/rubydb/migrations/migration_version.rb +71 -71
- data/lib/rubydb/migrations/schema_diff.rb +211 -211
- data/lib/rubydb/migrations/schema_version.rb +64 -64
- data/lib/rubydb/monitoring/events.rb +155 -160
- data/lib/rubydb/monitoring/health.rb +216 -222
- data/lib/rubydb/monitoring/logger.rb +188 -193
- data/lib/rubydb/monitoring/metrics.rb +363 -359
- data/lib/rubydb/monitoring/performance.rb +176 -176
- data/lib/rubydb/monitoring/statistics.rb +168 -170
- data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
- data/lib/rubydb/mvcc/mvcc.rb +16 -16
- data/lib/rubydb/mvcc/snapshot.rb +146 -147
- data/lib/rubydb/mvcc/vacuum.rb +180 -180
- data/lib/rubydb/mvcc/version.rb +106 -106
- data/lib/rubydb/mvcc/version_store.rb +396 -398
- data/lib/rubydb/mvcc/visibility.rb +107 -109
- data/lib/rubydb/protocol/capabilities.rb +125 -125
- data/lib/rubydb/protocol/decoder.rb +142 -145
- data/lib/rubydb/protocol/encoder.rb +131 -136
- data/lib/rubydb/protocol/handshake.rb +306 -305
- data/lib/rubydb/protocol/message.rb +121 -121
- data/lib/rubydb/protocol/parameter_binder.rb +101 -0
- data/lib/rubydb/protocol/protocol.rb +276 -277
- data/lib/rubydb/protocol/version.rb +54 -54
- data/lib/rubydb/rails/adapter.rb +245 -239
- data/lib/rubydb/rails/connection.rb +312 -314
- data/lib/rubydb/rails/database_statements.rb +122 -122
- data/lib/rubydb/rails/migration.rb +131 -131
- data/lib/rubydb/rails/quoting.rb +109 -109
- data/lib/rubydb/rails/result.rb +117 -117
- data/lib/rubydb/rails/schema_statements.rb +339 -339
- data/lib/rubydb/rails/transaction.rb +105 -105
- data/lib/rubydb/rails/type.rb +126 -126
- data/lib/rubydb/recovery/checkpoint.rb +261 -257
- data/lib/rubydb/recovery/consistency.rb +457 -467
- data/lib/rubydb/recovery/corruption_detector.rb +5 -5
- data/lib/rubydb/recovery/crash_recovery.rb +381 -387
- data/lib/rubydb/recovery/recovery_manager.rb +204 -206
- data/lib/rubydb/recovery/redo.rb +235 -237
- data/lib/rubydb/recovery/undo.rb +204 -206
- data/lib/rubydb/replication/failover.rb +5 -5
- data/lib/rubydb/replication/fencing.rb +63 -63
- data/lib/rubydb/replication/primary.rb +461 -450
- data/lib/rubydb/replication/replica.rb +382 -384
- data/lib/rubydb/replication/replication_log.rb +194 -200
- data/lib/rubydb/replication/replication_manager.rb +307 -308
- data/lib/rubydb/replication/replication_slot.rb +293 -295
- data/lib/rubydb/replication/replication_stream.rb +198 -201
- data/lib/rubydb/rubydb.rb +564 -560
- data/lib/rubydb/security/access_control.rb +252 -254
- data/lib/rubydb/security/audit_log.rb +209 -213
- data/lib/rubydb/security/authentication.rb +302 -302
- data/lib/rubydb/security/authorization.rb +282 -282
- data/lib/rubydb/security/credentials.rb +192 -196
- data/lib/rubydb/security/password.rb +205 -215
- data/lib/rubydb/security/permissions.rb +74 -74
- data/lib/rubydb/security/role.rb +99 -101
- data/lib/rubydb/security/user.rb +86 -86
- data/lib/rubydb/server/connection.rb +383 -366
- data/lib/rubydb/server/connection_pool.rb +193 -193
- data/lib/rubydb/server/lifecycle.rb +227 -228
- data/lib/rubydb/server/listener.rb +139 -136
- data/lib/rubydb/server/request_handler.rb +277 -276
- data/lib/rubydb/server/server.rb +363 -364
- data/lib/rubydb/server/session.rb +371 -369
- data/lib/rubydb/server/worker.rb +206 -210
- data/lib/rubydb/server/worker_pool.rb +168 -168
- data/lib/rubydb/sql/ast/alter_table.rb +169 -169
- data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
- data/lib/rubydb/sql/ast/commit.rb +37 -37
- data/lib/rubydb/sql/ast/constraint.rb +92 -83
- data/lib/rubydb/sql/ast/create_database.rb +41 -41
- data/lib/rubydb/sql/ast/create_index.rb +61 -61
- data/lib/rubydb/sql/ast/create_schema.rb +52 -52
- data/lib/rubydb/sql/ast/create_table.rb +187 -187
- data/lib/rubydb/sql/ast/delete.rb +54 -54
- data/lib/rubydb/sql/ast/drop_database.rb +41 -41
- data/lib/rubydb/sql/ast/drop_index.rb +41 -41
- data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
- data/lib/rubydb/sql/ast/drop_table.rb +49 -49
- data/lib/rubydb/sql/ast/explain.rb +64 -64
- data/lib/rubydb/sql/ast/expression.rb +617 -604
- data/lib/rubydb/sql/ast/insert.rb +66 -66
- data/lib/rubydb/sql/ast/node.rb +42 -42
- data/lib/rubydb/sql/ast/rollback.rb +63 -63
- data/lib/rubydb/sql/ast/savepoint.rb +59 -59
- data/lib/rubydb/sql/ast/select.rb +88 -88
- data/lib/rubydb/sql/ast/set_operation.rb +22 -20
- data/lib/rubydb/sql/ast/trigger.rb +35 -29
- data/lib/rubydb/sql/ast/update.rb +88 -88
- data/lib/rubydb/sql/ast/vacuum.rb +19 -19
- data/lib/rubydb/sql/ast/view.rb +38 -32
- data/lib/rubydb/sql/ast/with.rb +32 -32
- data/lib/rubydb/sql/grammar.rb +86 -86
- data/lib/rubydb/sql/keywords.rb +156 -156
- data/lib/rubydb/sql/lexer.rb +209 -214
- data/lib/rubydb/sql/operators.rb +100 -100
- data/lib/rubydb/sql/parser.rb +1167 -1170
- data/lib/rubydb/sql/planner/analyzer.rb +283 -302
- data/lib/rubydb/sql/planner/binder.rb +537 -550
- data/lib/rubydb/sql/planner/type_checker.rb +427 -431
- data/lib/rubydb/sql/token.rb +210 -210
- data/lib/rubydb/storage/buffer_frame.rb +44 -44
- data/lib/rubydb/storage/buffer_pool.rb +155 -155
- data/lib/rubydb/storage/database_lock.rb +74 -74
- data/lib/rubydb/storage/deserializer.rb +332 -342
- data/lib/rubydb/storage/engine.rb +2347 -2330
- data/lib/rubydb/storage/file_manager.rb +191 -187
- data/lib/rubydb/storage/free_space_map.rb +79 -81
- data/lib/rubydb/storage/page.rb +92 -94
- data/lib/rubydb/storage/page_allocator.rb +852 -855
- data/lib/rubydb/storage/page_header.rb +63 -67
- data/lib/rubydb/storage/page_manager.rb +127 -131
- data/lib/rubydb/storage/record.rb +58 -58
- data/lib/rubydb/storage/row.rb +78 -78
- data/lib/rubydb/storage/serializer.rb +51 -51
- data/lib/rubydb/storage/storage_layout.rb +151 -151
- data/lib/rubydb/storage/storage_manager.rb +114 -114
- data/lib/rubydb/storage/tuple.rb +458 -461
- data/lib/rubydb/storage/visibility_map.rb +964 -973
- data/lib/rubydb/transactions/commit_manager.rb +219 -220
- data/lib/rubydb/transactions/isolation.rb +98 -98
- data/lib/rubydb/transactions/lock.rb +76 -76
- data/lib/rubydb/transactions/lock_manager.rb +359 -362
- data/lib/rubydb/transactions/savepoint.rb +142 -143
- data/lib/rubydb/transactions/transaction.rb +214 -215
- data/lib/rubydb/transactions/transaction_id.rb +84 -84
- data/lib/rubydb/transactions/transaction_log.rb +256 -257
- data/lib/rubydb/transactions/transaction_manager.rb +434 -435
- data/lib/rubydb/types/bigint.rb +36 -36
- data/lib/rubydb/types/blob.rb +37 -37
- data/lib/rubydb/types/boolean.rb +34 -34
- data/lib/rubydb/types/date.rb +39 -39
- data/lib/rubydb/types/decimal.rb +48 -48
- data/lib/rubydb/types/float.rb +34 -34
- data/lib/rubydb/types/integer.rb +36 -36
- data/lib/rubydb/types/json.rb +41 -41
- data/lib/rubydb/types/null.rb +34 -34
- data/lib/rubydb/types/smallint.rb +36 -36
- data/lib/rubydb/types/text.rb +37 -37
- data/lib/rubydb/types/time.rb +46 -46
- data/lib/rubydb/types/timestamp.rb +39 -39
- data/lib/rubydb/types/type.rb +119 -119
- data/lib/rubydb/types/uuid.rb +47 -47
- data/lib/rubydb/types/varchar.rb +37 -37
- data/lib/rubydb/version.rb +32 -32
- data/lib/rubydb/wal/archive.rb +190 -193
- data/lib/rubydb/wal/checkpoint.rb +181 -183
- data/lib/rubydb/wal/lsn.rb +94 -94
- data/lib/rubydb/wal/reader.rb +259 -260
- data/lib/rubydb/wal/record.rb +105 -105
- data/lib/rubydb/wal/segment.rb +193 -193
- data/lib/rubydb/wal/wal.rb +480 -452
- data/lib/rubydb/wal/writer.rb +236 -236
- data/lib/rubydb.rb +7 -7
- data/packaging/docker/docker-compose.failover.yml +43 -43
- data/packaging/homebrew/rubydb.rb +19 -19
- data/rubydb.gemspec +60 -57
- data/scripts/benchmark +7 -7
- data/scripts/durability_drill +37 -37
- data/scripts/fuzz +63 -63
- data/scripts/release +45 -40
- data/scripts/release_check +43 -43
- data/scripts/replication_failover_drill +268 -250
- data/scripts/replication_network_failover_drill +287 -255
- data/scripts/restore_drill +45 -45
- data/scripts/security +45 -0
- metadata +54 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1c9eda84a67f7461880366d67d049e384b92d16735bfa453c8ab580ed4394c86
|
|
4
|
+
data.tar.gz: 577ab7b7758ebfbf4fa6ccbdd3fc6bc6ca022ab47253acc025fd55cdfe6935da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 301264ede8f046b3d5cb2c8c3fa90d220ae184dc4a72bca0962144876702d3b2a11ab570afd8acd786893cde098df8241fd7b95bfc6f1f5d2958dee4b7c4ae5a
|
|
7
|
+
data.tar.gz: 8ec1f26484273234980dd643b040a14d500f9551a1a873f3d293d3dc089b743b3e449f134c77083ad534045cd38ebcd7f98eb0f7770b6cc38283d4b87b69bdf1
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
## Summary
|
|
2
|
-
|
|
3
|
-
Describe the change and the user or operator problem it solves.
|
|
4
|
-
|
|
5
|
-
## Validation
|
|
6
|
-
|
|
7
|
-
- [ ] Tests added or updated for changed behavior
|
|
8
|
-
- [ ] `bundle exec rspec` passes, or failures are explained
|
|
9
|
-
- [ ] Documentation and compatibility claims are updated
|
|
10
|
-
- [ ] Production, security, migration, and rollback impact reviewed
|
|
11
|
-
|
|
12
|
-
## Operational impact
|
|
13
|
-
|
|
14
|
-
Describe storage-format, WAL, migration, configuration, protocol, replication,
|
|
15
|
-
security, and upgrade implications. Include rollback and observability notes.
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
Describe the change and the user or operator problem it solves.
|
|
4
|
+
|
|
5
|
+
## Validation
|
|
6
|
+
|
|
7
|
+
- [ ] Tests added or updated for changed behavior
|
|
8
|
+
- [ ] `bundle exec rspec` passes, or failures are explained
|
|
9
|
+
- [ ] Documentation and compatibility claims are updated
|
|
10
|
+
- [ ] Production, security, migration, and rollback impact reviewed
|
|
11
|
+
|
|
12
|
+
## Operational impact
|
|
13
|
+
|
|
14
|
+
Describe storage-format, WAL, migration, configuration, protocol, replication,
|
|
15
|
+
security, and upgrade implications. Include rollback and observability notes.
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
name: Workload smoke benchmark
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [main]
|
|
6
|
-
push:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: read
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
workload:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
- uses: ruby/setup-ruby@v1
|
|
18
|
-
with:
|
|
19
|
-
ruby-version: "3.3"
|
|
20
|
-
bundler-cache: true
|
|
21
|
-
- name: Deterministic storage workload
|
|
22
|
-
run: RUBYDB_BENCHMARK_ITERATIONS=100 bundle exec ruby -Ilib benchmarks/basic_workload.rb
|
|
23
|
-
- name: Concurrent durability workload
|
|
24
|
-
run: RUBYDB_WORKLOAD_THREADS=4 RUBYDB_WORKLOAD_OPERATIONS=100 bundle exec ruby -Ilib benchmarks/concurrent_workload.rb
|
|
25
|
-
- name: Server protocol durability workload
|
|
26
|
-
run: RUBYDB_SERVER_WORKLOAD_CLIENTS=2 RUBYDB_SERVER_WORKLOAD_OPERATIONS=25 bundle exec ruby -Ilib benchmarks/server_workload.rb
|
|
1
|
+
name: Workload smoke benchmark
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
workload:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: "3.3"
|
|
20
|
+
bundler-cache: true
|
|
21
|
+
- name: Deterministic storage workload
|
|
22
|
+
run: RUBYDB_BENCHMARK_ITERATIONS=100 bundle exec ruby -Ilib benchmarks/basic_workload.rb
|
|
23
|
+
- name: Concurrent durability workload
|
|
24
|
+
run: RUBYDB_WORKLOAD_THREADS=4 RUBYDB_WORKLOAD_OPERATIONS=100 bundle exec ruby -Ilib benchmarks/concurrent_workload.rb
|
|
25
|
+
- name: Server protocol durability workload
|
|
26
|
+
run: RUBYDB_SERVER_WORKLOAD_CLIENTS=2 RUBYDB_SERVER_WORKLOAD_OPERATIONS=25 bundle exec ruby -Ilib benchmarks/server_workload.rb
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
name: Compatibility
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
workflow_dispatch:
|
|
9
|
-
|
|
10
|
-
permissions:
|
|
11
|
-
contents: read
|
|
12
|
-
|
|
13
|
-
jobs:
|
|
14
|
-
ruby:
|
|
15
|
-
name: Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
|
|
16
|
-
runs-on: ${{ matrix.os }}
|
|
17
|
-
strategy:
|
|
18
|
-
fail-fast: false
|
|
19
|
-
matrix:
|
|
20
|
-
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
21
|
-
ruby: ["3.3", "3.4"]
|
|
22
|
-
steps:
|
|
23
|
-
- uses: actions/checkout@v4
|
|
24
|
-
- uses: ruby/setup-ruby@v1
|
|
25
|
-
with:
|
|
26
|
-
ruby-version: ${{ matrix.ruby }}
|
|
27
|
-
bundler-cache: true
|
|
28
|
-
- name: Run regression suite with coverage gate
|
|
29
|
-
env:
|
|
30
|
-
RUBYDB_COVERAGE: "1"
|
|
31
|
-
run: bundle exec rspec
|
|
32
|
-
|
|
33
|
-
- name: Validate SQLite compatibility profile
|
|
34
|
-
run: bundle exec rspec spec/sqlite_compatibility_spec.rb
|
|
35
|
-
|
|
36
|
-
rails:
|
|
37
|
-
name: ActiveRecord ${{ matrix.rails }}
|
|
38
|
-
runs-on: ubuntu-latest
|
|
39
|
-
strategy:
|
|
40
|
-
fail-fast: false
|
|
41
|
-
matrix:
|
|
42
|
-
rails: ["7.1", "7.2", "8.0"]
|
|
43
|
-
steps:
|
|
44
|
-
- uses: actions/checkout@v4
|
|
45
|
-
- uses: ruby/setup-ruby@v1
|
|
46
|
-
with:
|
|
47
|
-
ruby-version: "3.3"
|
|
48
|
-
bundler-cache: true
|
|
49
|
-
- name: Build current RubyDB gem
|
|
50
|
-
run: bundle exec rake build
|
|
51
|
-
- name: Install current RubyDB gem for adapter dependency
|
|
52
|
-
shell: bash
|
|
53
|
-
run: gem install "$(ls -t pkg/rubydb-*.gem | head -n 1)" --local --no-document
|
|
54
|
-
- name: Install adapter dependencies
|
|
55
|
-
working-directory: adapters/activerecord
|
|
56
|
-
env:
|
|
57
|
-
RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
|
|
58
|
-
run: bundle install --jobs 4 --retry 3
|
|
59
|
-
- name: Run adapter integration suite
|
|
60
|
-
working-directory: adapters/activerecord
|
|
61
|
-
env:
|
|
62
|
-
RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
|
|
63
|
-
run: bundle exec rspec
|
|
1
|
+
name: Compatibility
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
ruby:
|
|
15
|
+
name: Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
|
|
16
|
+
runs-on: ${{ matrix.os }}
|
|
17
|
+
strategy:
|
|
18
|
+
fail-fast: false
|
|
19
|
+
matrix:
|
|
20
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
21
|
+
ruby: ["3.3", "3.4"]
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v4
|
|
24
|
+
- uses: ruby/setup-ruby@v1
|
|
25
|
+
with:
|
|
26
|
+
ruby-version: ${{ matrix.ruby }}
|
|
27
|
+
bundler-cache: true
|
|
28
|
+
- name: Run regression suite with coverage gate
|
|
29
|
+
env:
|
|
30
|
+
RUBYDB_COVERAGE: "1"
|
|
31
|
+
run: bundle exec rspec
|
|
32
|
+
|
|
33
|
+
- name: Validate SQLite compatibility profile
|
|
34
|
+
run: bundle exec rspec spec/sqlite_compatibility_spec.rb
|
|
35
|
+
|
|
36
|
+
rails:
|
|
37
|
+
name: ActiveRecord ${{ matrix.rails }}
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
strategy:
|
|
40
|
+
fail-fast: false
|
|
41
|
+
matrix:
|
|
42
|
+
rails: ["7.1", "7.2", "8.0"]
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
- uses: ruby/setup-ruby@v1
|
|
46
|
+
with:
|
|
47
|
+
ruby-version: "3.3"
|
|
48
|
+
bundler-cache: true
|
|
49
|
+
- name: Build current RubyDB gem
|
|
50
|
+
run: bundle exec rake build
|
|
51
|
+
- name: Install current RubyDB gem for adapter dependency
|
|
52
|
+
shell: bash
|
|
53
|
+
run: gem install "$(ls -t pkg/rubydb-*.gem | head -n 1)" --local --no-document
|
|
54
|
+
- name: Install adapter dependencies
|
|
55
|
+
working-directory: adapters/activerecord
|
|
56
|
+
env:
|
|
57
|
+
RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
|
|
58
|
+
run: bundle install --jobs 4 --retry 3
|
|
59
|
+
- name: Run adapter integration suite
|
|
60
|
+
working-directory: adapters/activerecord
|
|
61
|
+
env:
|
|
62
|
+
RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
|
|
63
|
+
run: bundle exec rspec
|
data/.github/workflows/fuzz.yml
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
name: Fuzz safety
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
pull_request:
|
|
5
|
-
branches: [main]
|
|
6
|
-
schedule:
|
|
7
|
-
- cron: "17 3 * * 0"
|
|
8
|
-
workflow_dispatch:
|
|
9
|
-
inputs:
|
|
10
|
-
iterations:
|
|
11
|
-
description: "Iterations per fuzzer"
|
|
12
|
-
required: false
|
|
13
|
-
default: "1000"
|
|
14
|
-
type: string
|
|
15
|
-
|
|
16
|
-
permissions:
|
|
17
|
-
contents: read
|
|
18
|
-
|
|
19
|
-
jobs:
|
|
20
|
-
fuzz:
|
|
21
|
-
runs-on: ubuntu-latest
|
|
22
|
-
timeout-minutes: 15
|
|
23
|
-
steps:
|
|
24
|
-
- uses: actions/checkout@v4
|
|
25
|
-
- uses: ruby/setup-ruby@v1
|
|
26
|
-
with:
|
|
27
|
-
ruby-version: "3.3"
|
|
28
|
-
bundler-cache: true
|
|
29
|
-
- name: Run bounded fuzzers
|
|
30
|
-
env:
|
|
31
|
-
RUBYDB_FUZZ_ITERATIONS: ${{ inputs.iterations || '100' }}
|
|
32
|
-
RUBYDB_FUZZ_SEED: "20260909"
|
|
33
|
-
run: ruby scripts/fuzz
|
|
1
|
+
name: Fuzz safety
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main]
|
|
6
|
+
schedule:
|
|
7
|
+
- cron: "17 3 * * 0"
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
inputs:
|
|
10
|
+
iterations:
|
|
11
|
+
description: "Iterations per fuzzer"
|
|
12
|
+
required: false
|
|
13
|
+
default: "1000"
|
|
14
|
+
type: string
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
fuzz:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 15
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- uses: ruby/setup-ruby@v1
|
|
26
|
+
with:
|
|
27
|
+
ruby-version: "3.3"
|
|
28
|
+
bundler-cache: true
|
|
29
|
+
- name: Run bounded fuzzers
|
|
30
|
+
env:
|
|
31
|
+
RUBYDB_FUZZ_ITERATIONS: ${{ inputs.iterations || '100' }}
|
|
32
|
+
RUBYDB_FUZZ_SEED: "20260909"
|
|
33
|
+
run: ruby scripts/fuzz
|
data/.github/workflows/lint.yml
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
name: Lint
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: read
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
rubocop:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
- uses: ruby/setup-ruby@v1
|
|
18
|
-
with:
|
|
19
|
-
ruby-version: "3.3"
|
|
20
|
-
bundler-cache: true
|
|
21
|
-
- run: bundle exec rubocop
|
|
1
|
+
name: Lint
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
rubocop:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: "3.3"
|
|
20
|
+
bundler-cache: true
|
|
21
|
+
- run: bundle exec rubocop
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
name: Operations drills
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
schedule:
|
|
5
|
-
- cron: "47 3 * * 1"
|
|
6
|
-
workflow_dispatch:
|
|
7
|
-
|
|
8
|
-
permissions:
|
|
9
|
-
contents: read
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
restore:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
timeout-minutes: 15
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
- uses: ruby/setup-ruby@v1
|
|
18
|
-
with:
|
|
19
|
-
ruby-version: "3.3"
|
|
20
|
-
bundler-cache: true
|
|
21
|
-
- name: Run backup and restore drill
|
|
22
|
-
run: ruby scripts/restore_drill
|
|
23
|
-
- name: Run durability fault and recovery drill
|
|
24
|
-
run: ruby scripts/durability_drill
|
|
1
|
+
name: Operations drills
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "47 3 * * 1"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
restore:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 15
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: "3.3"
|
|
20
|
+
bundler-cache: true
|
|
21
|
+
- name: Run backup and restore drill
|
|
22
|
+
run: ruby scripts/restore_drill
|
|
23
|
+
- name: Run durability fault and recovery drill
|
|
24
|
+
run: ruby scripts/durability_drill
|
|
@@ -1,111 +1,111 @@
|
|
|
1
|
-
name: Production validation
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
workflow_dispatch:
|
|
5
|
-
schedule:
|
|
6
|
-
- cron: "19 4 * * 3"
|
|
7
|
-
|
|
8
|
-
permissions:
|
|
9
|
-
contents: read
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
validate:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
timeout-minutes: 45
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
- uses: ruby/setup-ruby@v1
|
|
18
|
-
with:
|
|
19
|
-
ruby-version: "3.3"
|
|
20
|
-
bundler-cache: true
|
|
21
|
-
|
|
22
|
-
- name: Run production safety regression set
|
|
23
|
-
run: |
|
|
24
|
-
bundle exec rspec \
|
|
25
|
-
spec/server_protocol_spec.rb \
|
|
26
|
-
spec/server_concurrency_durability_spec.rb \
|
|
27
|
-
spec/concurrent_soak_harness_spec.rb \
|
|
28
|
-
spec/multiprocess_server_workload_spec.rb \
|
|
29
|
-
spec/filesystem_fault_injection_spec.rb \
|
|
30
|
-
spec/metadata_persistence_safety_spec.rb \
|
|
31
|
-
spec/index_persistence_spec.rb \
|
|
32
|
-
spec/compaction_persistence_spec.rb \
|
|
33
|
-
spec/backup_restore_spec.rb \
|
|
34
|
-
spec/replication_network_spec.rb \
|
|
35
|
-
spec/replication_partition_spec.rb \
|
|
36
|
-
spec/replication_failover_integration_spec.rb \
|
|
37
|
-
spec/fencing_spec.rb \
|
|
38
|
-
spec/corruption_repair_spec.rb
|
|
39
|
-
spec/sqlite_compatibility_spec.rb
|
|
40
|
-
|
|
41
|
-
- name: Run sustained threaded workload
|
|
42
|
-
shell: bash
|
|
43
|
-
run: |
|
|
44
|
-
set -euo pipefail
|
|
45
|
-
mkdir -p production-results
|
|
46
|
-
RUBYDB_SOAK_ROUNDS=3 \
|
|
47
|
-
RUBYDB_SOAK_THREADS=16 \
|
|
48
|
-
RUBYDB_SOAK_OPERATIONS=2000 \
|
|
49
|
-
RUBYDB_SOAK_PAYLOAD_BYTES=512 \
|
|
50
|
-
ruby benchmarks/concurrent_soak.rb | tee production-results/threaded.json
|
|
51
|
-
|
|
52
|
-
- name: Run server and independent-process workloads
|
|
53
|
-
shell: bash
|
|
54
|
-
run: |
|
|
55
|
-
set -euo pipefail
|
|
56
|
-
RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
|
|
57
|
-
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
58
|
-
ruby -Ilib benchmarks/server_workload.rb | tee production-results/server.json
|
|
59
|
-
RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
|
|
60
|
-
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
61
|
-
ruby benchmarks/multiprocess_server_workload.rb | tee production-results/multiprocess.json
|
|
62
|
-
|
|
63
|
-
- name: Run production concurrency and resilience soak
|
|
64
|
-
shell: bash
|
|
65
|
-
run: |
|
|
66
|
-
set -euo pipefail
|
|
67
|
-
RUBYDB_PRODUCTION_SOAK_CLIENTS=16 \
|
|
68
|
-
RUBYDB_PRODUCTION_SOAK_OPERATIONS=2000 \
|
|
69
|
-
RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
|
|
70
|
-
ruby benchmarks/production_soak.rb | tee production-results/production-soak.json
|
|
71
|
-
|
|
72
|
-
- name: Run process-level replication failover drill
|
|
73
|
-
run: ruby scripts/replication_failover_drill | tee production-results/replication-failover.json
|
|
74
|
-
|
|
75
|
-
- name: Run network partition and promotion drill
|
|
76
|
-
run: ruby scripts/replication_network_failover_drill | tee production-results/replication-network-failover.json
|
|
77
|
-
|
|
78
|
-
- name: Run backup and restore drill
|
|
79
|
-
run: ruby scripts/restore_drill | tee production-results/restore.txt
|
|
80
|
-
|
|
81
|
-
- name: Run durability fault and recovery drill
|
|
82
|
-
run: ruby scripts/durability_drill | tee production-results/durability.txt
|
|
83
|
-
|
|
84
|
-
- name: Run bounded fuzzers
|
|
85
|
-
env:
|
|
86
|
-
RUBYDB_FUZZ_ITERATIONS: "250"
|
|
87
|
-
RUBYDB_FUZZ_SEED: "20260909"
|
|
88
|
-
run: ruby scripts/fuzz | tee production-results/fuzz.txt
|
|
89
|
-
|
|
90
|
-
- name: Build and verify release artifact
|
|
91
|
-
run: |
|
|
92
|
-
bundle exec rake build
|
|
93
|
-
ruby scripts/release | tee production-results/release.txt
|
|
94
|
-
|
|
95
|
-
- name: Upload validation evidence
|
|
96
|
-
if: always()
|
|
97
|
-
uses: actions/upload-artifact@v4
|
|
98
|
-
with:
|
|
99
|
-
name: rubydb-production-validation-${{ github.sha }}
|
|
100
|
-
path: production-results/
|
|
101
|
-
|
|
102
|
-
container-topology:
|
|
103
|
-
name: Multi-node container topology
|
|
104
|
-
runs-on: ubuntu-latest
|
|
105
|
-
timeout-minutes: 20
|
|
106
|
-
steps:
|
|
107
|
-
- uses: actions/checkout@v4
|
|
108
|
-
- name: Validate compose topology
|
|
109
|
-
run: docker compose -f packaging/docker/docker-compose.failover.yml config
|
|
110
|
-
- name: Build production image
|
|
111
|
-
run: docker compose -f packaging/docker/docker-compose.failover.yml build primary replica
|
|
1
|
+
name: Production validation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "19 4 * * 3"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
validate:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 45
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
- uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: "3.3"
|
|
20
|
+
bundler-cache: true
|
|
21
|
+
|
|
22
|
+
- name: Run production safety regression set
|
|
23
|
+
run: |
|
|
24
|
+
bundle exec rspec \
|
|
25
|
+
spec/server_protocol_spec.rb \
|
|
26
|
+
spec/server_concurrency_durability_spec.rb \
|
|
27
|
+
spec/concurrent_soak_harness_spec.rb \
|
|
28
|
+
spec/multiprocess_server_workload_spec.rb \
|
|
29
|
+
spec/filesystem_fault_injection_spec.rb \
|
|
30
|
+
spec/metadata_persistence_safety_spec.rb \
|
|
31
|
+
spec/index_persistence_spec.rb \
|
|
32
|
+
spec/compaction_persistence_spec.rb \
|
|
33
|
+
spec/backup_restore_spec.rb \
|
|
34
|
+
spec/replication_network_spec.rb \
|
|
35
|
+
spec/replication_partition_spec.rb \
|
|
36
|
+
spec/replication_failover_integration_spec.rb \
|
|
37
|
+
spec/fencing_spec.rb \
|
|
38
|
+
spec/corruption_repair_spec.rb
|
|
39
|
+
spec/sqlite_compatibility_spec.rb
|
|
40
|
+
|
|
41
|
+
- name: Run sustained threaded workload
|
|
42
|
+
shell: bash
|
|
43
|
+
run: |
|
|
44
|
+
set -euo pipefail
|
|
45
|
+
mkdir -p production-results
|
|
46
|
+
RUBYDB_SOAK_ROUNDS=3 \
|
|
47
|
+
RUBYDB_SOAK_THREADS=16 \
|
|
48
|
+
RUBYDB_SOAK_OPERATIONS=2000 \
|
|
49
|
+
RUBYDB_SOAK_PAYLOAD_BYTES=512 \
|
|
50
|
+
ruby benchmarks/concurrent_soak.rb | tee production-results/threaded.json
|
|
51
|
+
|
|
52
|
+
- name: Run server and independent-process workloads
|
|
53
|
+
shell: bash
|
|
54
|
+
run: |
|
|
55
|
+
set -euo pipefail
|
|
56
|
+
RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
|
|
57
|
+
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
58
|
+
ruby -Ilib benchmarks/server_workload.rb | tee production-results/server.json
|
|
59
|
+
RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
|
|
60
|
+
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
61
|
+
ruby benchmarks/multiprocess_server_workload.rb | tee production-results/multiprocess.json
|
|
62
|
+
|
|
63
|
+
- name: Run production concurrency and resilience soak
|
|
64
|
+
shell: bash
|
|
65
|
+
run: |
|
|
66
|
+
set -euo pipefail
|
|
67
|
+
RUBYDB_PRODUCTION_SOAK_CLIENTS=16 \
|
|
68
|
+
RUBYDB_PRODUCTION_SOAK_OPERATIONS=2000 \
|
|
69
|
+
RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
|
|
70
|
+
ruby benchmarks/production_soak.rb | tee production-results/production-soak.json
|
|
71
|
+
|
|
72
|
+
- name: Run process-level replication failover drill
|
|
73
|
+
run: ruby scripts/replication_failover_drill | tee production-results/replication-failover.json
|
|
74
|
+
|
|
75
|
+
- name: Run network partition and promotion drill
|
|
76
|
+
run: ruby scripts/replication_network_failover_drill | tee production-results/replication-network-failover.json
|
|
77
|
+
|
|
78
|
+
- name: Run backup and restore drill
|
|
79
|
+
run: ruby scripts/restore_drill | tee production-results/restore.txt
|
|
80
|
+
|
|
81
|
+
- name: Run durability fault and recovery drill
|
|
82
|
+
run: ruby scripts/durability_drill | tee production-results/durability.txt
|
|
83
|
+
|
|
84
|
+
- name: Run bounded fuzzers
|
|
85
|
+
env:
|
|
86
|
+
RUBYDB_FUZZ_ITERATIONS: "250"
|
|
87
|
+
RUBYDB_FUZZ_SEED: "20260909"
|
|
88
|
+
run: ruby scripts/fuzz | tee production-results/fuzz.txt
|
|
89
|
+
|
|
90
|
+
- name: Build and verify release artifact
|
|
91
|
+
run: |
|
|
92
|
+
bundle exec rake build
|
|
93
|
+
ruby scripts/release | tee production-results/release.txt
|
|
94
|
+
|
|
95
|
+
- name: Upload validation evidence
|
|
96
|
+
if: always()
|
|
97
|
+
uses: actions/upload-artifact@v4
|
|
98
|
+
with:
|
|
99
|
+
name: rubydb-production-validation-${{ github.sha }}
|
|
100
|
+
path: production-results/
|
|
101
|
+
|
|
102
|
+
container-topology:
|
|
103
|
+
name: Multi-node container topology
|
|
104
|
+
runs-on: ubuntu-latest
|
|
105
|
+
timeout-minutes: 20
|
|
106
|
+
steps:
|
|
107
|
+
- uses: actions/checkout@v4
|
|
108
|
+
- name: Validate compose topology
|
|
109
|
+
run: docker compose -f packaging/docker/docker-compose.failover.yml config
|
|
110
|
+
- name: Build production image
|
|
111
|
+
run: docker compose -f packaging/docker/docker-compose.failover.yml build primary replica
|