4
4
"errors"
5
5
"fmt"
6
6
"log"
7
+ "sync"
7
8
8
9
"github.com/hashicorp/go-version"
9
10
hcl "github.com/hashicorp/hcl/v2"
@@ -17,6 +18,7 @@ import (
17
18
18
19
// GRPCServer is a gRPC server for responding to requests from plugins.
19
20
type GRPCServer struct {
21
+ mu sync.Mutex
20
22
runner * tflint.Runner
21
23
rootRunner * tflint.Runner
22
24
files map [string ]* hcl.File
@@ -50,6 +52,8 @@ func (s *GRPCServer) GetModuleContent(bodyS *hclext.BodySchema, opts sdk.GetModu
50
52
module = s .runner .TFConfig .Module
51
53
ctx = s .runner .Ctx
52
54
case sdk .RootModuleCtxType :
55
+ s .mu .Lock ()
56
+ defer s .mu .Unlock ()
53
57
module = s .rootRunner .TFConfig .Module
54
58
ctx = s .rootRunner .Ctx
55
59
default :
@@ -87,6 +91,8 @@ func (s *GRPCServer) GetFiles(ty sdk.ModuleCtxType) map[string][]byte {
87
91
case sdk .SelfModuleCtxType :
88
92
return s .runner .Sources ()
89
93
case sdk .RootModuleCtxType :
94
+ // HINT: This is an operation on the root runner,
95
+ // but it works without locking since it is obviously readonly.
90
96
return s .rootRunner .Sources ()
91
97
default :
92
98
panic (fmt .Sprintf ("invalid ModuleCtxType: %s" , ty ))
@@ -127,6 +133,8 @@ func (s *GRPCServer) EvaluateExpr(expr hcl.Expression, opts sdk.EvaluateExprOpti
127
133
case sdk .SelfModuleCtxType :
128
134
runner = s .runner
129
135
case sdk .RootModuleCtxType :
136
+ s .mu .Lock ()
137
+ defer s .mu .Unlock ()
130
138
runner = s .rootRunner
131
139
}
132
140
0 commit comments