Dave Leskovec <dlesko(a)linux.vnet.ibm.com> wrote:
This is a repost of the shutdown and destroy container support.
Changes in this
A few comments:
...
+static int lxcDomainDestroy(virDomainPtr dom)
+{
+ int rc = -1;
+ lxc_driver_t *driver = (lxc_driver_t*)dom->conn->privateData;
+ lxc_vm_t *vm = lxcFindVMByID(driver, dom->id);
+ int childStatus;
+
+ if (!vm) {
+ lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
+ _("no domain with id %d"), dom->id);
+ goto error_out;
+ }
+
+ if (0 > (kill(vm->def->id, SIGKILL))) {
+ if (ESRCH != errno) {
+ lxcError(dom->conn, dom, VIR_ERR_INTERNAL_ERROR,
+ _("sending SIGKILL failed: %s"), strerror(errno));
+
+ goto error_out;
I wondered...
If this kill fails due to non-ESRCH, is it worth trying to kill vm->pid?
Seeing that the only other kill errno values are EINVAL and EPERM,
I guess not.
+ }
Does the ESRCH case deserve some sort of diagnostic? (I don't know)
+ }
+
+ vm->state = VIR_DOMAIN_SHUTDOWN;
+
+ waitpid(vm->def->id, &childStatus, 0);
How about waiting only if the signal was successfully sent?
And detect waitpid failure.
+ rc = WEXITSTATUS(childStatus);
+ DEBUG("container exited with rc: %d", rc);
+
+ /* also need to kill tty forward process */
+ /* wrap this with error handling etc.
yes ;-)
> in the right place? */
Looks ok to me.
+ /* also wait for the process */
+ kill(vm->pid, SIGKILL);
...