in service/frontend/api/handler.go [2405:2557]
func (wh *WorkflowHandler) validateSignalWithStartWorkflowExecutionRequest(ctx context.Context, signalWithStartRequest *types.SignalWithStartWorkflowExecutionRequest, scope metrics.Scope) error {
if err := wh.versionChecker.ClientSupported(ctx, wh.config.EnableClientVersionCheck()); err != nil {
return err
}
if signalWithStartRequest == nil {
return validate.ErrRequestNotSet
}
domainName := signalWithStartRequest.GetDomain()
if domainName == "" {
return validate.ErrDomainNotSet
}
if signalWithStartRequest.GetWorkflowID() == "" {
return validate.ErrWorkflowIDNotSet
}
idLengthWarnLimit := wh.config.MaxIDLengthWarnLimit()
if !common.IsValidIDLength(
domainName,
scope,
idLengthWarnLimit,
wh.config.DomainNameMaxLength(domainName),
metrics.CadenceErrDomainNameExceededWarnLimit,
domainName,
wh.GetLogger(),
tag.IDTypeDomainName) {
return validate.ErrDomainTooLong
}
if !common.IsValidIDLength(
signalWithStartRequest.GetWorkflowID(),
scope,
idLengthWarnLimit,
wh.config.WorkflowIDMaxLength(domainName),
metrics.CadenceErrWorkflowIDExceededWarnLimit,
domainName,
wh.GetLogger(),
tag.IDTypeWorkflowID) {
return validate.ErrWorkflowIDTooLong
}
if signalWithStartRequest.GetSignalName() == "" {
return validate.ErrSignalNameNotSet
}
if !common.IsValidIDLength(
signalWithStartRequest.GetSignalName(),
scope,
idLengthWarnLimit,
wh.config.SignalNameMaxLength(domainName),
metrics.CadenceErrSignalNameExceededWarnLimit,
domainName,
wh.GetLogger(),
tag.IDTypeSignalName) {
return validate.ErrSignalNameTooLong
}
if signalWithStartRequest.WorkflowType == nil || signalWithStartRequest.WorkflowType.GetName() == "" {
return validate.ErrWorkflowTypeNotSet
}
if !common.IsValidIDLength(
signalWithStartRequest.WorkflowType.GetName(),
scope,
idLengthWarnLimit,
wh.config.WorkflowTypeMaxLength(domainName),
metrics.CadenceErrWorkflowTypeExceededWarnLimit,
domainName,
wh.GetLogger(),
tag.IDTypeWorkflowType) {
return validate.ErrWorkflowTypeTooLong
}
if err := wh.validateTaskList(signalWithStartRequest.TaskList, scope, domainName); err != nil {
return err
}
if !common.IsValidIDLength(
signalWithStartRequest.GetRequestID(),
scope,
idLengthWarnLimit,
wh.config.RequestIDMaxLength(domainName),
metrics.CadenceErrRequestIDExceededWarnLimit,
domainName,
wh.GetLogger(),
tag.IDTypeRequestID) {
return validate.ErrRequestIDTooLong
}
if signalWithStartRequest.GetExecutionStartToCloseTimeoutSeconds() <= 0 {
return validate.ErrInvalidExecutionStartToCloseTimeoutSeconds
}
if signalWithStartRequest.GetTaskStartToCloseTimeoutSeconds() <= 0 {
return validate.ErrInvalidTaskStartToCloseTimeoutSeconds
}
if err := common.ValidateRetryPolicy(signalWithStartRequest.RetryPolicy); err != nil {
return err
}
if signalWithStartRequest.GetCronSchedule() != "" {
if _, err := backoff.ValidateSchedule(signalWithStartRequest.GetCronSchedule()); err != nil {
return err
}
}
if err := wh.searchAttributesValidator.ValidateSearchAttributes(signalWithStartRequest.SearchAttributes, domainName); err != nil {
return err
}
domainID, err := wh.GetDomainCache().GetDomainID(domainName)
if err != nil {
return err
}
sizeLimitError := wh.config.BlobSizeLimitError(domainName)
sizeLimitWarn := wh.config.BlobSizeLimitWarn(domainName)
if err := common.CheckEventBlobSizeLimit(
len(signalWithStartRequest.SignalInput),
sizeLimitWarn,
sizeLimitError,
domainID,
signalWithStartRequest.GetWorkflowID(),
"",
scope,
wh.GetThrottledLogger(),
tag.BlobSizeViolationOperation("SignalWithStartWorkflowExecution"),
); err != nil {
return err
}
actualSize := len(signalWithStartRequest.Input) + common.GetSizeOfMapStringToByteArray(signalWithStartRequest.Memo.GetFields())
if err := common.CheckEventBlobSizeLimit(
actualSize,
sizeLimitWarn,
sizeLimitError,
domainID,
signalWithStartRequest.GetWorkflowID(),
"",
scope,
wh.GetThrottledLogger(),
tag.BlobSizeViolationOperation("SignalWithStartWorkflowExecution"),
); err != nil {
return err
}
isolationGroup := wh.getIsolationGroup(ctx, domainName)
if !wh.isIsolationGroupHealthy(ctx, domainName, isolationGroup) {
return &types.BadRequestError{fmt.Sprintf("Domain %s is drained from isolation group %s.", domainName, isolationGroup)}
}
return nil
}