Skip to content

Commit 22a44e0

Browse files
stephanosclaude
andcommitted
Nexus Standalone: Terminate + Cancel (#9624)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 1e852f3 commit 22a44e0

18 files changed

Lines changed: 2436 additions & 324 deletions

chasm/lib/nexusoperation/config.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,13 @@ var UseSystemCallbackURL = dynamicconfig.NewGlobalBoolSetting(
186186
When true, uses the fixed system callback URL for all worker targets.`,
187187
)
188188

189+
var MaxReasonLength = dynamicconfig.NewNamespaceIntSetting(
190+
"nexusoperation.limit.reasonLength",
191+
1000,
192+
`Limits the maximum allowed length for a reason string in Nexus operation requests.
193+
Uses Go's len() function to determine the length.`,
194+
)
195+
189196
var UseNewFailureWireFormat = dynamicconfig.NewNamespaceBoolSetting(
190197
"nexusoperation.useNewFailureWireFormat",
191198
true,
@@ -210,10 +217,12 @@ type Config struct {
210217
PayloadSizeLimit dynamicconfig.IntPropertyFnWithNamespaceFilter
211218
CallbackURLTemplate dynamicconfig.TypedPropertyFn[*template.Template]
212219
UseSystemCallbackURL dynamicconfig.BoolPropertyFn
220+
PayloadSizeLimitWarn dynamicconfig.IntPropertyFnWithNamespaceFilter
213221
UseNewFailureWireFormat dynamicconfig.BoolPropertyFnWithNamespaceFilter
214222
RecordCancelRequestCompletionEvents dynamicconfig.BoolPropertyFn
215223
VisibilityMaxPageSize dynamicconfig.IntPropertyFnWithNamespaceFilter
216224
MaxIDLengthLimit dynamicconfig.IntPropertyFn
225+
MaxReasonLength dynamicconfig.IntPropertyFnWithNamespaceFilter
217226
RetryPolicy func() backoff.RetryPolicy
218227
}
219228

@@ -233,11 +242,13 @@ func configProvider(dc *dynamicconfig.Collection, cfg *config.Persistence) *Conf
233242
DisallowedOperationHeaders: DisallowedOperationHeaders.Get(dc),
234243
MaxOperationScheduleToCloseTimeout: MaxOperationScheduleToCloseTimeout.Get(dc),
235244
PayloadSizeLimit: dynamicconfig.BlobSizeLimitError.Get(dc),
245+
PayloadSizeLimitWarn: dynamicconfig.BlobSizeLimitWarn.Get(dc),
236246
CallbackURLTemplate: CallbackURLTemplate.Get(dc),
237247
UseSystemCallbackURL: UseSystemCallbackURL.Get(dc),
238248
UseNewFailureWireFormat: UseNewFailureWireFormat.Get(dc),
239249
VisibilityMaxPageSize: dynamicconfig.FrontendVisibilityMaxPageSize.Get(dc),
240250
MaxIDLengthLimit: dynamicconfig.MaxIDLengthLimit.Get(dc),
251+
MaxReasonLength: MaxReasonLength.Get(dc),
241252
RetryPolicy: RetryPolicy.Get(dc),
242253
}
243254
}

chasm/lib/nexusoperation/frontend.go

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (h *frontendHandler) StartNexusOperationExecution(
8181
return nil, err
8282
}
8383

84-
if err := validateAndNormalizeStartRequest(req, h.config, h.saMapperProvider, h.saValidator); err != nil {
84+
if err := validateAndNormalizeStartRequest(req, h.config, h.logger, h.saMapperProvider, h.saValidator); err != nil {
8585
return nil, err
8686
}
8787

@@ -110,7 +110,7 @@ func (h *frontendHandler) DescribeNexusOperationExecution(
110110
return nil, err
111111
}
112112

113-
if err := validateDescribeNexusOperationExecutionRequest(req, h.config); err != nil {
113+
if err := validateAndNormalizeDescribeRequest(req, h.config); err != nil {
114114
return nil, err
115115
}
116116

@@ -221,23 +221,59 @@ func (h *frontendHandler) CountNexusOperationExecutions(
221221
}
222222

223223
func (h *frontendHandler) RequestCancelNexusOperationExecution(
224-
_ context.Context,
224+
ctx context.Context,
225225
req *workflowservice.RequestCancelNexusOperationExecutionRequest,
226226
) (*workflowservice.RequestCancelNexusOperationExecutionResponse, error) {
227227
if !h.isStandaloneNexusOperationEnabled(req.GetNamespace()) {
228228
return nil, ErrStandaloneNexusOperationDisabled
229229
}
230-
return nil, serviceerror.NewUnimplemented("RequestCancelNexusOperationExecution not implemented")
230+
231+
namespaceID, err := h.namespaceRegistry.GetNamespaceID(namespace.Name(req.GetNamespace()))
232+
if err != nil {
233+
return nil, err
234+
}
235+
236+
if err := validateAndNormalizeCancelRequest(req, h.config); err != nil {
237+
return nil, err
238+
}
239+
240+
_, err = h.client.RequestCancelNexusOperation(ctx, &nexusoperationpb.RequestCancelNexusOperationRequest{
241+
NamespaceId: namespaceID.String(),
242+
FrontendRequest: req,
243+
})
244+
if err != nil {
245+
return nil, err
246+
}
247+
248+
return &workflowservice.RequestCancelNexusOperationExecutionResponse{}, nil
231249
}
232250

233251
func (h *frontendHandler) TerminateNexusOperationExecution(
234-
_ context.Context,
252+
ctx context.Context,
235253
req *workflowservice.TerminateNexusOperationExecutionRequest,
236254
) (*workflowservice.TerminateNexusOperationExecutionResponse, error) {
237255
if !h.isStandaloneNexusOperationEnabled(req.GetNamespace()) {
238256
return nil, ErrStandaloneNexusOperationDisabled
239257
}
240-
return nil, serviceerror.NewUnimplemented("TerminateNexusOperationExecution not implemented")
258+
259+
namespaceID, err := h.namespaceRegistry.GetNamespaceID(namespace.Name(req.GetNamespace()))
260+
if err != nil {
261+
return nil, err
262+
}
263+
264+
if err := validateAndNormalizeTerminateRequest(req, h.config); err != nil {
265+
return nil, err
266+
}
267+
268+
_, err = h.client.TerminateNexusOperation(ctx, &nexusoperationpb.TerminateNexusOperationRequest{
269+
NamespaceId: namespaceID.String(),
270+
FrontendRequest: req,
271+
})
272+
if err != nil {
273+
return nil, err
274+
}
275+
276+
return &workflowservice.TerminateNexusOperationExecutionResponse{}, nil
241277
}
242278

243279
func (h *frontendHandler) DeleteNexusOperationExecution(_ context.Context, req *workflowservice.DeleteNexusOperationExecutionRequest) (*workflowservice.DeleteNexusOperationExecutionResponse, error) {

chasm/lib/nexusoperation/gen/nexusoperationpb/v1/operation.go-helpers.pb.go

Lines changed: 75 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)