@@ -20,35 +20,39 @@ import (
2020 "errors"
2121 "slices"
2222
23+ "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/framework/interface/plugin"
24+
2325 fwk "sigs.k8s.io/gateway-api-inference-extension/pkg/epp/framework/interface/requestcontrol"
2426)
2527
2628// buildDAG builds a dependency graph among data preparation plugins based on their
2729// produced and consumed data keys.
28- func buildDAG (plugins []fwk. PrepareDataPlugin ) (map [string ][]string , error ) {
30+ func buildDAG (producers map [ string ]plugin. ProducerPlugin , consumers map [ string ]plugin. ConsumerPlugin ) (map [string ][]string , error ) {
2931 dag := make (map [string ][]string )
30- for _ , plugin := range plugins {
31- dag [plugin .TypedName ().String ()] = []string {}
32- }
3332 // Create dependency graph as a DAG.
34- for i := range plugins {
35- for j := range plugins {
36- if i == j {
33+ for _ , producer := range producers {
34+ dag [producer .TypedName ().String ()] = []string {}
35+ }
36+ for _ , consumer := range consumers {
37+ dag [consumer .TypedName ().String ()] = []string {}
38+ }
39+ for pName , producer := range producers {
40+ for cName , consumer := range consumers {
41+ if pName == cName {
3742 continue
3843 }
3944 // Check whether plugin[i] produces something consumed by plugin[j]. In that case, j depends on i.
40- if plugins [ i ] .Produces () != nil && plugins [ j ] .Consumes () != nil {
41- for producedKey , producedData := range plugins [ i ] .Produces () {
45+ if producer .Produces () != nil && consumer .Consumes () != nil {
46+ for producedKey , producedData := range producer .Produces () {
4247 // If plugin j consumes the produced key, then j depends on i. We can break after the first match.
43- if consumedData , ok := plugins [ j ] .Consumes ()[producedKey ]; ok {
48+ if consumedData , ok := consumer .Consumes ()[producedKey ]; ok {
4449 // Check types are same. Reflection is avoided here for simplicity.
4550 // TODO(#1985): Document this detail in IGW docs.
4651 if producedData != consumedData {
4752 return nil , errors .New ("data type mismatch between produced and consumed data for key: " + producedKey )
4853 }
49- iPluginName := plugins [i ].TypedName ().String ()
50- jPluginName := plugins [j ].TypedName ().String ()
51- dag [jPluginName ] = append (dag [jPluginName ], iPluginName )
54+ // Consumer depends on producer, so add an edge from consumer to producer.
55+ dag [cName ] = append (dag [cName ], pName )
5256 break
5357 }
5458 }
0 commit comments