github.com/hernad/nomad@v1.6.112/drivers/exec/handle.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package exec
     5  
     6  import (
     7  	"context"
     8  	"strconv"
     9  	"sync"
    10  	"time"
    11  
    12  	hclog "github.com/hashicorp/go-hclog"
    13  	plugin "github.com/hashicorp/go-plugin"
    14  	"github.com/hernad/nomad/drivers/shared/executor"
    15  	"github.com/hernad/nomad/plugins/drivers"
    16  )
    17  
    18  type taskHandle struct {
    19  	exec         executor.Executor
    20  	pid          int
    21  	pluginClient *plugin.Client
    22  	logger       hclog.Logger
    23  
    24  	// stateLock syncs access to all fields below
    25  	stateLock sync.RWMutex
    26  
    27  	taskConfig  *drivers.TaskConfig
    28  	procState   drivers.TaskState
    29  	startedAt   time.Time
    30  	completedAt time.Time
    31  	exitResult  *drivers.ExitResult
    32  }
    33  
    34  func (h *taskHandle) TaskStatus() *drivers.TaskStatus {
    35  	h.stateLock.RLock()
    36  	defer h.stateLock.RUnlock()
    37  
    38  	return &drivers.TaskStatus{
    39  		ID:          h.taskConfig.ID,
    40  		Name:        h.taskConfig.Name,
    41  		State:       h.procState,
    42  		StartedAt:   h.startedAt,
    43  		CompletedAt: h.completedAt,
    44  		ExitResult:  h.exitResult,
    45  		DriverAttributes: map[string]string{
    46  			"pid": strconv.Itoa(h.pid),
    47  		},
    48  	}
    49  }
    50  
    51  func (h *taskHandle) IsRunning() bool {
    52  	h.stateLock.RLock()
    53  	defer h.stateLock.RUnlock()
    54  	return h.procState == drivers.TaskStateRunning
    55  }
    56  
    57  func (h *taskHandle) run() {
    58  	h.stateLock.Lock()
    59  	if h.exitResult == nil {
    60  		h.exitResult = &drivers.ExitResult{}
    61  	}
    62  	h.stateLock.Unlock()
    63  
    64  	// Block until process exits
    65  	ps, err := h.exec.Wait(context.Background())
    66  
    67  	h.stateLock.Lock()
    68  	defer h.stateLock.Unlock()
    69  
    70  	if err != nil {
    71  		h.exitResult.Err = err
    72  		h.procState = drivers.TaskStateUnknown
    73  		h.completedAt = time.Now()
    74  		return
    75  	}
    76  	h.procState = drivers.TaskStateExited
    77  	h.exitResult.ExitCode = ps.ExitCode
    78  	h.exitResult.Signal = ps.Signal
    79  	h.completedAt = ps.Time
    80  
    81  	// TODO: detect if the task OOMed
    82  }