From patchwork Mon Aug 13 17:48:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Zhou X-Patchwork-Id: 957092 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="IOxnbKL4"; 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 41q3Lw1Kkvz9sBD for ; Tue, 14 Aug 2018 03:56:24 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 054F6DB2; Mon, 13 Aug 2018 17:48:48 +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 C1675E37 for ; Mon, 13 Aug 2018 17:48:43 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 42D3A765 for ; Mon, 13 Aug 2018 17:48:43 +0000 (UTC) Received: by mail-pf1-f169.google.com with SMTP id x17-v6so8001140pfh.5 for ; Mon, 13 Aug 2018 10:48:43 -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=PdMeo5zDXDWmx6gO/IE/EsJ9morVTelT1vTdSXq5E9U=; b=IOxnbKL4K8nKbKV9uijOS5uIWT4xx6LejyZtK77uNmlvInOfEzNl+lQxemD+u77yAt V0mr4cznsgAbKCggOV9aPsbfSL84fV5jYCxD8KWRhcgWN9DNpnJ9lI88ZAV5kK7HVQDW 01iqSZhUxkUzcS54Yw0CCDAmE6VVmnYpd/T409xF/ZG0/xmVeEygQkKPWEmKpQ+zC8ZD hQ8B1cDgzNpHuZa3t9qungV+Z3li5Gf2lNRlc6N/7oc7ul7vYBKVAa3jpGKJprCCUIHe Di+onfeObudvPgY48Lcqpj/Os6i9m71MKJMsP7KwurRj8nzwSym5hG4VZg6eDzm7K0yH BUTg== 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=PdMeo5zDXDWmx6gO/IE/EsJ9morVTelT1vTdSXq5E9U=; b=b2Q757jsK8Y35koPavDH6Y6nMlAiXDs7HoTYpWT+yYdYZxDWEeHOkh/HKtQEqZn1tH xxCSsC2uyZ5oQzqcU38RxWyBDfXsepzRU0IQ9IUdRd+fXs1qlWCsuNNW25i5P24+UYgI GEPFZPyJzpyQj8Du7x3FnEm6DulXPnxJDubUiZD6ohTAubTzbRr96xFh1JfLFtRMEW63 V70OQUOyF4JCvbONwKfFfHVcIGYvA1yAyGECXSvQrRhGGyKEAyClRLFZlVJI1PxdD5Wb aM2EeBvdZJnzI7JatZuQDlh3YKkk64j/NQ+CWt2hQc/x10dOMyz+E64Y3iPfJVEJSNWv jVRQ== X-Gm-Message-State: AOUpUlGRv82Yf134csBeTeQquZmNxfdpSkjmyDVqkePTq8EpJoEqCWkt rqW1dLaHnslC4bsBVrOqwzM0h1TK X-Google-Smtp-Source: AA+uWPw++f01Thxkr9mHS8/89Ksp6OogO8RFfPrwocf0b2fdHZ/V2b8Q/KJVTGrwwVy+MNEWNa3vBw== X-Received: by 2002:a63:920c:: with SMTP id o12-v6mr18075197pgd.141.1534182522572; Mon, 13 Aug 2018 10:48:42 -0700 (PDT) Received: from localhost.localdomain.localdomain ([216.113.160.70]) by smtp.gmail.com with ESMTPSA id d22-v6sm38068664pfk.69.2018.08.13.10.48.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 13 Aug 2018 10:48:42 -0700 (PDT) From: Han Zhou X-Google-Original-From: Han Zhou To: dev@openvswitch.org Date: Mon, 13 Aug 2018 10:48:16 -0700 Message-Id: <1534182499-75914-18-git-send-email-hzhou8@ebay.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1534182499-75914-1-git-send-email-hzhou8@ebay.com> References: <1534182499-75914-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] [PATCH v5 17/20] 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 8509145..99e9016 100644 --- a/ovn/controller/ovn-controller.c +++ b/ovn/controller/ovn-controller.c @@ -333,6 +333,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); @@ -751,6 +774,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; @@ -1377,7 +1424,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( @@ -1388,11 +1436,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 = @@ -1451,10 +1494,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, @@ -1467,8 +1535,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, @@ -1481,8 +1549,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, @@ -1499,6 +1567,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); +} + struct ovn_controller_exit_args { bool *exiting; bool *restart; @@ -1610,10 +1690,10 @@ main(int argc, char *argv[]) /* Add dependencies between inc-proc-engine nodes. */ 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_mff_ovn_geneve, NULL);