From patchwork Fri Jun 1 17:42:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han Zhou X-Patchwork-Id: 924268 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="K4LSlBGe"; 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 40yBdP579Nz9ry1 for ; Sat, 2 Jun 2018 03:48:25 +1000 (AEST) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 1DBC0E5B; Fri, 1 Jun 2018 17:42:56 +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 303C5EED for ; Fri, 1 Jun 2018 17:42:50 +0000 (UTC) X-Greylist: whitelisted by SQLgrey-1.7.6 Received: from mail-pl0-f68.google.com (mail-pl0-f68.google.com [209.85.160.68]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id A9688CF for ; Fri, 1 Jun 2018 17:42:49 +0000 (UTC) Received: by mail-pl0-f68.google.com with SMTP id u6-v6so15722379pls.9 for ; Fri, 01 Jun 2018 10:42:49 -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=3HGSbWC/pWThQo9ZXRflrQIcFlXuovGXMWlzhfze/bQ=; b=K4LSlBGe3YJiK4wvccBFFd1YxlTPVeszSQs8MhO/0e6XvM7AkfhpL0BrbNuG/YMkrT JfrmQpHF4s+w4xdlSbFPz/UGlhxJvah3T9LkE8A2e6B/WXL82MNwL860LO2ICE/x2XiJ ZvtWefRfwBDn1fZ+7XH3u186OSyhu7eP8abBCCvzfxhLUGk/1P+EeUrB1nP6oSaMLHG+ Q3kTI5ziqwvNBqhw14Mjuiol3cI+B0W30MaZ7OI04o8sRIIcEkRRIcr6DpY2grVkwnCy D7FpW+xmtYoS7lH1Z/uslRfdBw33/vx+wVzf8SBMpI3ZBpV7/Q75kTTaFsF1XfBFf42U OKOg== 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=3HGSbWC/pWThQo9ZXRflrQIcFlXuovGXMWlzhfze/bQ=; b=easrfIFZUanbQHppsMVCJyeW4OOVxIW7kDSLgXZq9lKCJJt5rs1t4pewR6yuwHuhVV jVPz2dFG7656q8IDDfuhzEo+aWSp5D9YPTRS+DAYVSJTLGFHtDKGnfCl0KhyjeJShgtE /rxt1bnTvrQ7Im7hYS2Dm200vjNK1EdXFAGnZFAa3v3cRT7n31m45cTGKS8aUI3QYnGs j2QucevllXB8FBYsMI+aubeJFVb6MRqimb9IbMklopBHqtyQEgU7A0782zgwvOHPynH4 qBoJDxJh8YVNqvdq/UGEbj9jeLztom8OyeOPy7zie3liaRajLxmP/rdnOBEXutNVKN7M eCTg== X-Gm-Message-State: ALKqPwe3qKlovBQeCUoXRYS7Tq4GM3o70SJWR75DPngG8G/Fn+x+fbEo FKjemcFtt9FegH4tkyfmjGjTRg== X-Google-Smtp-Source: ADUXVKICsSjpkndNsyfvjqIG4XLKb+iybUNEmyiiiRl2yDaZA5434A6NgdDdImEbzRZxjmoRDI/mzQ== X-Received: by 2002:a17:902:b60c:: with SMTP id b12-v6mr12350456pls.44.1527874969070; Fri, 01 Jun 2018 10:42:49 -0700 (PDT) Received: from localhost.localdomain.localdomain (c-73-162-150-77.hsd1.ca.comcast.net. [73.162.150.77]) by smtp.gmail.com with ESMTPSA id v26-v6sm9600279pfe.13.2018.06.01.10.42.48 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jun 2018 10:42:48 -0700 (PDT) From: Han Zhou X-Google-Original-From: Han Zhou To: dev@openvswitch.org Date: Fri, 1 Jun 2018 10:42:01 -0700 Message-Id: <1527874926-40450-12-git-send-email-hzhou8@ebay.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1527874926-40450-1-git-send-email-hzhou8@ebay.com> References: <1527874926-40450-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 v3 11/16] ovsdb-idl: Tracking - preserve data for deleted rows. 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 OVSDB IDL can track changes, but for deleted rows, the data is destroyed and only uuid is tracked. In some cases we need to check the data of the deleted rows. This patch preserves data for deleted rows until track clear is called. Signed-off-by: Han Zhou --- lib/ovsdb-idl-provider.h | 2 ++ lib/ovsdb-idl.c | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/ovsdb-idl-provider.h b/lib/ovsdb-idl-provider.h index 70bfde1..745000d 100644 --- a/lib/ovsdb-idl-provider.h +++ b/lib/ovsdb-idl-provider.h @@ -73,6 +73,7 @@ struct ovsdb_idl_row { struct ovs_list dst_arcs; /* Backward arcs (ovsdb_idl_arc.dst_node). */ struct ovsdb_idl_table *table; /* Containing table. */ struct ovsdb_datum *old_datum; /* Committed data (null if orphaned). */ + bool parsed; /* Whether the row is parsed. */ /* Transactional data. */ struct ovsdb_datum *new_datum; /* Modified data (null to delete row). */ @@ -88,6 +89,7 @@ struct ovsdb_idl_row { unsigned int change_seqno[OVSDB_IDL_CHANGE_MAX]; struct ovs_list track_node; /* Rows modified/added/deleted by IDL */ unsigned long int *updated; /* Bitmap of columns updated by IDL */ + struct ovsdb_datum *tracked_old_datum; /* Old deleted data. */ }; struct ovsdb_idl_column { diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c index c6ff78e..1e7d121 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -1709,8 +1709,16 @@ ovsdb_idl_db_track_clear(struct ovsdb_idl_db *db) } ovs_list_remove(&row->track_node); ovs_list_init(&row->track_node); - if (ovsdb_idl_row_is_orphan(row)) { - ovsdb_idl_row_clear_old(row); + if (ovsdb_idl_row_is_orphan(row) && row->tracked_old_datum) { + ovsdb_idl_row_unparse(row); + const struct ovsdb_idl_table_class *class = + row->table->class_; + for (size_t c = 0; c < class->n_columns; c++) { + ovsdb_datum_destroy(&row->tracked_old_datum[c], + &class->columns[c].type); + } + free(row->tracked_old_datum); + row->tracked_old_datum = NULL; free(row); } } @@ -2437,10 +2445,14 @@ ovsdb_idl_row_parse(struct ovsdb_idl_row *row) const struct ovsdb_idl_table_class *class = row->table->class_; size_t i; + if (row->parsed) { + ovsdb_idl_row_unparse(row); + } for (i = 0; i < class->n_columns; i++) { const struct ovsdb_idl_column *c = &class->columns[i]; (c->parse)(row, &row->old_datum[i]); } + row->parsed = true; } static void @@ -2449,10 +2461,14 @@ ovsdb_idl_row_unparse(struct ovsdb_idl_row *row) const struct ovsdb_idl_table_class *class = row->table->class_; size_t i; + if (!row->parsed) { + return; + } for (i = 0; i < class->n_columns; i++) { const struct ovsdb_idl_column *c = &class->columns[i]; (c->unparse)(row); } + row->parsed = false; } /* The OVSDB-IDL Compound Indexes feature allows for the creation of custom @@ -2881,13 +2897,18 @@ ovsdb_idl_row_clear_old(struct ovsdb_idl_row *row) { ovs_assert(row->old_datum == row->new_datum); if (!ovsdb_idl_row_is_orphan(row)) { - const struct ovsdb_idl_table_class *class = row->table->class_; - size_t i; + if (ovsdb_idl_track_is_set(row->table)) { + row->tracked_old_datum = row->old_datum; + } else { + const struct ovsdb_idl_table_class *class = row->table->class_; + size_t i; - for (i = 0; i < class->n_columns; i++) { - ovsdb_datum_destroy(&row->old_datum[i], &class->columns[i].type); + for (i = 0; i < class->n_columns; i++) { + ovsdb_datum_destroy(&row->old_datum[i], + &class->columns[i].type); + } + free(row->old_datum); } - free(row->old_datum); row->old_datum = row->new_datum = NULL; } } @@ -3063,6 +3084,7 @@ ovsdb_idl_row_destroy_postprocess(struct ovsdb_idl_db *db) LIST_FOR_EACH_SAFE(row, next, track_node, &table->track_list) { if (!ovsdb_idl_track_is_set(row->table)) { ovs_list_remove(&row->track_node); + ovsdb_idl_row_unparse(row); free(row); } } @@ -3093,7 +3115,6 @@ static void ovsdb_idl_delete_row(struct ovsdb_idl_row *row) { ovsdb_idl_remove_from_indexes(row); - ovsdb_idl_row_unparse(row); ovsdb_idl_row_clear_arcs(row, true); ovsdb_idl_row_clear_old(row); if (ovs_list_is_empty(&row->dst_arcs)) {