Skip to content

Commit

Permalink
Fix potential data races, simplify concurrency controls (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
kingishb committed Jan 30, 2021
1 parent 71d6959 commit ce040db
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 22 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/adhocteam/ssm
go 1.12

require (
github.com/aws/aws-sdk-go v1.36.33
github.com/aws/aws-sdk-go v1.37.0
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/urfave/cli v1.22.5
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/aws/aws-sdk-go v1.36.33 h1:ASmYIgWuPW1p01Xxch3ygaptshrEe7Vt+CirmwIqMtI=
github.com/aws/aws-sdk-go v1.36.33/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/aws/aws-sdk-go v1.37.0 h1:GzFnhOIsrGyQ69s7VgqtrG2BG8v7X7vwB3Xpbd/DBBk=
github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
Expand Down
36 changes: 17 additions & 19 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"os"
"sort"
"strings"
"sync"
"text/tabwriter"
"time"

Expand Down Expand Up @@ -204,7 +203,6 @@ func list(s string, showValue, ts, stripPrefix bool) ([]string, error) {
SharedConfigState: session.SharedConfigEnable,
}))
ssmsvc := ssm.New(sess, aws.NewConfig())
params := make([]entry, 0)
var next string
var n int64 = 50

Expand All @@ -213,7 +211,6 @@ func list(s string, showValue, ts, stripPrefix bool) ([]string, error) {
filterOption := "Contains"
filter := ssm.ParameterStringFilter{Key: &k, Option: &filterOption, Values: []*string{&s}}
var in ssm.DescribeParametersInput
var wg sync.WaitGroup

// if filter specified, add name filters
if s != "" {
Expand All @@ -223,47 +220,47 @@ func list(s string, showValue, ts, stripPrefix bool) ([]string, error) {
} else {
in = ssm.DescribeParametersInput{}
}
// iterate over results

// blocking semaphore channel to keep concurrency under control
sem := make(chan struct{}, 5)
semChan := make(chan struct{}, 5)
defer close(semChan)

params := []entry{}
// iterate over results
for {
desc, err := ssmsvc.DescribeParameters(&in)
if err != nil {
return []string{}, err
}
// result channel to store entries from concurrent secret requests
resultChan := make(chan entry, len(desc.Parameters))
defer close(resultChan)
for _, p := range desc.Parameters {
if p.Name != nil {
name := *p.Name
date := p.LastModifiedDate
if showValue {
// set waitgroup and fetch in a goroutine
wg.Add(1)
sem <- struct{}{}
semChan <- struct{}{}

go func() {
defer wg.Done()
v, err := get(name)
if err != nil {
log.Fatal(err)
} else {
params = append(params,
entry{date, name, v},
)

resultChan <- entry{date, name, v}
}
<-sem

<-semChan
}()
} else {
params = append(params,
entry{p.LastModifiedDate, *p.Name, ""},
)
resultChan <- entry{date, name, ""}
}
}
}
// let all goroutines finish
wg.Wait()
for i := 0; i < len(desc.Parameters); i++ {
p := <-resultChan
params = append(params, p)
}

if desc.NextToken != nil {
next = *desc.NextToken
Expand All @@ -276,6 +273,7 @@ func list(s string, showValue, ts, stripPrefix bool) ([]string, error) {
break
}
}

if ts {
sort.Slice(params, func(i, j int) bool {
return params[i].t.Before(*params[j].t)
Expand Down

0 comments on commit ce040db

Please sign in to comment.