Skip to content

Commit e462133

Browse files
authored
Fix registry already registered check (#1054)
1 parent e6b493b commit e462133

File tree

2 files changed

+76
-5
lines changed

2 files changed

+76
-5
lines changed

internal/registry.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func (r *registry) RegisterWorkflowWithOptions(
9292
defer r.Unlock()
9393

9494
if !options.DisableAlreadyRegisteredCheck {
95-
if _, ok := r.workflowFuncMap[registerName]; ok {
95+
if _, ok := r.getWorkflowNoLock(registerName); ok {
9696
panic(fmt.Sprintf("workflow name \"%v\" is already registered", registerName))
9797
}
9898
}
@@ -141,7 +141,7 @@ func (r *registry) registerActivityFunction(af interface{}, options RegisterActi
141141
defer r.Unlock()
142142

143143
if !options.DisableAlreadyRegisteredCheck {
144-
if _, ok := r.activityFuncMap[registerName]; ok {
144+
if _, ok := r.getActivityNoLock(registerName); ok {
145145
return fmt.Errorf("activity type \"%v\" is already registered", registerName)
146146
}
147147
}
@@ -231,6 +231,14 @@ func (r *registry) getWorkflowFn(fnName string) (interface{}, bool) {
231231
return fn, ok
232232
}
233233

234+
func (r *registry) getWorkflowNoLock(registerName string) (interface{}, bool) {
235+
a, ok := r.workflowFuncMap[registerName]
236+
if !ok && r.next != nil {
237+
return r.next.getWorkflowNoLock(registerName)
238+
}
239+
return a, ok
240+
}
241+
234242
func (r *registry) getRegisteredWorkflowTypes() []string {
235243
r.Lock() // do not defer for Unlock to call next.getRegisteredWorkflowTypes without lock
236244
var result []string
@@ -277,10 +285,10 @@ func (r *registry) GetActivity(fnName string) (activity, bool) {
277285
return a, ok
278286
}
279287

280-
func (r *registry) getActivityNoLock(fnName string) (activity, bool) {
281-
a, ok := r.activityFuncMap[fnName]
288+
func (r *registry) getActivityNoLock(registerName string) (activity, bool) {
289+
a, ok := r.activityFuncMap[registerName]
282290
if !ok && r.next != nil {
283-
return r.next.getActivityNoLock(fnName)
291+
return r.next.getActivityNoLock(registerName)
284292
}
285293
return a, ok
286294
}

internal/registry_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func TestWorkflowRegistration(t *testing.T) {
3131
tests := []struct {
3232
msg string
3333
register func(r *registry)
34+
registerPanic bool
3435
workflowType string
3536
altWorkflowType string
3637
resolveByFunction interface{}
@@ -66,11 +67,41 @@ func TestWorkflowRegistration(t *testing.T) {
6667
altWorkflowType: "go.uber.org/cadence/internal.(*testWorkflowStruct).Method-fm",
6768
resolveByFunction: w.Method,
6869
},
70+
{
71+
msg: "register duplicated workflow in one registry (should panic)",
72+
register: func(r *registry) {
73+
r.RegisterWorkflow(testWorkflowFunction)
74+
r.RegisterWorkflow(testWorkflowFunction)
75+
},
76+
registerPanic: true,
77+
},
78+
{
79+
msg: "register duplicated workflow with already registered check disabled",
80+
register: func(r *registry) {
81+
r.RegisterWorkflow(testWorkflowFunction)
82+
r.RegisterWorkflowWithOptions(testWorkflowFunction, RegisterWorkflowOptions{DisableAlreadyRegisteredCheck: true})
83+
},
84+
workflowType: "go.uber.org/cadence/internal.testWorkflowFunction",
85+
resolveByFunction: testWorkflowFunction,
86+
},
87+
{
88+
msg: "register duplicated workflow in chained registry (should panic)",
89+
register: func(r *registry) {
90+
r.next.RegisterWorkflow(testWorkflowFunction)
91+
r.RegisterWorkflow(testWorkflowFunction)
92+
},
93+
registerPanic: true,
94+
},
6995
}
7096

7197
for _, tt := range tests {
7298
t.Run(tt.msg, func(t *testing.T) {
7399
r := newRegistry()
100+
if tt.registerPanic {
101+
require.Panics(t, func() { tt.register(r) }, "register should panic")
102+
return
103+
}
104+
74105
tt.register(r)
75106

76107
// Verify registered workflow type
@@ -104,6 +135,7 @@ func TestActivityRegistration(t *testing.T) {
104135
tests := []struct {
105136
msg string
106137
register func(r *registry)
138+
registerPanic bool
107139
activityType string
108140
altActivityType string
109141
resolveByFunction interface{}
@@ -156,10 +188,41 @@ func TestActivityRegistration(t *testing.T) {
156188
resolveByFunction: (&testActivityStruct{}).Method,
157189
resolveByAlias: "prefix.Method",
158190
},
191+
{
192+
msg: "register duplicated activity function in one registry (should panic)",
193+
register: func(r *registry) {
194+
duplicatedActivityAlias := "activity.alias"
195+
r.RegisterActivityWithOptions(testActivityFunction, RegisterActivityOptions{Name: duplicatedActivityAlias})
196+
r.RegisterActivityWithOptions(testActivityFunction, RegisterActivityOptions{Name: duplicatedActivityAlias})
197+
},
198+
registerPanic: true,
199+
},
200+
{
201+
msg: "register duplicated activity struct with already registered check disabled",
202+
register: func(r *registry) {
203+
r.RegisterActivity(&testActivityStruct{})
204+
r.RegisterActivityWithOptions(&testActivityStruct{}, RegisterActivityOptions{DisableAlreadyRegisteredCheck: true})
205+
},
206+
activityType: "go.uber.org/cadence/internal.(*testActivityStruct).Method",
207+
resolveByFunction: (&testActivityStruct{}).Method,
208+
},
209+
{
210+
msg: "register duplicated activity function in chained registry (should panic)",
211+
register: func(r *registry) {
212+
r.next.RegisterActivity(testActivityFunction)
213+
r.RegisterActivity(testActivityFunction)
214+
},
215+
registerPanic: true,
216+
},
159217
}
160218
for _, tt := range tests {
161219
t.Run(tt.msg, func(t *testing.T) {
162220
r := newRegistry()
221+
if tt.registerPanic {
222+
require.Panics(t, func() { tt.register(r) }, "register should panic")
223+
return
224+
}
225+
163226
tt.register(r)
164227

165228
// Verify registered activity type

0 commit comments

Comments
 (0)