diff --git a/api-contracts/dispatcher/dispatcher.proto b/api-contracts/dispatcher/dispatcher.proto index fe600d268..b571ec8ae 100644 --- a/api-contracts/dispatcher/dispatcher.proto +++ b/api-contracts/dispatcher/dispatcher.proto @@ -28,6 +28,8 @@ service Dispatcher { rpc Unsubscribe(WorkerUnsubscribeRequest) returns (WorkerUnsubscribeResponse) {} + rpc RefreshTimeout(RefreshTimeoutRequest) returns (RefreshTimeoutResponse) {} + rpc ReleaseSlot(ReleaseSlotRequest) returns (ReleaseSlotResponse) {} } @@ -294,6 +296,17 @@ message HeartbeatRequest { message HeartbeatResponse {} +message RefreshTimeoutRequest { + // the id of the step run to release + string stepRunId = 1; + + string incrementTimeoutBy = 2; +} + +message RefreshTimeoutResponse { + google.protobuf.Timestamp timeoutAt = 1; + +} message ReleaseSlotRequest { // the id of the step run to release string stepRunId = 1; diff --git a/api-contracts/openapi/components/schemas/workflow_run.yaml b/api-contracts/openapi/components/schemas/workflow_run.yaml index 2035b5652..30fdc2edf 100644 --- a/api-contracts/openapi/components/schemas/workflow_run.yaml +++ b/api-contracts/openapi/components/schemas/workflow_run.yaml @@ -283,6 +283,7 @@ StepRunEventReason: - FAILED - RETRYING - CANCELLED + - TIMEOUT_REFRESHED - REASSIGNED - TIMED_OUT - SLOT_RELEASED diff --git a/api-contracts/openapi/paths/workflow/workflow.yaml b/api-contracts/openapi/paths/workflow/workflow.yaml index 12e9ed325..30e81f508 100644 --- a/api-contracts/openapi/paths/workflow/workflow.yaml +++ b/api-contracts/openapi/paths/workflow/workflow.yaml @@ -274,7 +274,7 @@ triggerWorkflow: tags: - Workflow Run -cancelWorkflowRuns: +cancelWorkflowRuns: post: x-resources: ["tenant"] description: Cancel a batch of workflow runs diff --git a/api/v1/server/handlers/workflows/cancel.go b/api/v1/server/handlers/workflows/cancel.go index 203e483aa..0f90e14cd 100644 --- a/api/v1/server/handlers/workflows/cancel.go +++ b/api/v1/server/handlers/workflows/cancel.go @@ -8,6 +8,7 @@ import ( "github.com/google/uuid" "github.com/hashicorp/go-multierror" + "github.com/hatchet-dev/hatchet/api/v1/server/oas/gen" "github.com/hatchet-dev/hatchet/internal/msgqueue" "github.com/hatchet-dev/hatchet/internal/repository/prisma/db" diff --git a/api/v1/server/oas/gen/openapi.gen.go b/api/v1/server/oas/gen/openapi.gen.go index a5c4df08f..a2fdd6767 100644 --- a/api/v1/server/oas/gen/openapi.gen.go +++ b/api/v1/server/oas/gen/openapi.gen.go @@ -85,6 +85,7 @@ const ( StepRunEventReasonSLOTRELEASED StepRunEventReason = "SLOT_RELEASED" StepRunEventReasonSTARTED StepRunEventReason = "STARTED" StepRunEventReasonTIMEDOUT StepRunEventReason = "TIMED_OUT" + StepRunEventReasonTIMEOUTREFRESHED StepRunEventReason = "TIMEOUT_REFRESHED" ) // Defines values for StepRunEventSeverity. @@ -7997,107 +7998,107 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/frontend/app/src/components/molecules/relative-date.tsx b/frontend/app/src/components/molecules/relative-date.tsx index 5a2ed543b..b74b3507b 100644 --- a/frontend/app/src/components/molecules/relative-date.tsx +++ b/frontend/app/src/components/molecules/relative-date.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import TimeAgo from 'timeago-react'; import { Tooltip, @@ -9,16 +9,71 @@ import { interface RelativeDateProps { date: Date | string; + future?: boolean; } -const RelativeDate: React.FC = ({ date }) => { - const formattedDate = typeof date === 'string' ? new Date(date) : date; +const RelativeDate: React.FC = ({ + date, + future = false, +}) => { + const formattedDate = useMemo( + () => (typeof date === 'string' ? new Date(date) : date), + [date], + ); + + const [countdown, setCountdown] = useState(''); + + useEffect(() => { + if (future) { + const updateCountdown = () => { + const currentDate = new Date(); + const timeDiff = formattedDate.getTime() - currentDate.getTime(); + + if (timeDiff <= 0) { + setCountdown(''); + return; + } + + const days = Math.floor(timeDiff / (1000 * 3600 * 24)); + const hours = Math.floor( + (timeDiff % (1000 * 3600 * 24)) / (1000 * 3600), + ); + const minutes = Math.floor((timeDiff % (1000 * 3600)) / (1000 * 60)); + const seconds = Math.floor((timeDiff % (1000 * 60)) / 1000); + + const countdownParts = []; + if (days > 0) { + countdownParts.push(`${days}d`); + } + if (hours > 0 || days > 0) { + countdownParts.push(`${hours}h`); + } + if (minutes > 0 || hours > 0 || days > 0) { + countdownParts.push(`${minutes}m`); + } + countdownParts.push(`${seconds}s`); + + setCountdown(countdownParts.join(' ')); + }; + + updateCountdown(); + const countdownInterval = setInterval(updateCountdown, 1000); + + return () => { + clearInterval(countdownInterval); + }; + } + }, [formattedDate, future]); return ( - + {future && countdown ? ( + <>{countdown} + ) : ( + + )} {formattedDate.toLocaleString()} diff --git a/frontend/app/src/lib/api/generated/data-contracts.ts b/frontend/app/src/lib/api/generated/data-contracts.ts index 7a67e7a0c..f51291a3a 100644 --- a/frontend/app/src/lib/api/generated/data-contracts.ts +++ b/frontend/app/src/lib/api/generated/data-contracts.ts @@ -687,6 +687,7 @@ export enum StepRunEventReason { FAILED = "FAILED", RETRYING = "RETRYING", CANCELLED = "CANCELLED", + TIMEOUT_REFRESHED = "TIMEOUT_REFRESHED", REASSIGNED = "REASSIGNED", TIMED_OUT = "TIMED_OUT", SLOT_RELEASED = "SLOT_RELEASED", diff --git a/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-events.tsx b/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-events.tsx index d0a5d128f..f5cf1900d 100644 --- a/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-events.tsx +++ b/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-events.tsx @@ -89,6 +89,7 @@ const REASON_TO_TITLE: Record = { [StepRunEventReason.REQUEUED_NO_WORKER]: 'Requeueing (no worker available)', [StepRunEventReason.REQUEUED_RATE_LIMIT]: 'Requeueing (rate limit)', [StepRunEventReason.SCHEDULING_TIMED_OUT]: 'Scheduling timed out', + [StepRunEventReason.TIMEOUT_REFRESHED]: 'Timeout refreshed', [StepRunEventReason.REASSIGNED]: 'Reassigned', [StepRunEventReason.TIMED_OUT]: 'Execution timed out', [StepRunEventReason.SLOT_RELEASED]: 'Slot released', diff --git a/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-playground.tsx b/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-playground.tsx index 423bde019..d1085f256 100644 --- a/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-playground.tsx +++ b/frontend/app/src/pages/main/workflow-runs/$run/components/step-run-playground.tsx @@ -32,6 +32,7 @@ import { RunStatus } from '../../components/run-statuses'; import { QuestionMarkCircleIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { WorkflowRunsTable } from '../../components/workflow-runs-table'; import { StepRunEvents } from './step-run-events'; +import RelativeDate from '@/components/molecules/relative-date'; export function StepRunPlayground({ stepRun, @@ -453,6 +454,12 @@ export function StepRunPlayground({ {isLoading && disabled && ( <> + {stepRun.timeoutAt && ( +
+ Timeout in{' '} + +
+ )}