tigerbeetle-node 0.11.5 → 0.11.7

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.
Files changed (77) hide show
  1. package/dist/.client.node.sha256 +1 -1
  2. package/dist/index.d.ts +41 -42
  3. package/dist/index.js +41 -42
  4. package/dist/index.js.map +1 -1
  5. package/package.json +2 -2
  6. package/src/index.ts +0 -1
  7. package/src/tigerbeetle/scripts/benchmark.bat +7 -3
  8. package/src/tigerbeetle/scripts/benchmark.sh +2 -3
  9. package/src/tigerbeetle/scripts/install.bat +7 -0
  10. package/src/tigerbeetle/scripts/install.sh +2 -3
  11. package/src/tigerbeetle/src/benchmark.zig +3 -3
  12. package/src/tigerbeetle/src/config.zig +24 -3
  13. package/src/tigerbeetle/src/constants.zig +8 -5
  14. package/src/tigerbeetle/src/ewah.zig +6 -5
  15. package/src/tigerbeetle/src/ewah_fuzz.zig +1 -1
  16. package/src/tigerbeetle/src/io/darwin.zig +19 -0
  17. package/src/tigerbeetle/src/io/linux.zig +8 -0
  18. package/src/tigerbeetle/src/io/windows.zig +20 -2
  19. package/src/tigerbeetle/src/iops.zig +7 -1
  20. package/src/tigerbeetle/src/lsm/compaction.zig +27 -72
  21. package/src/tigerbeetle/src/lsm/forest_fuzz.zig +10 -11
  22. package/src/tigerbeetle/src/lsm/grid.zig +267 -267
  23. package/src/tigerbeetle/src/lsm/groove.zig +3 -0
  24. package/src/tigerbeetle/src/lsm/level_iterator.zig +18 -1
  25. package/src/tigerbeetle/src/lsm/manifest.zig +29 -1
  26. package/src/tigerbeetle/src/lsm/manifest_level.zig +1 -0
  27. package/src/tigerbeetle/src/lsm/manifest_log.zig +5 -5
  28. package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +19 -11
  29. package/src/tigerbeetle/src/lsm/merge_iterator.zig +106 -0
  30. package/src/tigerbeetle/src/lsm/posted_groove.zig +1 -0
  31. package/src/tigerbeetle/src/lsm/segmented_array.zig +1 -0
  32. package/src/tigerbeetle/src/lsm/set_associative_cache.zig +26 -70
  33. package/src/tigerbeetle/src/lsm/table.zig +56 -0
  34. package/src/tigerbeetle/src/lsm/table_iterator.zig +29 -2
  35. package/src/tigerbeetle/src/lsm/table_mutable.zig +49 -15
  36. package/src/tigerbeetle/src/lsm/test.zig +10 -7
  37. package/src/tigerbeetle/src/lsm/tree.zig +27 -6
  38. package/src/tigerbeetle/src/lsm/tree_fuzz.zig +302 -263
  39. package/src/tigerbeetle/src/message_pool.zig +2 -1
  40. package/src/tigerbeetle/src/simulator.zig +22 -84
  41. package/src/tigerbeetle/src/{test/accounting → state_machine}/auditor.zig +8 -8
  42. package/src/tigerbeetle/src/{test/accounting → state_machine}/workload.zig +108 -48
  43. package/src/tigerbeetle/src/state_machine.zig +20 -14
  44. package/src/tigerbeetle/src/storage.zig +58 -6
  45. package/src/tigerbeetle/src/test/cluster.zig +14 -11
  46. package/src/tigerbeetle/src/test/conductor.zig +2 -3
  47. package/src/tigerbeetle/src/test/id.zig +10 -0
  48. package/src/tigerbeetle/src/test/state_checker.zig +1 -1
  49. package/src/tigerbeetle/src/test/state_machine.zig +151 -46
  50. package/src/tigerbeetle/src/test/storage.zig +22 -1
  51. package/src/tigerbeetle/src/tigerbeetle.zig +0 -1
  52. package/src/tigerbeetle/src/tracer.zig +50 -28
  53. package/src/tigerbeetle/src/unit_tests.zig +11 -6
  54. package/src/tigerbeetle/src/vopr.zig +4 -4
  55. package/src/tigerbeetle/src/vsr/client.zig +5 -5
  56. package/src/tigerbeetle/src/vsr/clock.zig +2 -2
  57. package/src/tigerbeetle/src/vsr/journal.zig +647 -537
  58. package/src/tigerbeetle/src/vsr/replica.zig +333 -333
  59. package/src/tigerbeetle/src/vsr/replica_format.zig +7 -4
  60. package/src/tigerbeetle/src/vsr/superblock.zig +87 -39
  61. package/src/tigerbeetle/src/vsr/superblock_free_set.zig +114 -93
  62. package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +1 -1
  63. package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +11 -8
  64. package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +3 -3
  65. package/src/tigerbeetle/src/vsr.zig +60 -13
  66. package/src/tigerbeetle/src/c/tb_client/context.zig +0 -304
  67. package/src/tigerbeetle/src/c/tb_client/echo_client.zig +0 -108
  68. package/src/tigerbeetle/src/c/tb_client/packet.zig +0 -80
  69. package/src/tigerbeetle/src/c/tb_client/signal.zig +0 -286
  70. package/src/tigerbeetle/src/c/tb_client/thread.zig +0 -88
  71. package/src/tigerbeetle/src/c/tb_client.h +0 -221
  72. package/src/tigerbeetle/src/c/tb_client.zig +0 -177
  73. package/src/tigerbeetle/src/c/tb_client_header.zig +0 -218
  74. package/src/tigerbeetle/src/c/tb_client_header_test.zig +0 -135
  75. package/src/tigerbeetle/src/c/test.zig +0 -371
  76. package/src/tigerbeetle/src/cli.zig +0 -375
  77. package/src/tigerbeetle/src/main.zig +0 -245
@@ -1 +1 @@
1
- 004fa5f957fa7933ae697abff26d8e6879ebef4257a380594a24c92d285b07d8 dist/client.node
1
+ 47b1ff2fdba97cebd987a6012cd302a640a6f0710645f4e3dfd0d3570c2686f9 dist/client.node
package/dist/index.d.ts CHANGED
@@ -79,48 +79,47 @@ export declare enum CreateTransferError {
79
79
  credit_account_id_must_not_be_int_max = 10,
80
80
  accounts_must_be_different = 11,
81
81
  pending_id_must_be_zero = 12,
82
- pending_transfer_must_timeout = 13,
83
- ledger_must_not_be_zero = 14,
84
- code_must_not_be_zero = 15,
85
- amount_must_not_be_zero = 16,
86
- debit_account_not_found = 17,
87
- credit_account_not_found = 18,
88
- accounts_must_have_the_same_ledger = 19,
89
- transfer_must_have_the_same_ledger_as_accounts = 20,
90
- exists_with_different_flags = 21,
91
- exists_with_different_debit_account_id = 22,
92
- exists_with_different_credit_account_id = 23,
93
- exists_with_different_user_data = 24,
94
- exists_with_different_pending_id = 25,
95
- exists_with_different_timeout = 26,
96
- exists_with_different_code = 27,
97
- exists_with_different_amount = 28,
98
- exists = 29,
99
- overflows_debits_pending = 30,
100
- overflows_credits_pending = 31,
101
- overflows_debits_posted = 32,
102
- overflows_credits_posted = 33,
103
- overflows_debits = 34,
104
- overflows_credits = 35,
105
- exceeds_credits = 36,
106
- exceeds_debits = 37,
107
- cannot_post_and_void_pending_transfer = 38,
108
- pending_transfer_cannot_post_or_void_another = 39,
109
- timeout_reserved_for_pending_transfer = 40,
110
- pending_id_must_not_be_zero = 41,
111
- pending_id_must_not_be_int_max = 42,
112
- pending_id_must_be_different = 43,
113
- pending_transfer_not_found = 44,
114
- pending_transfer_not_pending = 45,
115
- pending_transfer_has_different_debit_account_id = 46,
116
- pending_transfer_has_different_credit_account_id = 47,
117
- pending_transfer_has_different_ledger = 48,
118
- pending_transfer_has_different_code = 49,
119
- exceeds_pending_transfer_amount = 50,
120
- pending_transfer_has_different_amount = 51,
121
- pending_transfer_already_posted = 52,
122
- pending_transfer_already_voided = 53,
123
- pending_transfer_expired = 54
82
+ ledger_must_not_be_zero = 13,
83
+ code_must_not_be_zero = 14,
84
+ amount_must_not_be_zero = 15,
85
+ debit_account_not_found = 16,
86
+ credit_account_not_found = 17,
87
+ accounts_must_have_the_same_ledger = 18,
88
+ transfer_must_have_the_same_ledger_as_accounts = 19,
89
+ exists_with_different_flags = 20,
90
+ exists_with_different_debit_account_id = 21,
91
+ exists_with_different_credit_account_id = 22,
92
+ exists_with_different_user_data = 23,
93
+ exists_with_different_pending_id = 24,
94
+ exists_with_different_timeout = 25,
95
+ exists_with_different_code = 26,
96
+ exists_with_different_amount = 27,
97
+ exists = 28,
98
+ overflows_debits_pending = 29,
99
+ overflows_credits_pending = 30,
100
+ overflows_debits_posted = 31,
101
+ overflows_credits_posted = 32,
102
+ overflows_debits = 33,
103
+ overflows_credits = 34,
104
+ exceeds_credits = 35,
105
+ exceeds_debits = 36,
106
+ cannot_post_and_void_pending_transfer = 37,
107
+ pending_transfer_cannot_post_or_void_another = 38,
108
+ timeout_reserved_for_pending_transfer = 39,
109
+ pending_id_must_not_be_zero = 40,
110
+ pending_id_must_not_be_int_max = 41,
111
+ pending_id_must_be_different = 42,
112
+ pending_transfer_not_found = 43,
113
+ pending_transfer_not_pending = 44,
114
+ pending_transfer_has_different_debit_account_id = 45,
115
+ pending_transfer_has_different_credit_account_id = 46,
116
+ pending_transfer_has_different_ledger = 47,
117
+ pending_transfer_has_different_code = 48,
118
+ exceeds_pending_transfer_amount = 49,
119
+ pending_transfer_has_different_amount = 50,
120
+ pending_transfer_already_posted = 51,
121
+ pending_transfer_already_voided = 52,
122
+ pending_transfer_expired = 53
124
123
  }
125
124
  export declare type CreateTransfersError = {
126
125
  index: number;
package/dist/index.js CHANGED
@@ -50,48 +50,47 @@ var CreateTransferError;
50
50
  CreateTransferError[CreateTransferError["credit_account_id_must_not_be_int_max"] = 10] = "credit_account_id_must_not_be_int_max";
51
51
  CreateTransferError[CreateTransferError["accounts_must_be_different"] = 11] = "accounts_must_be_different";
52
52
  CreateTransferError[CreateTransferError["pending_id_must_be_zero"] = 12] = "pending_id_must_be_zero";
53
- CreateTransferError[CreateTransferError["pending_transfer_must_timeout"] = 13] = "pending_transfer_must_timeout";
54
- CreateTransferError[CreateTransferError["ledger_must_not_be_zero"] = 14] = "ledger_must_not_be_zero";
55
- CreateTransferError[CreateTransferError["code_must_not_be_zero"] = 15] = "code_must_not_be_zero";
56
- CreateTransferError[CreateTransferError["amount_must_not_be_zero"] = 16] = "amount_must_not_be_zero";
57
- CreateTransferError[CreateTransferError["debit_account_not_found"] = 17] = "debit_account_not_found";
58
- CreateTransferError[CreateTransferError["credit_account_not_found"] = 18] = "credit_account_not_found";
59
- CreateTransferError[CreateTransferError["accounts_must_have_the_same_ledger"] = 19] = "accounts_must_have_the_same_ledger";
60
- CreateTransferError[CreateTransferError["transfer_must_have_the_same_ledger_as_accounts"] = 20] = "transfer_must_have_the_same_ledger_as_accounts";
61
- CreateTransferError[CreateTransferError["exists_with_different_flags"] = 21] = "exists_with_different_flags";
62
- CreateTransferError[CreateTransferError["exists_with_different_debit_account_id"] = 22] = "exists_with_different_debit_account_id";
63
- CreateTransferError[CreateTransferError["exists_with_different_credit_account_id"] = 23] = "exists_with_different_credit_account_id";
64
- CreateTransferError[CreateTransferError["exists_with_different_user_data"] = 24] = "exists_with_different_user_data";
65
- CreateTransferError[CreateTransferError["exists_with_different_pending_id"] = 25] = "exists_with_different_pending_id";
66
- CreateTransferError[CreateTransferError["exists_with_different_timeout"] = 26] = "exists_with_different_timeout";
67
- CreateTransferError[CreateTransferError["exists_with_different_code"] = 27] = "exists_with_different_code";
68
- CreateTransferError[CreateTransferError["exists_with_different_amount"] = 28] = "exists_with_different_amount";
69
- CreateTransferError[CreateTransferError["exists"] = 29] = "exists";
70
- CreateTransferError[CreateTransferError["overflows_debits_pending"] = 30] = "overflows_debits_pending";
71
- CreateTransferError[CreateTransferError["overflows_credits_pending"] = 31] = "overflows_credits_pending";
72
- CreateTransferError[CreateTransferError["overflows_debits_posted"] = 32] = "overflows_debits_posted";
73
- CreateTransferError[CreateTransferError["overflows_credits_posted"] = 33] = "overflows_credits_posted";
74
- CreateTransferError[CreateTransferError["overflows_debits"] = 34] = "overflows_debits";
75
- CreateTransferError[CreateTransferError["overflows_credits"] = 35] = "overflows_credits";
76
- CreateTransferError[CreateTransferError["exceeds_credits"] = 36] = "exceeds_credits";
77
- CreateTransferError[CreateTransferError["exceeds_debits"] = 37] = "exceeds_debits";
78
- CreateTransferError[CreateTransferError["cannot_post_and_void_pending_transfer"] = 38] = "cannot_post_and_void_pending_transfer";
79
- CreateTransferError[CreateTransferError["pending_transfer_cannot_post_or_void_another"] = 39] = "pending_transfer_cannot_post_or_void_another";
80
- CreateTransferError[CreateTransferError["timeout_reserved_for_pending_transfer"] = 40] = "timeout_reserved_for_pending_transfer";
81
- CreateTransferError[CreateTransferError["pending_id_must_not_be_zero"] = 41] = "pending_id_must_not_be_zero";
82
- CreateTransferError[CreateTransferError["pending_id_must_not_be_int_max"] = 42] = "pending_id_must_not_be_int_max";
83
- CreateTransferError[CreateTransferError["pending_id_must_be_different"] = 43] = "pending_id_must_be_different";
84
- CreateTransferError[CreateTransferError["pending_transfer_not_found"] = 44] = "pending_transfer_not_found";
85
- CreateTransferError[CreateTransferError["pending_transfer_not_pending"] = 45] = "pending_transfer_not_pending";
86
- CreateTransferError[CreateTransferError["pending_transfer_has_different_debit_account_id"] = 46] = "pending_transfer_has_different_debit_account_id";
87
- CreateTransferError[CreateTransferError["pending_transfer_has_different_credit_account_id"] = 47] = "pending_transfer_has_different_credit_account_id";
88
- CreateTransferError[CreateTransferError["pending_transfer_has_different_ledger"] = 48] = "pending_transfer_has_different_ledger";
89
- CreateTransferError[CreateTransferError["pending_transfer_has_different_code"] = 49] = "pending_transfer_has_different_code";
90
- CreateTransferError[CreateTransferError["exceeds_pending_transfer_amount"] = 50] = "exceeds_pending_transfer_amount";
91
- CreateTransferError[CreateTransferError["pending_transfer_has_different_amount"] = 51] = "pending_transfer_has_different_amount";
92
- CreateTransferError[CreateTransferError["pending_transfer_already_posted"] = 52] = "pending_transfer_already_posted";
93
- CreateTransferError[CreateTransferError["pending_transfer_already_voided"] = 53] = "pending_transfer_already_voided";
94
- CreateTransferError[CreateTransferError["pending_transfer_expired"] = 54] = "pending_transfer_expired";
53
+ CreateTransferError[CreateTransferError["ledger_must_not_be_zero"] = 13] = "ledger_must_not_be_zero";
54
+ CreateTransferError[CreateTransferError["code_must_not_be_zero"] = 14] = "code_must_not_be_zero";
55
+ CreateTransferError[CreateTransferError["amount_must_not_be_zero"] = 15] = "amount_must_not_be_zero";
56
+ CreateTransferError[CreateTransferError["debit_account_not_found"] = 16] = "debit_account_not_found";
57
+ CreateTransferError[CreateTransferError["credit_account_not_found"] = 17] = "credit_account_not_found";
58
+ CreateTransferError[CreateTransferError["accounts_must_have_the_same_ledger"] = 18] = "accounts_must_have_the_same_ledger";
59
+ CreateTransferError[CreateTransferError["transfer_must_have_the_same_ledger_as_accounts"] = 19] = "transfer_must_have_the_same_ledger_as_accounts";
60
+ CreateTransferError[CreateTransferError["exists_with_different_flags"] = 20] = "exists_with_different_flags";
61
+ CreateTransferError[CreateTransferError["exists_with_different_debit_account_id"] = 21] = "exists_with_different_debit_account_id";
62
+ CreateTransferError[CreateTransferError["exists_with_different_credit_account_id"] = 22] = "exists_with_different_credit_account_id";
63
+ CreateTransferError[CreateTransferError["exists_with_different_user_data"] = 23] = "exists_with_different_user_data";
64
+ CreateTransferError[CreateTransferError["exists_with_different_pending_id"] = 24] = "exists_with_different_pending_id";
65
+ CreateTransferError[CreateTransferError["exists_with_different_timeout"] = 25] = "exists_with_different_timeout";
66
+ CreateTransferError[CreateTransferError["exists_with_different_code"] = 26] = "exists_with_different_code";
67
+ CreateTransferError[CreateTransferError["exists_with_different_amount"] = 27] = "exists_with_different_amount";
68
+ CreateTransferError[CreateTransferError["exists"] = 28] = "exists";
69
+ CreateTransferError[CreateTransferError["overflows_debits_pending"] = 29] = "overflows_debits_pending";
70
+ CreateTransferError[CreateTransferError["overflows_credits_pending"] = 30] = "overflows_credits_pending";
71
+ CreateTransferError[CreateTransferError["overflows_debits_posted"] = 31] = "overflows_debits_posted";
72
+ CreateTransferError[CreateTransferError["overflows_credits_posted"] = 32] = "overflows_credits_posted";
73
+ CreateTransferError[CreateTransferError["overflows_debits"] = 33] = "overflows_debits";
74
+ CreateTransferError[CreateTransferError["overflows_credits"] = 34] = "overflows_credits";
75
+ CreateTransferError[CreateTransferError["exceeds_credits"] = 35] = "exceeds_credits";
76
+ CreateTransferError[CreateTransferError["exceeds_debits"] = 36] = "exceeds_debits";
77
+ CreateTransferError[CreateTransferError["cannot_post_and_void_pending_transfer"] = 37] = "cannot_post_and_void_pending_transfer";
78
+ CreateTransferError[CreateTransferError["pending_transfer_cannot_post_or_void_another"] = 38] = "pending_transfer_cannot_post_or_void_another";
79
+ CreateTransferError[CreateTransferError["timeout_reserved_for_pending_transfer"] = 39] = "timeout_reserved_for_pending_transfer";
80
+ CreateTransferError[CreateTransferError["pending_id_must_not_be_zero"] = 40] = "pending_id_must_not_be_zero";
81
+ CreateTransferError[CreateTransferError["pending_id_must_not_be_int_max"] = 41] = "pending_id_must_not_be_int_max";
82
+ CreateTransferError[CreateTransferError["pending_id_must_be_different"] = 42] = "pending_id_must_be_different";
83
+ CreateTransferError[CreateTransferError["pending_transfer_not_found"] = 43] = "pending_transfer_not_found";
84
+ CreateTransferError[CreateTransferError["pending_transfer_not_pending"] = 44] = "pending_transfer_not_pending";
85
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_debit_account_id"] = 45] = "pending_transfer_has_different_debit_account_id";
86
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_credit_account_id"] = 46] = "pending_transfer_has_different_credit_account_id";
87
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_ledger"] = 47] = "pending_transfer_has_different_ledger";
88
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_code"] = 48] = "pending_transfer_has_different_code";
89
+ CreateTransferError[CreateTransferError["exceeds_pending_transfer_amount"] = 49] = "exceeds_pending_transfer_amount";
90
+ CreateTransferError[CreateTransferError["pending_transfer_has_different_amount"] = 50] = "pending_transfer_has_different_amount";
91
+ CreateTransferError[CreateTransferError["pending_transfer_already_posted"] = 51] = "pending_transfer_already_posted";
92
+ CreateTransferError[CreateTransferError["pending_transfer_already_voided"] = 52] = "pending_transfer_already_voided";
93
+ CreateTransferError[CreateTransferError["pending_transfer_expired"] = 53] = "pending_transfer_expired";
95
94
  })(CreateTransferError = exports.CreateTransferError || (exports.CreateTransferError = {}));
96
95
  var Operation;
97
96
  (function (Operation) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const binding: Binding = require('./client.node')\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n debits_pending_must_be_zero,\n debits_posted_must_be_zero,\n credits_pending_must_be_zero,\n credits_posted_must_be_zero,\n\n mutually_exclusive_flags,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n pending_transfer_must_timeout,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const binding: Binding = require('./client.node')\ninterface Binding {\n init: (args: BindingInitArgs) => Context\n request: (context: Context, operation: Operation, batch: Event[], result: ResultCallback) => void\n raw_request: (context: Context, operation: Operation, raw_batch: Buffer, result: ResultCallback) => void\n tick: (context: Context) => void,\n deinit: (context: Context) => void,\n tick_ms: number\n}\n\ninterface BindingInitArgs {\n cluster_id: number, // u32\n replica_addresses: Buffer,\n}\n\nexport interface InitArgs {\n cluster_id: number, // u32\n replica_addresses: Array<string | number>,\n}\n\nexport type Context = object\n\nexport type Account = {\n id: bigint // u128\n user_data: bigint // u128\n reserved: Buffer // [48]u8\n ledger: number // u32, ledger of value\n code: number // u16, A chart of accounts code describing the type of account (e.g. clearing, settlement)\n flags: number // u16\n debits_pending: bigint // u64\n debits_posted: bigint // u64\n credits_pending: bigint // u64\n credits_posted: bigint // u64\n timestamp: bigint // u64, Set this to 0n - the actual value will be set by TigerBeetle server\n}\n\nexport enum AccountFlags {\n linked = (1 << 0),\n debits_must_not_exceed_credits = (1 << 1),\n credits_must_not_exceed_debits = (1 << 2)\n}\n\nexport enum CreateAccountError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n debits_pending_must_be_zero,\n debits_posted_must_be_zero,\n credits_pending_must_be_zero,\n credits_posted_must_be_zero,\n\n mutually_exclusive_flags,\n\n exists_with_different_flags,\n exists_with_different_user_data,\n exists_with_different_ledger,\n exists_with_different_code,\n exists,\n}\n\nexport type CreateAccountsError = {\n index: number,\n code: CreateAccountError,\n}\n\nexport type Transfer = {\n id: bigint, // u128\n debit_account_id: bigint, // u128\n credit_account_id: bigint, // u128\n user_data: bigint, // u128\n reserved: bigint, // u128\n pending_id: bigint, // u128\n timeout: bigint, // u64, In nanoseconds.\n ledger: number // u32, The ledger of value.\n code: number, // u16, A user-defined accounting code to describe the type of transfer (e.g. settlement).\n flags: number, // u16\n amount: bigint, // u64,\n timestamp: bigint, // u64, Set this to 0n - the timestamp will be set by TigerBeetle.\n}\n\nexport enum TransferFlags {\n linked = (1 << 0),\n pending = (1 << 1),\n post_pending_transfer = (1 << 2),\n void_pending_transfer = (1 << 3)\n}\n\nexport enum CreateTransferError {\n // ok = 0 (No Error)\n linked_event_failed = 1,\n linked_event_chain_open,\n\n reserved_flag,\n reserved_field,\n\n id_must_not_be_zero,\n id_must_not_be_int_max,\n debit_account_id_must_not_be_zero,\n debit_account_id_must_not_be_int_max,\n credit_account_id_must_not_be_zero,\n credit_account_id_must_not_be_int_max,\n accounts_must_be_different,\n\n pending_id_must_be_zero,\n\n ledger_must_not_be_zero,\n code_must_not_be_zero,\n amount_must_not_be_zero,\n\n debit_account_not_found,\n credit_account_not_found,\n\n accounts_must_have_the_same_ledger,\n transfer_must_have_the_same_ledger_as_accounts,\n\n exists_with_different_flags,\n exists_with_different_debit_account_id,\n exists_with_different_credit_account_id,\n exists_with_different_user_data,\n exists_with_different_pending_id,\n exists_with_different_timeout,\n exists_with_different_code,\n exists_with_different_amount,\n exists,\n\n overflows_debits_pending,\n overflows_credits_pending,\n overflows_debits_posted,\n overflows_credits_posted,\n overflows_debits,\n overflows_credits,\n\n exceeds_credits,\n exceeds_debits,\n\n cannot_post_and_void_pending_transfer,\n pending_transfer_cannot_post_or_void_another,\n timeout_reserved_for_pending_transfer,\n\n pending_id_must_not_be_zero,\n pending_id_must_not_be_int_max,\n pending_id_must_be_different,\n\n pending_transfer_not_found,\n pending_transfer_not_pending,\n\n pending_transfer_has_different_debit_account_id,\n pending_transfer_has_different_credit_account_id,\n pending_transfer_has_different_ledger,\n pending_transfer_has_different_code,\n\n exceeds_pending_transfer_amount,\n pending_transfer_has_different_amount,\n\n pending_transfer_already_posted,\n pending_transfer_already_voided,\n\n pending_transfer_expired,\n}\n\nexport type CreateTransfersError = {\n index: number,\n code: CreateTransferError,\n}\n\nexport type AccountID = bigint // u128\nexport type TransferID = bigint // u128\n\nexport type Event = Account | Transfer | AccountID | TransferID\nexport type Result = CreateAccountsError | CreateTransfersError | Account | Transfer\nexport type ResultCallback = (error: undefined | Error, results: Result[]) => void\n\nexport enum Operation {\n CREATE_ACCOUNT = 3,\n CREATE_TRANSFER,\n ACCOUNT_LOOKUP,\n TRANSFER_LOOKUP\n}\n\nexport interface Client {\n createAccounts: (batch: Account[]) => Promise<CreateAccountsError[]>\n createTransfers: (batch: Transfer[]) => Promise<CreateTransfersError[]>\n lookupAccounts: (batch: AccountID[]) => Promise<Account[]>\n lookupTransfers: (batch: TransferID[]) => Promise<Transfer[]>\n request: (operation: Operation, batch: Event[], callback: ResultCallback) => void\n rawRequest: (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => void\n destroy: () => void\n}\n\nlet _args: InitArgs | undefined = undefined\nconst isSameArgs = (args: InitArgs): boolean => {\n if (typeof _args === 'undefined') {\n return false\n }\n\n if (_args.replica_addresses.length !== args.replica_addresses.length) {\n return false\n }\n\n let isSameReplicas = true\n args.replica_addresses.forEach((entry, index) => {\n if (_args?.replica_addresses[index] !== entry) {\n isSameReplicas = false\n }\n })\n\n return args.cluster_id === _args.cluster_id && isSameReplicas\n}\n\nlet _client: Client | undefined = undefined\nlet _interval: NodeJS.Timeout | undefined = undefined\n// Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\nlet _pinged = false\n// TODO: allow creation of clients if the arguments are different. Will require changes in node.zig as well.\nexport function createClient (args: InitArgs): Client {\n const duplicateArgs = isSameArgs(args)\n if (!duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with different arguments.')\n }\n\n if (duplicateArgs && typeof _client !== 'undefined'){\n throw new Error('Client has already been initialized with the same arguments.')\n }\n\n _args = Object.assign({}, { ...args })\n const context = binding.init({\n ...args,\n replica_addresses: Buffer.from(args.replica_addresses.join(','))\n })\n\n const request = (operation: Operation, batch: Event[], callback: ResultCallback) => {\n binding.request(context, operation, batch, callback)\n }\n\n const rawRequest = (operation: Operation, rawBatch: Buffer, callback: ResultCallback) => {\n binding.raw_request(context, operation, rawBatch, callback)\n }\n\n const createAccounts = async (batch: Account[]): Promise<CreateAccountsError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateAccountsError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_ACCOUNT, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const createTransfers = async (batch: Transfer[]): Promise<CreateTransfersError[]> => {\n // Here to wait until `ping` is sent to server so that connection is registered - temporary till client table and sessions are implemented.\n if (!_pinged) {\n await new Promise<void>(resolve => {\n setTimeout(() => {\n _pinged = true\n resolve()\n }, 600)\n })\n }\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: CreateTransfersError[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.CREATE_TRANSFER, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupAccounts = async (batch: AccountID[]): Promise<Account[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Account[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.ACCOUNT_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const lookupTransfers = async (batch: TransferID[]): Promise<Transfer[]> => {\n return new Promise((resolve, reject) => {\n const callback = (error: undefined | Error, results: Transfer[]) => {\n if (error) {\n reject(error)\n return\n }\n resolve(results)\n }\n\n try {\n binding.request(context, Operation.TRANSFER_LOOKUP, batch, callback)\n } catch (error) {\n reject(error)\n }\n })\n }\n\n const destroy = (): void => {\n binding.deinit(context)\n if (_interval){\n clearInterval(_interval)\n }\n _client = undefined\n }\n\n _client = {\n createAccounts,\n createTransfers,\n lookupAccounts,\n lookupTransfers,\n request,\n rawRequest,\n destroy\n }\n\n _interval = setInterval(() => {\n binding.tick(context)\n }, binding.tick_ms)\n\n return _client\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tigerbeetle-node",
3
- "version": "0.11.5",
3
+ "version": "0.11.7",
4
4
  "description": "TigerBeetle Node.js client",
5
5
  "main": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -24,7 +24,7 @@
24
24
  "src/node.zig",
25
25
  "src/test.ts",
26
26
  "src/tigerbeetle/src/*.zig",
27
- "src/tigerbeetle/src/{c,io,lsm,test,vsr}",
27
+ "src/tigerbeetle/src/{c,io,lsm,test,vsr,state_machine}",
28
28
  "src/tigerbeetle/scripts",
29
29
  "src/translate.zig",
30
30
  "tsconfig.json"
package/src/index.ts CHANGED
@@ -110,7 +110,6 @@ export enum CreateTransferError {
110
110
  accounts_must_be_different,
111
111
 
112
112
  pending_id_must_be_zero,
113
- pending_transfer_must_timeout,
114
113
 
115
114
  ledger_must_not_be_zero,
116
115
  code_must_not_be_zero,
@@ -1,6 +1,11 @@
1
1
  @echo off
2
2
  setlocal enabledelayedexpansion
3
3
 
4
+ REM Install Zig if it does not already exist:
5
+ if not exist "zig" (
6
+ call .\scripts\install_zig.bat
7
+ )
8
+
4
9
  if "%~1" equ ":main" (
5
10
  shift /1
6
11
  goto main
@@ -22,8 +27,7 @@ echo.
22
27
  exit /b
23
28
 
24
29
  :main
25
- zig\zig.exe build -Drelease-safe
26
- move zig-out\bin\tigerbeetle.exe . >nul
30
+ zig\zig.exe build install -Drelease-safe
27
31
 
28
32
  for /l %%i in (0, 1, 0) do (
29
33
  echo Initializing replica %%i
@@ -43,5 +47,5 @@ timeout /t 2
43
47
 
44
48
  echo.
45
49
  echo Benchmarking...
46
- zig\zig.exe run -OReleaseSafe src\benchmark.zig
50
+ zig\zig.exe build benchmark -Drelease-safe
47
51
  exit /b %errorlevel%
@@ -12,8 +12,7 @@ fi
12
12
  COLOR_RED='\033[1;31m'
13
13
  COLOR_END='\033[0m'
14
14
 
15
- zig/zig build -Drelease-safe
16
- mv zig-out/bin/tigerbeetle .
15
+ zig/zig build install -Drelease-safe
17
16
 
18
17
  function onerror {
19
18
  if [ "$?" == "0" ]; then
@@ -58,7 +57,7 @@ sleep 1
58
57
 
59
58
  echo ""
60
59
  echo "Benchmarking..."
61
- zig/zig run -OReleaseSafe src/benchmark.zig
60
+ zig/zig build benchmark -Drelease-safe
62
61
  echo ""
63
62
 
64
63
  for I in $REPLICAS
@@ -0,0 +1,7 @@
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+
4
+ call .\scripts\install_zig.bat
5
+
6
+ echo "Building TigerBeetle..."
7
+ .\zig\zig.exe build install -Dcpu=baseline -Drelease-safe
@@ -14,9 +14,8 @@ set -eu
14
14
  scripts/install_zig.sh
15
15
  if [ "$debug" = "true" ]; then
16
16
  echo "Building Tigerbeetle debug..."
17
- zig/zig build -Dcpu=baseline
17
+ zig/zig build install -Dcpu=baseline
18
18
  else
19
19
  echo "Building TigerBeetle..."
20
- zig/zig build -Dcpu=baseline -Drelease-safe
20
+ zig/zig build install -Dcpu=baseline -Drelease-safe
21
21
  fi
22
- mv zig-out/bin/tigerbeetle .
@@ -6,7 +6,6 @@ const constants = @import("constants.zig");
6
6
  const log = std.log;
7
7
  pub const log_level: std.log.Level = .err;
8
8
 
9
- const cli = @import("cli.zig");
10
9
  const IO = @import("io.zig").IO;
11
10
 
12
11
  const util = @import("util.zig");
@@ -23,7 +22,7 @@ const Client = vsr.Client(StateMachine, MessageBus);
23
22
 
24
23
  const tb = @import("tigerbeetle.zig");
25
24
 
26
- const batches_count = 100;
25
+ const batches_count = 1000;
27
26
 
28
27
  const transfers_per_batch: u32 = @divExact(
29
28
  constants.message_size_max - @sizeOf(vsr.Header),
@@ -151,7 +150,8 @@ pub fn main() !void {
151
150
 
152
151
  const result: i64 = @divFloor(@intCast(i64, transfers.len * 1000), ms);
153
152
  try stdout.print("============================================\n", .{});
154
- try stdout.print("{} transfers per second\n\n", .{result});
153
+ try stdout.print("{} batches in {} ms\n", .{ batches_count, ms });
154
+ try stdout.print("{} transfers per second\n", .{result});
155
155
  try stdout.print("max p100 latency per {} transfers = {}ms\n", .{
156
156
  transfers_per_batch,
157
157
  queue.transfers_latency_max,
@@ -21,7 +21,7 @@ pub const Config = struct {
21
21
  /// - Client configs need not equal replica configs.
22
22
  /// - Replica configs can change between restarts.
23
23
  ///
24
- /// Fields are documented within the top-level module body.
24
+ /// Fields are documented within constants.zig.
25
25
  const ConfigProcess = struct {
26
26
  log_level: std.log.Level = .info,
27
27
  tracer_backend: TracerBackend = .none,
@@ -64,7 +64,7 @@ const ConfigProcess = struct {
64
64
  /// over the cluster lifetime.
65
65
  /// - The storage formats generated by different ConfigClusters are incompatible.
66
66
  ///
67
- /// Fields are documented within the top-level module body.
67
+ /// Fields are documented within constants.zig.
68
68
  const ConfigCluster = struct {
69
69
  cache_line_size: comptime_int = 64,
70
70
  clients_max: usize,
@@ -72,7 +72,7 @@ const ConfigCluster = struct {
72
72
  journal_slot_count: usize = 1024,
73
73
  message_size_max: usize = 1 * 1024 * 1024,
74
74
  superblock_copies: comptime_int = 4,
75
- size_max: usize = 16 * 1024 * 1024 * 1024 * 1024,
75
+ storage_size_max: u64 = 16 * 1024 * 1024 * 1024 * 1024,
76
76
  block_size: comptime_int = 64 * 1024,
77
77
  lsm_levels: u7 = 7,
78
78
  lsm_growth_factor: u32 = 8,
@@ -80,6 +80,7 @@ const ConfigCluster = struct {
80
80
  lsm_batch_multiple: comptime_int = 4,
81
81
  lsm_snapshots_max: usize = 32,
82
82
  lsm_value_to_key_layout_ratio_min: comptime_int = 16,
83
+ state_machine: StateMachine = .accounting,
83
84
 
84
85
  /// The WAL requires at least two sectors of redundant headers — otherwise we could lose them all to
85
86
  /// a single torn write. A replica needs at least one valid redundant header to determine an
@@ -102,6 +103,13 @@ const ConfigCluster = struct {
102
103
  }
103
104
  };
104
105
 
106
+ pub const ConfigBase = enum {
107
+ production,
108
+ development,
109
+ test_min,
110
+ default,
111
+ };
112
+
105
113
  pub const TracerBackend = enum {
106
114
  none,
107
115
  // Writes to a file (./tracer.json) which can be uploaded to https://ui.perfetto.dev/
@@ -110,6 +118,11 @@ pub const TracerBackend = enum {
110
118
  tracy,
111
119
  };
112
120
 
121
+ pub const StateMachine = enum {
122
+ accounting,
123
+ testing,
124
+ };
125
+
113
126
  pub const configs = struct {
114
127
  /// A good default config for production.
115
128
  pub const default_production = Config{
@@ -156,6 +169,7 @@ pub const configs = struct {
156
169
  .clients_max = 4,
157
170
  .journal_slot_count = Config.Cluster.journal_slot_count_min,
158
171
  .message_size_max = Config.Cluster.message_size_max_min(2),
172
+ .storage_size_max = 1024 * 1024 * 1024,
159
173
 
160
174
  .block_size = sector_size,
161
175
  .lsm_growth_factor = 4,
@@ -182,6 +196,13 @@ pub const configs = struct {
182
196
  .test_min => test_min,
183
197
  };
184
198
 
199
+ base.cluster.state_machine = if (@hasDecl(root, "decode_events"))
200
+ // TODO(DJ) This is a hack to work around the absense of tigerbeetle_build_options.
201
+ // This should be removed once the node client is built using `zig build`.
202
+ .accounting
203
+ else
204
+ @intToEnum(StateMachine, @enumToInt(build_options.config_cluster_state_machine));
205
+
185
206
  // TODO Use additional build options to overwrite other fields.
186
207
  base.process.tracer_backend = if (@hasDecl(root, "tracer_backend"))
187
208
  // TODO(jamii)
@@ -21,6 +21,12 @@ pub const tracer_backend = config.process.tracer_backend;
21
21
  /// The maximum number of replicas allowed in a cluster.
22
22
  pub const replicas_max = 6;
23
23
 
24
+ pub const state_machine = config.cluster.state_machine;
25
+ pub const StateMachineType = switch (config.cluster.state_machine) {
26
+ .accounting => @import("state_machine.zig").StateMachineType,
27
+ .testing => @import("test/state_machine.zig").StateMachineType,
28
+ };
29
+
24
30
  /// The maximum number of clients allowed per cluster, where each client has a unique 128-bit ID.
25
31
  /// This impacts the amount of memory allocated at initialization by the server.
26
32
  /// This determines the size of the VR client table used to cache replies to clients by client ID.
@@ -289,8 +295,7 @@ comptime {
289
295
  /// * replicated storage overhead, since all data files are mirrored,
290
296
  /// * the size of the superblock storage zone, and
291
297
  /// * the static memory allocation required for tracking LSM forest metadata in memory.
292
- // TODO Remove, now that we have block_count_max.
293
- pub const size_max = config.cluster.size_max;
298
+ pub const storage_size_max = config.cluster.storage_size_max;
294
299
 
295
300
  /// The unit of read/write access to LSM manifest and LSM table blocks in the block storage zone.
296
301
  ///
@@ -298,8 +303,6 @@ pub const size_max = config.cluster.size_max;
298
303
  /// - A higher block size increases space amplification due to partially-filled blocks.
299
304
  pub const block_size = config.cluster.block_size;
300
305
 
301
- pub const block_count_max = @divExact(16 * 1024 * 1024 * 1024 * 1024, block_size);
302
-
303
306
  comptime {
304
307
  assert(block_size % sector_size == 0);
305
308
  assert(lsm_table_size_max % sector_size == 0);
@@ -380,7 +383,7 @@ pub const clock_epoch_max_ms = config.process.clock_epoch_max_ms;
380
383
 
381
384
  /// The amount of time to wait for enough accurate samples before synchronizing the clock.
382
385
  /// The more samples we can take per remote clock source, the more accurate our estimation becomes.
383
- /// This impacts cluster startup time as the leader must first wait for synchronization to complete.
386
+ /// This impacts cluster startup time as the primary must first wait for synchronization to complete.
384
387
  pub const clock_synchronization_window_min_ms = config.process.clock_synchronization_window_min_ms;
385
388
 
386
389
  /// The amount of time without agreement before the clock window is expired and a new window opened.
@@ -64,7 +64,6 @@ pub fn ewah(comptime Word: type) type {
64
64
  // so that we can test invalid encodings.
65
65
  pub fn decode(source: []align(@alignOf(Word)) const u8, target_words: []Word) usize {
66
66
  assert(source.len % @sizeOf(Word) == 0);
67
- assert(source.len >= @sizeOf(Marker));
68
67
  assert(disjoint_slices(u8, Word, source, target_words));
69
68
 
70
69
  const source_words = mem.bytesAsSlice(Word, source);
@@ -95,7 +94,6 @@ pub fn ewah(comptime Word: type) type {
95
94
 
96
95
  // Returns the number of bytes written to `target`.
97
96
  pub fn encode(source_words: []const Word, target: []align(@alignOf(Word)) u8) usize {
98
- assert(target.len >= @sizeOf(Marker));
99
97
  assert(target.len == encode_size_max(source_words.len));
100
98
  assert(disjoint_slices(Word, u8, source_words, target));
101
99
 
@@ -149,8 +147,6 @@ pub fn ewah(comptime Word: type) type {
149
147
  /// Assumes (pessimistically) that every word will be encoded as a literal.
150
148
  pub fn encode_size_max(word_count: usize) usize {
151
149
  const marker_count = div_ceil(word_count, marker_literal_word_count_max);
152
- assert(marker_count != 0);
153
-
154
150
  return marker_count * @sizeOf(Marker) + word_count * @sizeOf(Word);
155
151
  }
156
152
 
@@ -178,7 +174,7 @@ test "ewah encode→decode cycle" {
178
174
  }
179
175
  }
180
176
 
181
- test "ewah Word=u8 decode→encode→decode" {
177
+ test "ewah Word=u8" {
182
178
  try test_decode_with_word(u8);
183
179
 
184
180
  const codec = ewah(u8);
@@ -195,6 +191,9 @@ test "ewah Word=u8 decode→encode→decode" {
195
191
  56,
196
192
  });
197
193
  }
194
+
195
+ try std.testing.expectEqual(codec.encode_size_max(0), 0);
196
+ try std.testing.expectEqual(codec.encode(&.{}, &.{}), 0);
198
197
  }
199
198
 
200
199
  test "ewah Word=u16" {
@@ -205,6 +204,8 @@ test "ewah Word=u16" {
205
204
  fn test_decode_with_word(comptime Word: type) !void {
206
205
  const codec = ewah(Word);
207
206
 
207
+ // No set bits.
208
+ try test_decode(Word, &.{});
208
209
  // Alternating runs, no literals.
209
210
  try test_decode(Word, &.{
210
211
  codec.marker_word(.{ .uniform_bit = 0, .uniform_word_count = 2, .literal_word_count = 0 }),
@@ -17,7 +17,7 @@ pub fn main() !void {
17
17
  const random = prng.random();
18
18
 
19
19
  const decoded_size_max = @divExact(1024 * 1024, @sizeOf(Word));
20
- const decoded_size = 1 + random.uintLessThan(usize, decoded_size_max);
20
+ const decoded_size = random.uintLessThan(usize, 1 + decoded_size_max);
21
21
  const decoded = try allocator.alloc(Word, decoded_size);
22
22
  defer allocator.free(decoded);
23
23
 
@@ -571,6 +571,25 @@ pub const IO = struct {
571
571
  completion: *Completion,
572
572
  nanoseconds: u63,
573
573
  ) void {
574
+ // Special case a zero timeout as a yield.
575
+ if (nanoseconds == 0) {
576
+ completion.* = .{
577
+ .next = null,
578
+ .context = context,
579
+ .operation = undefined,
580
+ .callback = struct {
581
+ fn on_complete(_io: *IO, _completion: *Completion) void {
582
+ _ = _io;
583
+ const _context = @intToPtr(Context, @ptrToInt(_completion.context));
584
+ callback(_context, _completion, {});
585
+ }
586
+ }.on_complete,
587
+ };
588
+
589
+ self.completed.push(completion);
590
+ return;
591
+ }
592
+
574
593
  self.submit(
575
594
  context,
576
595
  callback,
@@ -819,6 +819,14 @@ pub const IO = struct {
819
819
  },
820
820
  },
821
821
  };
822
+
823
+ // Special case a zero timeout as a yield.
824
+ if (nanoseconds == 0) {
825
+ completion.result = -@intCast(i32, @enumToInt(std.os.E.TIME));
826
+ self.completed.push(completion);
827
+ return;
828
+ }
829
+
822
830
  self.enqueue(completion);
823
831
  }
824
832