Hi Mark, Thanks for your review. I'm going fix this point Regards, Paulo
Em ter., 1 de set. de 2026 às 16:05, Mark Michelson <[email protected]> escreveu: > Hi Paulo, > > AI noticed that all header files in this patch are missing the Apache > 2.0 license header. > > > On Mon, Aug 31, 2026 at 1:04 PM Paulo Guilherme Silva > <[email protected]> wrote: > > > > Replace the single monolithic en_ic engine node (which ran the whole > > ovn_db_run() full recompute on any tracked change) with one engine node > > per subsystem: en_dp_enum, en_gateway, en_ts, en_tr, en_port_binding, > > en_route, en_service_monitor and en_address_set. en_ic becomes a pure > > output node that only aggregates them. > > > > Each subsystem node still performs a full recompute in its run() method > > (no change handlers yet), but is now gated on only the table inputs it > > actually reads, so an unrelated change no longer forces every subsystem > > to recompute. Change handlers are added incrementally in later commits. > > > > The transit switch/router datapath tunnel-key allocator and the transit > > switch/router datapath maps (previously built on the stack by > > enumerate_datapaths() and shared by ts_run()/tr_run()) are now owned by > > the en_dp_enum node. en_dp_enum depends on every input that can trigger > > a tunnel-key allocation (IC-SB datapath bindings, transit switches, > > transit routers and vxlan_mode) so the allocator is always rebuilt from > > scratch in the same iteration as any allocation, preserving correctness. > > > > The address-set synchronization added by the "ovn-ic: Address set > > synchronization across AZs" upstream commit becomes the en_address_set > > node, gated on the NB/SB/IC-SB Address_Set tables and NB_Global. > > > > The ic_sb_global table is no longer modeled as an engine input: it only > > carries IC-SB sequence numbers written by update_sequence_numbers() in > > the main loop, outside the engine, and is not read by any subsystem. > > > > No functional change: all existing ovn-ic system tests pass. > > > > Assisted-by: Claude Opus 4.8, Claude Code > > Signed-off-by: Paulo Guilherme Silva <[email protected]> > > --- > > ic/automake.mk | 16 +++++ > > ic/en-address-set.c | 45 ++++++++++++ > > ic/en-address-set.h | 11 +++ > > ic/en-dp-enum.c | 68 ++++++++++++++++++ > > ic/en-dp-enum.h | 30 ++++++++ > > ic/en-gateway.c | 45 ++++++++++++ > > ic/en-gateway.h | 10 +++ > > ic/en-ic.c | 9 ++- > > ic/en-port-binding.c | 45 ++++++++++++ > > ic/en-port-binding.h | 11 +++ > > ic/en-route.c | 45 ++++++++++++ > > ic/en-route.h | 10 +++ > > ic/en-service-monitor.c | 46 ++++++++++++ > > ic/en-service-monitor.h | 12 ++++ > > ic/en-tr.c | 47 ++++++++++++ > > ic/en-tr.h | 10 +++ > > ic/en-ts.c | 47 ++++++++++++ > > ic/en-ts.h | 10 +++ > > ic/inc-proc-ic.c | 154 ++++++++++++++++++++++++++++++---------- > > ic/ovn-ic.c | 21 ------ > > ic/ovn-ic.h | 2 - > > 21 files changed, 630 insertions(+), 64 deletions(-) > > create mode 100644 ic/en-address-set.c > > create mode 100644 ic/en-address-set.h > > create mode 100644 ic/en-dp-enum.c > > create mode 100644 ic/en-dp-enum.h > > create mode 100644 ic/en-gateway.c > > create mode 100644 ic/en-gateway.h > > create mode 100644 ic/en-port-binding.c > > create mode 100644 ic/en-port-binding.h > > create mode 100644 ic/en-route.c > > create mode 100644 ic/en-route.h > > create mode 100644 ic/en-service-monitor.c > > create mode 100644 ic/en-service-monitor.h > > create mode 100644 ic/en-tr.c > > create mode 100644 ic/en-tr.h > > create mode 100644 ic/en-ts.c > > create mode 100644 ic/en-ts.h > > > > diff --git a/ic/automake.mk b/ic/automake.mk > > index a69b1030d..fd888d60c 100644 > > --- a/ic/automake.mk > > +++ b/ic/automake.mk > > @@ -4,6 +4,22 @@ ic_ovn_ic_SOURCES = ic/ovn-ic.c \ > > ic/ovn-ic.h \ > > ic/en-ic.c \ > > ic/en-ic.h \ > > + ic/en-dp-enum.c \ > > + ic/en-dp-enum.h \ > > + ic/en-gateway.c \ > > + ic/en-gateway.h \ > > + ic/en-ts.c \ > > + ic/en-ts.h \ > > + ic/en-tr.c \ > > + ic/en-tr.h \ > > + ic/en-port-binding.c \ > > + ic/en-port-binding.h \ > > + ic/en-route.c \ > > + ic/en-route.h \ > > + ic/en-service-monitor.c \ > > + ic/en-service-monitor.h \ > > + ic/en-address-set.c \ > > + ic/en-address-set.h \ > > ic/inc-proc-ic.c \ > > ic/inc-proc-ic.h > > ic_ovn_ic_LDADD = \ > > diff --git a/ic/en-address-set.c b/ic/en-address-set.c > > new file mode 100644 > > index 000000000..764dd71d2 > > --- /dev/null > > +++ b/ic/en-address-set.c > > @@ -0,0 +1,45 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-address-set.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_address_set); > > + > > +enum engine_node_state > > +en_address_set_run(struct engine_node *node OVS_UNUSED, void *data > OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + > > + address_set_run(ctx); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_address_set_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_address_set_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-address-set.h b/ic/en-address-set.h > > new file mode 100644 > > index 000000000..3f74b24a5 > > --- /dev/null > > +++ b/ic/en-address-set.h > > @@ -0,0 +1,11 @@ > > +#ifndef EN_IC_ADDRESS_SET_H > > +#define EN_IC_ADDRESS_SET_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_address_set_run(struct engine_node *node, > > + void *data); > > +void *en_address_set_init(struct engine_node *node, struct engine_arg > *arg); > > +void en_address_set_cleanup(void *data); > > + > > +#endif /* EN_IC_ADDRESS_SET_H */ > > diff --git a/ic/en-dp-enum.c b/ic/en-dp-enum.c > > new file mode 100644 > > index 000000000..fd447ab52 > > --- /dev/null > > +++ b/ic/en-dp-enum.c > > @@ -0,0 +1,68 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-dp-enum.h" > > +#include "lib/inc-proc-eng.h" > > +#include "lib/ovn-util.h" > > +#include "openvswitch/hmap.h" > > +#include "openvswitch/shash.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_dp_enum); > > + > > +enum engine_node_state > > +en_dp_enum_run(struct engine_node *node OVS_UNUSED, void *data_) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + struct ed_type_dp_enum *data = data_; > > + > > + /* Clear the previous iteration's state and rebuild from the > current IC-SB > > + * datapath bindings. */ > > + ovn_destroy_tnlids(&data->dp_tnlids); > > + hmap_init(&data->dp_tnlids); > > + shash_clear(&data->isb_ts_dps); > > + shash_clear(&data->isb_tr_dps); > > + > > + enumerate_datapaths(ctx, &data->dp_tnlids, &data->isb_ts_dps, > > + &data->isb_tr_dps); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_dp_enum_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + struct ed_type_dp_enum *data = xzalloc(sizeof *data); > > + > > + hmap_init(&data->dp_tnlids); > > + shash_init(&data->isb_ts_dps); > > + shash_init(&data->isb_tr_dps); > > + > > + return data; > > +} > > + > > +void > > +en_dp_enum_cleanup(void *data_) > > +{ > > + struct ed_type_dp_enum *data = data_; > > + > > + ovn_destroy_tnlids(&data->dp_tnlids); > > + shash_destroy(&data->isb_ts_dps); > > + shash_destroy(&data->isb_tr_dps); > > +} > > diff --git a/ic/en-dp-enum.h b/ic/en-dp-enum.h > > new file mode 100644 > > index 000000000..206e6423c > > --- /dev/null > > +++ b/ic/en-dp-enum.h > > @@ -0,0 +1,30 @@ > > +#ifndef EN_IC_DP_ENUM_H > > +#define EN_IC_DP_ENUM_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/hmap.h" > > +#include "openvswitch/shash.h" > > + > > +/* Data maintained by the "dp_enum" engine node: the result of > enumerating the > > + * IC-SB datapath bindings. It is the explicit, engine-visible form of > the > > + * state that used to be built on the stack by enumerate_datapaths() > inside > > + * ovn_db_run(). The transit-switch (en_ts) and transit-router (en_tr) > nodes > > + * consume this data instead of rebuilding it themselves, which also > keeps the > > + * shared 'dp_tnlids' tunnel-key allocator consistent between them. */ > > +struct ed_type_dp_enum { > > + /* Set of tunnel keys already in use by IC-SB datapath bindings. > Holds > > + * 'struct tnlid_node *' entries owned by this node. */ > > + struct hmap dp_tnlids; > > + /* Transit-switch datapath bindings, keyed by transit switch name. > Values > > + * are 'const struct icsbrec_datapath_binding *' owned by the IDL. > */ > > + struct shash isb_ts_dps; > > + /* Transit-router datapath bindings, keyed by NB IC UUID string. > Values > > + * are 'const struct icsbrec_datapath_binding *' owned by the IDL. > */ > > + struct shash isb_tr_dps; > > +}; > > + > > +enum engine_node_state en_dp_enum_run(struct engine_node *node, void > *data); > > +void *en_dp_enum_init(struct engine_node *node, struct engine_arg *arg); > > +void en_dp_enum_cleanup(void *data); > > + > > +#endif /* EN_IC_DP_ENUM_H */ > > diff --git a/ic/en-gateway.c b/ic/en-gateway.c > > new file mode 100644 > > index 000000000..f41166018 > > --- /dev/null > > +++ b/ic/en-gateway.c > > @@ -0,0 +1,45 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-gateway.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_gateway); > > + > > +enum engine_node_state > > +en_gateway_run(struct engine_node *node OVS_UNUSED, void *data > OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + > > + gateway_run(ctx); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_gateway_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_gateway_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-gateway.h b/ic/en-gateway.h > > new file mode 100644 > > index 000000000..d804d114f > > --- /dev/null > > +++ b/ic/en-gateway.h > > @@ -0,0 +1,10 @@ > > +#ifndef EN_IC_GATEWAY_H > > +#define EN_IC_GATEWAY_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_gateway_run(struct engine_node *node, void > *data); > > +void *en_gateway_init(struct engine_node *node, struct engine_arg *arg); > > +void en_gateway_cleanup(void *data); > > + > > +#endif /* EN_IC_GATEWAY_H */ > > diff --git a/ic/en-ic.c b/ic/en-ic.c > > index 2db9d3b84..d671e2cb0 100644 > > --- a/ic/en-ic.c > > +++ b/ic/en-ic.c > > @@ -29,11 +29,10 @@ VLOG_DEFINE_THIS_MODULE(en_ic); > > enum engine_node_state > > en_ic_run(struct engine_node *node OVS_UNUSED, void *data OVS_UNUSED) > > { > > - const struct engine_context *eng_ctx = engine_get_context(); > > - struct ic_context *ctx = eng_ctx->client_ctx; > > - > > - ovn_db_run(ctx); > > - > > + /* 'en_ic' is the engine's output node and only aggregates the per > > + * subsystem nodes (gateway, ts, tr, port_binding, route, > service_monitor > > + * and address_set). Each of those nodes performs (and gates) its > own > > + * work, so this node has nothing to compute itself. */ > > return EN_UPDATED; > > } > > > > diff --git a/ic/en-port-binding.c b/ic/en-port-binding.c > > new file mode 100644 > > index 000000000..8843d6cef > > --- /dev/null > > +++ b/ic/en-port-binding.c > > @@ -0,0 +1,45 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-port-binding.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_port_binding); > > + > > +enum engine_node_state > > +en_port_binding_run(struct engine_node *node OVS_UNUSED, void *data > OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + > > + port_binding_run(ctx); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_port_binding_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_port_binding_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-port-binding.h b/ic/en-port-binding.h > > new file mode 100644 > > index 000000000..030a470dd > > --- /dev/null > > +++ b/ic/en-port-binding.h > > @@ -0,0 +1,11 @@ > > +#ifndef EN_IC_PORT_BINDING_H > > +#define EN_IC_PORT_BINDING_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_port_binding_run(struct engine_node *node, > > + void *data); > > +void *en_port_binding_init(struct engine_node *node, struct engine_arg > *arg); > > +void en_port_binding_cleanup(void *data); > > + > > +#endif /* EN_IC_PORT_BINDING_H */ > > diff --git a/ic/en-route.c b/ic/en-route.c > > new file mode 100644 > > index 000000000..ec39d89d9 > > --- /dev/null > > +++ b/ic/en-route.c > > @@ -0,0 +1,45 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-route.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_route); > > + > > +enum engine_node_state > > +en_route_run(struct engine_node *node OVS_UNUSED, void *data OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + > > + route_run(ctx); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_route_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_route_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-route.h b/ic/en-route.h > > new file mode 100644 > > index 000000000..c03aed19e > > --- /dev/null > > +++ b/ic/en-route.h > > @@ -0,0 +1,10 @@ > > +#ifndef EN_IC_ROUTE_H > > +#define EN_IC_ROUTE_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_route_run(struct engine_node *node, void > *data); > > +void *en_route_init(struct engine_node *node, struct engine_arg *arg); > > +void en_route_cleanup(void *data); > > + > > +#endif /* EN_IC_ROUTE_H */ > > diff --git a/ic/en-service-monitor.c b/ic/en-service-monitor.c > > new file mode 100644 > > index 000000000..b85a36dc7 > > --- /dev/null > > +++ b/ic/en-service-monitor.c > > @@ -0,0 +1,46 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-service-monitor.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_service_monitor); > > + > > +enum engine_node_state > > +en_service_monitor_run(struct engine_node *node OVS_UNUSED, > > + void *data OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + > > + sync_service_monitor(ctx); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_service_monitor_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_service_monitor_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-service-monitor.h b/ic/en-service-monitor.h > > new file mode 100644 > > index 000000000..55103635e > > --- /dev/null > > +++ b/ic/en-service-monitor.h > > @@ -0,0 +1,12 @@ > > +#ifndef EN_IC_SERVICE_MONITOR_H > > +#define EN_IC_SERVICE_MONITOR_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_service_monitor_run(struct engine_node *node, > > + void *data); > > +void *en_service_monitor_init(struct engine_node *node, > > + struct engine_arg *arg); > > +void en_service_monitor_cleanup(void *data); > > + > > +#endif /* EN_IC_SERVICE_MONITOR_H */ > > diff --git a/ic/en-tr.c b/ic/en-tr.c > > new file mode 100644 > > index 000000000..4f05a4325 > > --- /dev/null > > +++ b/ic/en-tr.c > > @@ -0,0 +1,47 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-dp-enum.h" > > +#include "en-tr.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_tr); > > + > > +enum engine_node_state > > +en_tr_run(struct engine_node *node, void *data OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + struct ed_type_dp_enum *dp = engine_get_input_data("dp_enum", node); > > + > > + tr_run(ctx, &dp->dp_tnlids, &dp->isb_tr_dps); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_tr_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_tr_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-tr.h b/ic/en-tr.h > > new file mode 100644 > > index 000000000..90c8c8c4a > > --- /dev/null > > +++ b/ic/en-tr.h > > @@ -0,0 +1,10 @@ > > +#ifndef EN_IC_TR_H > > +#define EN_IC_TR_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_tr_run(struct engine_node *node, void *data); > > +void *en_tr_init(struct engine_node *node, struct engine_arg *arg); > > +void en_tr_cleanup(void *data); > > + > > +#endif /* EN_IC_TR_H */ > > diff --git a/ic/en-ts.c b/ic/en-ts.c > > new file mode 100644 > > index 000000000..e8df1888a > > --- /dev/null > > +++ b/ic/en-ts.c > > @@ -0,0 +1,47 @@ > > +/* > > + * Licensed under the Apache License, Version 2.0 (the "License"); > > + * you may not use this file except in compliance with the License. > > + * You may obtain a copy of the License at: > > + * > > + * http://www.apache.org/licenses/LICENSE-2.0 > > + * > > + * Unless required by applicable law or agreed to in writing, software > > + * distributed under the License is distributed on an "AS IS" BASIS, > > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or > implied. > > + * See the License for the specific language governing permissions and > > + * limitations under the License. > > + */ > > + > > +#include <config.h> > > + > > +#include "en-dp-enum.h" > > +#include "en-ts.h" > > +#include "lib/inc-proc-eng.h" > > +#include "openvswitch/vlog.h" > > +#include "ovn-ic.h" > > + > > +VLOG_DEFINE_THIS_MODULE(en_ic_ts); > > + > > +enum engine_node_state > > +en_ts_run(struct engine_node *node, void *data OVS_UNUSED) > > +{ > > + const struct engine_context *eng_ctx = engine_get_context(); > > + struct ic_context *ctx = eng_ctx->client_ctx; > > + struct ed_type_dp_enum *dp = engine_get_input_data("dp_enum", node); > > + > > + ts_run(ctx, &dp->dp_tnlids, &dp->isb_ts_dps); > > + > > + return EN_UPDATED; > > +} > > + > > +void * > > +en_ts_init(struct engine_node *node OVS_UNUSED, > > + struct engine_arg *arg OVS_UNUSED) > > +{ > > + return NULL; > > +} > > + > > +void > > +en_ts_cleanup(void *data OVS_UNUSED) > > +{ > > +} > > diff --git a/ic/en-ts.h b/ic/en-ts.h > > new file mode 100644 > > index 000000000..3c22f3b40 > > --- /dev/null > > +++ b/ic/en-ts.h > > @@ -0,0 +1,10 @@ > > +#ifndef EN_IC_TS_H > > +#define EN_IC_TS_H 1 > > + > > +#include "lib/inc-proc-eng.h" > > + > > +enum engine_node_state en_ts_run(struct engine_node *node, void *data); > > +void *en_ts_init(struct engine_node *node, struct engine_arg *arg); > > +void en_ts_cleanup(void *data); > > + > > +#endif /* EN_IC_TS_H */ > > diff --git a/ic/inc-proc-ic.c b/ic/inc-proc-ic.c > > index bbcbcdd17..a6f029e37 100644 > > --- a/ic/inc-proc-ic.c > > +++ b/ic/inc-proc-ic.c > > @@ -27,6 +27,14 @@ > > #include "openvswitch/vlog.h" > > #include "inc-proc-ic.h" > > #include "en-ic.h" > > +#include "en-dp-enum.h" > > +#include "en-gateway.h" > > +#include "en-ts.h" > > +#include "en-tr.h" > > +#include "en-port-binding.h" > > +#include "en-route.h" > > +#include "en-service-monitor.h" > > +#include "en-address-set.h" > > #include "ovn-util.h" > > #include "unixctl.h" > > #include "util.h" > > @@ -108,8 +116,11 @@ VLOG_DEFINE_THIS_MODULE(inc_proc_ic); > > ICNB_NODES > > #undef ICNB_NODE > > > > +/* Note: the ic_sb_global table is intentionally not modeled as an > engine input > > + * node. It only carries IC-SB sequence numbers, which are written by > > + * update_sequence_numbers() in the main loop (outside the engine) and > are not > > + * read by any subsystem node. */ > > #define ICSB_NODES \ > > - ICSB_NODE(ic_sb_global, "ic_sb_global") \ > > ICSB_NODE(availability_zone, "availability_zone") \ > > ICSB_NODE(service_monitor, "service_monitor") \ > > ICSB_NODE(route, "route") \ > > @@ -162,6 +173,14 @@ VLOG_DEFINE_THIS_MODULE(inc_proc_ic); > > > > /* Define engine nodes for other nodes. They should be defined as > static to > > * avoid sparse errors. */ > > +static ENGINE_NODE(dp_enum); > > +static ENGINE_NODE(gateway); > > +static ENGINE_NODE(ts); > > +static ENGINE_NODE(tr); > > +static ENGINE_NODE(port_binding); > > +static ENGINE_NODE(route); > > +static ENGINE_NODE(service_monitor); > > +static ENGINE_NODE(address_set); > > static ENGINE_NODE(ic); > > > > void inc_proc_ic_init(struct ovsdb_idl_loop *nb, > > @@ -169,41 +188,104 @@ void inc_proc_ic_init(struct ovsdb_idl_loop *nb, > > struct ovsdb_idl_loop *icnb, > > struct ovsdb_idl_loop *icsb) > > { > > - /* Define relationships between nodes where first argument is > dependent > > - * on the second argument */ > > - engine_add_input(&en_ic, &en_nb_nb_global, NULL); > > - engine_add_input(&en_ic, &en_nb_logical_router_static_route, NULL); > > - engine_add_input(&en_ic, &en_nb_logical_router, NULL); > > - engine_add_input(&en_ic, &en_nb_logical_router_port, NULL); > > - engine_add_input(&en_ic, &en_nb_logical_switch, NULL); > > - engine_add_input(&en_ic, &en_nb_logical_switch_port, NULL); > > - engine_add_input(&en_ic, &en_nb_load_balancer, NULL); > > - engine_add_input(&en_ic, &en_nb_load_balancer_group, NULL); > > - engine_add_input(&en_ic, &en_nb_address_set, NULL); > > - > > - engine_add_input(&en_ic, &en_sb_sb_global, NULL); > > - engine_add_input(&en_ic, &en_sb_chassis, NULL); > > - engine_add_input(&en_ic, &en_sb_encap, NULL); > > - engine_add_input(&en_ic, &en_sb_datapath_binding, NULL); > > - engine_add_input(&en_ic, &en_sb_port_binding, NULL); > > - engine_add_input(&en_ic, &en_sb_service_monitor, NULL); > > - engine_add_input(&en_ic, &en_sb_learned_route, NULL); > > - engine_add_input(&en_ic, &en_sb_address_set, NULL); > > - > > - engine_add_input(&en_ic, &en_icnb_ic_nb_global, NULL); > > - engine_add_input(&en_ic, &en_icnb_transit_switch, NULL); > > - engine_add_input(&en_ic, &en_icnb_transit_router, NULL); > > - engine_add_input(&en_ic, &en_icnb_transit_router_port, NULL); > > - > > - engine_add_input(&en_ic, &en_icsb_encap, NULL); > > - engine_add_input(&en_ic, &en_icsb_service_monitor, NULL); > > - engine_add_input(&en_ic, &en_icsb_ic_sb_global, NULL); > > - engine_add_input(&en_ic, &en_icsb_port_binding, NULL); > > - engine_add_input(&en_ic, &en_icsb_availability_zone, NULL); > > - engine_add_input(&en_ic, &en_icsb_gateway, NULL); > > - engine_add_input(&en_ic, &en_icsb_route, NULL); > > - engine_add_input(&en_ic, &en_icsb_datapath_binding, NULL); > > - engine_add_input(&en_ic, &en_icsb_address_set, NULL); > > + /* Define relationships between nodes where the first argument is > dependent > > + * on the second argument. > > + * > > + * Each subsystem node below depends on the table input nodes it > reads, so > > + * the engine only re-runs a subsystem when one of its inputs > changed. No > > + * change handlers are wired yet: every dependency uses a NULL > handler, so > > + * any tracked change to an input triggers a full recompute of just > that > > + * subsystem (run() method). This preserves the previous behavior > while > > + * splitting the monolithic ovn_db_run() into independently-gated > nodes. > > + * Change handlers are added incrementally in a later step. */ > > + > > + /* en_dp_enum: enumerate IC-SB datapath bindings (tunnel-key > allocator and > > + * transit switch/router datapath maps shared by en_ts and en_tr). > > + * > > + * en_ts and en_tr allocate datapath tunnel keys from the shared > > + * 'dp_tnlids' set owned by this node, mutating it during their > run. To > > + * keep that allocator correct, en_dp_enum must rebuild it from > scratch in > > + * the same iteration as any allocation. It therefore depends not > only on > > + * the IC-SB datapath bindings themselves, but also on every input > that can > > + * cause en_ts/en_tr to allocate a key: a new transit switch or > router, or > > + * a change of vxlan_mode (which forces a tunnel-key refresh). */ > > + engine_add_input(&en_dp_enum, &en_icsb_datapath_binding, NULL); > > + engine_add_input(&en_dp_enum, &en_icnb_transit_switch, NULL); > > + engine_add_input(&en_dp_enum, &en_icnb_transit_router, NULL); > > + engine_add_input(&en_dp_enum, &en_icnb_ic_nb_global, NULL); > > + > > + /* en_gateway: sync gateways/chassis between SB and IC-SB. */ > > + engine_add_input(&en_gateway, &en_icsb_availability_zone, NULL); > > + engine_add_input(&en_gateway, &en_icsb_gateway, NULL); > > + engine_add_input(&en_gateway, &en_icsb_encap, NULL); > > + engine_add_input(&en_gateway, &en_sb_chassis, NULL); > > + engine_add_input(&en_gateway, &en_sb_encap, NULL); > > + > > + /* en_ts: sync transit switches to NB and IC-SB datapath bindings. > */ > > + engine_add_input(&en_ts, &en_dp_enum, NULL); > > + engine_add_input(&en_ts, &en_icnb_ic_nb_global, NULL); > > + engine_add_input(&en_ts, &en_icnb_transit_switch, NULL); > > + engine_add_input(&en_ts, &en_nb_logical_switch, NULL); > > + engine_add_input(&en_ts, &en_icsb_encap, NULL); > > + > > + /* en_tr: sync transit routers to NB and IC-SB datapath bindings. */ > > + engine_add_input(&en_tr, &en_dp_enum, NULL); > > + engine_add_input(&en_tr, &en_icnb_transit_router, NULL); > > + engine_add_input(&en_tr, &en_nb_logical_router, NULL); > > + > > + /* en_port_binding: sync cross-AZ port bindings. */ > > + engine_add_input(&en_port_binding, &en_icsb_availability_zone, > NULL); > > + engine_add_input(&en_port_binding, &en_icsb_port_binding, NULL); > > + engine_add_input(&en_port_binding, &en_icnb_transit_switch, NULL); > > + engine_add_input(&en_port_binding, &en_icnb_transit_router, NULL); > > + engine_add_input(&en_port_binding, &en_icnb_transit_router_port, > NULL); > > + engine_add_input(&en_port_binding, &en_nb_logical_switch, NULL); > > + engine_add_input(&en_port_binding, &en_nb_logical_switch_port, > NULL); > > + engine_add_input(&en_port_binding, &en_nb_logical_router, NULL); > > + engine_add_input(&en_port_binding, &en_nb_logical_router_port, > NULL); > > + engine_add_input(&en_port_binding, &en_sb_port_binding, NULL); > > + engine_add_input(&en_port_binding, &en_sb_chassis, NULL); > > + > > + /* en_route: advertise/learn cross-AZ routes. */ > > + engine_add_input(&en_route, &en_icsb_availability_zone, NULL); > > + engine_add_input(&en_route, &en_icsb_port_binding, NULL); > > + engine_add_input(&en_route, &en_icsb_route, NULL); > > + engine_add_input(&en_route, &en_icnb_transit_switch, NULL); > > + engine_add_input(&en_route, &en_nb_nb_global, NULL); > > + engine_add_input(&en_route, &en_nb_logical_router, NULL); > > + engine_add_input(&en_route, &en_nb_logical_router_port, NULL); > > + engine_add_input(&en_route, &en_nb_logical_router_static_route, > NULL); > > + engine_add_input(&en_route, &en_nb_logical_switch_port, NULL); > > + engine_add_input(&en_route, &en_nb_load_balancer, NULL); > > + engine_add_input(&en_route, &en_nb_load_balancer_group, NULL); > > + engine_add_input(&en_route, &en_sb_datapath_binding, NULL); > > + engine_add_input(&en_route, &en_sb_learned_route, NULL); > > + > > + /* en_service_monitor: sync load-balancer health checks across AZs. > */ > > + engine_add_input(&en_service_monitor, &en_icsb_availability_zone, > NULL); > > + engine_add_input(&en_service_monitor, &en_icsb_service_monitor, > NULL); > > + engine_add_input(&en_service_monitor, &en_sb_sb_global, NULL); > > + engine_add_input(&en_service_monitor, &en_sb_service_monitor, NULL); > > + engine_add_input(&en_service_monitor, &en_sb_port_binding, NULL); > > + > > + /* en_address_set: advertise/learn address sets across AZs. */ > > + engine_add_input(&en_address_set, &en_icsb_availability_zone, NULL); > > + engine_add_input(&en_address_set, &en_nb_nb_global, NULL); > > + engine_add_input(&en_address_set, &en_nb_address_set, NULL); > > + engine_add_input(&en_address_set, &en_sb_address_set, NULL); > > + engine_add_input(&en_address_set, &en_icsb_address_set, NULL); > > + > > + /* en_ic: output node aggregating all subsystems. Order matches the > > + * previous ovn_db_run() call order; in particular en_ts is added > before > > + * en_tr so they allocate datapath tunnel keys from the shared > en_dp_enum > > + * allocator in the same order as before. */ > > + engine_add_input(&en_ic, &en_gateway, NULL); > > + engine_add_input(&en_ic, &en_ts, NULL); > > + engine_add_input(&en_ic, &en_tr, NULL); > > + engine_add_input(&en_ic, &en_port_binding, NULL); > > + engine_add_input(&en_ic, &en_route, NULL); > > + engine_add_input(&en_ic, &en_service_monitor, NULL); > > + engine_add_input(&en_ic, &en_address_set, NULL); > > > > struct engine_arg engine_arg = { > > .nb_idl = nb->idl, > > diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c > > index 738685eaa..6e0d1b4e1 100644 > > --- a/ic/ovn-ic.c > > +++ b/ic/ovn-ic.c > > @@ -3782,27 +3782,6 @@ inc_proc_graph_dump(const char *end_node) > > ovsdb_idl_loop_destroy(&ovnisb_idl_loop); > > } > > > > -void > > -ovn_db_run(struct ic_context *ctx) > > -{ > > - struct hmap dp_tnlids = HMAP_INITIALIZER(&dp_tnlids); > > - struct shash isb_ts_dps = SHASH_INITIALIZER(&isb_ts_dps); > > - struct shash isb_tr_dps = SHASH_INITIALIZER(&isb_tr_dps); > > - > > - gateway_run(ctx); > > - enumerate_datapaths(ctx, &dp_tnlids, &isb_ts_dps, &isb_tr_dps); > > - ts_run(ctx, &dp_tnlids, &isb_ts_dps); > > - tr_run(ctx, &dp_tnlids, &isb_tr_dps); > > - port_binding_run(ctx); > > - route_run(ctx); > > - sync_service_monitor(ctx); > > - address_set_run(ctx); > > - > > - ovn_destroy_tnlids(&dp_tnlids); > > - shash_destroy(&isb_ts_dps); > > - shash_destroy(&isb_tr_dps); > > -} > > - > > static void > > parse_options(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > { > > diff --git a/ic/ovn-ic.h b/ic/ovn-ic.h > > index 94a233f10..b06725373 100644 > > --- a/ic/ovn-ic.h > > +++ b/ic/ovn-ic.h > > @@ -64,8 +64,6 @@ enum ic_port_binding_type { IC_SWITCH_PORT, > IC_ROUTER_PORT, IC_PORT_MAX }; > > struct hmap; > > struct shash; > > > > -void ovn_db_run(struct ic_context *ctx); > > - > > /* Per-subsystem entry points, invoked by the incremental-processing > engine > > * nodes (see ic/en-*.c). Each performs a full recompute of its > subsystem and > > * may be invoked independently when its engine inputs change. */ > > -- > > 2.34.1 > > > > > > -- > > > > > > > > > > _'Esta mensagem é direcionada apenas para os endereços constantes no > > cabeçalho inicial. Se você não está listado nos endereços constantes no > > cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa > > mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas > estão > > imediatamente anuladas e proibidas'._ > > > > > > * **'Apesar do Magazine Luiza tomar > > todas as precauções razoáveis para assegurar que nenhum vírus esteja > > presente nesse e-mail, a empresa não poderá aceitar a responsabilidade > por > > quaisquer perdas ou danos causados por esse e-mail ou por seus anexos'.* > > > > > > > > _______________________________________________ > > dev mailing list > > [email protected] > > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > > > -- _‘Esta mensagem é direcionada apenas para os endereços constantes no cabeçalho inicial. Se você não está listado nos endereços constantes no cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão imediatamente anuladas e proibidas’._ * **‘Apesar do Magazine Luiza tomar todas as precauções razoáveis para assegurar que nenhum vírus esteja presente nesse e-mail, a empresa não poderá aceitar a responsabilidade por quaisquer perdas ou danos causados por esse e-mail ou por seus anexos’.* _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
