[
https://issues.apache.org/jira/browse/BROOKLYN-264?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15347381#comment-15347381
]
ASF GitHub Bot commented on BROOKLYN-264:
-----------------------------------------
Github user aledsage commented on the issue:
https://github.com/apache/brooklyn-server/pull/211
My comments so far are bike-shedding.
Looking at the big picture, I need to think more about:
* How should we trigger the delete, so that it safely handles success and
failure of provisioning? Options include:
* As you've done here, have `stop()` wait for the machine to be set; but
abort if start() fails.
* Mark the entity's internal state as "requiring machine-release", and
have the start() code immediately release the machine. But we'd still need
`stop()` to wait for that to be done, otherwise we might go on to unmanage the
entity and thus cancel the tasks.
* For speed:
* Can we use the jclouds event bus to be told of the VM's id long before
jclouds has returned from the provisioning call? @andreaturli what do you think?
* Can we tell the `JcloudsLocation` instance that the provisioning has
been aborted (this would allow us to avoid waiting-for-sshable, etc). Not quite
sure how best to do that.
We can ignore the speed issue for now, unless there is a quick win that
greatly speeds things up. The main thing is to get it functionally correct, and
with clean code.
> Stop app while VM still being provisioned: vm is left running when app is
> expunged
> ----------------------------------------------------------------------------------
>
> Key: BROOKLYN-264
> URL: https://issues.apache.org/jira/browse/BROOKLYN-264
> Project: Brooklyn
> Issue Type: Bug
> Affects Versions: 0.9.0
> Reporter: Aled Sage
>
> A customer deployed an app to AWS, but while the VM was still starting up
> they stopped (and thus expunged) the app. The app disappeared from the
> Brooklyn web-console, but the starting VM was left behind in AWS.
> This is simple to reproduce:
> 1. deploy a simple blueprint, such as:
> {noformat}
> location: aws-ec2:us-east-1
> services:
> - type: org.apache.brooklyn.entity.machine.MachineEntity
> {noformat}
> 2. wait for the VM to appear in the AWS web-console (with state
> "initialising")
> 3. call the {{stop}} effector on the top-level app.
> ---
> Looking at the {{start}} task that was executing at the time when {{stop}}
> was called, below is the thread's stack trace:
> {noformat}
> Provisioning machine in JcloudsLocation[AWS
> Virginia:AAAAAAAAAAAAAAAAAAAA/aws-ec2:us-east-1@eyNrLIo5]
> Task[provisioning (AWS Virginia)]@MJITkjw0
> Submitted by SoftlyPresent[value=Task[start]@tKw0qJET]
> In progress, thread waiting (notify) on
> java.util.concurrent.CountDownLatch$Sync@2ed5be36
> At:
> org.jclouds.concurrent.FutureIterables.awaitCompletion(FutureIterables.java:149)
>
> org.jclouds.compute.internal.BaseComputeService.createNodesInGroup(BaseComputeService.java:214)
>
> org.jclouds.ec2.compute.EC2ComputeService.createNodesInGroup(EC2ComputeService.java:149)
>
> org.apache.brooklyn.location.jclouds.JcloudsLocation.obtainOnce(JcloudsLocation.java:726)
>
> org.apache.brooklyn.location.jclouds.JcloudsLocation.obtain(JcloudsLocation.java:616)
>
> org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks$ObtainLocationTask.call(MachineLifecycleEffectorTasks.java:406)
>
> org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks$ObtainLocationTask.call(MachineLifecycleEffectorTasks.java:396)
>
> org.apache.brooklyn.util.core.task.Tasks.withBlockingDetails(Tasks.java:98)
>
> org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks$ProvisionMachineTask.call(MachineLifecycleEffectorTasks.java:380)
>
> org.apache.brooklyn.entity.software.base.lifecycle.MachineLifecycleEffectorTasks$ProvisionMachineTask.call(MachineLifecycleEffectorTasks.java:364)
>
> org.apache.brooklyn.util.core.task.DynamicSequentialTask$DstJob.call(DynamicSequentialTask.java:359)
>
> org.apache.brooklyn.util.core.task.BasicExecutionManager$SubmissionCallable.call(BasicExecutionManager.java:519)
> {noformat}
> From this, we can see that we are still calling jclouds. This means that
> jclouds has not yet returned to Brooklyn the VM's id. It also means that the
> {{MachineEntity}} will not have been given a {{JcloudsSshMachineLocation}}
> instance.
> When {{stop}} is called on the {{MachineEntity}}, it doesn't have a machine
> location instance so it doesn't have anything to ask to stop. This is why the
> VM is left running.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)