{"record":{"id":"96eb9c40858de0a8","repo":"alibaba/nacos","slug":"21008","errorCode":"21008","errorMessage":"service %s not found!","messagePattern":"service (.+?) not found!","errorType":"validation","errorClass":"NacosApiException","httpStatus":400,"severity":"error","filePath":"naming/src/main/java/com/alibaba/nacos/naming/core/ServiceOperatorV2Impl.java","lineNumber":108,"sourceCode":"     *\n     * @param service  v2 service\n     * @param metadata new metadata of service\n     * @throws NacosException nacos exception during creating\n     */\n    public void create(Service service, ServiceMetadata metadata) throws NacosException {\n        if (ServiceManager.getInstance().containSingleton(service)) {\n            throw new NacosApiException(NacosException.INVALID_PARAM,\n                ErrorCode.SERVICE_ALREADY_EXIST,\n                String.format(\"specified service %s already exists!\",\n                    service.getGroupedServiceName()));\n        }\n        metadataOperateService.updateServiceMetadata(service, metadata);\n    }\n    \n    @Override\n    public void update(Service service, ServiceMetadata metadata) throws NacosException {\n        if (!ServiceManager.getInstance().containSingleton(service)) {\n            throw new NacosApiException(NacosException.INVALID_PARAM, ErrorCode.SERVICE_NOT_EXIST,\n                String.format(\"service %s not found!\", service.getGroupedServiceName()));\n        }\n        metadataOperateService.updateServiceMetadata(service, metadata);\n        NotifyCenter.publishEvent(new InfoChangeEvent.ServiceInfoChangeEvent(service));\n    }\n    \n    @Override\n    public void delete(String namespaceId, String serviceName) throws NacosException {\n        Service service = getServiceFromGroupedServiceName(namespaceId, serviceName, true);\n        delete(service);\n    }\n    \n    /**\n     * Delete service.\n     *\n     * @param service service v2\n     * @throws NacosException nacos exception during delete\n     */","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/naming/src/main/java/com/alibaba/nacos/naming/core/ServiceOperatorV2Impl.java#L90-L126","documentation":"Thrown by ServiceOperatorV2Impl.update when ServiceManager does NOT contain a singleton for the given Service. Error code 21008 maps to ErrorCode.SERVICE_NOT_EXIST with NacosException.INVALID_PARAM (400). Update requires the service to already exist — it modifies metadata on an existing singleton.","triggerScenarios":"Calling the update-service metadata API for a (namespaceId, groupName, serviceName) that was never created or has already been deleted. Also triggered when the namespace or group name is mistyped so the service key does not resolve to an existing singleton.","commonSituations":"Attempting to update service metadata before the service was created. Service was deleted by another operator or by empty-service cleanup. Namespace/group name mismatch between the update call and the original create. Migrating services between environments and forgetting to create first.","solutions":["Create the service first via create() if it does not exist, then call update().","Verify the namespaceId, groupName, and serviceName match the originally created service exactly.","Check that empty-service cleanup has not removed the service (increase nacos.naming.empty.service.expired.time if needed).","Query the service via queryService() before updating to confirm existence."],"exampleFix":"// before\nserviceOperatorV2.update(service, metadata);\n\n// after — ensure existence first\nif (!ServiceManager.getInstance().containSingleton(service)) {\n    serviceOperatorV2.create(service, metadata);\n} else {\n    serviceOperatorV2.update(service, metadata);\n}","handlingStrategy":"validation","validationCode":"Service service = Service.newService(namespaceId, groupName, serviceName, ephemeral);\nif (!ServiceManager.getInstance().containSingleton(service)) {\n    serviceOperatorV2.create(service, metadata);\n} else {\n    serviceOperatorV2.update(service, metadata);\n}","typeGuard":null,"tryCatchPattern":"try {\n    serviceOperatorV2.update(service, metadata);\n} catch (NacosApiException e) {\n    if (e.getErrCode() == NacosException.INVALID_PARAM\n            && ErrorCode.SERVICE_NOT_EXIST.getCode() == 21008) {\n        serviceOperatorV2.create(service, metadata);\n    } else throw e;\n}","preventionTips":["Verify service existence before updating metadata.","Ensure namespace, group, and service name match the original create exactly.","Prevent empty-service cleanup from removing services still in use."],"tags":["naming","service-update","not-exist","validation"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}