From patchwork Mon Apr 12 09:04:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexey Roytman X-Patchwork-Id: 1465076 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org (client-ip=140.211.166.133; helo=smtp2.osuosl.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=eB2HdNqc; dkim-atps=neutral Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4FJjVg5Rtnz9sW0 for ; Mon, 12 Apr 2021 19:04:59 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 11866403D4; Mon, 12 Apr 2021 09:04:58 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id eEWmyBwoowwZ; Mon, 12 Apr 2021 09:04:56 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTP id 07F5A4020A; Mon, 12 Apr 2021 09:04:56 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id CDBEFC000C; Mon, 12 Apr 2021 09:04:55 +0000 (UTC) X-Original-To: ovs-dev@openvswitch.org Delivered-To: ovs-dev@lists.linuxfoundation.org Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 42B19C000A for ; Mon, 12 Apr 2021 09:04:54 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 22DA040238 for ; Mon, 12 Apr 2021 09:04:54 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id I3ekuI18BzSl for ; Mon, 12 Apr 2021 09:04:53 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.8.0 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by smtp2.osuosl.org (Postfix) with ESMTPS id C6C394020A for ; Mon, 12 Apr 2021 09:04:52 +0000 (UTC) Received: by mail-ed1-x536.google.com with SMTP id z1so14138296edb.8 for ; Mon, 12 Apr 2021 02:04:52 -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:mime-version :content-transfer-encoding; bh=GtfSuHHLDH3BUbZmzhLuM5WGE9sZKZ6YCptJ/MphNro=; b=eB2HdNqcG98dgDGXJEVPtNhLIs7NlGMWDKAx9LYxp/YCCG1AQmeJjmoGUWZkDHLcYo mMa8LobGY/J/OfObU3FRJ6ONP9TEKLjxspqQ0+KjwtVXsezzkVqX7zP26fIio3Qx7ZBb HkbCymnrV7rxYjmIy+97ZAf+DLTeIyH/lgGf2IIWSADZ2h90B7icMQgWcMj0Y9lvoLwv RPl0WKVt7fqn0g6tMMJx0X18ctm/H26MTfNXKuinKP8TbnTH3GXGqY1RjQy6UbwpEENr A6xfuZQS3ZXOWjyDgo/D9ESisi81hShQlu7zjbicmgIj+OIt+76dmq7UDyVcEfnM/f3d mobA== 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:mime-version :content-transfer-encoding; bh=GtfSuHHLDH3BUbZmzhLuM5WGE9sZKZ6YCptJ/MphNro=; b=GZVIJVjZmcPrBPgl5mDEIK3bS7FeIVhBH8+xZ3Z6HiQ5IS+/RPvbIBaU3WAAAZ+ctG iFw3DBtuhWitjMDZ3NBQj7qM9zn/FT3pTj4TQHPr7TiRupf1geG7eKVTC2AW76rPULzK kDLVQ5ehmNVsphfs7BSl6I9wcDLNbf/LzsNbIZ+11iTH4osX3iX0RoTx3l68ML4jtOaT aoapcyDjjfLrggIaagRQfAooIe8EbIcW5JF5436aBbMxCaqhEaMjufqPW/gD3SCSWWid ZhnLK9g5Qwh3lyPJW86aBMULJ+cxJNgie7W3p1CthZojaVQezNWPdLLCHVV7q4HBQVSU bmEA== X-Gm-Message-State: AOAM533u6iS9Jv3UMLtvpVbnp1KBIAAEgjCKqjzZZFpjS8H5Td/kgy1V m0RK2ehGQEKeKKjYuC82+bUq5E1q+yz9Zg== X-Google-Smtp-Source: ABdhPJzF/PnNqfZtyJYylb/e3P/+7VMSbZpZy5xmDDHnKDVsIns00xMvG1P0qPn/DK/79sjdHp+Flg== X-Received: by 2002:a05:6402:350b:: with SMTP id b11mr27756748edd.288.1618218290749; Mon, 12 Apr 2021 02:04:50 -0700 (PDT) Received: from localhost (89-138-139-233.bb.netvision.net.il. [89.138.139.233]) by smtp.gmail.com with ESMTPSA id gn19sm5173984ejc.4.2021.04.12.02.04.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 12 Apr 2021 02:04:50 -0700 (PDT) From: Alexey Roytman To: ovs-dev@openvswitch.org Date: Mon, 12 Apr 2021 12:04:45 +0300 Message-Id: <20210412090445.638426-1-aroytman@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Cc: Alexey Roytman Subject: [ovs-dev] [PATCH ovn] ovn-sbctl: Add logical flows count numbers X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ovs-dev-bounces@openvswitch.org Sender: "dev" From: Alexey Roytman For big scale deployments, when number of logical flows can be 2M+, sometimes users just need to know the total number of logical flows and numbers of logical flows per table/per datapath. New command output Datapath: "sw1" (4b1e53d8-9f0f-4768-b4a6-6cbc58a4bfda) Pipeline: ingress table=0 (ls_in_port_sec_l2 ) lflows=2 table=1 (ls_in_port_sec_ip ) lflows=1 table=2 (ls_in_port_sec_nd ) lflows=1 table=3 (ls_in_lookup_fdb ) lflows=1 table=4 (ls_in_put_fdb ) lflows=1 table=5 (ls_in_pre_acl ) lflows=2 table=6 (ls_in_pre_lb ) lflows=3 table=7 (ls_in_pre_stateful ) lflows=2 table=8 (ls_in_acl_hint ) lflows=1 table=9 (ls_in_acl ) lflows=2 table=10(ls_in_qos_mark ) lflows=1 table=11(ls_in_qos_meter ) lflows=1 table=12(ls_in_lb ) lflows=1 table=13(ls_in_stateful ) lflows=8 table=14(ls_in_pre_hairpin ) lflows=1 table=15(ls_in_nat_hairpin ) lflows=1 table=16(ls_in_hairpin ) lflows=1 table=17(ls_in_arp_rsp ) lflows=1 table=18(ls_in_dhcp_options ) lflows=1 table=19(ls_in_dhcp_response) lflows=1 table=20(ls_in_dns_lookup ) lflows=1 table=21(ls_in_dns_response ) lflows=1 table=22(ls_in_external_port) lflows=1 table=23(ls_in_l2_lkup ) lflows=3 table=24(ls_in_l2_unknown ) lflows=2 Total number of logical flows in the datapath = 41 Datapath: "sw1" (4b1e53d8-9f0f-4768-b4a6-6cbc58a4bfda) Pipeline: egress table=0 (ls_out_pre_lb ) lflows=3 table=1 (ls_out_pre_acl ) lflows=2 table=2 (ls_out_pre_stateful) lflows=2 table=3 (ls_out_lb ) lflows=1 table=4 (ls_out_acl_hint ) lflows=1 table=5 (ls_out_acl ) lflows=2 table=6 (ls_out_qos_mark ) lflows=1 table=7 (ls_out_qos_meter ) lflows=1 table=8 (ls_out_stateful ) lflows=3 table=9 (ls_out_port_sec_ip ) lflows=1 table=10(ls_out_port_sec_l2 ) lflows=1 Total number of logical flows in the datapath = 18 Total number of logical flows = 59 Signed-off-by: Alexey Roytman --- utilities/ovn-sbctl.8.in | 5 +++ utilities/ovn-sbctl.c | 72 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/utilities/ovn-sbctl.8.in b/utilities/ovn-sbctl.8.in index 153e72e6c..46e01140b 100644 --- a/utilities/ovn-sbctl.8.in +++ b/utilities/ovn-sbctl.8.in @@ -207,6 +207,11 @@ conjunction with \fB\-\-vflows\fR. .IP "[\fB\-\-uuid\fR] \fBdump\-flows\fR [\fIlogical-datapath\fR]" Alias for \fBlflow\-list\fB. . +.IP "[\fB\-\-count\fR] \fBlflow\-list\fR [\fIlogical-datapath\fR]" +and +.IP "[\fB\-\-count\fR] \fBdump\-flows\fR [\fIlogical-datapath\fR]" +Print numbers of logical flows per table and per datapath. +. .SS "Remote Connectivity Commands" . These commands manipulate the \fBconnections\fR column in the \fBSB_Global\fR diff --git a/utilities/ovn-sbctl.c b/utilities/ovn-sbctl.c index e3aa7a68e..ca9047a42 100644 --- a/utilities/ovn-sbctl.c +++ b/utilities/ovn-sbctl.c @@ -1114,6 +1114,63 @@ sbctl_lflow_add(struct sbctl_lflow **lflows, (*n_flows)++; } +static void +print_datapath_prompt(const struct sbrec_datapath_binding *dp, + const struct uuid *uuid, + char *pipeline) { + printf("Datapath: "); + print_datapath_name(dp); + printf(" ("UUID_FMT") Pipeline: %s\n", UUID_ARGS(uuid), pipeline); +} + +static void +print_lflows_count(int64_t table_id, const char *name, long count) { + printf(" table=%-2"PRId64"(%-19s) lflows=%ld\n", \ + table_id, name, count); +} + +static void +print_lfow_counters(size_t n_flows, struct sbctl_lflow *lflows) +{ + const struct sbctl_lflow *curr, *prev = NULL; + long table_lflows = 0; + long dp_lflows = 0; + + for (size_t i = 0; i < n_flows; i++) { + bool new_datapath = false; + curr = &lflows[i]; + if (!prev + || prev->dp != curr->dp + || strcmp(prev->lflow->pipeline, curr->lflow->pipeline)) { + new_datapath = true; + } + + if ( prev && (prev->lflow->table_id != curr->lflow->table_id || new_datapath )) { + print_lflows_count(prev->lflow->table_id, smap_get_def(&prev->lflow->external_ids, "stage-name", ""), table_lflows); + table_lflows = 1; + if ( new_datapath ) { + printf("Total number of logical flows in the datapath = %ld\n\n", dp_lflows); + dp_lflows = 1; + } else { + dp_lflows++; + } + } else { + dp_lflows++; + table_lflows++; + } + + if ( new_datapath ) { + print_datapath_prompt(curr->dp, &curr->dp->header_.uuid, curr->lflow->pipeline); + } + prev = curr; + } + if ( n_flows > 0) { + print_lflows_count(prev->lflow->table_id, smap_get_def(&prev->lflow->external_ids, "stage-name", ""), table_lflows); + printf("Total number of logical flows in the datapath = %ld\n\n", dp_lflows); + } + printf("Total number of logical flows = %ld\n", n_flows); +} + static void cmd_lflow_list(struct ctl_context *ctx) { @@ -1176,6 +1233,10 @@ cmd_lflow_list(struct ctl_context *ctx) qsort(lflows, n_flows, sizeof *lflows, sbctl_lflow_cmp); } + if ( shash_find(&ctx->options, "--count") != NULL ) { + print_lfow_counters(n_flows, lflows); + goto cleanup; + } bool print_uuid = shash_find(&ctx->options, "--uuid") != NULL; const struct sbctl_lflow *curr, *prev = NULL; @@ -1207,11 +1268,7 @@ cmd_lflow_list(struct ctl_context *ctx) if (!prev || prev->dp != curr->dp || strcmp(prev->lflow->pipeline, curr->lflow->pipeline)) { - printf("Datapath: "); - print_datapath_name(curr->dp); - printf(" ("UUID_FMT") Pipeline: %s\n", - UUID_ARGS(&curr->dp->header_.uuid), - curr->lflow->pipeline); + print_datapath_prompt(curr->dp, &curr->dp->header_.uuid, curr->lflow->pipeline); } /* Print the flow. */ @@ -1238,6 +1295,7 @@ cmd_lflow_list(struct ctl_context *ctx) cmd_lflow_list_load_balancers(ctx, vconn, datapath, stats, print_uuid); } +cleanup: vconn_close(vconn); free(lflows); } @@ -1824,10 +1882,10 @@ static const struct ctl_command_syntax sbctl_commands[] = { /* Logical flow commands */ {"lflow-list", 0, INT_MAX, "[DATAPATH] [LFLOW...]", pre_get_info, cmd_lflow_list, NULL, - "--uuid,--ovs?,--stats,--vflows?", RO}, + "--uuid,--ovs?,--stats,--vflows?,--count?", RO}, {"dump-flows", 0, INT_MAX, "[DATAPATH] [LFLOW...]", pre_get_info, cmd_lflow_list, NULL, - "--uuid,--ovs?,--stats,--vflows?", + "--uuid,--ovs?,--stats,--vflows?,--count?", RO}, /* Friendly alias for lflow-list */ /* IP multicast commands. */