Skip to content

Commit 1da0788

Browse files
authored
Merge pull request #15 from karimra/mod-sync
add modify stream rcv lock and upgrade to go 1.19
2 parents a61e49f + 941c682 commit 1da0788

File tree

7 files changed

+64
-39
lines changed

7 files changed

+64
-39
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ on:
66
- v*
77

88
env:
9-
GOVER: 1.18.1
9+
GOVER: 1.19.5
1010
GORELEASER_VER: v0.180.3
1111

1212
jobs:

app/app.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import (
1919
)
2020

2121
type App struct {
22+
//
23+
mrcv *sync.Mutex
24+
//
2225
ctx context.Context
2326
Cfn context.CancelFunc
2427
RootCmd *cobra.Command
@@ -48,6 +51,7 @@ func New() *App {
4851
ctx, cancel := context.WithCancel(context.Background())
4952
logger := log.New()
5053
a := &App{
54+
mrcv: new(sync.Mutex),
5155
ctx: ctx,
5256
Cfn: cancel,
5357
RootCmd: new(cobra.Command),

app/modify.go

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"sync"
78

89
"github.com/karimra/gribic/api"
910
"github.com/karimra/gribic/config"
@@ -349,38 +350,54 @@ func (a *App) createModifyRequestOperation(modifyInput *config.ModifyInput) ([]*
349350

350351
func (a *App) modifyChan(ctx context.Context, t *target, modReqCh chan *spb.ModifyRequest) (chan *spb.ModifyResponse, chan error) {
351352
rspChan := make(chan *spb.ModifyResponse)
352-
errChan := make(chan error)
353-
353+
errChan := make(chan error, 1)
354+
m := new(sync.Mutex)
355+
ops := make(map[uint64]struct{})
356+
// stream sending goroutine
354357
go func() {
355-
defer close(rspChan)
356-
defer close(errChan)
357-
// stream sending goroutine
358-
go func() {
359-
var err error
360-
for {
361-
select {
362-
case <-ctx.Done():
358+
var err error
359+
for {
360+
select {
361+
case <-ctx.Done():
362+
return
363+
case req, ok := <-modReqCh:
364+
if !ok {
365+
return
366+
}
367+
m.Lock()
368+
for _, op := range req.GetOperation() {
369+
ops[op.GetId()] = struct{}{}
370+
}
371+
m.Unlock()
372+
err = t.modClient.Send(req)
373+
if err != nil {
374+
errChan <- fmt.Errorf("failed sending request: %v: err=%v", req, err)
363375
return
364-
case req, ok := <-modReqCh:
365-
if !ok {
366-
return
367-
}
368-
err = t.modClient.Send(req)
369-
if err != nil {
370-
errChan <- fmt.Errorf("failed sending request: %v: err=%v", req, err)
371-
return
372-
}
373376
}
374377
}
375-
}()
376-
// receive stream
378+
}
379+
}()
380+
// receive stream
381+
go func() {
382+
defer close(rspChan)
377383
for {
384+
a.mrcv.Lock()
378385
modRsp, err := t.modClient.Recv()
386+
a.mrcv.Unlock()
379387
if err != nil {
380388
errChan <- err
381389
return
382390
}
383391
rspChan <- modRsp
392+
m.Lock()
393+
for _, res := range modRsp.GetResult() {
394+
delete(ops, res.GetId())
395+
}
396+
if len(ops) == 0 {
397+
m.Unlock()
398+
return
399+
}
400+
m.Unlock()
384401
}
385402
}()
386403

app/version.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package app
33
import (
44
"fmt"
55
"io"
6-
"io/ioutil"
76
"net/http"
87
"os"
98
"os/exec"
@@ -30,7 +29,7 @@ func (a *App) RunEVersion(cmd *cobra.Command, args []string) error {
3029
}
3130

3231
func (a *App) VersionUpgradeRun(cmd *cobra.Command, args []string) error {
33-
f, err := ioutil.TempFile("", "gribic")
32+
f, err := os.CreateTemp("", "gribic")
3433
defer os.Remove(f.Name())
3534
if err != nil {
3635
return err

app/workflow.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ func (a *App) runWorkflow(ctx context.Context, t *target, wf *config.Workflow) (
259259
return exec, err
260260
}
261261
}
262+
doneCh := make(chan struct{})
262263
go func() {
263264
rspCh, errCh := a.modifyChan(ctx, t, reqCh)
264265
for {
@@ -279,6 +280,7 @@ func (a *App) runWorkflow(ctx context.Context, t *target, wf *config.Workflow) (
279280
return
280281
case rsp, ok := <-rspCh:
281282
if !ok {
283+
close(doneCh)
282284
return
283285
}
284286
a.Logger.Infof("workflow=%q: target=%q: step=%s: %T: %v", wf.Name, t.Config.Name, s.Name, rsp, rsp)
@@ -292,6 +294,7 @@ func (a *App) runWorkflow(ctx context.Context, t *target, wf *config.Workflow) (
292294
})
293295
case err, ok := <-errCh:
294296
if !ok {
297+
close(doneCh)
295298
return
296299
}
297300
a.Logger.Infof("workflow=%q: target=%q: step=%s: err=%v", t.Config.Name, wf.Name, s.Name, err)
@@ -333,7 +336,9 @@ func (a *App) runWorkflow(ctx context.Context, t *target, wf *config.Workflow) (
333336
return exec, err
334337
}
335338
}
339+
<-doneCh
336340
}
341+
337342
// wait duration if any
338343
a.Logger.Infof("workflow=%q: target=%q: step=%s: waiting %s after execution", wf.Name, t.Config.Name, s.Name, s.WaitAfter)
339344
time.Sleep(s.WaitAfter)

go.mod

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/karimra/gribic
22

3-
go 1.18
3+
go 1.19
44

55
require (
66
github.com/adrg/xdg v0.4.0
@@ -9,16 +9,16 @@ require (
99
github.com/mitchellh/go-homedir v1.1.0
1010
github.com/mitchellh/mapstructure v1.5.0
1111
github.com/openconfig/gnmi v0.0.0-20220503232738-6eb133c65a13
12-
github.com/openconfig/gribi v0.1.1-0.20220622162620-08d53dffce45
12+
github.com/openconfig/gribi v1.0.0
1313
github.com/openconfig/gribigo v0.0.0-20220216214442-0aae099db56f
1414
github.com/prometheus/client_golang v1.12.2
1515
github.com/sirupsen/logrus v1.8.1
1616
github.com/spf13/cobra v1.4.0
1717
github.com/spf13/pflag v1.0.5
1818
github.com/spf13/viper v1.10.1
1919
golang.org/x/sync v0.0.0-20220513210516-0976fa681c29
20-
google.golang.org/grpc v1.47.0
21-
google.golang.org/protobuf v1.28.0
20+
google.golang.org/grpc v1.51.0
21+
google.golang.org/protobuf v1.28.1
2222
)
2323

2424
require (
@@ -144,11 +144,10 @@ require (
144144
go4.org/unsafe/assume-no-moving-gc v0.0.0-20220617031537-928513b29760 // indirect
145145
gocloud.dev v0.25.1-0.20220408200107-09b10f7359f7 // indirect
146146
golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e // indirect
147-
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
148147
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect
149148
golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401 // indirect
150149
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
151-
golang.org/x/text v0.3.7 // indirect
150+
golang.org/x/text v0.4.0 // indirect
152151
golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect
153152
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
154153
google.golang.org/api v0.81.0 // indirect

go.sum

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -777,8 +777,8 @@ github.com/openconfig/goyang v1.0.0 h1:nYaFu7BOAk/eQn4CgAUjgYPfp3J6CdXrBryp32E5C
777777
github.com/openconfig/goyang v1.0.0/go.mod h1:vX61x01Q46AzbZUzG617vWqh/cB+aisc+RrNkXRd3W8=
778778
github.com/openconfig/gribi v0.1.1-0.20210423184541-ce37eb4ba92f/go.mod h1:OoH46A2kV42cIXGyviYmAlGmn6cHjGduyC2+I9d/iVs=
779779
github.com/openconfig/gribi v0.1.1-0.20220126144445-1634932f9fd8/go.mod h1:VFqGH2ZPFIfnKTimP4/AQB4OK0eySW5muJNFxXAwP6k=
780-
github.com/openconfig/gribi v0.1.1-0.20220622162620-08d53dffce45 h1:pmwzRJYdvc+CQDrIw6NF0XBnTng6SvMYBdZz9CeRbCk=
781-
github.com/openconfig/gribi v0.1.1-0.20220622162620-08d53dffce45/go.mod h1:VFqGH2ZPFIfnKTimP4/AQB4OK0eySW5muJNFxXAwP6k=
780+
github.com/openconfig/gribi v1.0.0 h1:xMwEg0mBD+21mOxuFOw0d9dBKuIPwJEhMUUeUulZdLg=
781+
github.com/openconfig/gribi v1.0.0/go.mod h1:VFqGH2ZPFIfnKTimP4/AQB4OK0eySW5muJNFxXAwP6k=
782782
github.com/openconfig/gribigo v0.0.0-20220216214442-0aae099db56f h1:W+4+uRld9Tgji/QK/85Ts1ybHWno0LjiGkOyRBNAWUU=
783783
github.com/openconfig/gribigo v0.0.0-20220216214442-0aae099db56f/go.mod h1:udA2WsTVQk9QKDOjNq1UlJ4p5Us8/5HP1bsoYp+ZoKw=
784784
github.com/openconfig/grpctunnel v0.0.0-20210610163803-fde4a9dc048d/go.mod h1:x9tAZ4EwqCQ0jI8D6S8Yhw9Z0ee7/BxWQX0k0Uib5Q8=
@@ -1019,8 +1019,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
10191019
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
10201020
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
10211021
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
1022-
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o=
1023-
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
1022+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
10241023
golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
10251024
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
10261025
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1233,8 +1232,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
12331232
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
12341233
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
12351234
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
1236-
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
12371235
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
1236+
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
1237+
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
12381238
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
12391239
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
12401240
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1309,7 +1309,7 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
13091309
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
13101310
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
13111311
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
1312-
golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20=
1312+
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
13131313
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
13141314
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
13151315
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1505,8 +1505,8 @@ google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5
15051505
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
15061506
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
15071507
google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
1508-
google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
1509-
google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
1508+
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
1509+
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
15101510
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
15111511
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
15121512
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
@@ -1522,8 +1522,9 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
15221522
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
15231523
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
15241524
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
1525-
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
15261525
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
1526+
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
1527+
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
15271528
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
15281529
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
15291530
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

0 commit comments

Comments
 (0)