// Module included in the following assemblies: // // * operators/operator_sdk/java/osdk-java-tutorial.adoc :_content-type: CONCEPT [id="osdk-java-controller-reconcile-loop_{context}"] = Reconcile loop . Every controller has a reconciler object with a `Reconcile()` method that implements the reconcile loop. The reconcile loop is passed the `Deployment` argument, as shown in the following example: + [source,java] ---- Deployment deployment = client.apps() .deployments() .inNamespace(resource.getMetadata().getNamespace()) .withName(resource.getMetadata().getName()) .get(); ---- . As shown in the following example, if the `Deployment` is `null`, the deployment needs to be created. After you create the `Deployment`, you can determine if reconciliation is necessary. If there is no need of reconciliation, return the value of `UpdateControl.noUpdate()`, otherwise, return the value of `UpdateControl.updateStatus(resource): + [source, java] ---- if (deployment == null) { Deployment newDeployment = createMemcachedDeployment(resource); client.apps().deployments().create(newDeployment); return UpdateControl.noUpdate(); } ---- . After getting the `Deployment`, get the current and required replicas, as shown in the following example: + [source,java] ---- int currentReplicas = deployment.getSpec().getReplicas(); int requiredReplicas = resource.getSpec().getSize(); ---- . If `currentReplicas` does not match the `requiredReplicas`, you must update the `Deployment`, as shown in the following example: + [source,java] ---- if (currentReplicas != requiredReplicas) { deployment.getSpec().setReplicas(requiredReplicas); client.apps().deployments().createOrReplace(deployment); return UpdateControl.noUpdate(); } ---- . The following example shows how to obtain the list of pods and their names: + [source,java] ---- List pods = client.pods() .inNamespace(resource.getMetadata().getNamespace()) .withLabels(labelsForMemcached(resource)) .list() .getItems(); List podNames = pods.stream().map(p -> p.getMetadata().getName()).collect(Collectors.toList()); ---- . Check if resources were created and verify podnames with the Memcached resources. If a mismatch exists in either of these conditions, perform a reconciliation as shown in the following example: + [source,java] ---- if (resource.getStatus() == null || !CollectionUtils.isEqualCollection(podNames, resource.getStatus().getNodes())) { if (resource.getStatus() == null) resource.setStatus(new MemcachedStatus()); resource.getStatus().setNodes(podNames); return UpdateControl.updateResource(resource); } ----