Skip to content

Commit ae3cb7d

Browse files
authored
🐛 Fix concurrent tag/category Ensure(). (konveyor#629)
_Look-and-See_ logic replaced to support concurrent operations. --------- Signed-off-by: Jeff Ortel <[email protected]>
1 parent cdc096f commit ae3cb7d

File tree

4 files changed

+75
-18
lines changed

4 files changed

+75
-18
lines changed

binding/tag.go

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package binding
22

33
import (
4+
"errors"
5+
46
"github.com/konveyor/tackle2-hub/api"
57
)
68

@@ -66,14 +68,20 @@ func (h *Tag) Find(name string, category uint) (r *api.Tag, found bool, err erro
6668

6769
// Ensure a tag exists.
6870
func (h *Tag) Ensure(wanted *api.Tag) (err error) {
69-
tag, found, err := h.Find(wanted.Name, wanted.Category.ID)
70-
if err != nil {
71-
return
72-
}
73-
if !found {
71+
for i := 0; i < 10; i++ {
7472
err = h.Create(wanted)
75-
} else {
76-
*wanted = *tag
73+
if err == nil {
74+
return
75+
}
76+
found := false
77+
if errors.Is(err, &Conflict{}) {
78+
var tag *api.Tag
79+
tag, found, err = h.Find(wanted.Name, wanted.Category.ID)
80+
if found {
81+
*wanted = *tag
82+
break
83+
}
84+
}
7785
}
7886
return
7987
}

binding/tagcategory.go

+15-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package binding
22

33
import (
4+
"errors"
5+
46
"github.com/konveyor/tackle2-hub/api"
57
)
68

@@ -65,14 +67,20 @@ func (h *TagCategory) Find(name string) (r *api.TagCategory, found bool, err err
6567

6668
// Ensure a tag-type exists.
6769
func (h *TagCategory) Ensure(wanted *api.TagCategory) (err error) {
68-
tp, found, err := h.Find(wanted.Name)
69-
if err != nil {
70-
return
71-
}
72-
if !found {
70+
for i := 0; i < 10; i++ {
7371
err = h.Create(wanted)
74-
} else {
75-
*wanted = *tp
72+
if err == nil {
73+
return
74+
}
75+
found := false
76+
if errors.Is(err, &Conflict{}) {
77+
var cat *api.TagCategory
78+
cat, found, err = h.Find(wanted.Name)
79+
if found {
80+
*wanted = *cat
81+
break
82+
}
83+
}
7684
}
7785
return
7886
}

test/api/tag/api_test.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import (
99
func TestTagCRUD(t *testing.T) {
1010
for _, r := range Samples {
1111
t.Run(r.Name, func(t *testing.T) {
12+
var err error
1213
// Create.
13-
err := Tag.Create(&r)
14+
err = Tag.Create(&r)
1415
if err != nil {
1516
t.Errorf(err.Error())
1617
}
@@ -44,11 +45,30 @@ func TestTagCRUD(t *testing.T) {
4445
if err != nil {
4546
t.Errorf(err.Error())
4647
}
47-
4848
_, err = Tag.Get(r.ID)
4949
if err == nil {
5050
t.Errorf("Resource exits, but should be deleted: %v", r)
5151
}
52+
// Ensure.
53+
r.ID = 0
54+
err = Tag.Ensure(&r)
55+
if err != nil {
56+
t.Errorf(err.Error())
57+
}
58+
got, err = Tag.Get(r.ID)
59+
if err != nil {
60+
t.Errorf(err.Error())
61+
}
62+
if got.ID == 0 {
63+
t.Errorf("Ensured resource has no id.")
64+
}
65+
if got.Name != r.Name {
66+
t.Errorf("Different response error. Got %s, expected %s", got.Name, r.Name)
67+
}
68+
err = Tag.Delete(r.ID)
69+
if err != nil {
70+
t.Errorf(err.Error())
71+
}
5272
})
5373
}
5474
}

test/api/tagcategory/api_test.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import (
99
func TestTagCategoryCRUD(t *testing.T) {
1010
for _, r := range Samples {
1111
t.Run(r.Name, func(t *testing.T) {
12+
var err error
1213
// Create.
13-
err := TagCategory.Create(&r)
14+
err = TagCategory.Create(&r)
1415
if err != nil {
1516
t.Errorf(err.Error())
1617
}
@@ -44,11 +45,31 @@ func TestTagCategoryCRUD(t *testing.T) {
4445
if err != nil {
4546
t.Errorf(err.Error())
4647
}
47-
4848
_, err = TagCategory.Get(r.ID)
4949
if err == nil {
5050
t.Errorf("Resource exits, but should be deleted: %v", r)
5151
}
52+
53+
// Ensure.
54+
r.ID = 0
55+
err = TagCategory.Ensure(&r)
56+
if err != nil {
57+
t.Errorf(err.Error())
58+
}
59+
got, err = TagCategory.Get(r.ID)
60+
if err != nil {
61+
t.Errorf(err.Error())
62+
}
63+
if got.ID == 0 {
64+
t.Errorf("Ensured resource has no id.")
65+
}
66+
if got.Name != r.Name {
67+
t.Errorf("Different response error. Got %s, expected %s", got.Name, r.Name)
68+
}
69+
err = TagCategory.Delete(r.ID)
70+
if err != nil {
71+
t.Errorf(err.Error())
72+
}
5273
})
5374
}
5475
}

0 commit comments

Comments
 (0)