From abf50649d13018bf40c5803730a03053737efeee Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sun, 8 Sep 2024 17:42:25 -0400 Subject: [PATCH] clusterlin: simplify DepGraphFormatter::Ser This does not change the serialization format. It turns out that it is unnecessary to keep track of the order of transactions in the so-far reconstructed DepGraph to decide how far from the end to insert a new transaction. --- src/test/util/cluster_linearize.h | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/test/util/cluster_linearize.h b/src/test/util/cluster_linearize.h index 1ee0f7c2a79..a9ae4ff12a8 100644 --- a/src/test/util/cluster_linearize.h +++ b/src/test/util/cluster_linearize.h @@ -134,9 +134,8 @@ struct DepGraphFormatter }); /** Which transactions the deserializer already knows when it has deserialized what has - * been serialized here so far, and in what order. */ - std::vector rebuilt_order; - rebuilt_order.reserve(depgraph.TxCount()); + * been serialized here so far. */ + SetType done; // Loop over the transactions in topological order. for (ClusterIndex topo_idx = 0; topo_idx < topo_order.size(); ++topo_idx) { @@ -166,14 +165,11 @@ struct DepGraphFormatter } } // Write position information. - ClusterIndex insert_distance = 0; - while (insert_distance < rebuilt_order.size()) { - // Loop to find how far from the end in rebuilt_order to insert. - if (idx > *(rebuilt_order.end() - 1 - insert_distance)) break; - ++insert_distance; - } - rebuilt_order.insert(rebuilt_order.end() - insert_distance, idx); - s << VARINT(diff + insert_distance); + // The new transaction is to be inserted N positions back from the end of the cluster. + // Emit N to indicate that that many insertion choices are skipped. + auto skips = (done - SetType::Fill(idx)).Count(); + s << VARINT(diff + skips); + done.Set(idx); } // Output a final 0 to denote the end of the graph.