{"record":{"id":"73b5def39cc5f603","repo":"argoproj/argo-workflows","slug":"invalidargument-73b5de","errorCode":"InvalidArgument","errorMessage":"limit must be greater than zero","messagePattern":"limit must be greater than zero","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/sync/sync_server.go","lineNumber":48,"sourceCode":"\t\tproviders: make(map[syncpkg.SyncConfigType]ConfigProvider),\n\t}\n\n\tserver.providers[syncpkg.SyncConfigType_CONFIGMAP] = &configMapSyncProvider{}\n\n\tif syncConfig != nil && syncConfig.EnableAPI {\n\t\tsessionProxy := syncdb.SessionProxyFromConfig(ctx, kubectlConfig, namespace, syncConfig)\n\t\tif sessionProxy == nil {\n\t\t\tpanic(\"was unable to create database connection\")\n\t\t}\n\t\tserver.providers[syncpkg.SyncConfigType_DATABASE] = &dbSyncProvider{db: syncdb.NewSyncQueries(sessionProxy, syncdb.ConfigFromConfig(syncConfig))}\n\t}\n\n\treturn server\n}\n\nfunc (s *syncServer) CreateSyncLimit(ctx context.Context, req *syncpkg.CreateSyncLimitRequest) (*syncpkg.SyncLimitResponse, error) {\n\tif req.Limit <= 0 {\n\t\treturn nil, sutils.ToStatusError(fmt.Errorf(\"limit must be greater than zero\"), codes.InvalidArgument)\n\t}\n\n\tprovider, ok := s.providers[req.Type]\n\tif !ok {\n\t\treturn nil, sutils.ToStatusError(fmt.Errorf(\"unsupported sync config type: %s\", req.Type), codes.InvalidArgument)\n\t}\n\treturn provider.createSyncLimit(ctx, req)\n}\n\nfunc (s *syncServer) GetSyncLimit(ctx context.Context, req *syncpkg.GetSyncLimitRequest) (*syncpkg.SyncLimitResponse, error) {\n\tprovider, ok := s.providers[req.Type]\n\tif !ok {\n\t\treturn nil, sutils.ToStatusError(fmt.Errorf(\"unsupported sync config type: %s\", req.Type), codes.InvalidArgument)\n\t}\n\treturn provider.getSyncLimit(ctx, req)\n}\n\nfunc (s *syncServer) UpdateSyncLimit(ctx context.Context, req *syncpkg.UpdateSyncLimitRequest) (*syncpkg.SyncLimitResponse, error) {","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/server/sync/sync_server.go#L30-L66","documentation":"The syncServer facade validates req.Limit > 0 before dispatching to the type-specific provider. This is the outer duplicate of the provider-level check, giving a consistent gRPC error regardless of backend.","triggerScenarios":"CreateSyncLimit RPC with Limit <= 0 on the sync server; the request is rejected before provider lookup.","commonSituations":"CLI/tools sending the zero-value int32, computed limits evaluating to 0, protobuf fields left unset.","solutions":["Send a positive integer limit in CreateSyncLimitRequest","Fix client-side computation to guarantee >= 1","Ensure the CLI/UI surfaces limit input as required"],"exampleFix":"// before\nLimit: limitParam // may be 0\n// after\nif limitParam < 1 { return fmt.Errorf(\"limit must be >= 1\") }\nLimit: limitParam","handlingStrategy":"validation","validationCode":"if req.Limit <= 0 { return errors.New(\"limit must be positive\") }\nif req.Type == syncpkg.SyncConfigType_UNSPECIFIED { return errors.New(\"sync config type required\") }","typeGuard":"func validCreateReq(r *syncpkg.CreateSyncLimitRequest) bool { return r.Limit > 0 && r.Type != syncpkg.SyncConfigType_UNSPECIFIED }","tryCatchPattern":"_, err := syncClient.CreateSyncLimit(ctx, req)\nif st, ok := status.FromError(err); ok && st.Code() == codes.InvalidArgument {\n    return fmt.Errorf(\"request rejected: %v\", st.Message())\n}","preventionTips":["Validate protobuf requests client-side before RPC","Set all required fields explicitly, never rely on zero values","Add unit tests asserting nonzero limits"],"tags":["grpc","sync-limit","validation"],"backgroundTag":"invalid-parameter","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}