From patchwork Fri May 17 19:56:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Zhou X-Patchwork-Id: 1101245 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="ZD2u5Wxc"; 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 455K733JLNz9s6w for ; Sat, 18 May 2019 06:06:23 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 8A20DCF6; Fri, 17 May 2019 19:59:07 +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 223C9CCB for ; Fri, 17 May 2019 19:59:05 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 587D482C for ; Fri, 17 May 2019 19:59:04 +0000 (UTC) Received: by mail-ed1-f65.google.com with SMTP id w37so12208601edw.4 for ; Fri, 17 May 2019 12:59:04 -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=CSSSLifvG7VM8lNtbod+JUpYYfLDt9xABOhLW00NLD0=; b=ZD2u5Wxc3ayseAt39wHyGXtxV0FuUewWsiILZ+CY9X4r3L4MdqkGIvqsumMO3LDcmX YxpXvxblq/EYFDNbU4wPWiF8t6ZcbxZHkjOs63ZvmTURa3gvdKqGP7H8w0WCQ6j5P1Z+ zSQArCHvrIssWEBfTJ62JVG/JMSQNOINax4qnAMveDpIQWbFYnoNK5IRWoIh++uj/4We qkeFWeR3BKSy7Kq0g7pTTt10xbK3dq+aAPEJWABM+Q2/2c0whx9rlKYAg54Zf5zYe2uv iwnDNCBnXOy/ggfvoUOGLWZSSuXfcLM46fC7AxNXu27iAzOVs2TUGROyl8tYTi2Tcogu hr3g== 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=CSSSLifvG7VM8lNtbod+JUpYYfLDt9xABOhLW00NLD0=; b=Fe7SkXsbWAlNwK7l+JZPcBkquwAlYY6iYVDtmaukLlOV+HBEw3f35VRk4uqebNsMe/ IOU+V2gJkPOwcakVS10jBT4K7S3ULdWu8H6EkdCNWmTxT7TKDQL8Bxrk3ETM/PlFAeSD T6HoemWqLXoBzp+ngBy1HsLh6bKZvs3OemkLoM9yO+TeB+s4Wm3j3TxUY/WORhqgWbzM s4ZsBkfX6aISMbkQ9l87Dnvnoz5+NHmDC/XCNyABZaYewx1Ck9vz/a7/4qvvNSfoQnb7 W1goSo29AHx6pLWiw3z71ZI6CcmR2LJ3/nWW20QT1fi45PFo/iOWD2I3rljpSUoSRdKC vTuQ== X-Gm-Message-State: APjAAAWQYSSsjzR7anWA4CGsSpR0/JsZcCwSwsjZZi8D2HceF+6Vjnvt lvBoxuRsmsij8iejPK/2sCnTJiy6aCI= X-Google-Smtp-Source: APXvYqw7ihSfRrkm0Om9mXq/tSAGjUsC6vjhveRDHkeqaVc3SkO/1990QngOPmscf1fY+kViVR89hg== X-Received: by 2002:a17:906:f84c:: with SMTP id ks12mr35478942ejb.270.1558123142727; Fri, 17 May 2019 12:59:02 -0700 (PDT) Received: from localhost.localdomain.localdomain ([216.113.160.77]) by smtp.gmail.com with ESMTPSA id e43sm2989371edb.38.2019.05.17.12.59.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 17 May 2019 12:59:02 -0700 (PDT) From: Han Zhou X-Google-Original-From: Han Zhou To: dev@openvswitch.org Date: Fri, 17 May 2019 12:56:38 -0700 Message-Id: <1558123002-4905-14-git-send-email-hzhou8@ebay.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1558123002-4905-1-git-send-email-hzhou8@ebay.com> References: <1558123002-4905-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 v6 13/17] 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 From: Han Zhou Signed-off-by: Han Zhou --- ovn/controller/lflow.h | 3 +- ovn/controller/ovn-controller.c | 112 ++++++++++++++++++++++++++++++++++------ 2 files changed, 99 insertions(+), 16 deletions(-) diff --git a/ovn/controller/lflow.h b/ovn/controller/lflow.h index 2a75ac5..2b5016e 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 5ec9a5e..fa94879 100644 --- a/ovn/controller/ovn-controller.c +++ b/ovn/controller/ovn-controller.c @@ -357,6 +357,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); @@ -793,6 +816,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; @@ -1436,7 +1483,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( @@ -1447,11 +1495,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 = @@ -1510,10 +1553,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_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, dhcpv6_table, logical_flow_table, @@ -1525,8 +1593,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_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, dhcpv6_table, logical_flow_table, @@ -1538,8 +1606,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_multicast_group_by_name_datapath, sbrec_port_binding_by_name,dhcp_table, dhcpv6_table, logical_flow_table, @@ -1555,6 +1623,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; @@ -1672,11 +1752,13 @@ main(int argc, char *argv[]) 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);