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.
- package/dist/.client.node.sha256 +1 -1
- package/dist/index.d.ts +41 -42
- package/dist/index.js +41 -42
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +0 -1
- package/src/tigerbeetle/scripts/benchmark.bat +7 -3
- package/src/tigerbeetle/scripts/benchmark.sh +2 -3
- package/src/tigerbeetle/scripts/install.bat +7 -0
- package/src/tigerbeetle/scripts/install.sh +2 -3
- package/src/tigerbeetle/src/benchmark.zig +3 -3
- package/src/tigerbeetle/src/config.zig +24 -3
- package/src/tigerbeetle/src/constants.zig +8 -5
- package/src/tigerbeetle/src/ewah.zig +6 -5
- package/src/tigerbeetle/src/ewah_fuzz.zig +1 -1
- package/src/tigerbeetle/src/io/darwin.zig +19 -0
- package/src/tigerbeetle/src/io/linux.zig +8 -0
- package/src/tigerbeetle/src/io/windows.zig +20 -2
- package/src/tigerbeetle/src/iops.zig +7 -1
- package/src/tigerbeetle/src/lsm/compaction.zig +27 -72
- package/src/tigerbeetle/src/lsm/forest_fuzz.zig +10 -11
- package/src/tigerbeetle/src/lsm/grid.zig +267 -267
- package/src/tigerbeetle/src/lsm/groove.zig +3 -0
- package/src/tigerbeetle/src/lsm/level_iterator.zig +18 -1
- package/src/tigerbeetle/src/lsm/manifest.zig +29 -1
- package/src/tigerbeetle/src/lsm/manifest_level.zig +1 -0
- package/src/tigerbeetle/src/lsm/manifest_log.zig +5 -5
- package/src/tigerbeetle/src/lsm/manifest_log_fuzz.zig +19 -11
- package/src/tigerbeetle/src/lsm/merge_iterator.zig +106 -0
- package/src/tigerbeetle/src/lsm/posted_groove.zig +1 -0
- package/src/tigerbeetle/src/lsm/segmented_array.zig +1 -0
- package/src/tigerbeetle/src/lsm/set_associative_cache.zig +26 -70
- package/src/tigerbeetle/src/lsm/table.zig +56 -0
- package/src/tigerbeetle/src/lsm/table_iterator.zig +29 -2
- package/src/tigerbeetle/src/lsm/table_mutable.zig +49 -15
- package/src/tigerbeetle/src/lsm/test.zig +10 -7
- package/src/tigerbeetle/src/lsm/tree.zig +27 -6
- package/src/tigerbeetle/src/lsm/tree_fuzz.zig +302 -263
- package/src/tigerbeetle/src/message_pool.zig +2 -1
- package/src/tigerbeetle/src/simulator.zig +22 -84
- package/src/tigerbeetle/src/{test/accounting → state_machine}/auditor.zig +8 -8
- package/src/tigerbeetle/src/{test/accounting → state_machine}/workload.zig +108 -48
- package/src/tigerbeetle/src/state_machine.zig +20 -14
- package/src/tigerbeetle/src/storage.zig +58 -6
- package/src/tigerbeetle/src/test/cluster.zig +14 -11
- package/src/tigerbeetle/src/test/conductor.zig +2 -3
- package/src/tigerbeetle/src/test/id.zig +10 -0
- package/src/tigerbeetle/src/test/state_checker.zig +1 -1
- package/src/tigerbeetle/src/test/state_machine.zig +151 -46
- package/src/tigerbeetle/src/test/storage.zig +22 -1
- package/src/tigerbeetle/src/tigerbeetle.zig +0 -1
- package/src/tigerbeetle/src/tracer.zig +50 -28
- package/src/tigerbeetle/src/unit_tests.zig +11 -6
- package/src/tigerbeetle/src/vopr.zig +4 -4
- package/src/tigerbeetle/src/vsr/client.zig +5 -5
- package/src/tigerbeetle/src/vsr/clock.zig +2 -2
- package/src/tigerbeetle/src/vsr/journal.zig +647 -537
- package/src/tigerbeetle/src/vsr/replica.zig +333 -333
- package/src/tigerbeetle/src/vsr/replica_format.zig +7 -4
- package/src/tigerbeetle/src/vsr/superblock.zig +87 -39
- package/src/tigerbeetle/src/vsr/superblock_free_set.zig +114 -93
- package/src/tigerbeetle/src/vsr/superblock_free_set_fuzz.zig +1 -1
- package/src/tigerbeetle/src/vsr/superblock_fuzz.zig +11 -8
- package/src/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +3 -3
- package/src/tigerbeetle/src/vsr.zig +60 -13
- package/src/tigerbeetle/src/c/tb_client/context.zig +0 -304
- package/src/tigerbeetle/src/c/tb_client/echo_client.zig +0 -108
- package/src/tigerbeetle/src/c/tb_client/packet.zig +0 -80
- package/src/tigerbeetle/src/c/tb_client/signal.zig +0 -286
- package/src/tigerbeetle/src/c/tb_client/thread.zig +0 -88
- package/src/tigerbeetle/src/c/tb_client.h +0 -221
- package/src/tigerbeetle/src/c/tb_client.zig +0 -177
- package/src/tigerbeetle/src/c/tb_client_header.zig +0 -218
- package/src/tigerbeetle/src/c/tb_client_header_test.zig +0 -135
- package/src/tigerbeetle/src/c/test.zig +0 -371
- package/src/tigerbeetle/src/cli.zig +0 -375
- package/src/tigerbeetle/src/main.zig +0 -245
package/dist/.client.node.sha256
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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["
|
|
54
|
-
CreateTransferError[CreateTransferError["
|
|
55
|
-
CreateTransferError[CreateTransferError["
|
|
56
|
-
CreateTransferError[CreateTransferError["
|
|
57
|
-
CreateTransferError[CreateTransferError["
|
|
58
|
-
CreateTransferError[CreateTransferError["
|
|
59
|
-
CreateTransferError[CreateTransferError["
|
|
60
|
-
CreateTransferError[CreateTransferError["
|
|
61
|
-
CreateTransferError[CreateTransferError["
|
|
62
|
-
CreateTransferError[CreateTransferError["
|
|
63
|
-
CreateTransferError[CreateTransferError["
|
|
64
|
-
CreateTransferError[CreateTransferError["
|
|
65
|
-
CreateTransferError[CreateTransferError["
|
|
66
|
-
CreateTransferError[CreateTransferError["
|
|
67
|
-
CreateTransferError[CreateTransferError["
|
|
68
|
-
CreateTransferError[CreateTransferError["
|
|
69
|
-
CreateTransferError[CreateTransferError["
|
|
70
|
-
CreateTransferError[CreateTransferError["
|
|
71
|
-
CreateTransferError[CreateTransferError["
|
|
72
|
-
CreateTransferError[CreateTransferError["
|
|
73
|
-
CreateTransferError[CreateTransferError["
|
|
74
|
-
CreateTransferError[CreateTransferError["
|
|
75
|
-
CreateTransferError[CreateTransferError["
|
|
76
|
-
CreateTransferError[CreateTransferError["
|
|
77
|
-
CreateTransferError[CreateTransferError["
|
|
78
|
-
CreateTransferError[CreateTransferError["
|
|
79
|
-
CreateTransferError[CreateTransferError["
|
|
80
|
-
CreateTransferError[CreateTransferError["
|
|
81
|
-
CreateTransferError[CreateTransferError["
|
|
82
|
-
CreateTransferError[CreateTransferError["
|
|
83
|
-
CreateTransferError[CreateTransferError["
|
|
84
|
-
CreateTransferError[CreateTransferError["
|
|
85
|
-
CreateTransferError[CreateTransferError["
|
|
86
|
-
CreateTransferError[CreateTransferError["
|
|
87
|
-
CreateTransferError[CreateTransferError["
|
|
88
|
-
CreateTransferError[CreateTransferError["
|
|
89
|
-
CreateTransferError[CreateTransferError["
|
|
90
|
-
CreateTransferError[CreateTransferError["
|
|
91
|
-
CreateTransferError[CreateTransferError["
|
|
92
|
-
CreateTransferError[CreateTransferError["
|
|
93
|
-
CreateTransferError[CreateTransferError["
|
|
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.
|
|
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
|
@@ -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
|
|
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
|
|
60
|
+
zig/zig build benchmark -Drelease-safe
|
|
62
61
|
echo ""
|
|
63
62
|
|
|
64
63
|
for I in $REPLICAS
|
|
@@ -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 =
|
|
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("{}
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|