Skip to content

Commit f32997a

Browse files
committed
1
1 parent 568dd91 commit f32997a

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

components/ws-daemon/pkg/container/container.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"golang.org/x/xerrors"
1111

12+
"github.com/containerd/containerd/api/types/task"
1213
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
1314
)
1415

@@ -54,6 +55,8 @@ type Runtime interface {
5455

5556
// DisposeContainer removes a stopped container, and everything we know about it
5657
DisposeContainer(ctx context.Context, workspaceInstanceID string)
58+
59+
GetContainerTaskInfo(ctx context.Context, id ID) (*task.Process, error)
5760
}
5861

5962
var (

components/ws-daemon/pkg/container/containerd.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/containerd/containerd/api/events"
2121
"github.com/containerd/containerd/api/services/tasks/v1"
2222
"github.com/containerd/containerd/api/types"
23+
"github.com/containerd/containerd/api/types/task"
2324
"github.com/containerd/containerd/containers"
2425
"github.com/containerd/containerd/errdefs"
2526
"github.com/containerd/containerd/images"
@@ -576,6 +577,27 @@ func (s *Containerd) IsContainerdReady(ctx context.Context) (bool, error) {
576577
return true, nil
577578
}
578579

580+
func (s *Containerd) GetContainerTaskInfo(ctx context.Context, id ID) (*task.Process, error) {
581+
task, err := s.Client.TaskService().Get(ctx, &tasks.GetRequest{
582+
ContainerID: string(id),
583+
})
584+
if err != nil {
585+
return nil, err
586+
}
587+
if task.Process == nil {
588+
return nil, fmt.Errorf("task has no process")
589+
}
590+
591+
// try send last kill signal to the task
592+
_, _ = s.Client.TaskService().Kill(ctx, &tasks.KillRequest{
593+
ContainerID: string(id),
594+
Signal: 9,
595+
All: true,
596+
})
597+
598+
return task.Process, nil
599+
}
600+
579601
var kubepodsQoSRegexp = regexp.MustCompile(`([^/]+)-([^/]+)-pod`)
580602
var kubepodsRegexp = regexp.MustCompile(`([^/]+)-pod`)
581603

components/ws-daemon/pkg/controller/workspace_controller.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
workspacev1 "github.com/gitpod-io/gitpod/ws-manager/api/crd/v1"
2121
"github.com/opentracing/opentracing-go"
2222
"github.com/prometheus/client_golang/prometheus"
23+
"github.com/sirupsen/logrus"
2324

2425
"google.golang.org/protobuf/proto"
2526
corev1 "k8s.io/api/core/v1"
@@ -359,6 +360,10 @@ func (wsc *WorkspaceController) doWorkspaceContentBackup(ctx context.Context, sp
359360
return ctrl.Result{RequeueAfter: 500 * time.Millisecond}, nil
360361
} else {
361362
glog.WithFields(ws.OWI()).WithField("workspace", req.NamespacedName).Warn("workspace container is still running after 5 minutes of deletion, starting backup anyway")
363+
err = wsc.dumpWorkspaceContainerInfo(ctx, ws)
364+
if err != nil {
365+
glog.WithFields(ws.OWI()).WithField("workspace", req.NamespacedName).Errorf("failed to dump container info: %v", err)
366+
}
362367
}
363368
}
364369

@@ -450,6 +455,25 @@ func (wsc *WorkspaceController) doWorkspaceContentBackup(ctx context.Context, sp
450455
return ctrl.Result{}, nil
451456
}
452457

458+
func (wsc *WorkspaceController) dumpWorkspaceContainerInfo(ctx context.Context, ws *workspacev1.Workspace) error {
459+
id, err := wsc.runtime.WaitForContainer(ctx, ws.Name)
460+
if err != nil {
461+
return fmt.Errorf("failed to wait for container: %w", err)
462+
}
463+
task, err := wsc.runtime.GetContainerTaskInfo(ctx, id)
464+
if err != nil {
465+
return fmt.Errorf("failed to get container task info: %w", err)
466+
}
467+
glog.WithFields(ws.OWI()).WithFields(logrus.Fields{
468+
"containerID": id,
469+
"exitStatus": task.ExitStatus,
470+
"pid": task.Pid,
471+
"exitedAt": task.ExitedAt.AsTime(),
472+
"status": task.Status.String(),
473+
}).Info("container task info")
474+
return nil
475+
}
476+
453477
func (wsc *WorkspaceController) prepareInitializer(ctx context.Context, ws *workspacev1.Workspace) (*csapi.WorkspaceInitializer, error) {
454478
var init csapi.WorkspaceInitializer
455479
err := proto.Unmarshal(ws.Spec.Initializer, &init)

components/ws-manager-mk2/controllers/workspace_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ func (r *WorkspaceReconciler) emitPhaseEvents(ctx context.Context, ws *workspace
473473

474474
if ws.Status.Phase == workspacev1.WorkspacePhaseStopping && old.Phase != workspacev1.WorkspacePhaseStopping {
475475
t := metav1.Now()
476-
ws.Status.PodDeletionTime = &t
476+
ws.Status.PodStoppingTime = &t
477477
r.Recorder.Event(ws, corev1.EventTypeNormal, "Stopping", "")
478478
}
479479
}

0 commit comments

Comments
 (0)