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 }