From patchwork Wed Jul 25 00:59:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Zhou X-Patchwork-Id: 948982 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="T85h3+Dy"; dkim-atps=neutral Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41Zxr06GpQz9s0R for ; Wed, 25 Jul 2018 11:06:08 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id B05FDEC2; Wed, 25 Jul 2018 00:59:57 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 102B3E99 for ; Wed, 25 Jul 2018 00:59:49 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pl0-f48.google.com (mail-pl0-f48.google.com [209.85.160.48]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 82FCF708 for ; Wed, 25 Jul 2018 00:59:48 +0000 (UTC) Received: by mail-pl0-f48.google.com with SMTP id x6-v6so812515plv.10 for ; Tue, 24 Jul 2018 17:59:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=naDj0VU6iu5jp4A0pIas7QsXuajTIBwg4YBjboLdoMY=; b=T85h3+DyC6BINWr+0JgTtacbZyBkprW2FEgRfQz5Wpp+FOkU3W3i5PGG7IRox37qrj OHuEi4FM/xMEuytAgJsTPkPfq/Tu7gdYNpLeJdQp+C+sjQjy71wpL6SjxERPFu1cOxOB IiTWw8RfZHnq6NUUnKvSdXEFDQ6zpyOPnUyRp6guADxGfA9bw1WiyPgQsqddqx/2RsvR QlI4Ldfv1OWvI3ve/Dr6bpBBkd8FPRsAVepiPBoT1j5DjZjN0yHAnTKOxnUTlGiJJ9lM InOJpdoKxv55RbBXbR8F0pDyWM/m8NJpyMsOSwh/JIDui8wPQsB5c0KidGSLMI77Es7O mYQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=naDj0VU6iu5jp4A0pIas7QsXuajTIBwg4YBjboLdoMY=; b=oh/YVvqSSp4u6VEx39OXHjrYdPoyvL+zC9E6pi+3oo0SPhw03nqFfKL1RTS7ADNMry gLlDBI26WYAFlYKXK/xes6dwyZRbjyxVG/ZQiaLksy3mqaijR31W7Ubi3YTXvRBejsus nTePHdPY8dMiq6sBM4j9A+o4c0jVZ4QHakLqYIqQ2LiHJ88ju9baJPZLr62AXOhuCvUI KqPv0n1tIWNJKQfJQAakOpNdNJ0LzHc+yNtKPWFLHUOQOzWZorhf9N4iBvTmwKlW5uHG ZiaFX5RSRmfCNbbCfeJSV5y0HQzHAl93aKku7ZE7wtbe7SIzNCP6hnr3Z1FVnm8HHMBC rMlg== X-Gm-Message-State: AOUpUlHLt+cFbZvf1aoGa8wLKaMySlHWgcO8+gaHleRvAwxlkPaAsEhm /FsXrJv9XOx0N/GkpYX3YNDrSZsx X-Google-Smtp-Source: AAOMgpc5XU7ybxA42w+gUOycWU2TBdY9NhTge0scOW6ef2ERm2RnyhDLPg/Wp6a2LlJcIRntqx9MUA== X-Received: by 2002:a17:902:8ecb:: with SMTP id x11-v6mr19367556plo.308.1532480387914; Tue, 24 Jul 2018 17:59:47 -0700 (PDT) Received: from localhost.localdomain.localdomain ([216.113.160.71]) by smtp.gmail.com with ESMTPSA id g11-v6sm18798424pgi.90.2018.07.24.17.59.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 24 Jul 2018 17:59:47 -0700 (PDT) From: Han Zhou X-Google-Original-From: Han Zhou To: dev@openvswitch.org Date: Tue, 24 Jul 2018 17:59:40 -0700 Message-Id: <1532480380-97578-15-git-send-email-hzhou8@ebay.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1532480380-97578-1-git-send-email-hzhou8@ebay.com> References: <1532480380-97578-1-git-send-email-hzhou8@ebay.com> X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [RFC 14/14] ovn-controller: Incremental processing for port-group changes. X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Signed-off-by: Han Zhou --- ovn/controller/lflow.h | 3 +- ovn/controller/ovn-controller.c | 110 ++++++++++++++++++++++++++++++++++------ 2 files changed, 97 insertions(+), 16 deletions(-) diff --git a/ovn/controller/lflow.h b/ovn/controller/lflow.h index 01dda1d..b90f971 100644 --- a/ovn/controller/lflow.h +++ b/ovn/controller/lflow.h @@ -70,7 +70,8 @@ struct uuid; #define LOG_PIPELINE_LEN 24 enum ref_type { - REF_TYPE_ADDRSET + REF_TYPE_ADDRSET, + REF_TYPE_PORTGROUP }; /* Maintains the relationship for a pair of named resource and diff --git a/ovn/controller/ovn-controller.c b/ovn/controller/ovn-controller.c index 13bc333..1f95acb 100644 --- a/ovn/controller/ovn-controller.c +++ b/ovn/controller/ovn-controller.c @@ -330,6 +330,29 @@ port_groups_init(const struct sbrec_port_group_table *port_group_table, } static void +port_groups_update(const struct sbrec_port_group_table *port_group_table, + struct shash *port_groups, struct sset *new, + struct sset *deleted, struct sset *updated) +{ + const struct sbrec_port_group *pg; + SBREC_PORT_GROUP_TABLE_FOR_EACH_TRACKED (pg, port_group_table) { + if (sbrec_port_group_is_deleted(pg)) { + expr_const_sets_remove(port_groups, pg->name); + sset_add(deleted, pg->name); + } else { + expr_const_sets_add(port_groups, pg->name, + (const char *const *) pg->ports, + pg->n_ports, false); + if (sbrec_port_group_is_new(pg)) { + sset_add(new, pg->name); + } else { + sset_add(updated, pg->name); + } + } + } +} + +static void update_ssl_config(const struct ovsrec_ssl_table *ssl_table) { const struct ovsrec_ssl *ssl = ovsrec_ssl_table_first(ssl_table); @@ -748,6 +771,30 @@ en_port_groups_run(struct engine_node *node) node->changed = true; } +static bool +port_groups_sb_port_group_handler(struct engine_node *node) +{ + struct ed_type_port_groups *pg = (struct ed_type_port_groups *)node->data; + + sset_clear(&pg->new); + sset_clear(&pg->deleted); + sset_clear(&pg->updated); + + struct sbrec_port_group_table *pg_table = + (struct sbrec_port_group_table *)EN_OVSDB_GET( + engine_get_input("SB_port_group", node)); + + port_groups_update(pg_table, &pg->port_groups, &pg->new, + &pg->deleted, &pg->updated); + + node->changed = !sset_is_empty(&pg->new) || !sset_is_empty(&pg->deleted) + || !sset_is_empty(&pg->updated); + + pg->change_tracked = true; + node->changed = true; + return true; +} + struct ed_type_runtime_data { /* Contains "struct local_datapath" nodes. */ struct hmap local_datapaths; @@ -1338,7 +1385,8 @@ flow_output_sb_multicast_group_handler(struct engine_node *node) } static bool -flow_output_addr_sets_handler(struct engine_node *node) +_flow_output_resource_ref_handler(struct engine_node *node, + enum ref_type ref_type) { struct ed_type_runtime_data *data = (struct ed_type_runtime_data *)engine_get_input( @@ -1349,11 +1397,6 @@ flow_output_addr_sets_handler(struct engine_node *node) struct ed_type_addr_sets *as_data = (struct ed_type_addr_sets *)engine_get_input("addr_sets", node)->data; - - /* XXX: The change_tracked check may be added to inc-proc framework. */ - if (!as_data->change_tracked) { - return false; - } struct shash *addr_sets = &as_data->addr_sets; struct ed_type_port_groups *pg_data = @@ -1412,10 +1455,35 @@ flow_output_addr_sets_handler(struct engine_node *node) engine_get_input("SB_logical_flow", node)); bool changed; - const char *as; + const char *ref_name; + struct sset *new, *updated, *deleted; + + switch (ref_type) { + case REF_TYPE_ADDRSET: + /* XXX: The change_tracked check may be added to inc-proc + * framework. */ + if (!as_data->change_tracked) { + return false; + } + new = &as_data->new; + updated = &as_data->updated; + deleted = &as_data->deleted; + break; + case REF_TYPE_PORTGROUP: + if (!pg_data->change_tracked) { + return false; + } + new = &pg_data->new; + updated = &pg_data->updated; + deleted = &pg_data->deleted; + break; + default: + OVS_NOT_REACHED(); + } + - SSET_FOR_EACH (as, &as_data->deleted) { - if (!lflow_handle_changed_ref(REF_TYPE_ADDRSET, as, + SSET_FOR_EACH (ref_name, deleted) { + if (!lflow_handle_changed_ref(ref_type, ref_name, sbrec_chassis_by_name, sbrec_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, @@ -1428,8 +1496,8 @@ flow_output_addr_sets_handler(struct engine_node *node) } node->changed = changed || node->changed; } - SSET_FOR_EACH (as, &as_data->updated) { - if (!lflow_handle_changed_ref(REF_TYPE_ADDRSET, as, + SSET_FOR_EACH (ref_name, updated) { + if (!lflow_handle_changed_ref(ref_type, ref_name, sbrec_chassis_by_name, sbrec_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, @@ -1442,8 +1510,8 @@ flow_output_addr_sets_handler(struct engine_node *node) } node->changed = changed || node->changed; } - SSET_FOR_EACH (as, &as_data->new) { - if (!lflow_handle_changed_ref(REF_TYPE_ADDRSET, as, + SSET_FOR_EACH (ref_name, new) { + if (!lflow_handle_changed_ref(ref_type, ref_name, sbrec_chassis_by_name, sbrec_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, @@ -1460,6 +1528,18 @@ flow_output_addr_sets_handler(struct engine_node *node) return true; } +static bool +flow_output_addr_sets_handler(struct engine_node *node) +{ + return _flow_output_resource_ref_handler(node, REF_TYPE_ADDRSET); +} + +static bool +flow_output_port_groups_handler(struct engine_node *node) +{ + return _flow_output_resource_ref_handler(node, REF_TYPE_PORTGROUP); +} + int main(int argc, char *argv[]) { @@ -1552,10 +1632,10 @@ main(int argc, char *argv[]) ENGINE_NODE(port_groups, "port_groups"); engine_add_input(&en_addr_sets, &en_sb_address_set, addr_sets_sb_address_set_handler); - engine_add_input(&en_port_groups, &en_sb_port_group, NULL); + engine_add_input(&en_port_groups, &en_sb_port_group, port_groups_sb_port_group_handler); engine_add_input(&en_flow_output, &en_addr_sets, flow_output_addr_sets_handler); - engine_add_input(&en_flow_output, &en_port_groups, NULL); + engine_add_input(&en_flow_output, &en_port_groups, flow_output_port_groups_handler); engine_add_input(&en_flow_output, &en_runtime_data, NULL); engine_add_input(&en_flow_output, &en_ovs_open_vswitch, NULL);