From c35434459a3640cf91aeed8dc4324b1f4e290856 Mon Sep 17 00:00:00 2001 From: Uday Patil Date: Wed, 28 Sep 2022 10:53:04 -0700 Subject: [PATCH 1/4] [graph] Fix buildcompletionsignals --- app/graph.go | 22 ++++++---- app/graph_test.go | 102 +++++++++++++++++++++++++++++++--------------- go.mod | 2 +- go.sum | 2 - 4 files changed, 85 insertions(+), 43 deletions(-) diff --git a/app/graph.go b/app/graph.go index 05c958257d..dd04cdf461 100644 --- a/app/graph.go +++ b/app/graph.go @@ -118,12 +118,6 @@ func (dag *Dag) AddEdge(fromIndex DagNodeID, toIndex DagNodeID) *DagEdge { // It will also register the new node with AccessOpsMap so that future nodes that amy be dependent on this one can properly identify the dependency. func (dag *Dag) AddNodeBuildDependency(messageIndex int, txIndex int, accessOp acltypes.AccessOperation) { dagNode := dag.AddNode(messageIndex, txIndex, accessOp) - // if in TxIndexMap, make an edge from the previous node index - if lastTxNodeID, ok := dag.TxIndexMap[txIndex]; ok { - // TODO: we actually don't necessarily need these edges, but keeping for now so we can first determine that cycles can't be missed if we remove these - // add an edge between access ops in a transaction - dag.AddEdge(lastTxNodeID, dagNode.NodeID) - } // update tx index map dag.TxIndexMap[txIndex] = dagNode.NodeID @@ -205,6 +199,8 @@ func (dag *Dag) BuildCompletionSignalMaps() ( completionSignalingMap map[int]MessageCompletionSignalMapping, blockingSignalsMap map[int]MessageCompletionSignalMapping, ) { + completionSignalingMap = make(map[int]MessageCompletionSignalMapping) + blockingSignalsMap = make(map[int]MessageCompletionSignalMapping) // go through every node for _, node := range dag.NodeMap { // for each node, assign its completion signaling, and also assign blocking signals for the destination nodes @@ -214,11 +210,23 @@ func (dag *Dag) BuildCompletionSignalMaps() ( if maybeCompletionSignal != nil { completionSignal := *maybeCompletionSignal - // add it to the right blocking signal in the right txindex toNode := dag.NodeMap[edge.ToNodeID] + if _, exists := blockingSignalsMap[toNode.TxIndex]; !exists { + blockingSignalsMap[toNode.TxIndex] = make(MessageCompletionSignalMapping) + } + if _, exists := blockingSignalsMap[toNode.TxIndex][toNode.MessageIndex]; !exists { + blockingSignalsMap[toNode.TxIndex][toNode.MessageIndex] = make(map[acltypes.AccessOperation][]CompletionSignal) + } + // add it to the right blocking signal in the right txindex prevBlockSignalMapping := blockingSignalsMap[toNode.TxIndex][toNode.MessageIndex][completionSignal.BlockedAccessOperation] blockingSignalsMap[toNode.TxIndex][toNode.MessageIndex][completionSignal.BlockedAccessOperation] = append(prevBlockSignalMapping, completionSignal) + if _, exists := completionSignalingMap[node.TxIndex]; !exists { + completionSignalingMap[node.TxIndex] = make(MessageCompletionSignalMapping) + } + if _, exists := completionSignalingMap[node.TxIndex][node.MessageIndex]; !exists { + completionSignalingMap[node.TxIndex][node.MessageIndex] = make(map[acltypes.AccessOperation][]CompletionSignal) + } // add it to the completion signal for the tx index prevCompletionSignalMapping := completionSignalingMap[node.TxIndex][node.MessageIndex][completionSignal.CompletionAccessOperation] completionSignalingMap[node.TxIndex][node.MessageIndex][completionSignal.CompletionAccessOperation] = append(prevCompletionSignalMapping, completionSignal) diff --git a/app/graph_test.go b/app/graph_test.go index 622705eab1..fa9480062d 100644 --- a/app/graph_test.go +++ b/app/graph_test.go @@ -48,26 +48,22 @@ func TestCreateGraph(t *testing.T) { IdentifierTemplate: "ResourceB", } - dag.AddNodeBuildDependency(1, 1, writeAccessA) // node id 0 - dag.AddNodeBuildDependency(1, 1, readAccessB) // node id 1 - dag.AddNodeBuildDependency(1, 1, commitAccessOp) // node id 2 - dag.AddNodeBuildDependency(1, 2, readAccessA) // node id 3 - dag.AddNodeBuildDependency(1, 2, readAccessB) // node id 4 - dag.AddNodeBuildDependency(1, 2, commitAccessOp) // node id 5 - dag.AddNodeBuildDependency(1, 3, readAccessB) // node id 6 - dag.AddNodeBuildDependency(1, 3, readAccessA) // node id 7 - dag.AddNodeBuildDependency(1, 3, commitAccessOp) // node id 8 - dag.AddNodeBuildDependency(1, 4, writeAccessB) // node id 9 - dag.AddNodeBuildDependency(1, 4, commitAccessOp) // node id 10 + dag.AddNodeBuildDependency(0, 0, writeAccessA) // node id 0 + dag.AddNodeBuildDependency(0, 0, readAccessB) // node id 1 + dag.AddNodeBuildDependency(0, 0, commitAccessOp) // node id 2 + dag.AddNodeBuildDependency(0, 1, readAccessA) // node id 3 + dag.AddNodeBuildDependency(0, 1, readAccessB) // node id 4 + dag.AddNodeBuildDependency(0, 1, commitAccessOp) // node id 5 + dag.AddNodeBuildDependency(0, 2, readAccessB) // node id 6 + dag.AddNodeBuildDependency(0, 2, readAccessA) // node id 7 + dag.AddNodeBuildDependency(0, 2, commitAccessOp) // node id 8 + dag.AddNodeBuildDependency(0, 3, writeAccessB) // node id 9 + dag.AddNodeBuildDependency(0, 3, commitAccessOp) // node id 10 + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[0]) require.Equal( t, - []app.DagEdge{{0, 1}}, - dag.EdgesMap[0], - ) - require.Equal( - t, - []app.DagEdge{{1, 2}, {1, 9}}, + []app.DagEdge{{1, 9}}, dag.EdgesMap[1], ) require.Equal( @@ -75,36 +71,76 @@ func TestCreateGraph(t *testing.T) { []app.DagEdge{{2, 3}, {2, 7}}, dag.EdgesMap[2], ) + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[3]) require.Equal( t, - []app.DagEdge{{3, 4}}, - dag.EdgesMap[3], - ) - require.Equal( - t, - []app.DagEdge{{4, 5}, {4, 9}}, + []app.DagEdge{{4, 9}}, dag.EdgesMap[4], ) require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[5]) require.Equal( t, - []app.DagEdge{{6, 7}, {6, 9}}, + []app.DagEdge{{6, 9}}, dag.EdgesMap[6], ) + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[7]) + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[8]) + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[9]) + require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[10]) + + // assert dag is acyclic + acyclic := graph.Acyclic(dag) + require.True(t, acyclic) + + // test completion signals + completionSignalsMap, blockingSignalsMap := dag.BuildCompletionSignalMaps() + + channel0 := completionSignalsMap[0][0][commitAccessOp][0].Channel + channel1 := completionSignalsMap[0][0][commitAccessOp][1].Channel + channel2 := completionSignalsMap[1][0][readAccessB][0].Channel + channel3 := completionSignalsMap[0][0][readAccessB][0].Channel + channel4 := completionSignalsMap[2][0][readAccessB][0].Channel + + signal0 := app.CompletionSignal{2, 3, commitAccessOp, readAccessA, channel0} + signal1 := app.CompletionSignal{2, 7, commitAccessOp, readAccessA, channel1} + signal2 := app.CompletionSignal{4, 9, readAccessB, writeAccessB, channel2} + signal3 := app.CompletionSignal{1, 9, readAccessB, writeAccessB, channel3} + signal4 := app.CompletionSignal{6, 9, readAccessB, writeAccessB, channel4} + require.Equal( t, - []app.DagEdge{{7, 8}}, - dag.EdgesMap[7], + []app.CompletionSignal{signal0, signal1}, + completionSignalsMap[0][0][commitAccessOp], ) - require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[8]) require.Equal( t, - []app.DagEdge{{9, 10}}, - dag.EdgesMap[9], + []app.CompletionSignal{signal0}, + blockingSignalsMap[1][0][readAccessA], + ) + require.Equal( + t, + []app.CompletionSignal{signal1}, + blockingSignalsMap[2][0][readAccessA], ) - require.Equal(t, []app.DagEdge(nil), dag.EdgesMap[10]) - // assert dag is acyclic - acyclic := graph.Acyclic(dag) - require.True(t, acyclic) + require.Equal( + t, + []app.CompletionSignal{signal2}, + completionSignalsMap[1][0][readAccessB], + ) + require.Equal( + t, + []app.CompletionSignal{signal3}, + completionSignalsMap[0][0][readAccessB], + ) + require.Equal( + t, + []app.CompletionSignal{signal4}, + completionSignalsMap[2][0][readAccessB], + ) + require.Equal( + t, + []app.CompletionSignal{signal4, signal3, signal2}, + blockingSignalsMap[3][0][writeAccessB], + ) } diff --git a/go.mod b/go.mod index 07529b8eac..2137021593 100644 --- a/go.mod +++ b/go.mod @@ -130,7 +130,7 @@ require ( ) replace ( - github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.69 + github.com/cosmos/cosmos-sdk => ../sei-cosmos //github.com/sei-protocol/sei-cosmos v0.1.68 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.1.54 diff --git a/go.sum b/go.sum index 8ac94499e1..a5ec73fe90 100644 --- a/go.sum +++ b/go.sum @@ -1095,8 +1095,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= -github.com/sei-protocol/sei-cosmos v0.1.69 h1:jPFTf6vSg3DQ0FgKpQGw6ZEUuElKL2UJ3P8SBXbYnio= -github.com/sei-protocol/sei-cosmos v0.1.69/go.mod h1:Oaj7toqHCkwEEb+sDIWxtfTkPZxOpMXBXDMvIIqUjpw= github.com/sei-protocol/sei-tendermint v0.1.54 h1:T8snsZ5schPUSMa2STd61a0Mt/yoz1H5MTn3HRTbzj8= github.com/sei-protocol/sei-tendermint v0.1.54/go.mod h1:Olwbjyagrpoxj5DAUhHxMTWDVEfQ3FYdpypaJ3+6Hs8= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= From 97e1e8e74c1ba10aac25e5df8f3a5dd58abed6a0 Mon Sep 17 00:00:00 2001 From: Uday Patil Date: Thu, 29 Sep 2022 09:49:39 -0700 Subject: [PATCH 2/4] fix test --- app/graph_test.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/graph_test.go b/app/graph_test.go index fa9480062d..5cf8e08733 100644 --- a/app/graph_test.go +++ b/app/graph_test.go @@ -1,6 +1,7 @@ package app_test import ( + "sort" "testing" acltypes "github.com/cosmos/cosmos-sdk/types/accesscontrol" @@ -138,9 +139,13 @@ func TestCreateGraph(t *testing.T) { []app.CompletionSignal{signal4}, completionSignalsMap[2][0][readAccessB], ) + slice := blockingSignalsMap[3][0][writeAccessB] + sort.SliceStable(slice, func(p, q int) bool { + return slice[p].FromNodeID < slice[q].FromNodeID + }) require.Equal( t, - []app.CompletionSignal{signal4, signal3, signal2}, - blockingSignalsMap[3][0][writeAccessB], + []app.CompletionSignal{signal3, signal2, signal4}, + slice, ) } From 64fea90b11029164421d2f521adb8596a2b50863 Mon Sep 17 00:00:00 2001 From: Uday Patil Date: Thu, 29 Sep 2022 10:23:58 -0700 Subject: [PATCH 3/4] update go mod --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2137021593..07529b8eac 100644 --- a/go.mod +++ b/go.mod @@ -130,7 +130,7 @@ require ( ) replace ( - github.com/cosmos/cosmos-sdk => ../sei-cosmos //github.com/sei-protocol/sei-cosmos v0.1.68 + github.com/cosmos/cosmos-sdk => github.com/sei-protocol/sei-cosmos v0.1.69 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 github.com/tendermint/tendermint => github.com/sei-protocol/sei-tendermint v0.1.54 diff --git a/go.sum b/go.sum index a5ec73fe90..8ac94499e1 100644 --- a/go.sum +++ b/go.sum @@ -1095,6 +1095,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec/v2 v2.11.0/go.mod h1:SX8bptShuG8reGC0XS09+a4H2BoWSJi+fscA+Pulbpo= github.com/segmentio/fasthash v1.0.3/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= +github.com/sei-protocol/sei-cosmos v0.1.69 h1:jPFTf6vSg3DQ0FgKpQGw6ZEUuElKL2UJ3P8SBXbYnio= +github.com/sei-protocol/sei-cosmos v0.1.69/go.mod h1:Oaj7toqHCkwEEb+sDIWxtfTkPZxOpMXBXDMvIIqUjpw= github.com/sei-protocol/sei-tendermint v0.1.54 h1:T8snsZ5schPUSMa2STd61a0Mt/yoz1H5MTn3HRTbzj8= github.com/sei-protocol/sei-tendermint v0.1.54/go.mod h1:Olwbjyagrpoxj5DAUhHxMTWDVEfQ3FYdpypaJ3+6Hs8= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= From f13fcb0bb4755d6238c005ff2b182961e0c27c87 Mon Sep 17 00:00:00 2001 From: Uday Patil Date: Thu, 29 Sep 2022 10:31:08 -0700 Subject: [PATCH 4/4] lint fix --- app/graph.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/graph.go b/app/graph.go index dd04cdf461..a8e7dd69f5 100644 --- a/app/graph.go +++ b/app/graph.go @@ -235,7 +235,7 @@ func (dag *Dag) BuildCompletionSignalMaps() ( } } } - return + return completionSignalingMap, blockingSignalsMap } var ErrCycleInDAG = fmt.Errorf("cycle detected in DAG")