From a54115f6b7f84821dfffbd5b4a7426210015682c Mon Sep 17 00:00:00 2001 From: Christien Rioux Date: Sun, 30 Mar 2025 15:42:00 -0400 Subject: [PATCH] [ci skip] stash --- veilid-cli/src/client_api_connection.rs | 4 +- veilid-core/proto/veilid.capnp | 2 +- veilid-core/proto/veilid_capnp.rs | 427 +++++++++++------- .../src/network_manager/connection_manager.rs | 13 +- .../src/network_manager/network_connection.rs | 6 +- .../src/rpc_processor/rpc_watch_value.rs | 10 +- veilid-core/src/storage_manager/debug.rs | 2 +- veilid-core/src/storage_manager/get_value.rs | 2 +- veilid-core/src/storage_manager/mod.rs | 100 ++-- .../src/storage_manager/record_store/mod.rs | 58 +-- .../record_store/opened_record.rs | 136 ------ .../src/storage_manager/record_store/watch.rs | 66 --- veilid-core/src/storage_manager/set_value.rs | 6 +- .../tasks/check_active_watches.rs | 64 --- .../tasks/check_watched_records.rs | 23 - veilid-core/src/storage_manager/tasks/mod.rs | 20 +- .../tasks/offline_subkey_writes.rs | 2 +- .../src/storage_manager/watch_value.rs | 87 +++- veilid-core/src/veilid_api/routing_context.rs | 2 +- veilid-server/src/client_api.rs | 12 +- veilid-tools/src/async_tag_lock.rs | 4 + veilid-tools/src/deferred_stream_processor.rs | 23 +- veilid-tools/src/tools.rs | 8 - .../src/virtual_network/router_client.rs | 6 +- .../src/virtual_network/router_server/mod.rs | 14 +- 25 files changed, 485 insertions(+), 612 deletions(-) delete mode 100644 veilid-core/src/storage_manager/record_store/watch.rs delete mode 100644 veilid-core/src/storage_manager/tasks/check_active_watches.rs delete mode 100644 veilid-core/src/storage_manager/tasks/check_watched_records.rs diff --git a/veilid-cli/src/client_api_connection.rs b/veilid-cli/src/client_api_connection.rs index a45356f8..6b86389c 100644 --- a/veilid-cli/src/client_api_connection.rs +++ b/veilid-cli/src/client_api_connection.rs @@ -173,7 +173,7 @@ impl ClientApiConnection { let mut inner = this.inner.lock(); inner.request_sender = None; }; - unord.push(system_boxed(recv_messages_future)); + unord.push(pin_dyn_future!(recv_messages_future)); // Requests send processor let send_requests_future = async move { @@ -183,7 +183,7 @@ impl ClientApiConnection { } } }; - unord.push(system_boxed(send_requests_future)); + unord.push(pin_dyn_future!(send_requests_future)); // Request initial server state let capi = self.clone(); diff --git a/veilid-core/proto/veilid.capnp b/veilid-core/proto/veilid.capnp index 19158696..df07b21f 100644 --- a/veilid-core/proto/veilid.capnp +++ b/veilid-core/proto/veilid.capnp @@ -353,7 +353,7 @@ struct OperationSetValueA @0x9378d0732dc95be2 { struct OperationWatchValueQ @0xf9a5a6c547b9b228 { key @0 :TypedKey; # key for value to watch - subkeys @1 :List(SubkeyRange); # subkey range to watch (up to 512 subranges), if empty this implies 0..=UINT32_MAX + subkeys @1 :List(SubkeyRange); # subkey range to watch (up to 512 subranges). An empty range here should not be specified unless cancelling a watch (count=0). expiration @2 :UInt64; # requested timestamp when this watch will expire in usec since epoch (can be return less, 0 for max) count @3 :UInt32; # requested number of changes to watch for (0 = cancel, 1 = single shot, 2+ = counter, UINT32_MAX = continuous) watchId @4 :UInt64; # if 0, request a new watch. if >0, existing watch id diff --git a/veilid-core/proto/veilid_capnp.rs b/veilid-core/proto/veilid_capnp.rs index 60f7fbf6..3434d036 100644 --- a/veilid-core/proto/veilid_capnp.rs +++ b/veilid-core/proto/veilid_capnp.rs @@ -177,13 +177,14 @@ pub mod key256 { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 78] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 79] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(13, 169, 246, 134, 50, 78, 228, 221), ::capnp::word(19, 0, 0, 0, 1, 0, 4, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(71, 0, 0, 0, 16, 1, 0, 0), ::capnp::word(21, 0, 0, 0, 210, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -504,13 +505,14 @@ pub mod signature512 { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 138] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 139] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(18, 156, 18, 58, 4, 73, 103, 128), ::capnp::word(19, 0, 0, 0, 1, 0, 8, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(18, 1, 0, 0, 133, 2, 0, 0), ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -835,13 +837,14 @@ pub mod nonce24 { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 63] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 64] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(252, 125, 141, 93, 178, 13, 38, 182), ::capnp::word(19, 0, 0, 0, 1, 0, 3, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(135, 2, 0, 0, 40, 3, 0, 0), ::capnp::word(21, 0, 0, 0, 218, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -1089,13 +1092,14 @@ pub mod typed_key { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(41, 27, 230, 241, 169, 103, 213, 226), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(203, 5, 0, 0, 75, 6, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -1327,13 +1331,14 @@ pub mod typed_signature { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(132, 56, 142, 41, 199, 112, 49, 150), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(77, 6, 0, 0, 211, 6, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -1540,13 +1545,14 @@ pub mod address_i_p_v4 { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 33] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 34] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(160, 166, 102, 18, 136, 105, 135, 219), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(40, 7, 0, 0, 169, 7, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -1771,13 +1777,14 @@ pub mod address_i_p_v6 { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 78] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 79] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(32, 92, 220, 17, 96, 110, 93, 179), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(171, 7, 0, 0, 231, 8, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -2076,13 +2083,14 @@ pub mod address { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(139, 16, 125, 229, 233, 6, 39, 129), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(233, 8, 0, 0, 125, 9, 0, 0), ::capnp::word(21, 0, 0, 0, 218, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -2320,13 +2328,14 @@ pub mod socket_address { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(98, 58, 221, 244, 114, 66, 223, 130), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(127, 9, 0, 0, 254, 9, 0, 0), ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -2429,13 +2438,14 @@ impl ::capnp::traits::HasTypeId for ProtocolKind { const TYPE_ID: u64 = 0xde0b_f578_7c06_7d5au64; } mod protocol_kind { -pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(90, 125, 6, 124, 120, 245, 11, 222), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 10, 0, 0, 169, 10, 0, 0), ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -2623,13 +2633,14 @@ pub mod dial_info_u_d_p { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(124, 74, 2, 183, 184, 168, 56, 187), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(171, 10, 0, 0, 5, 11, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -2834,13 +2845,14 @@ pub mod dial_info_t_c_p { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(252, 247, 169, 185, 113, 147, 10, 158), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(7, 11, 0, 0, 97, 11, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -3069,13 +3081,14 @@ pub mod dial_info_w_s { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(176, 21, 171, 146, 122, 95, 121, 215), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(99, 11, 0, 0, 227, 11, 0, 0), ::capnp::word(21, 0, 0, 0, 242, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -3320,13 +3333,14 @@ pub mod dial_info_w_s_s { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(4, 123, 125, 27, 164, 250, 57, 230), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(229, 11, 0, 0, 102, 12, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -3654,13 +3668,14 @@ pub mod dial_info { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 78] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 79] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(223, 239, 45, 252, 57, 28, 205, 225), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 4, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(104, 12, 0, 0, 88, 13, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -3944,13 +3959,14 @@ pub mod signal_info_hole_punch { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(154, 12, 137, 97, 104, 171, 185, 238), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(132, 13, 0, 0, 130, 14, 0, 0), ::capnp::word(21, 0, 0, 0, 58, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -4196,13 +4212,14 @@ pub mod signal_info_reverse_connect { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 51] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 52] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(19, 224, 70, 13, 189, 211, 235, 217), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(132, 14, 0, 0, 145, 15, 0, 0), ::capnp::word(21, 0, 0, 0, 98, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -4449,13 +4466,14 @@ pub mod route_hop_data { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(242, 173, 183, 209, 249, 49, 226, 140), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(196, 15, 0, 0, 79, 19, 0, 0), ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -4692,13 +4710,14 @@ pub mod route_hop { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 41] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 42] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(59, 12, 206, 92, 215, 114, 246, 248), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(81, 19, 0, 0, 193, 21, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -4957,13 +4976,14 @@ pub mod route_hop { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(33, 226, 183, 112, 125, 213, 33, 202), ::capnp::word(28, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(59, 12, 206, 92, 215, 114, 246, 248), ::capnp::word(2, 0, 7, 0, 1, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -5220,13 +5240,14 @@ pub mod private_route { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 58] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 59] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(118, 231, 81, 8, 203, 252, 131, 138), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(195, 21, 0, 0, 89, 24, 0, 0), ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -5517,13 +5538,14 @@ pub mod private_route { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 64] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 65] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(56, 83, 93, 93, 37, 237, 192, 139), ::capnp::word(32, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(118, 231, 81, 8, 203, 252, 131, 138), ::capnp::word(2, 0, 7, 0, 1, 0, 3, 0), ::capnp::word(1, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 42, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -5797,13 +5819,14 @@ pub mod safety_route { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 58] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 59] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(89, 93, 203, 7, 77, 115, 84, 245), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(92, 24, 0, 0, 83, 26, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6080,13 +6103,14 @@ pub mod safety_route { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(26, 107, 173, 97, 187, 247, 201, 172), ::capnp::word(31, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(89, 93, 203, 7, 77, 115, 84, 245), ::capnp::word(2, 0, 7, 0, 1, 0, 2, 0), ::capnp::word(1, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 34, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6195,13 +6219,14 @@ impl ::capnp::traits::HasTypeId for NetworkClass { const TYPE_ID: u64 = 0x8ceb_fc2a_6230_717fu64; } mod network_class { -pub static ENCODED_NODE: [::capnp::Word; 36] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 37] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(127, 113, 48, 98, 42, 252, 235, 140), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(130, 26, 0, 0, 125, 28, 0, 0), ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6277,13 +6302,14 @@ impl ::capnp::traits::HasTypeId for DialInfoClass { const TYPE_ID: u64 = 0x8800_05ed_fdd3_8b1eu64; } mod dial_info_class { -pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(30, 139, 211, 253, 237, 5, 0, 136), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(127, 28, 0, 0, 204, 31, 0, 0), ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6365,13 +6391,14 @@ impl ::capnp::traits::HasTypeId for Sequencing { const TYPE_ID: u64 = 0xb673_5890_f781_8a1cu64; } mod sequencing { -pub static ENCODED_NODE: [::capnp::Word; 33] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 34] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(28, 138, 129, 247, 144, 88, 115, 182), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(206, 31, 0, 0, 85, 32, 0, 0), ::capnp::word(21, 0, 0, 0, 242, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6570,13 +6597,14 @@ pub mod dial_info_detail { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(216, 116, 123, 214, 161, 58, 66, 150), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(87, 32, 0, 0, 223, 32, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6771,13 +6799,14 @@ pub mod node_status { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 17] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 18] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(13, 51, 243, 59, 122, 158, 107, 211), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(225, 32, 0, 0, 49, 33, 0, 0), ::capnp::word(21, 0, 0, 0, 242, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -6983,13 +7012,14 @@ pub mod protocol_type_set { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 79] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 80] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(38, 51, 183, 161, 85, 47, 241, 130), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(51, 33, 0, 0, 253, 33, 0, 0), ::capnp::word(21, 0, 0, 0, 26, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -7239,13 +7269,14 @@ pub mod address_type_set { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(107, 158, 52, 13, 67, 213, 82, 159), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(255, 33, 0, 0, 122, 34, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -7466,13 +7497,14 @@ pub mod sender_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(1, 209, 177, 180, 250, 100, 68, 138), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(124, 34, 0, 0, 8, 35, 0, 0), ::capnp::word(21, 0, 0, 0, 242, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -7812,13 +7844,14 @@ pub mod node_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 148] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 149] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(25, 244, 249, 227, 71, 216, 37, 225), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(6, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(10, 35, 0, 0, 171, 37, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -8179,13 +8212,14 @@ pub mod signed_direct_node_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 71] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 72] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(215, 61, 58, 137, 62, 234, 231, 224), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(173, 37, 0, 0, 199, 38, 0, 0), ::capnp::word(21, 0, 0, 0, 66, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -8516,13 +8550,14 @@ pub mod signed_relayed_node_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 108] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 109] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(187, 124, 216, 204, 40, 132, 158, 179), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(4, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(201, 38, 0, 0, 134, 40, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -8852,13 +8887,14 @@ pub mod signed_node_info { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(106, 64, 147, 245, 229, 140, 71, 210), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(136, 40, 0, 0, 143, 41, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -9109,13 +9145,14 @@ pub mod peer_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 53] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 54] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(203, 75, 60, 93, 45, 114, 45, 254), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(145, 41, 0, 0, 106, 42, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -9400,13 +9437,14 @@ pub mod routed_operation { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 85] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 86] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(221, 233, 57, 184, 53, 133, 203, 203), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(108, 42, 0, 0, 49, 44, 0, 0), ::capnp::word(21, 0, 0, 0, 26, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -9665,13 +9703,14 @@ pub mod operation_status_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 35] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 36] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(74, 136, 13, 167, 206, 128, 93, 134), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(51, 44, 0, 0, 210, 44, 0, 0), ::capnp::word(21, 0, 0, 0, 34, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -9904,13 +9943,14 @@ pub mod operation_status_a { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 51] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 52] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(85, 42, 129, 250, 7, 244, 6, 179), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(212, 44, 0, 0, 222, 45, 0, 0), ::capnp::word(21, 0, 0, 0, 34, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -10169,13 +10209,14 @@ pub mod operation_validate_dial_info { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 67] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 68] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(200, 96, 208, 213, 215, 106, 113, 188), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(224, 45, 0, 0, 72, 47, 0, 0), ::capnp::word(21, 0, 0, 0, 106, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -10412,13 +10453,14 @@ pub mod operation_return_receipt { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 35] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 36] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(235, 14, 22, 169, 181, 181, 15, 235), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(74, 47, 0, 0, 222, 47, 0, 0), ::capnp::word(21, 0, 0, 0, 82, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -10648,13 +10690,14 @@ pub mod operation_find_node_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 54] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 55] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(205, 59, 98, 233, 143, 120, 239, 253), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(224, 47, 0, 0, 202, 48, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -10877,13 +10920,14 @@ pub mod operation_find_node_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 38] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 39] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(137, 112, 199, 64, 251, 242, 76, 168), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(204, 48, 0, 0, 90, 49, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -11119,13 +11163,14 @@ pub mod operation_route { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 51] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 52] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(221, 199, 106, 206, 89, 24, 116, 150), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(92, 49, 0, 0, 45, 50, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -11345,13 +11390,14 @@ pub mod operation_app_call_q { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(7, 69, 120, 9, 159, 123, 230, 173), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(47, 50, 0, 0, 183, 50, 0, 0), ::capnp::word(21, 0, 0, 0, 42, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -11553,13 +11599,14 @@ pub mod operation_app_call_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(184, 20, 242, 133, 172, 151, 199, 247), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(185, 50, 0, 0, 68, 51, 0, 0), ::capnp::word(21, 0, 0, 0, 42, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -11761,13 +11808,14 @@ pub mod operation_app_message { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(245, 17, 180, 129, 45, 84, 175, 155), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(70, 51, 0, 0, 208, 51, 0, 0), ::capnp::word(21, 0, 0, 0, 58, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -11969,13 +12017,14 @@ pub mod subkey_range { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 48] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 49] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(28, 23, 208, 164, 192, 218, 146, 245), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(210, 51, 0, 0, 166, 52, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -12258,13 +12307,14 @@ pub mod signed_value_data { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 80] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 81] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(61, 42, 159, 22, 111, 65, 183, 180), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(172, 52, 0, 0, 199, 56, 0, 0), ::capnp::word(21, 0, 0, 0, 26, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -12569,13 +12619,14 @@ pub mod signed_value_descriptor { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 67] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 68] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(231, 176, 225, 249, 211, 28, 145, 231), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(201, 56, 0, 0, 179, 58, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -12839,13 +12890,14 @@ pub mod operation_get_value_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 65] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 66] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(208, 165, 237, 165, 109, 91, 138, 248), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(182, 58, 0, 0, 29, 60, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -13134,13 +13186,14 @@ pub mod operation_get_value_a { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 69] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 70] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(159, 36, 224, 242, 70, 187, 150, 216), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(32, 60, 0, 0, 197, 61, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -13448,13 +13501,14 @@ pub mod operation_set_value_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 80] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 81] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(197, 219, 139, 255, 145, 97, 192, 186), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(199, 61, 0, 0, 163, 63, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -13744,13 +13798,14 @@ pub mod operation_set_value_a { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 68] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 69] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(226, 91, 201, 45, 115, 208, 120, 147), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(165, 63, 0, 0, 74, 65, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -14105,13 +14160,14 @@ pub mod operation_watch_value_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 130] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 131] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(40, 178, 185, 71, 197, 166, 165, 249), ::capnp::word(19, 0, 0, 0, 1, 0, 3, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(4, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(76, 65, 0, 0, 116, 69, 0, 0), ::capnp::word(21, 0, 0, 0, 66, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -14451,13 +14507,14 @@ pub mod operation_watch_value_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 85] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 86] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(147, 168, 75, 6, 183, 202, 38, 167), ::capnp::word(19, 0, 0, 0, 1, 0, 3, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(118, 69, 0, 0, 185, 71, 0, 0), ::capnp::word(21, 0, 0, 0, 66, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -14752,13 +14809,14 @@ pub mod operation_inspect_value_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 70] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 71] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(90, 245, 22, 253, 210, 18, 247, 222), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(187, 71, 0, 0, 95, 73, 0, 0), ::capnp::word(21, 0, 0, 0, 82, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -15049,13 +15107,14 @@ pub mod operation_inspect_value_a { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 74] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 75] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(2, 225, 14, 150, 175, 127, 181, 184), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(97, 73, 0, 0, 220, 75, 0, 0), ::capnp::word(21, 0, 0, 0, 82, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -15377,13 +15436,14 @@ pub mod operation_value_changed { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 99] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 100] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(246, 27, 204, 216, 189, 158, 197, 209), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(222, 75, 0, 0, 84, 78, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -15657,13 +15717,14 @@ pub mod operation_supply_block_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 35] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 36] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(113, 153, 116, 45, 84, 76, 191, 173), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(86, 78, 0, 0, 228, 78, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -15878,13 +15939,14 @@ pub mod operation_supply_block_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 55] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 56] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(215, 192, 181, 131, 46, 130, 3, 240), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(230, 78, 0, 0, 26, 80, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -16111,13 +16173,14 @@ pub mod operation_find_block_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 34] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 35] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(86, 113, 76, 0, 255, 83, 67, 175), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(28, 80, 0, 0, 164, 80, 0, 0), ::capnp::word(21, 0, 0, 0, 58, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -16367,13 +16430,14 @@ pub mod operation_find_block_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 73] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 74] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(93, 70, 21, 73, 188, 85, 20, 197), ::capnp::word(19, 0, 0, 0, 1, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(3, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(166, 80, 0, 0, 119, 82, 0, 0), ::capnp::word(21, 0, 0, 0, 58, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -16666,13 +16730,14 @@ pub mod operation_signal { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 51] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 52] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(73, 126, 32, 93, 42, 79, 249, 212), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(121, 82, 0, 0, 42, 83, 0, 0), ::capnp::word(21, 0, 0, 0, 26, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -16779,13 +16844,14 @@ impl ::capnp::traits::HasTypeId for TunnelEndpointMode { const TYPE_ID: u64 = 0xef06_f4c2_9beb_7458u64; } mod tunnel_endpoint_mode { -pub static ENCODED_NODE: [::capnp::Word; 27] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 28] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(88, 116, 235, 155, 194, 244, 6, 239), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(44, 83, 0, 0, 230, 83, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -16848,13 +16914,14 @@ impl ::capnp::traits::HasTypeId for TunnelError { const TYPE_ID: u64 = 0xb82c_6bfb_1ec3_8c7cu64; } mod tunnel_error { -pub static ENCODED_NODE: [::capnp::Word; 37] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), +pub static ENCODED_NODE: [::capnp::Word; 38] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(124, 140, 195, 30, 251, 107, 44, 184), ::capnp::word(19, 0, 0, 0, 2, 0, 0, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(232, 83, 0, 0, 88, 85, 0, 0), ::capnp::word(21, 0, 0, 0, 250, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -17054,13 +17121,14 @@ pub mod tunnel_endpoint { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(125, 51, 204, 131, 169, 42, 96, 194), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(90, 85, 0, 0, 53, 86, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -17333,13 +17401,14 @@ pub mod full_tunnel { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 78] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 79] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(99, 63, 55, 117, 220, 195, 33, 152), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(55, 86, 0, 0, 204, 87, 0, 0), ::capnp::word(21, 0, 0, 0, 242, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -17615,13 +17684,14 @@ pub mod partial_tunnel { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 64] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 65] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(200, 47, 190, 2, 188, 126, 122, 130), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(206, 87, 0, 0, 0, 89, 0, 0), ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0), ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -17867,13 +17937,14 @@ pub mod operation_start_tunnel_q { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 66] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 67] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(175, 135, 65, 228, 252, 154, 196, 169), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(2, 89, 0, 0, 86, 90, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -18144,13 +18215,14 @@ pub mod operation_start_tunnel_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(30, 191, 97, 204, 228, 98, 129, 129), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(88, 90, 0, 0, 86, 91, 0, 0), ::capnp::word(21, 0, 0, 0, 74, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -18414,13 +18486,14 @@ pub mod operation_complete_tunnel_q { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 82] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 83] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(11, 149, 235, 136, 69, 89, 120, 233), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(88, 91, 0, 0, 9, 93, 0, 0), ::capnp::word(21, 0, 0, 0, 98, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -18708,13 +18781,14 @@ pub mod operation_complete_tunnel_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(42, 95, 118, 187, 145, 7, 9, 132), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(11, 93, 0, 0, 9, 94, 0, 0), ::capnp::word(21, 0, 0, 0, 98, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -18927,13 +19001,14 @@ pub mod operation_cancel_tunnel_q { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 35] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 36] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(56, 55, 0, 10, 174, 17, 40, 174), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(11, 94, 0, 0, 146, 94, 0, 0), ::capnp::word(21, 0, 0, 0, 82, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -19156,13 +19231,14 @@ pub mod operation_cancel_tunnel_a { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 50] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 51] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(188, 151, 255, 46, 153, 60, 162, 187), ::capnp::word(19, 0, 0, 0, 1, 0, 2, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(0, 0, 7, 0, 0, 0, 2, 0), ::capnp::word(4, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(148, 94, 0, 0, 143, 95, 0, 0), ::capnp::word(21, 0, 0, 0, 82, 1, 0, 0), ::capnp::word(41, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -19397,13 +19473,14 @@ pub mod question { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 35] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 36] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(112, 239, 146, 52, 195, 11, 81, 216), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(174, 95, 0, 0, 21, 100, 0, 0), ::capnp::word(21, 0, 0, 0, 226, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -19640,13 +19717,14 @@ pub mod question { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 49] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 50] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(37, 188, 37, 253, 21, 134, 139, 165), ::capnp::word(28, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(112, 239, 146, 52, 195, 11, 81, 216), ::capnp::word(2, 0, 7, 0, 1, 0, 2, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 50, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -20070,13 +20148,14 @@ pub mod question { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 129] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 130] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(178, 131, 145, 42, 21, 110, 131, 223), ::capnp::word(28, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(112, 239, 146, 52, 195, 11, 81, 216), ::capnp::word(2, 0, 7, 0, 1, 0, 7, 0), ::capnp::word(1, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 26, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -20384,13 +20463,14 @@ pub mod statement { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 26] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 27] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(225, 74, 64, 143, 130, 32, 14, 153), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(58, 100, 0, 0, 5, 102, 0, 0), ::capnp::word(21, 0, 0, 0, 234, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -20753,13 +20833,14 @@ pub mod statement { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 113] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 114] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(61, 125, 19, 220, 188, 114, 192, 204), ::capnp::word(29, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(225, 74, 64, 143, 130, 32, 14, 153), ::capnp::word(1, 0, 7, 0, 1, 0, 6, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 34, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -21049,13 +21130,14 @@ pub mod answer { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 26] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 27] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(88, 16, 140, 152, 182, 184, 172, 172), ::capnp::word(19, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(33, 102, 0, 0, 189, 105, 0, 0), ::capnp::word(21, 0, 0, 0, 210, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -21448,13 +21530,14 @@ pub mod answer { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 129] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 130] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(181, 242, 159, 40, 61, 141, 102, 244), ::capnp::word(26, 0, 0, 0, 1, 0, 1, 0), ::capnp::word(88, 16, 140, 152, 182, 184, 172, 172), ::capnp::word(1, 0, 7, 0, 1, 0, 7, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -21813,13 +21896,14 @@ pub mod operation { } } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 74] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 75] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(59, 60, 64, 53, 196, 17, 40, 191), ::capnp::word(19, 0, 0, 0, 1, 0, 3, 0), ::capnp::word(2, 171, 52, 55, 3, 232, 252, 143), ::capnp::word(2, 0, 7, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(191, 105, 0, 0, 254, 107, 0, 0), ::capnp::word(21, 0, 0, 0, 234, 0, 0, 0), ::capnp::word(33, 0, 0, 0, 7, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -22143,13 +22227,14 @@ pub mod operation { impl Pipeline { } mod _private { - pub static ENCODED_NODE: [::capnp::Word; 65] = [ - ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0), + pub static ENCODED_NODE: [::capnp::Word; 66] = [ + ::capnp::word(0, 0, 0, 0, 6, 0, 6, 0), ::capnp::word(25, 105, 98, 160, 94, 146, 86, 179), ::capnp::word(29, 0, 0, 0, 1, 0, 3, 0), ::capnp::word(59, 60, 64, 53, 196, 17, 40, 191), ::capnp::word(2, 0, 7, 0, 1, 0, 3, 0), ::capnp::word(8, 0, 0, 0, 0, 0, 0, 0), + ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(21, 0, 0, 0, 18, 1, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0), @@ -22242,6 +22327,6 @@ pub mod operation { } } -//BUILDHASH:a28970f74fcf7989d47e1457e848e5de33d8b7a4003a0e439c95f442ecf69fd3 +//BUILDHASH:196f6bbf9c5b0ec79e01c72ef11ada6bef828ecbd7e4a9ee9021e9e2574e3352 //CAPNPDESIREDVERSIONHASH:bfec2e34583ada7e6af2cb73993fb75a3f7147a6c943e5ff5f5c4294fc577b90 diff --git a/veilid-core/src/network_manager/connection_manager.rs b/veilid-core/src/network_manager/connection_manager.rs index 89030eeb..09467603 100644 --- a/veilid-core/src/network_manager/connection_manager.rs +++ b/veilid-core/src/network_manager/connection_manager.rs @@ -691,10 +691,7 @@ impl ConnectionManager { fn spawn_reconnector(&self, dial_info: DialInfo) { let this = self.clone(); - self.arc.reconnection_processor.add( - Box::pin(futures_util::stream::once(async { dial_info })), - move |dial_info| { - let this = this.clone(); + self.arc.reconnection_processor.add_future( Box::pin(async move { match this.get_or_create_connection(dial_info.clone()).await { Ok(NetworkResult::Value(conn)) => { @@ -706,15 +703,11 @@ impl ConnectionManager { Err(e) => { veilid_log!(this debug "Reconnection error to {}: {}", dial_info, e); } - } - false - }) - }, - ); + }; + })); } pub fn debug_print(&self) -> String { - //let inner = self.arc.inner.lock(); format!( "Connection Table:\n\n{}", self.arc.connection_table.debug_print_table() diff --git a/veilid-core/src/network_manager/network_connection.rs b/veilid-core/src/network_manager/network_connection.rs index 552571f7..0f2870ba 100644 --- a/veilid-core/src/network_manager/network_connection.rs +++ b/veilid-core/src/network_manager/network_connection.rs @@ -352,7 +352,7 @@ impl NetworkConnection { }; let timer = MutableFuture::new(new_timer()); - unord.push(system_boxed(timer.clone().in_current_span())); + unord.push(pin_dyn_future!(timer.clone().in_current_span())); loop { // Add another message sender future if necessary @@ -386,7 +386,7 @@ impl NetworkConnection { } } }.in_current_span()); - unord.push(system_boxed(sender_fut.in_current_span())); + unord.push(pin_dyn_future!(sender_fut.in_current_span())); } // Add another message receiver future if necessary @@ -445,7 +445,7 @@ impl NetworkConnection { } }.in_current_span()); - unord.push(system_boxed(receiver_fut.in_current_span())); + unord.push(pin_dyn_future!(receiver_fut.in_current_span())); } // Process futures diff --git a/veilid-core/src/rpc_processor/rpc_watch_value.rs b/veilid-core/src/rpc_processor/rpc_watch_value.rs index 77a45da9..567105b8 100644 --- a/veilid-core/src/rpc_processor/rpc_watch_value.rs +++ b/veilid-core/src/rpc_processor/rpc_watch_value.rs @@ -269,7 +269,7 @@ impl RPCProcessor { } else { // Accepted, lets try to watch or cancel it - let params = WatchParameters { + let params = InboundWatchParameters { subkeys: subkeys.clone(), expiration: Timestamp::new(expiration), count, @@ -287,12 +287,12 @@ impl RPCProcessor { // Encode the watch result // Rejections and cancellations are treated the same way by clients let (ret_expiration, ret_watch_id) = match watch_result { - WatchResult::Created { id, expiration } => (expiration.as_u64(), id), - WatchResult::Changed { expiration } => { + InboundWatchResult::Created { id, expiration } => (expiration.as_u64(), id), + InboundWatchResult::Changed { expiration } => { (expiration.as_u64(), watch_id.unwrap_or_default()) } - WatchResult::Cancelled => (0, watch_id.unwrap_or_default()), - WatchResult::Rejected => (0, watch_id.unwrap_or_default()), + InboundWatchResult::Cancelled => (0, watch_id.unwrap_or_default()), + InboundWatchResult::Rejected => (0, watch_id.unwrap_or_default()), }; (true, ret_expiration, ret_watch_id) }; diff --git a/veilid-core/src/storage_manager/debug.rs b/veilid-core/src/storage_manager/debug.rs index 05a44759..e7493fc0 100644 --- a/veilid-core/src/storage_manager/debug.rs +++ b/veilid-core/src/storage_manager/debug.rs @@ -24,7 +24,7 @@ impl StorageManager { } else { "".to_owned() }; - let watch = if let Some(w) = v.active_watch() { + let watch = if let Some(w) = v.outbound_watch() { format!(" watch: {:?}\n", w) } else { "".to_owned() diff --git a/veilid-core/src/storage_manager/get_value.rs b/veilid-core/src/storage_manager/get_value.rs index 211682a9..b62a41f6 100644 --- a/veilid-core/src/storage_manager/get_value.rs +++ b/veilid-core/src/storage_manager/get_value.rs @@ -395,7 +395,7 @@ impl StorageManager { key, subkey, get_result_value.clone(), - WatchUpdateMode::UpdateAll, + InboundWatchUpdateMode::UpdateAll, ) .await?; } diff --git a/veilid-core/src/storage_manager/mod.rs b/veilid-core/src/storage_manager/mod.rs index 620ceb70..dff868d6 100644 --- a/veilid-core/src/storage_manager/mod.rs +++ b/veilid-core/src/storage_manager/mod.rs @@ -1,6 +1,7 @@ mod debug; mod get_value; mod inspect_value; +mod outbound_watch; mod record_store; mod set_value; mod tasks; @@ -8,11 +9,12 @@ mod types; mod watch_value; use super::*; +use outbound_watch::*; use record_store::*; use routing_table::*; use rpc_processor::*; -pub use record_store::{WatchParameters, WatchResult}; +pub use record_store::{InboundWatchParameters, InboundWatchResult}; pub use types::*; @@ -28,8 +30,8 @@ const FLUSH_RECORD_STORES_INTERVAL_SECS: u32 = 1; const OFFLINE_SUBKEY_WRITES_INTERVAL_SECS: u32 = 5; /// Frequency to send ValueChanged notifications to the network const SEND_VALUE_CHANGES_INTERVAL_SECS: u32 = 1; -/// Frequency to check for dead nodes and routes for client-side active watches -const CHECK_ACTIVE_WATCHES_INTERVAL_SECS: u32 = 1; +/// Frequency to check for dead nodes and routes for client-side outbound watches +const CHECK_OUTBOUND_WATCHES_INTERVAL_SECS: u32 = 1; /// Frequency to check for expired server-side watched records const CHECK_WATCHED_RECORDS_INTERVAL_SECS: u32 = 1; /// Table store table for storage manager metadata @@ -61,6 +63,8 @@ struct StorageManagerInner { pub offline_subkey_writes: HashMap, /// Record subkeys that are currently being written to in the foreground pub active_subkey_writes: HashMap, + /// State management for outbound watches + pub outbound_watches: HashMap, /// Storage manager metadata that is persistent, including copy of offline subkey writes pub metadata_db: Option, /// Background processing task (not part of attachment manager tick tree so it happens when detached too) @@ -90,14 +94,20 @@ pub(crate) struct StorageManager { flush_record_stores_task: TickTask, offline_subkey_writes_task: TickTask, send_value_changes_task: TickTask, - check_active_watches_task: TickTask, - check_watched_records_task: TickTask, + check_outbound_watches_task: TickTask, + check_inbound_watches_task: TickTask, // Anonymous watch keys anonymous_watch_keys: TypedKeyPairGroup, - /// Deferred result processor - deferred_result_processor: DeferredStreamProcessor, + // Outbound watch operation lock + // Keeps changes to watches to one-at-a-time per record + outbound_watch_lock_table: AsyncTagLockTable, + + // Background operation processor + // for offline subkey writes, watch changes, and any other + // background operations the storage manager wants to perform + background_operation_processor: DeferredStreamProcessor, } impl fmt::Debug for StorageManager { @@ -116,7 +126,11 @@ impl fmt::Debug for StorageManager { // "check_watched_records_task", // &self.check_watched_records_task, // ) - .field("deferred_result_processor", &self.deferred_result_processor) + .field("outbound_watch_lock_table", &self.outbound_watch_lock_table) + .field( + "background_operation_processor", + &self.background_operation_processor, + ) .field("anonymous_watch_keys", &self.anonymous_watch_keys) .finish() } @@ -157,17 +171,17 @@ impl StorageManager { "send_value_changes_task", SEND_VALUE_CHANGES_INTERVAL_SECS, ), - check_active_watches_task: TickTask::new( + check_outbound_watches_task: TickTask::new( "check_active_watches_task", - CHECK_ACTIVE_WATCHES_INTERVAL_SECS, + CHECK_OUTBOUND_WATCHES_INTERVAL_SECS, ), - check_watched_records_task: TickTask::new( + check_inbound_watches_task: TickTask::new( "check_watched_records_task", CHECK_WATCHED_RECORDS_INTERVAL_SECS, ), - + outbound_watch_lock_table: AsyncTagLockTable::new(), anonymous_watch_keys, - deferred_result_processor: DeferredStreamProcessor::new(), + background_operation_processor: DeferredStreamProcessor::new(), }; this.setup_tasks(); @@ -240,7 +254,7 @@ impl StorageManager { } // Start deferred results processors - self.deferred_result_processor.init(); + self.background_operation_processor.init(); Ok(()) } @@ -286,7 +300,7 @@ impl StorageManager { veilid_log!(self debug "starting storage manager shutdown"); // Stop deferred result processor - self.deferred_result_processor.terminate().await; + self.background_operation_processor.terminate().await; // Terminate and release the storage manager { @@ -366,7 +380,7 @@ impl StorageManager { let inner = self.inner.lock().await; let mut out = vec![]; for opened_record in inner.opened_records.values() { - if let Some(aw) = opened_record.active_watch() { + if let Some(aw) = opened_record.outbound_watch() { for pn in &aw.per_node { out.push( Destination::direct( @@ -525,7 +539,7 @@ impl StorageManager { }; // See if we have an active watch on the closed record - let Some(active_watch) = opened_record.active_watch() else { + let Some(active_watch) = opened_record.outbound_watch() else { return Ok(()); }; @@ -737,7 +751,7 @@ impl StorageManager { key, subkey, signed_value_data.clone(), - WatchUpdateMode::NoUpdate, + InboundWatchUpdateMode::NoUpdate, ) .await?; @@ -867,7 +881,7 @@ impl StorageManager { ( opened_record.safety_selection(), opened_record.writer().cloned(), - opened_record.active_watch().cloned(), + opened_record.outbound_watch().cloned(), ) }; @@ -921,7 +935,7 @@ impl StorageManager { let Some(opened_record) = inner.opened_records.get_mut(&key) else { apibail_generic!("record not open"); }; - opened_record.clear_active_watch(); + opened_record.clear_outbound_watch(); // Get the minimum expiration timestamp we will accept let (rpc_timeout_us, max_watch_expiration_us) = self.config().with(|c| { @@ -965,7 +979,7 @@ impl StorageManager { } // Keep a record of the watch - opened_record.set_active_watch(ActiveWatch { + opened_record.set_outbound_watch(OutboundWatch { id: owvresult.watch_id, expiration_ts, watch_node: owvresult.watch_node, @@ -983,14 +997,14 @@ impl StorageManager { key: TypedKey, subkeys: ValueSubkeyRangeSet, ) -> VeilidAPIResult { - let (subkeys, active_watch) = { + let (subkeys, count, expiration_ts) = { let inner = self.inner.lock().await; let Some(opened_record) = inner.opened_records.get(&key) else { apibail_generic!("record not open"); }; // See what watch we have currently if any - let Some(active_watch) = opened_record.active_watch() else { + let Some(active_watch) = opened_record.outbound_watch() else { // If we didn't have an active watch, then we can just return false because there's nothing to do here return Ok(false); }; @@ -1003,22 +1017,27 @@ impl StorageManager { }; // Reduce the subkey range - let new_subkeys = active_watch.subkeys.difference(&subkeys); + let new_subkeys = active_watch.params.subkeys.difference(&subkeys); - (new_subkeys, active_watch) - }; + // If no change is happening return false + if new_subkeys == active_watch.params.subkeys { + return Ok(false); + } - // If we have no subkeys left, then set the count to zero to indicate a full cancellation - let count = if subkeys.is_empty() { - 0 - } else { - active_watch.count + // If we have no subkeys left, then set the count to zero to indicate a full cancellation + let count = if new_subkeys.is_empty() { + 0 + } else { + active_watch.params.count + }; + + (new_subkeys, count, active_watch.params.expiration_ts) }; // Update the watch. This just calls through to the above watch_values() function // This will update the active_watch so we don't need to do that in this routine. let expiration_ts = - pin_future!(self.watch_values(key, subkeys, active_watch.expiration_ts, count)).await?; + pin_future!(self.watch_values(key, subkeys, expiration_ts, count)).await?; // A zero expiration time returned from watch_value() means the watch is done // or no subkeys are left, and the watch is no longer active @@ -1375,7 +1394,7 @@ impl StorageManager { continue; }; local_record_store - .set_subkey(key, subkey, subkey_data, WatchUpdateMode::NoUpdate) + .set_subkey(key, subkey, subkey_data, InboundWatchUpdateMode::NoUpdate) .await?; } @@ -1509,7 +1528,12 @@ impl StorageManager { if let Some(signed_value_data) = get_result.opt_value { // Write subkey to local store local_record_store - .set_subkey(key, subkey, signed_value_data, WatchUpdateMode::NoUpdate) + .set_subkey( + key, + subkey, + signed_value_data, + InboundWatchUpdateMode::NoUpdate, + ) .await?; } @@ -1653,7 +1677,7 @@ impl StorageManager { key: TypedKey, subkey: ValueSubkey, signed_value_data: Arc, - watch_update_mode: WatchUpdateMode, + watch_update_mode: InboundWatchUpdateMode, ) -> VeilidAPIResult<()> { // See if it's in the local record store let Some(local_record_store) = inner.local_record_store.as_mut() else { @@ -1724,7 +1748,7 @@ impl StorageManager { subkey: ValueSubkey, signed_value_data: Arc, signed_value_descriptor: Arc, - watch_update_mode: WatchUpdateMode, + watch_update_mode: InboundWatchUpdateMode, ) -> VeilidAPIResult<()> { // See if it's in the remote record store let Some(remote_record_store) = inner.remote_record_store.as_mut() else { @@ -1816,7 +1840,7 @@ impl StorageManager { receiver: flume::Receiver, handler: impl FnMut(T) -> PinBoxFutureStatic + Send + 'static, ) -> bool { - self.deferred_result_processor - .add(receiver.into_stream(), handler) + self.background_operation_processor + .add_stream(receiver.into_stream(), handler) } } diff --git a/veilid-core/src/storage_manager/record_store/mod.rs b/veilid-core/src/storage_manager/record_store/mod.rs index 5705101e..a599a1cd 100644 --- a/veilid-core/src/storage_manager/record_store/mod.rs +++ b/veilid-core/src/storage_manager/record_store/mod.rs @@ -1,3 +1,4 @@ +mod inbound_watch; /// RecordStore /// Keeps an LRU cache of dht keys and their associated subkey valuedata. /// Instances of this store are used for 'local' (persistent) and 'remote' (ephemeral) dht key storage. @@ -13,8 +14,9 @@ mod record; mod record_data; mod record_store_limits; mod remote_record_detail; -mod watch; +pub(super) use inbound_watch::*; +pub use inbound_watch::{InboundWatchParameters, InboundWatchResult}; pub(super) use inspect_cache::*; pub(super) use keys::*; pub(super) use limited_size::*; @@ -23,8 +25,6 @@ pub(super) use opened_record::*; pub(super) use record::*; pub(super) use record_store_limits::*; pub(super) use remote_record_detail::*; -pub(super) use watch::*; -pub use watch::{WatchParameters, WatchResult}; use super::*; use record_data::*; @@ -75,7 +75,7 @@ where /// The list of records that have changed since last flush to disk (optimization for batched writes) changed_records: HashSet, /// The list of records being watched for changes - watched_records: HashMap, + watched_records: HashMap, /// The list of watched records that have changed values since last notification changed_watched_values: HashSet, /// A mutex to ensure we handle this concurrently @@ -680,12 +680,12 @@ where &mut self, key: TypedKey, subkey: ValueSubkey, - watch_update_mode: WatchUpdateMode, + watch_update_mode: InboundWatchUpdateMode, ) { let (do_update, opt_ignore_target) = match watch_update_mode { - WatchUpdateMode::NoUpdate => (false, None), - WatchUpdateMode::UpdateAll => (true, None), - WatchUpdateMode::ExcludeTarget(target) => (true, Some(target)), + InboundWatchUpdateMode::NoUpdate => (false, None), + InboundWatchUpdateMode::UpdateAll => (true, None), + InboundWatchUpdateMode::ExcludeTarget(target) => (true, Some(target)), }; if !do_update { return; @@ -720,7 +720,7 @@ where key: TypedKey, subkey: ValueSubkey, signed_value_data: Arc, - watch_update_mode: WatchUpdateMode, + watch_update_mode: InboundWatchUpdateMode, ) -> VeilidAPIResult<()> { // Check size limit for data if signed_value_data.value_data().data().len() > self.limits.max_subkey_size { @@ -902,9 +902,9 @@ where pub async fn _change_existing_watch( &mut self, key: TypedKey, - params: WatchParameters, + params: InboundWatchParameters, watch_id: u64, - ) -> VeilidAPIResult { + ) -> VeilidAPIResult { if params.count == 0 { apibail_internal!("cancel watch should not have gotten here"); } @@ -915,7 +915,7 @@ where let rtk = RecordTableKey { key }; let Some(watch_list) = self.watched_records.get_mut(&rtk) else { // No watches, nothing to change - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); }; // Check each watch to see if we have an exact match for the id to change @@ -925,23 +925,23 @@ where if w.id == watch_id && w.params.watcher == params.watcher { // Updating an existing watch w.params = params; - return Ok(WatchResult::Changed { + return Ok(InboundWatchResult::Changed { expiration: w.params.expiration, }); } } // No existing watch found - Ok(WatchResult::Rejected) + Ok(InboundWatchResult::Rejected) } #[instrument(level = "trace", target = "stor", skip_all, err)] pub async fn _create_new_watch( &mut self, key: TypedKey, - params: WatchParameters, + params: InboundWatchParameters, member_check: Box bool + Send>, - ) -> VeilidAPIResult { + ) -> VeilidAPIResult { // Generate a record-unique watch id > 0 let rtk = RecordTableKey { key }; let mut id = 0; @@ -1001,7 +1001,7 @@ where // For anonymous, no more than one watch per target per record if target_watch_count > 0 { // Too many watches - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); } // Check watch table for limits @@ -1011,18 +1011,18 @@ where self.limits.public_watch_limit }; if watch_count >= watch_limit { - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); } // Ok this is an acceptable new watch, add it let watch_list = self.watched_records.entry(rtk).or_default(); let expiration = params.expiration; - watch_list.watches.push(Watch { + watch_list.watches.push(InboundWatch { params, id, changed: ValueSubkeyRangeSet::new(), }); - Ok(WatchResult::Created { id, expiration }) + Ok(InboundWatchResult::Created { id, expiration }) } /// Add or update an inbound record watch for changes @@ -1030,17 +1030,17 @@ where pub async fn watch_record( &mut self, key: TypedKey, - mut params: WatchParameters, + mut params: InboundWatchParameters, opt_watch_id: Option, - ) -> VeilidAPIResult { + ) -> VeilidAPIResult { // If count is zero then we're cancelling a watch completely if params.count == 0 { if let Some(watch_id) = opt_watch_id { let cancelled = self.cancel_watch(key, watch_id, params.watcher).await?; if cancelled { - return Ok(WatchResult::Cancelled); + return Ok(InboundWatchResult::Cancelled); } - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); } apibail_internal!("shouldn't have let a None watch id get here"); } @@ -1058,10 +1058,10 @@ where if let Some(watch_id) = opt_watch_id { let cancelled = self.cancel_watch(key, watch_id, params.watcher).await?; if cancelled { - return Ok(WatchResult::Cancelled); + return Ok(InboundWatchResult::Cancelled); } } - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); } // Make a closure to check for member vs anonymous @@ -1071,7 +1071,7 @@ where Box::new(move |watcher| owner == watcher || schema.is_member(&watcher)) }) else { // Record not found - return Ok(WatchResult::Rejected); + return Ok(InboundWatchResult::Rejected); }; // Create or update depending on if a watch id is specified or not @@ -1128,8 +1128,8 @@ where pub fn move_watches( &mut self, key: TypedKey, - in_watch: Option<(WatchList, bool)>, - ) -> Option<(WatchList, bool)> { + in_watch: Option<(InboundWatchList, bool)>, + ) -> Option<(InboundWatchList, bool)> { let rtk = RecordTableKey { key }; let out = self.watched_records.remove(&rtk); if let Some(in_watch) = in_watch { diff --git a/veilid-core/src/storage_manager/record_store/opened_record.rs b/veilid-core/src/storage_manager/record_store/opened_record.rs index e90d1e5c..4e993c8d 100644 --- a/veilid-core/src/storage_manager/record_store/opened_record.rs +++ b/veilid-core/src/storage_manager/record_store/opened_record.rs @@ -1,56 +1,5 @@ use super::*; -#[derive(Clone, Debug)] -pub(in crate::storage_manager) struct PerNodeActiveWatch { - /// The watch id returned from the watch node - pub id: u64, - /// The expiration of a successful watch - pub expiration_ts: Timestamp, - /// Which node accepted the watch - pub watch_node: NodeRef, - /// How many value change notifications are left - pub count: u32, -} - -/// Requested parameters for watch -#[derive(Clone, Debug)] -pub(in crate::storage_manager) struct ActiveWatchParameters { - /// Requested expiration timestamp - pub expiration_ts: Timestamp, - /// How many notifications the requestor asked for - pub count: u32, - /// Subkeys requested for this watch - pub subkeys: ValueSubkeyRangeSet, -} - -#[derive(Clone, Debug)] -pub(in crate::storage_manager) struct ActiveWatch { - /// Requested parameters - pub params: ActiveWatchParameters, - /// Active watches per node - pub per_node: Vec, - /// Minimum expiration time for all our nodes - pub min_expiration_ts: Timestamp, - /// How many value change updates remain - pub remaining_count: u32, - /// Which private route is responsible for receiving ValueChanged notifications - pub opt_value_changed_route: Option, -} - -impl ActiveWatch { - pub fn new(params: ActiveWatchParameters, opt_value_changed_route: Option) -> Self { - let remaining_count = params.count; - - Self { - params, - per_node, - min_expiration_ts, - remaining_count, - opt_value_changed_route, - } - } -} - /// The state associated with a local record when it is opened /// This is not serialized to storage as it is ephemeral for the lifetime of the opened record #[derive(Clone, Debug, Default)] @@ -62,9 +11,6 @@ pub(in crate::storage_manager) struct OpenedRecord { /// The safety selection in current use safety_selection: SafetySelection, - - /// Active watches we have on this record - active_watch: Option, } impl OpenedRecord { @@ -72,7 +18,6 @@ impl OpenedRecord { Self { writer, safety_selection, - active_watch: None, } } @@ -89,85 +34,4 @@ impl OpenedRecord { pub fn set_safety_selection(&mut self, safety_selection: SafetySelection) { self.safety_selection = safety_selection; } - - fn calculate_min_expiration_ts(per_node: &[PerNodeActiveWatch]) -> Option { - per_node - .iter() - .map(|x| x.expiration_ts) - .reduce(|a, b| a.min(b)) - } - - pub fn new_active_watch( - &mut self, - params: ActiveWatchParameters, - opt_value_changed_route: Option, - per_node: Vec, - ) { - assert!( - self.active_watch.is_none(), - "should have cleared active watch first" - ); - assert!(!per_node.is_empty(), "must have at least one watch node"); - - let min_expiration_ts = Self::calculate_min_expiration_ts(&per_node).unwrap(); - let remaining_count = params.count; - - self.active_watch = Some(ActiveWatch { - params, - per_node, - min_expiration_ts, - remaining_count, - opt_value_changed_route, - }); - } - - pub fn set_active_watch(&mut self, active_watch: ActiveWatch) { - assert!( - self.active_watch.is_none(), - "should have cleared watch first before setting a new one" - ); - self.active_watch = Some(active_watch); - } - - pub fn clear_active_watch(&mut self) { - self.active_watch = None; - } - - pub fn active_watch(&self) -> Option<&ActiveWatch> { - self.active_watch.as_ref() - } - - pub fn active_watch_mut(&mut self) -> Option<&mut ActiveWatch> { - self.active_watch.as_mut() - } - - pub fn per_node_active_watch_by_id(&self, watch_id: u64) -> Option<&PerNodeActiveWatch> { - self.active_watch - .as_ref() - .map(|x| x.per_node.iter().find(|x| x.id == watch_id)) - .flatten() - } - - pub fn per_node_active_watch_by_id_mut( - &mut self, - watch_id: u64, - ) -> Option<&mut PerNodeActiveWatch> { - self.active_watch - .as_mut() - .map(|x| x.per_node.iter_mut().find(|x| x.id == watch_id)) - .flatten() - } - - pub fn remove_per_node_active_watch_by_id(&mut self, watch_id: u64) { - let Some(active_watch) = self.active_watch.as_mut() else { - return; - }; - let Some(n) = active_watch.per_node.iter().position(|x| x.id == watch_id) else { - return; - }; - active_watch.per_node.remove(n); - - active_watch.min_expiration_ts = - Self::calculate_min_expiration_ts(&active_watch.per_node).unwrap(); - } } diff --git a/veilid-core/src/storage_manager/record_store/watch.rs b/veilid-core/src/storage_manager/record_store/watch.rs deleted file mode 100644 index 60440a29..00000000 --- a/veilid-core/src/storage_manager/record_store/watch.rs +++ /dev/null @@ -1,66 +0,0 @@ -use super::*; - -/// Watch parameters used to configure a watch -#[derive(Debug, Clone)] -pub struct WatchParameters { - /// The range of subkeys being watched, empty meaning full - pub subkeys: ValueSubkeyRangeSet, - /// When this watch will expire - pub expiration: Timestamp, - /// How many updates are left before forced expiration - pub count: u32, - /// The watching schema member key, or an anonymous key - pub watcher: PublicKey, - /// The place where updates are sent - pub target: Target, -} - -/// Watch result to return with answer -/// Default result is cancelled/expired/inactive/rejected -#[derive(Debug, Clone)] -pub enum WatchResult { - /// A new watch was created - Created { - /// The new id of the watch - id: u64, - /// The expiration timestamp of the watch. This should never be zero. - expiration: Timestamp, - }, - /// An existing watch was modified - Changed { - /// The new expiration timestamp of the modified watch. This should never be zero. - expiration: Timestamp, - }, - /// An existing watch was cancelled - Cancelled, - /// The request was rejected due to invalid parameters or a missing watch - Rejected, -} - -/// An individual watch -#[derive(Debug, Clone)] -pub struct Watch { - /// The configuration of the watch - pub params: WatchParameters, - /// A unique id per record assigned at watch creation time. Used to disambiguate a client's version of a watch - pub id: u64, - /// What has changed since the last update - pub changed: ValueSubkeyRangeSet, -} - -#[derive(Debug, Default, Clone)] -/// A record being watched for changes -pub struct WatchList { - /// The list of active watches - pub watches: Vec, -} - -/// How a watch gets updated when a value changes -pub enum WatchUpdateMode { - /// Update no watchers - NoUpdate, - /// Update all watchers - UpdateAll, - /// Update all watchers except ones that come from a specific target - ExcludeTarget(Target), -} diff --git a/veilid-core/src/storage_manager/set_value.rs b/veilid-core/src/storage_manager/set_value.rs index 73e88e11..fb3df7b7 100644 --- a/veilid-core/src/storage_manager/set_value.rs +++ b/veilid-core/src/storage_manager/set_value.rs @@ -385,7 +385,7 @@ impl StorageManager { key, subkey, result.signed_value_data.clone(), - WatchUpdateMode::UpdateAll, + InboundWatchUpdateMode::UpdateAll, ) .await?; @@ -486,7 +486,7 @@ impl StorageManager { key, subkey, value, - WatchUpdateMode::ExcludeTarget(target), + InboundWatchUpdateMode::ExcludeTarget(target), ) .await } else { @@ -496,7 +496,7 @@ impl StorageManager { subkey, value, actual_descriptor, - WatchUpdateMode::ExcludeTarget(target), + InboundWatchUpdateMode::ExcludeTarget(target), ) .await }; diff --git a/veilid-core/src/storage_manager/tasks/check_active_watches.rs b/veilid-core/src/storage_manager/tasks/check_active_watches.rs deleted file mode 100644 index 5b13b929..00000000 --- a/veilid-core/src/storage_manager/tasks/check_active_watches.rs +++ /dev/null @@ -1,64 +0,0 @@ -use super::*; - -impl StorageManager { - // Check if client-side watches on opened records either have dead nodes or if the watch has expired - #[instrument(level = "trace", target = "stor", skip_all, err)] - pub(super) async fn check_active_watches_task_routine( - &self, - _stop_token: StopToken, - _last_ts: Timestamp, - _cur_ts: Timestamp, - ) -> EyreResult<()> { - { - let mut inner = self.inner.lock().await; - - let routing_table = self.routing_table(); - //let update_callback = self.update_callback(); - - let cur_ts = Timestamp::now(); - for (k, v) in inner.opened_records.iter_mut() { - for active_watch in v.active_watches() { - // See if the active watch's node is dead - let mut is_dead = false; - if !active_watch.watch_node.state(cur_ts).is_alive() { - // Watched node is dead - is_dead = true; - } - - // See if the private route we're using is dead - if !is_dead { - if let Some(value_changed_route) = active_watch.opt_value_changed_route { - if routing_table - .route_spec_store() - .get_route_id_for_key(&value_changed_route) - .is_none() - { - // Route we would receive value changes on is dead - is_dead = true; - } - } - } - // See if the watch is expired - if !is_dead && active_watch.expiration_ts <= cur_ts { - // Watch has expired - is_dead = true; - } - - if is_dead { - v.remove_active_watch(active_watch.id); - - // // Send valuechange with dead count and no subkeys - // update_callback(VeilidUpdate::ValueChange(Box::new(VeilidValueChange { - // key: *k, - // subkeys: ValueSubkeyRangeSet::new(), - // count: 0, - // value: None, - // }))); - } - } - } - } - - Ok(()) - } -} diff --git a/veilid-core/src/storage_manager/tasks/check_watched_records.rs b/veilid-core/src/storage_manager/tasks/check_watched_records.rs deleted file mode 100644 index c784555f..00000000 --- a/veilid-core/src/storage_manager/tasks/check_watched_records.rs +++ /dev/null @@ -1,23 +0,0 @@ -use super::*; - -impl StorageManager { - // Check if server-side watches have expired - #[instrument(level = "trace", target = "stor", skip_all, err)] - pub(super) async fn check_watched_records_task_routine( - &self, - _stop_token: StopToken, - _last_ts: Timestamp, - _cur_ts: Timestamp, - ) -> EyreResult<()> { - let mut inner = self.inner.lock().await; - - if let Some(local_record_store) = &mut inner.local_record_store { - local_record_store.check_watched_records(); - } - if let Some(remote_record_store) = &mut inner.remote_record_store { - remote_record_store.check_watched_records(); - } - - Ok(()) - } -} diff --git a/veilid-core/src/storage_manager/tasks/mod.rs b/veilid-core/src/storage_manager/tasks/mod.rs index db47f81e..1706f815 100644 --- a/veilid-core/src/storage_manager/tasks/mod.rs +++ b/veilid-core/src/storage_manager/tasks/mod.rs @@ -1,5 +1,5 @@ -pub mod check_active_watches; -pub mod check_watched_records; +pub mod check_inbound_watches; +pub mod check_outbound_watches; pub mod flush_record_stores; pub mod offline_subkey_writes; pub mod send_value_changes; @@ -40,8 +40,8 @@ impl StorageManager { impl_setup_task!( self, Self, - check_active_watches_task, - check_active_watches_task_routine + check_outbound_watches_task, + check_outbound_watches_task_routine ); // Set check watched records tick task @@ -49,8 +49,8 @@ impl StorageManager { impl_setup_task!( self, Self, - check_watched_records_task, - check_watched_records_task_routine + check_inbound_watches_task, + check_inbound_watches_task_routine ); } @@ -60,10 +60,10 @@ impl StorageManager { self.flush_record_stores_task.tick().await?; // Check active watches - self.check_active_watches_task.tick().await?; + self.check_outbound_watches_task.tick().await?; // Check watched records - self.check_watched_records_task.tick().await?; + self.check_inbound_watches_task.tick().await?; // Run online-only tasks if self.dht_is_online() { @@ -81,11 +81,11 @@ impl StorageManager { #[instrument(level = "trace", target = "stor", skip_all)] pub(super) async fn cancel_tasks(&self) { veilid_log!(self debug "stopping check watched records task"); - if let Err(e) = self.check_watched_records_task.stop().await { + if let Err(e) = self.check_inbound_watches_task.stop().await { veilid_log!(self warn "check_watched_records_task not stopped: {}", e); } veilid_log!(self debug "stopping check active watches task"); - if let Err(e) = self.check_active_watches_task.stop().await { + if let Err(e) = self.check_outbound_watches_task.stop().await { veilid_log!(self warn "check_active_watches_task not stopped: {}", e); } veilid_log!(self debug "stopping send value changes task"); diff --git a/veilid-core/src/storage_manager/tasks/offline_subkey_writes.rs b/veilid-core/src/storage_manager/tasks/offline_subkey_writes.rs index fcb6f280..1a00890e 100644 --- a/veilid-core/src/storage_manager/tasks/offline_subkey_writes.rs +++ b/veilid-core/src/storage_manager/tasks/offline_subkey_writes.rs @@ -90,7 +90,7 @@ impl StorageManager { key, subkey, result.signed_value_data.clone(), - WatchUpdateMode::UpdateAll, + InboundWatchUpdateMode::UpdateAll, ) .await?; } diff --git a/veilid-core/src/storage_manager/watch_value.rs b/veilid-core/src/storage_manager/watch_value.rs index 20980c53..c11b995b 100644 --- a/veilid-core/src/storage_manager/watch_value.rs +++ b/veilid-core/src/storage_manager/watch_value.rs @@ -1,4 +1,5 @@ use super::*; +use futures_util::StreamExt as _; impl_veilid_log_facility!("stor"); @@ -28,17 +29,66 @@ pub(super) struct OutboundWatchValueResult { } impl StorageManager { + /// Perform a 'watch value cancel' on a set of nodes without fanout + /// Returns the list of successfully cancelled ids and just logs failures + pub(super) async fn outbound_watch_value_cancel_set( + &self, + key: TypedKey, + safety_selection: SafetySelection, + opt_watcher: Option, + outbound_watch: &OutboundWatch, + ) -> Vec { + let mut unord = FuturesUnordered::new(); + for pn in &outbound_watch.per_node { + unord.push(async { + + let cancelled = match self.outbound_watch_value_cancel( + key, + safety_selection, + opt_watcher, + pn.watch_node.clone(), + pn.id, + ).await { + Ok(_) => { + // Either watch was cancelled, or it didn't exist, but it's not there now + true + } + Err(e) => { + veilid_log!(self debug "Outbound watch value (id={}) cancel to {} failed: {}", pn.id, pn.watch_node, e); + false + } + }; + + if cancelled { + Some(pn.id) + } else { + None + } + }); + } + let mut cancelled = vec![]; + while let Some(x) = unord.next().await { + match x { + Some(id) => { + cancelled.push(id); + } + None => {} + } + } + + cancelled + } + /// Perform a 'watch value cancel' on the network without fanout - #[allow(clippy::too_many_arguments)] #[instrument(level = "trace", target = "dht", skip_all, err)] pub(super) async fn outbound_watch_value_cancel( &self, key: TypedKey, - subkeys: ValueSubkeyRangeSet, safety_selection: SafetySelection, opt_watcher: Option, - active_watch: &ActiveWatch, - ) -> VeilidAPIResult> { + watch_node: NodeRef, + watch_id: u64, + ) -> VeilidAPIResult { let routing_domain = RoutingDomain::PublicInternet; // Get the appropriate watcher key, if anonymous use a static anonymous watch key @@ -52,7 +102,7 @@ impl StorageManager { Destination::direct(watch_node.routing_domain_filtered(routing_domain)) .with_safety(safety_selection), key, - subkeys, + ValueSubkeyRangeSet::new(), Timestamp::default(), 0, watcher, @@ -62,16 +112,11 @@ impl StorageManager { )?; if wva.answer.accepted { - veilid_log!(self debug "WatchValue canceled: id={} expiration_ts={} ({})", wva.answer.watch_id, display_ts(wva.answer.expiration_ts.as_u64()), watch_node); - Ok(Some(OutboundWatchValueResult { - expiration_ts: wva.answer.expiration_ts, - watch_id: wva.answer.watch_id, - watch_node, - opt_value_changed_route: wva.reply_private_route, - })) + veilid_log!(self debug "Outbound watch canceled: id={} ({})", wva.answer.watch_id, watch_node); + Ok(true) } else { - veilid_log!(self debug "WatchValue not canceled: id={} ({})", watch_id, watch_node); - Ok(None) + veilid_log!(self debug "Outbound watch id did not exist: id={} ({})", watch_id, watch_node); + Ok(false) } } @@ -86,7 +131,7 @@ impl StorageManager { count: u32, safety_selection: SafetySelection, opt_watcher: Option, - active_watch: &ActiveWatch, + active_watch: &OutboundWatch, ) -> VeilidAPIResult> { let routing_domain = RoutingDomain::PublicInternet; @@ -143,7 +188,7 @@ impl StorageManager { count: u32, safety_selection: SafetySelection, opt_watcher: Option, - opt_active_watch: Option<&ActiveWatch>, + opt_active_watch: Option<&OutboundWatch>, ) -> VeilidAPIResult> { // if the count is zero, we are cancelling if count == 0 { @@ -357,9 +402,9 @@ impl StorageManager { pub async fn inbound_watch_value( &self, key: TypedKey, - params: WatchParameters, + params: InboundWatchParameters, watch_id: Option, - ) -> VeilidAPIResult> { + ) -> VeilidAPIResult> { let mut inner = self.inner.lock().await; // Validate input @@ -390,7 +435,7 @@ impl StorageManager { .map(NetworkResult::value); } // No record found - Ok(NetworkResult::value(WatchResult::Rejected)) + Ok(NetworkResult::value(InboundWatchResult::Rejected)) } /// Handle a received 'Value Changed' statement @@ -445,7 +490,7 @@ impl StorageManager { active_watch.count ); active_watch.count = count; - opened_record.set_active_watch(active_watch); + opened_record.set_outbound_watch(active_watch); } // Null out default value @@ -492,7 +537,7 @@ impl StorageManager { key, first_subkey, value.clone(), - WatchUpdateMode::NoUpdate, + InboundWatchUpdateMode::NoUpdate, ) .await?; } diff --git a/veilid-core/src/veilid_api/routing_context.rs b/veilid-core/src/veilid_api/routing_context.rs index a9ecbc2e..acdfe783 100644 --- a/veilid-core/src/veilid_api/routing_context.rs +++ b/veilid-core/src/veilid_api/routing_context.rs @@ -404,7 +404,7 @@ impl RoutingContext { /// /// Returns a timestamp of when the watch will expire. All watches are guaranteed to expire at some point in the future, /// and the returned timestamp will be no later than the requested expiration, but -may- be before the requested expiration. - /// If the returned timestamp is zero it indicates that the watch creation or update has failed. In the case of a faild update, the watch is considered cancelled. + /// If the returned timestamp is zero it indicates that the watch creation or update has failed. In the case of a failed update, the watch is considered cancelled. /// /// DHT watches are accepted with the following conditions: /// * First-come first-served basis for arbitrary unauthenticated readers, up to network.dht.public_watch_limit per record. diff --git a/veilid-server/src/client_api.rs b/veilid-server/src/client_api.rs index dbdd16bb..f8d230a1 100644 --- a/veilid-server/src/client_api.rs +++ b/veilid-server/src/client_api.rs @@ -395,7 +395,7 @@ impl ClientApi { // Request receive processor future // Receives from socket and enqueues RequestLines // Completes when the connection is closed or there is a failure - unord.push(system_boxed(self.clone().receive_requests( + unord.push(Box::pin(self.clone().receive_requests( reader, requests_tx, responses_tx, @@ -404,12 +404,10 @@ impl ClientApi { // Response send processor // Sends finished response strings out the socket // Completes when the responses channel is closed - unord.push(system_boxed( - self.clone().send_responses(responses_rx, writer), - )); + unord.push(Box::pin(self.clone().send_responses(responses_rx, writer))); // Add future to process first request - unord.push(system_boxed(Self::next_request_line(requests_rx.clone()))); + unord.push(Box::pin(Self::next_request_line(requests_rx.clone()))); // Send and receive until we're done or a stop is requested while let Ok(Some(r)) = unord.next().timeout_at(stop_token.clone()).await { @@ -417,7 +415,7 @@ impl ClientApi { let request_line = match r { Ok(Some(request_line)) => { // Add future to process next request - unord.push(system_boxed(Self::next_request_line(requests_rx.clone()))); + unord.push(Box::pin(Self::next_request_line(requests_rx.clone()))); // Socket receive future returned something to process request_line @@ -434,7 +432,7 @@ impl ClientApi { }; // Enqueue unordered future to process request line in parallel - unord.push(system_boxed( + unord.push(Box::pin( self.clone().process_request_line(jrp.clone(), request_line), )); } diff --git a/veilid-tools/src/async_tag_lock.rs b/veilid-tools/src/async_tag_lock.rs index ff892c95..a3faeeab 100644 --- a/veilid-tools/src/async_tag_lock.rs +++ b/veilid-tools/src/async_tag_lock.rs @@ -24,6 +24,10 @@ where guard: Some(guard), } } + + pub fn tag(&self) -> T { + self.tag.clone() + } } impl Drop for AsyncTagLockGuard diff --git a/veilid-tools/src/deferred_stream_processor.rs b/veilid-tools/src/deferred_stream_processor.rs index 64fe4d87..ce4d28d4 100644 --- a/veilid-tools/src/deferred_stream_processor.rs +++ b/veilid-tools/src/deferred_stream_processor.rs @@ -113,7 +113,10 @@ impl DeferredStreamProcessor { /// * 'handler' is the callback to handle each item from the stream /// /// Returns 'true' if the stream was added for processing, and 'false' if the stream could not be added, possibly due to not being initialized. - pub fn add + Unpin + Send + 'static>( + pub fn add_stream< + T: Send + 'static, + S: futures_util::Stream + Unpin + Send + 'static, + >( &self, mut receiver: S, mut handler: impl FnMut(T) -> PinBoxFutureStatic + Send + 'static, @@ -140,6 +143,24 @@ impl DeferredStreamProcessor { } true } + + /// Queue a single future to process in the background + pub fn add_future(&self, fut: F) -> bool + where + F: Future + Send + 'static, + { + let dsc_tx = { + let inner = self.inner.lock(); + let Some(dsc_tx) = inner.opt_deferred_stream_channel.clone() else { + return false; + }; + dsc_tx + }; + if dsc_tx.send(Box::pin(fut)).is_err() { + return false; + } + true + } } impl Default for DeferredStreamProcessor { diff --git a/veilid-tools/src/tools.rs b/veilid-tools/src/tools.rs index 3634be84..fdf51408 100644 --- a/veilid-tools/src/tools.rs +++ b/veilid-tools/src/tools.rs @@ -119,14 +119,6 @@ macro_rules! asyncrwlock_try_write_arc { ////////////////////////////////////////////////////////////////////////////////////////////////////////////// -pub fn system_boxed<'a, Out>( - future: impl Future + Send + 'a, -) -> PinBoxFuture<'a, Out> { - Box::pin(future) -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// - cfg_if! { if #[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))] { #[must_use] diff --git a/veilid-tools/src/virtual_network/router_client.rs b/veilid-tools/src/virtual_network/router_client.rs index 71a4bc8a..19fc8856 100644 --- a/veilid-tools/src/virtual_network/router_client.rs +++ b/veilid-tools/src/virtual_network/router_client.rs @@ -589,7 +589,7 @@ impl RouterClient { let framed_reader = FramedRead::new(reader, BytesCodec); let framed_writer = FramedWrite::new(writer, BytesCodec); - let framed_writer_fut = system_boxed(async move { + let framed_writer_fut = Box::pin(async move { if let Err(e) = receiver .into_stream() .map(|command| { @@ -603,7 +603,7 @@ impl RouterClient { error!("{}", e); } }); - let framed_reader_fut = system_boxed(async move { + let framed_reader_fut = Box::pin(async move { let fut = framed_reader.try_for_each(|x| async { let x = x; let evt = from_bytes::(&x) @@ -631,7 +631,7 @@ impl RouterClient { .into_stream() .map(io::Result::::Ok); - let receiver_fut = system_boxed(async move { + let receiver_fut = Box::pin(async move { let fut = receiver.try_for_each(|evt| Self::process_event(evt, router_op_waiter.clone())); if let Err(e) = fut.await { diff --git a/veilid-tools/src/virtual_network/router_server/mod.rs b/veilid-tools/src/virtual_network/router_server/mod.rs index 7bb74920..47838a2c 100644 --- a/veilid-tools/src/virtual_network/router_server/mod.rs +++ b/veilid-tools/src/virtual_network/router_server/mod.rs @@ -117,7 +117,7 @@ impl RouterServer { let stop_token = stop_source.token(); let this = self.clone(); - let listener_fut = system_boxed(async move { + let listener_fut = Box::pin(async move { loop { // Wait for a new connection match listener.accept().timeout_at(stop_token.clone()).await { @@ -125,7 +125,7 @@ impl RouterServer { let conn = conn.compat(); // Register a connection processing inbound receiver let this2 = this.clone(); - let inbound_receiver_fut = system_boxed(async move { + let inbound_receiver_fut = Box::pin(async move { let (reader, writer) = conn.split(); this2.process_connection(reader, writer).await @@ -178,7 +178,7 @@ impl RouterServer { let stop_token = stop_source.token(); let this = self.clone(); - let listener_fut = system_boxed(async move { + let listener_fut = Box::pin(async move { loop { // Wait for a new connection match listener.accept().timeout_at(stop_token.clone()).await { @@ -188,7 +188,7 @@ impl RouterServer { let ws = WsStream::new(s); // Register a connection processing inbound receiver let this2 = this.clone(); - let inbound_receiver_fut = system_boxed(async move { + let inbound_receiver_fut = Box::pin(async move { let (reader, writer) = ws.split(); this2.process_connection(reader, writer).await }); @@ -233,7 +233,7 @@ impl RouterServer { let (local_outbound_sender, local_outbound_receiver) = flume::unbounded(); let this = self.clone(); - let inbound_receiver_fut = system_boxed(async move { + let inbound_receiver_fut = Box::pin(async move { local_inbound_receiver .into_stream() .for_each(|cmd| async { @@ -316,7 +316,7 @@ impl RouterServer { let framed_writer = FramedWrite::new(writer, BytesCodec); let (outbound_sender, outbound_receiver) = flume::unbounded(); - let outbound_fut = system_boxed( + let outbound_fut = Box::pin( outbound_receiver .into_stream() .map(|command| { @@ -327,7 +327,7 @@ impl RouterServer { .forward(framed_writer), ); - let inbound_fut = system_boxed(framed_reader.try_for_each(|x| async { + let inbound_fut = Box::pin(framed_reader.try_for_each(|x| async { let x = x; let cmd = from_bytes::(&x).map_err(io::Error::other)?;