rubydb 0.1.3 → 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 +49 -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 +877 -880
- data/adapters/activerecord/rubydb-activerecord.gemspec +21 -21
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +155 -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 +1195 -1192
- 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 +123 -120
- 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
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
name: Release gem
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
tags: ["v*"]
|
|
6
|
-
|
|
7
|
-
permissions:
|
|
8
|
-
contents: write
|
|
9
|
-
id-token: write
|
|
10
|
-
attestations: write
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
build-and-publish:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v4
|
|
17
|
-
with:
|
|
18
|
-
fetch-depth: 0
|
|
19
|
-
- uses: ruby/setup-ruby@v1
|
|
20
|
-
with:
|
|
21
|
-
ruby-version: "3.3"
|
|
22
|
-
bundler-cache: true
|
|
23
|
-
- name: Require protected release credentials
|
|
24
|
-
env:
|
|
25
|
-
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
|
26
|
-
RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
|
|
27
|
-
RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
|
|
28
|
-
shell: bash
|
|
29
|
-
run: |
|
|
30
|
-
set -euo pipefail
|
|
31
|
-
test -n "$RUBYGEMS_API_KEY" || { echo "RUBYGEMS_API_KEY is required for a release tag" >&2; exit 1; }
|
|
32
|
-
test -n "$RUBYDB_GEM_SIGNING_KEY_B64" || { echo "RUBYDB_GEM_SIGNING_KEY_B64 is required for a release tag" >&2; exit 1; }
|
|
33
|
-
test -n "$RUBYDB_GEM_CERT_B64" || { echo "RUBYDB_GEM_CERT_B64 is required for a release tag" >&2; exit 1; }
|
|
34
|
-
|
|
35
|
-
- name: Configure RubyGems signing
|
|
36
|
-
env:
|
|
37
|
-
RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
|
|
38
|
-
RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
|
|
39
|
-
shell: bash
|
|
40
|
-
run: |
|
|
41
|
-
key_path="$RUNNER_TEMP/rubydb-gem-private-key.pem"
|
|
42
|
-
cert_path="$RUNNER_TEMP/rubydb-gem-public-cert.pem"
|
|
43
|
-
printf '%s' "$RUBYDB_GEM_SIGNING_KEY_B64" | base64 --decode > "$key_path"
|
|
44
|
-
printf '%s' "$RUBYDB_GEM_CERT_B64" | base64 --decode > "$cert_path"
|
|
45
|
-
chmod 600 "$key_path"
|
|
46
|
-
{
|
|
47
|
-
echo "RUBYDB_GEM_SIGNING_KEY=$key_path"
|
|
48
|
-
echo "RUBYDB_GEM_CERT=$cert_path"
|
|
49
|
-
} >> "$GITHUB_ENV"
|
|
50
|
-
- name: Verify tag matches gem version
|
|
51
|
-
shell: bash
|
|
52
|
-
run: test "${GITHUB_REF_NAME#v}" = "$(ruby -Ilib -rrubydb/version -e 'puts RubyDB::VERSION')"
|
|
53
|
-
- name: Verify changelog release entry
|
|
54
|
-
run: ruby scripts/release_check
|
|
55
|
-
- name: Test and build release artifact
|
|
56
|
-
run: |
|
|
57
|
-
bundle exec rspec
|
|
58
|
-
ruby scripts/release
|
|
59
|
-
- name: Sign release provenance
|
|
60
|
-
uses: actions/attest-build-provenance@v2
|
|
61
|
-
with:
|
|
62
|
-
subject-path: "pkg/*.gem"
|
|
63
|
-
- name: Publish to RubyGems
|
|
64
|
-
env:
|
|
65
|
-
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
|
66
|
-
RUBYDB_PUBLISH: "1"
|
|
67
|
-
run: ruby scripts/release
|
|
68
|
-
- name: Publish GitHub release notes from changelog history
|
|
69
|
-
env:
|
|
70
|
-
GH_TOKEN: ${{ github.token }}
|
|
71
|
-
run: gh release create "$GITHUB_REF_NAME" --verify-tag --generate-notes --title "$GITHUB_REF_NAME"
|
|
72
|
-
- uses: actions/upload-artifact@v4
|
|
73
|
-
with:
|
|
74
|
-
name: rubydb-gem-${{ github.ref_name }}
|
|
75
|
-
path: |
|
|
76
|
-
pkg/*.gem
|
|
77
|
-
checksums/*.sha512
|
|
1
|
+
name: Release gem
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
id-token: write
|
|
10
|
+
attestations: write
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
build-and-publish:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
fetch-depth: 0
|
|
19
|
+
- uses: ruby/setup-ruby@v1
|
|
20
|
+
with:
|
|
21
|
+
ruby-version: "3.3"
|
|
22
|
+
bundler-cache: true
|
|
23
|
+
- name: Require protected release credentials
|
|
24
|
+
env:
|
|
25
|
+
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
|
26
|
+
RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
|
|
27
|
+
RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
|
|
28
|
+
shell: bash
|
|
29
|
+
run: |
|
|
30
|
+
set -euo pipefail
|
|
31
|
+
test -n "$RUBYGEMS_API_KEY" || { echo "RUBYGEMS_API_KEY is required for a release tag" >&2; exit 1; }
|
|
32
|
+
test -n "$RUBYDB_GEM_SIGNING_KEY_B64" || { echo "RUBYDB_GEM_SIGNING_KEY_B64 is required for a release tag" >&2; exit 1; }
|
|
33
|
+
test -n "$RUBYDB_GEM_CERT_B64" || { echo "RUBYDB_GEM_CERT_B64 is required for a release tag" >&2; exit 1; }
|
|
34
|
+
|
|
35
|
+
- name: Configure RubyGems signing
|
|
36
|
+
env:
|
|
37
|
+
RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
|
|
38
|
+
RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
|
|
39
|
+
shell: bash
|
|
40
|
+
run: |
|
|
41
|
+
key_path="$RUNNER_TEMP/rubydb-gem-private-key.pem"
|
|
42
|
+
cert_path="$RUNNER_TEMP/rubydb-gem-public-cert.pem"
|
|
43
|
+
printf '%s' "$RUBYDB_GEM_SIGNING_KEY_B64" | base64 --decode > "$key_path"
|
|
44
|
+
printf '%s' "$RUBYDB_GEM_CERT_B64" | base64 --decode > "$cert_path"
|
|
45
|
+
chmod 600 "$key_path"
|
|
46
|
+
{
|
|
47
|
+
echo "RUBYDB_GEM_SIGNING_KEY=$key_path"
|
|
48
|
+
echo "RUBYDB_GEM_CERT=$cert_path"
|
|
49
|
+
} >> "$GITHUB_ENV"
|
|
50
|
+
- name: Verify tag matches gem version
|
|
51
|
+
shell: bash
|
|
52
|
+
run: test "${GITHUB_REF_NAME#v}" = "$(ruby -Ilib -rrubydb/version -e 'puts RubyDB::VERSION')"
|
|
53
|
+
- name: Verify changelog release entry
|
|
54
|
+
run: ruby scripts/release_check
|
|
55
|
+
- name: Test and build release artifact
|
|
56
|
+
run: |
|
|
57
|
+
bundle exec rspec
|
|
58
|
+
ruby scripts/release
|
|
59
|
+
- name: Sign release provenance
|
|
60
|
+
uses: actions/attest-build-provenance@v2
|
|
61
|
+
with:
|
|
62
|
+
subject-path: "pkg/*.gem"
|
|
63
|
+
- name: Publish to RubyGems
|
|
64
|
+
env:
|
|
65
|
+
GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
|
66
|
+
RUBYDB_PUBLISH: "1"
|
|
67
|
+
run: ruby scripts/release
|
|
68
|
+
- name: Publish GitHub release notes from changelog history
|
|
69
|
+
env:
|
|
70
|
+
GH_TOKEN: ${{ github.token }}
|
|
71
|
+
run: gh release create "$GITHUB_REF_NAME" --verify-tag --generate-notes --title "$GITHUB_REF_NAME"
|
|
72
|
+
- uses: actions/upload-artifact@v4
|
|
73
|
+
with:
|
|
74
|
+
name: rubydb-gem-${{ github.ref_name }}
|
|
75
|
+
path: |
|
|
76
|
+
pkg/*.gem
|
|
77
|
+
checksums/*.sha512
|
|
@@ -1,37 +1,39 @@
|
|
|
1
|
-
name: Security
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
schedule:
|
|
9
|
-
- cron: "17 3 * * 1"
|
|
10
|
-
|
|
11
|
-
permissions:
|
|
12
|
-
contents: read
|
|
13
|
-
security-events: write
|
|
14
|
-
|
|
15
|
-
jobs:
|
|
16
|
-
dependency-audit:
|
|
17
|
-
runs-on: ubuntu-latest
|
|
18
|
-
steps:
|
|
19
|
-
- uses: actions/checkout@v4
|
|
20
|
-
- uses: ruby/setup-ruby@v1
|
|
21
|
-
with:
|
|
22
|
-
ruby-version: "3.3"
|
|
23
|
-
bundler-cache: true
|
|
24
|
-
- name: Audit Ruby dependencies
|
|
25
|
-
run: |
|
|
26
|
-
gem install bundler-audit --no-document
|
|
27
|
-
bundle audit check --update
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
1
|
+
name: Security
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
schedule:
|
|
9
|
+
- cron: "17 3 * * 1"
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
security-events: write
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
dependency-audit:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
- uses: ruby/setup-ruby@v1
|
|
21
|
+
with:
|
|
22
|
+
ruby-version: "3.3"
|
|
23
|
+
bundler-cache: true
|
|
24
|
+
- name: Audit Ruby dependencies
|
|
25
|
+
run: |
|
|
26
|
+
gem install bundler-audit --no-document
|
|
27
|
+
bundle audit check --update
|
|
28
|
+
- name: Run repository security baseline
|
|
29
|
+
run: ruby scripts/security
|
|
30
|
+
|
|
31
|
+
codeql:
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
steps:
|
|
34
|
+
- uses: actions/checkout@v4
|
|
35
|
+
- uses: github/codeql-action/init@v3
|
|
36
|
+
with:
|
|
37
|
+
languages: ruby
|
|
38
|
+
build-mode: none
|
|
39
|
+
- uses: github/codeql-action/analyze@v3
|
data/.github/workflows/test.yml
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
name: Test
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches: [main]
|
|
6
|
-
pull_request:
|
|
7
|
-
branches: [main]
|
|
8
|
-
|
|
9
|
-
permissions:
|
|
10
|
-
contents: read
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
rspec:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
strategy:
|
|
16
|
-
fail-fast: false
|
|
17
|
-
matrix:
|
|
18
|
-
ruby: ["3.3", "3.4"]
|
|
19
|
-
steps:
|
|
20
|
-
- uses: actions/checkout@v4
|
|
21
|
-
- uses: ruby/setup-ruby@v1
|
|
22
|
-
with:
|
|
23
|
-
ruby-version: ${{ matrix.ruby }}
|
|
24
|
-
bundler-cache: true
|
|
25
|
-
- run: bundle exec rspec
|
|
26
|
-
- run: ruby benchmarks/concurrent_workload.rb
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
rspec:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
fail-fast: false
|
|
17
|
+
matrix:
|
|
18
|
+
ruby: ["3.3", "3.4"]
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
- uses: ruby/setup-ruby@v1
|
|
22
|
+
with:
|
|
23
|
+
ruby-version: ${{ matrix.ruby }}
|
|
24
|
+
bundler-cache: true
|
|
25
|
+
- run: bundle exec rspec
|
|
26
|
+
- run: ruby benchmarks/concurrent_workload.rb
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
name: Sustained workload validation
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
schedule:
|
|
5
|
-
- cron: "31 3 * * 6"
|
|
6
|
-
workflow_dispatch:
|
|
7
|
-
|
|
8
|
-
permissions:
|
|
9
|
-
contents: read
|
|
10
|
-
|
|
11
|
-
jobs:
|
|
12
|
-
workload:
|
|
13
|
-
runs-on: ubuntu-latest
|
|
14
|
-
timeout-minutes: 30
|
|
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 sustained threaded durability soak
|
|
22
|
-
shell: bash
|
|
23
|
-
run: |
|
|
24
|
-
set -euo pipefail
|
|
25
|
-
mkdir -p workload-results
|
|
26
|
-
RUBYDB_SOAK_ROUNDS=3 \
|
|
27
|
-
RUBYDB_SOAK_THREADS=16 \
|
|
28
|
-
RUBYDB_SOAK_OPERATIONS=2000 \
|
|
29
|
-
RUBYDB_SOAK_PAYLOAD_BYTES=512 \
|
|
30
|
-
ruby benchmarks/concurrent_soak.rb | tee workload-results/threaded.json
|
|
31
|
-
- name: Run sustained server/client latency workload
|
|
32
|
-
shell: bash
|
|
33
|
-
run: |
|
|
34
|
-
set -euo pipefail
|
|
35
|
-
RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
|
|
36
|
-
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
37
|
-
ruby -Ilib benchmarks/server_workload.rb | tee workload-results/server.json
|
|
38
|
-
- name: Run sustained multi-process client workload
|
|
39
|
-
shell: bash
|
|
40
|
-
run: |
|
|
41
|
-
set -euo pipefail
|
|
42
|
-
RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
|
|
43
|
-
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
44
|
-
ruby benchmarks/multiprocess_server_workload.rb | tee workload-results/multiprocess.json
|
|
45
|
-
- name: Run cancellation, capacity, and deadlock soak
|
|
46
|
-
shell: bash
|
|
47
|
-
run: |
|
|
48
|
-
set -euo pipefail
|
|
49
|
-
RUBYDB_PRODUCTION_SOAK_CLIENTS=8 \
|
|
50
|
-
RUBYDB_PRODUCTION_SOAK_OPERATIONS=500 \
|
|
51
|
-
RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
|
|
52
|
-
ruby benchmarks/production_soak.rb | tee workload-results/production-soak.json
|
|
53
|
-
- name: Upload workload metrics
|
|
54
|
-
if: always()
|
|
55
|
-
uses: actions/upload-artifact@v4
|
|
56
|
-
with:
|
|
57
|
-
name: rubydb-workload-${{ github.sha }}
|
|
58
|
-
path: workload-results/
|
|
1
|
+
name: Sustained workload validation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "31 3 * * 6"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
workload:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 30
|
|
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 sustained threaded durability soak
|
|
22
|
+
shell: bash
|
|
23
|
+
run: |
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
mkdir -p workload-results
|
|
26
|
+
RUBYDB_SOAK_ROUNDS=3 \
|
|
27
|
+
RUBYDB_SOAK_THREADS=16 \
|
|
28
|
+
RUBYDB_SOAK_OPERATIONS=2000 \
|
|
29
|
+
RUBYDB_SOAK_PAYLOAD_BYTES=512 \
|
|
30
|
+
ruby benchmarks/concurrent_soak.rb | tee workload-results/threaded.json
|
|
31
|
+
- name: Run sustained server/client latency workload
|
|
32
|
+
shell: bash
|
|
33
|
+
run: |
|
|
34
|
+
set -euo pipefail
|
|
35
|
+
RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
|
|
36
|
+
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
37
|
+
ruby -Ilib benchmarks/server_workload.rb | tee workload-results/server.json
|
|
38
|
+
- name: Run sustained multi-process client workload
|
|
39
|
+
shell: bash
|
|
40
|
+
run: |
|
|
41
|
+
set -euo pipefail
|
|
42
|
+
RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
|
|
43
|
+
RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
|
|
44
|
+
ruby benchmarks/multiprocess_server_workload.rb | tee workload-results/multiprocess.json
|
|
45
|
+
- name: Run cancellation, capacity, and deadlock soak
|
|
46
|
+
shell: bash
|
|
47
|
+
run: |
|
|
48
|
+
set -euo pipefail
|
|
49
|
+
RUBYDB_PRODUCTION_SOAK_CLIENTS=8 \
|
|
50
|
+
RUBYDB_PRODUCTION_SOAK_OPERATIONS=500 \
|
|
51
|
+
RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
|
|
52
|
+
ruby benchmarks/production_soak.rb | tee workload-results/production-soak.json
|
|
53
|
+
- name: Upload workload metrics
|
|
54
|
+
if: always()
|
|
55
|
+
uses: actions/upload-artifact@v4
|
|
56
|
+
with:
|
|
57
|
+
name: rubydb-workload-${{ github.sha }}
|
|
58
|
+
path: workload-results/
|
data/.gitignore
CHANGED
|
@@ -26,11 +26,18 @@
|
|
|
26
26
|
*.log
|
|
27
27
|
/examples/server/tmp/
|
|
28
28
|
|
|
29
|
-
# Environment
|
|
30
|
-
/.bundle/
|
|
31
|
-
/vendor/bundle/
|
|
32
|
-
/.env
|
|
33
|
-
/.env.local
|
|
29
|
+
# Environment
|
|
30
|
+
/.bundle/
|
|
31
|
+
/vendor/bundle/
|
|
32
|
+
/.env
|
|
33
|
+
/.env.local
|
|
34
|
+
|
|
35
|
+
# Python adapter build output
|
|
36
|
+
/adapters/python/build/
|
|
37
|
+
/adapters/python/dist/
|
|
38
|
+
/adapters/python/src/*.egg-info/
|
|
39
|
+
__pycache__/
|
|
40
|
+
*.py[cod]
|
|
34
41
|
|
|
35
42
|
# IDE
|
|
36
43
|
/.idea/
|
data/.rubocop.yml
CHANGED
|
@@ -1,44 +1,50 @@
|
|
|
1
|
-
inherit_gem:
|
|
2
|
-
standard: config/base.yml
|
|
3
|
-
|
|
4
|
-
AllCops:
|
|
5
|
-
TargetRubyVersion:
|
|
6
|
-
NewCops: enable
|
|
7
|
-
Exclude:
|
|
8
|
-
- 'bin/**/*'
|
|
9
|
-
- 'exe/**/*'
|
|
10
|
-
- 'tmp/**/*'
|
|
11
|
-
- 'vendor/**/*'
|
|
12
|
-
- 'test/fixtures/**/*'
|
|
13
|
-
- 'fuzz/**/*'
|
|
14
|
-
|
|
15
|
-
# Ruby 4.0 modern features
|
|
16
|
-
Style/HashSyntax:
|
|
17
|
-
EnforcedShorthandSyntax: either
|
|
18
|
-
|
|
19
|
-
Style/EndlessMethod:
|
|
20
|
-
Enabled: true
|
|
21
|
-
EnforcedStyle: allow_single_line
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Enabled:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Metrics/
|
|
33
|
-
Max:
|
|
34
|
-
|
|
35
|
-
Metrics/
|
|
36
|
-
Max:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
1
|
+
inherit_gem:
|
|
2
|
+
standard: config/base.yml
|
|
3
|
+
|
|
4
|
+
AllCops:
|
|
5
|
+
TargetRubyVersion: 3.3
|
|
6
|
+
NewCops: enable
|
|
7
|
+
Exclude:
|
|
8
|
+
- 'bin/**/*'
|
|
9
|
+
- 'exe/**/*'
|
|
10
|
+
- 'tmp/**/*'
|
|
11
|
+
- 'vendor/**/*'
|
|
12
|
+
- 'test/fixtures/**/*'
|
|
13
|
+
- 'fuzz/**/*'
|
|
14
|
+
|
|
15
|
+
# Ruby 4.0 modern features
|
|
16
|
+
Style/HashSyntax:
|
|
17
|
+
EnforcedShorthandSyntax: either
|
|
18
|
+
|
|
19
|
+
Style/EndlessMethod:
|
|
20
|
+
Enabled: true
|
|
21
|
+
EnforcedStyle: allow_single_line
|
|
22
|
+
|
|
23
|
+
Lint/ShadowingOuterLocalVariable:
|
|
24
|
+
Enabled: false
|
|
25
|
+
|
|
26
|
+
# Several service objects declare a cheap reader with attr_reader and later
|
|
27
|
+
# replace it with a synchronized, computed stats method. The explicit method
|
|
28
|
+
# is the intended public API; RuboCop's duplicate-method warning is expected.
|
|
29
|
+
Lint/DuplicateMethods:
|
|
30
|
+
Enabled: false
|
|
31
|
+
|
|
32
|
+
Metrics/ClassLength:
|
|
33
|
+
Max: 200
|
|
34
|
+
|
|
35
|
+
Metrics/MethodLength:
|
|
36
|
+
Max: 25
|
|
37
|
+
|
|
38
|
+
Metrics/BlockLength:
|
|
39
|
+
Max: 50
|
|
40
|
+
Exclude:
|
|
41
|
+
- 'spec/**/*'
|
|
42
|
+
- 'test/**/*'
|
|
43
|
+
- '*.gemspec'
|
|
44
|
+
|
|
45
|
+
Naming/FileName:
|
|
46
|
+
Exclude:
|
|
47
|
+
- 'lib/rubydb.rb'
|
|
48
|
+
|
|
49
|
+
Layout/EndOfLine:
|
|
50
|
+
EnforcedStyle: lf
|
data/.standard.yml
CHANGED
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
# Standard Ruby configuration
|
|
2
|
-
ruby_version:
|
|
3
|
-
|
|
4
|
-
ignore:
|
|
5
|
-
- 'tmp/**/*'
|
|
6
|
-
- 'vendor/**/*'
|
|
7
|
-
- 'test/fixtures/**/*'
|
|
8
|
-
- 'fuzz/**/*'
|
|
9
|
-
- 'bin/**/*'
|
|
10
|
-
|
|
11
|
-
# Allow some flexibility in development
|
|
12
|
-
plugins:
|
|
13
|
-
- rubocop-performance
|
|
14
|
-
- rubocop-rspec
|
|
1
|
+
# Standard Ruby configuration
|
|
2
|
+
ruby_version: 3.3
|
|
3
|
+
|
|
4
|
+
ignore:
|
|
5
|
+
- 'tmp/**/*'
|
|
6
|
+
- 'vendor/**/*'
|
|
7
|
+
- 'test/fixtures/**/*'
|
|
8
|
+
- 'fuzz/**/*'
|
|
9
|
+
- 'bin/**/*'
|
data/ARCHITECTURE.md
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
# RubyDB architecture
|
|
2
|
-
|
|
3
|
-
RubyDB is organized as a durable relational engine with optional server/client
|
|
4
|
-
and Rails integration layers:
|
|
5
|
-
|
|
6
|
-
1. SQL lexer/parser and AST
|
|
7
|
-
2. binder, planner, and executor
|
|
8
|
-
3. catalog, constraints, and indexes
|
|
9
|
-
4. transactions, MVCC, lock management, and WAL
|
|
10
|
-
5. page storage, checkpoints, recovery, backup, and compaction
|
|
11
|
-
6. server protocol, authentication, TLS, limits, and monitoring
|
|
12
|
-
7. logical replication, fencing, failover, and adapters
|
|
13
|
-
|
|
14
|
-
The architecture is deliberately modular so every durable boundary can be
|
|
15
|
-
tested independently and end to end. Start with the [architecture index](docs/README.md),
|
|
16
|
-
then read [current state](docs/architecture/current-state.md) and the
|
|
17
|
-
[production validation contract](docs/production_validation.md).
|
|
18
|
-
|
|
19
|
-
The embedded engine requires exclusive ownership. Server mode is the boundary
|
|
20
|
-
for multiple application processes. Automatic election is disabled until an
|
|
21
|
-
independent multi-host fencing authority is validated.
|
|
1
|
+
# RubyDB architecture
|
|
2
|
+
|
|
3
|
+
RubyDB is organized as a durable relational engine with optional server/client
|
|
4
|
+
and Rails integration layers:
|
|
5
|
+
|
|
6
|
+
1. SQL lexer/parser and AST
|
|
7
|
+
2. binder, planner, and executor
|
|
8
|
+
3. catalog, constraints, and indexes
|
|
9
|
+
4. transactions, MVCC, lock management, and WAL
|
|
10
|
+
5. page storage, checkpoints, recovery, backup, and compaction
|
|
11
|
+
6. server protocol, authentication, TLS, limits, and monitoring
|
|
12
|
+
7. logical replication, fencing, failover, and adapters
|
|
13
|
+
|
|
14
|
+
The architecture is deliberately modular so every durable boundary can be
|
|
15
|
+
tested independently and end to end. Start with the [architecture index](docs/README.md),
|
|
16
|
+
then read [current state](docs/architecture/current-state.md) and the
|
|
17
|
+
[production validation contract](docs/production_validation.md).
|
|
18
|
+
|
|
19
|
+
The embedded engine requires exclusive ownership. Server mode is the boundary
|
|
20
|
+
for multiple application processes. Automatic election is disabled until an
|
|
21
|
+
independent multi-host fencing authority is validated.
|