mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-04 16:01:35 -05:00
Large nests tie up the workstation that runs them. In Database mode, Auto Nest can now queue the job on the nest server, where a worker container solves one job at a time under its own CPU and memory limits. The job has no time limit, so a throttled worker finds the same nest a fast one does, only later. - Server: /api/nest-jobs queue (schema v15). The worker holds a job on a heartbeat lease. When the lease lapses, the job goes back to the queue, or fails after three attempts. Only one job runs at a time. Packages and results are opaque to the HTTP server, which stays off Engine and IO. - Worker: OpenNest.Server.Worker in the same image (OPENNEST_ROLE=worker), reaching the server over HTTP only. It records each engine answer with RecordingNestingEngine and gives its job back on shutdown. - Desktop: "Nest on the server" in the Auto Nest dialog, for built-in engines only. The client replays the recorded answers with RemoteNestSubmission, so validation, the review and Keep run locally against the client's own drawings, exactly as after a local run. A drawing edited after sending refuses the result. If the server cannot take the job, the user may nest locally instead. - compose.server.yaml adds the throttled worker service. The Dockerfile, .dockerignore, CI paths and the deploy script now include the worker's projects. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
24 lines
1.3 KiB
C#
24 lines
1.3 KiB
C#
using System.Diagnostics;
|
|
using OpenNest.Data;
|
|
using OpenNest.Server.Worker;
|
|
|
|
// The nest server's worker: takes queued whole-job nests from OPENNEST_SERVER_URL and solves
|
|
// them one at a time. Run it in its own container with CPU and memory limits (compose.server.yaml)
|
|
// so nesting never slows nest open and save. See docs/server-nesting.md.
|
|
var options = WorkerOptions.FromEnvironment(Environment.GetEnvironmentVariable);
|
|
|
|
// Below the server and anything else on the host when they share CPUs; the container's
|
|
// CPU limit is the real bound.
|
|
try { Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; }
|
|
catch (Exception ex) when (ex is System.ComponentModel.Win32Exception or PlatformNotSupportedException) { }
|
|
|
|
var builder = Host.CreateApplicationBuilder(args);
|
|
builder.Services.AddSingleton(options);
|
|
builder.Services.AddSingleton(_ => new RemoteNestJobs(options.ServerUrl));
|
|
builder.Services.AddSingleton(sp => new NestJobWorker(
|
|
sp.GetRequiredService<RemoteNestJobs>(), sp.GetRequiredService<ILogger<NestJobWorker>>()));
|
|
builder.Services.AddHostedService<NestJobWorkerService>();
|
|
// A running job is given back, not abandoned, when the container stops.
|
|
builder.Services.Configure<HostOptions>(o => o.ShutdownTimeout = TimeSpan.FromSeconds(20));
|
|
builder.Build().Run();
|