These 61 commits are when the Protocol Buffers files have changed:
| Commit: | dc5c0d0 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuebot] Defer release proc when host non-accessible (#2471) If a lostProc could not be confirmed to have been killed, don't release the frame to Waiting state. Wait for the host to have been confirmed dead to release the proc for booking. Flapping and genuinely-dead hosts are indistinguishable at kill time. If the kill could not confirm the frame is stopped and the host is not confirmed dead, releasing the frame now would re-book it onto a second host while this RQD keeps rendering. In that case we DEFER the release: the proc row and RUNNING frame are left intact (preserving the host<->frame link, which is otherwise lost once the proc is deleted) so the frame is reclaimed later, once the host is confirmed DOWN (clearDownProcs) or the frame completes naturally. A genuinely dead host (marked DOWN, or no longer Up) leaves no live RQD, so release is safe. See design/frame_double_booking_v2.md. ## LLM usage disclaimer Claude Code Opus was used to help investigating this issue <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a new system metric for “deferred release procs” (lost procs held back instead of released immediately). * Introduced `dispatcher.defer_release_on_failed_kill_enabled` (default: enabled) to defer releasing when the frame stop can’t be confirmed and the host isn’t confirmed dead. * **Bug Fixes** * Improved lost-proc release/deferral logic to reduce double-booking during frame-stop uncertainty and host flapping. * Adjusted cleared-proc metrics so deferred cases no longer inflate cleared counts. * Enhanced orphaned-proc/frame maintenance reporting and warnings when records are already missing. * **Tests** * Expanded lost-proc decision-path coverage. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
The documentation is generated from this commit.
| Commit: | ae191e3 | |
|---|---|---|
| Author: | Filipe Lacerda | |
| Committer: | GitHub | |
[cuebot/cuegui] Feature add layer dispatchorder control (#2354) This PR just complement it: https://github.com/AcademySoftwareFoundation/OpenCue/pull/222 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added "Reorder Dispatch..." option to the layer context menu to set dispatch priority for one or multiple layers. * Exposed a layer dispatch-order API so layers can be reordered programmatically. * Added a Python SDK Layer method to update dispatch order from scripts. * **Chores** * Version bumped to 1.26 <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Alexis Oblet <alexis@theyard-vfx.com> Signed-off-by: Alexis Oblet <aoblet@users.noreply.github.com> Signed-off-by: Filipe Lacerda <53842848+tifilipebr@users.noreply.github.com> Co-authored-by: Diego Tavares <dtavares@imageworks.com> Co-authored-by: Alexis Oblet <alexis@theyard-vfx.com> Co-authored-by: Alexis Oblet <aoblet@users.noreply.github.com>
| Commit: | e4546eb | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[scheduler] Resource accounting on Redis (#2323) ### Summary Moves the Rust scheduler's resource accounting off in-process `HashMap`s and into a shared Redis store, with Cuebot's release path teed into the same store. Architecture, schema, the `acct:seq` guard, failure modes, and trade-offs are documented in [docs/_docs/developer-guide/redis-accounting.md](docs/_docs/developer-guide/redis-accounting.md) — this description covers what shipped on the branch, not how it works. Branch also carries an earlier batch of perf/stability fixes ("Phase 1") that landed ahead of the accounting work. ### Phase 1 — perf and stability quick wins (pre-feature) - `2072e63a` Dispatch + cluster query perf: `LIMIT N` on `QUERY_PENDING_BY_SHOW_FACILITY_TAG`, EXISTS rewrite, new indexes (V40 migration), facility case-sensitivity fix, empty-cluster sleep 3s → 30s, host-cache refresh overlap guard. Net: ~10× drop in `QUERY_PENDING` rate, ~3–5× per-call cost reduction. - `b98b86fa` Drop tag chunk size defaults to more reasonable values. - `7e2a5941` New metric for cluster round-trip duration. - `06a18ecd` Wrap cluster loop in panic guard. - `05dd9b31` Wrap panic surface on resource-accounting logic. - `e1767b12` Fix permit-update being ignored. - `bc5cd975`, `941c59fe` Minor refactors + review fixes. - `7f2c5124` Merge `master` (carries RQD windows/system tweaks). ### Phase 2 — schema + show-management flag + Cuebot read-side - `388bbc4c` New `show.b_scheduler_managed` column (V42 migration), `ShowDao` flag lookup + cache, `ShowInterface.setSchedulerManaged` gRPC + pycue wrapper + `cueadmin -setSchedulerManaged`. Drops `dispatcher.exclusion_list` / `dispatcher.scheduler_manages_resources` from `opencue.properties`; `DispatcherDaoJdbc` and `WhiteboardDaoJdbc` switched to the new column. Updates the existing deploying-scheduler docs and a release post to reflect the new toggle. - `1087ae66` Version bump + rename V40 migration after the V42 ordering. ### Phase 3 — Cuebot Redis publisher + show-aware `unbookProc` - `d14e52e4` `AccountingRedisPublisher` interface + `LettuceAccountingRedisPublisher` (single Lua doing 5 × `HINCRBY` + `INCR acct:seq`). `ProcDaoJdbc.unbookProc` branches on the cached flag: scheduler-managed shows get `DELETE proc` + `afterCommit` publish, others keep today's behavior. Spring config wires the no-op vs real publisher on `accounting.redis.enabled`; startup guardrail logs the misconfigured-Cuebot WARN. Tests across `ProcDaoTests`, `ShowDaoTests`, and `LettuceAccountingRedisPublisherTests`. - `88495a1c` Add Lettuce dependency. ### Phase 4 — Rust scheduler accounting module - `9d480e08` New `crates/scheduler/src/accounting/` module replacing `ResourceAccountingService`: Redis client + Lua scripts (atomic check-and-modify with `force` rollback), 2-min recompute, 5-min limit reseed, blocking bootstrap, managed-shows cache, `BookingDelta` over 5 tables (`DispatchLayer` extended with `folder_id` / `dept_id`). Compensation rollback at the dispatcher actor switched to Lua force mode. `acct:seq` CAS guard on every reseed. New `redis_integration` test suite. - `d945f0d1` Fix centicore-vs-core unit handling at PG/Cuebot↔Redis boundaries (limit reseed, recompute, release publisher, `CoreSize`); test centicores in the Lettuce publisher tests; dispatcher actor cleanups. - `336a6696` Add GPU limit enforcement to the booking Lua + integration coverage. ### Phase 5 — docs + cleanup (this session) - `88f3732c` New `docs/_docs/developer-guide/redis-accounting.md` rewriting the surviving design content as a developer reference; re-points the four in-tree citations (`accounting/mod.rs`, `AccountingRedisPublisher.java`, `LettuceAccountingRedisPublisher.java`, `LettuceAccountingRedisPublisherTests.java`) to the new guide; deletes `design/SCHED_REDIS_DECISIONS.md` (history preserved in git). ### Test plan - [x] Cuebot: `./gradlew build` (embedded Postgres covers V42 migration, `ShowDao`, `ProcDao` branching, `LettuceAccountingRedisPublisher` Lua wiring, `ManageShow.setSchedulerManaged`). - [x] Rust: `cargo test -p scheduler` and `cargo test -p scheduler --features integration-tests` (covers the booking Lua, recompute, limit reseed, bootstrap, GPU limits, centicore conversion at boundaries). - [x] pycue: `cd pycue && pytest tests/wrappers/test_show.py` (new `setSchedulerManaged` wrapper). - [x] cueadmin: `cd cueadmin && pytest tests/test_common.py` (new subcommand). - [x] `./docs/build.sh` (new developer-guide entry renders, internal anchors resolve). - [x] Manual sandbox smoke: flip a show via `cueadmin -setSchedulerManaged true`, verify Cuebot `unbookProc` publishes to Redis (`redis-cli MONITOR`), let recompute run, flip back, confirm no negative `int_cores` persists past one recompute cycle. - [x] Deploy validation: confirm no Cuebot logs `cuebot_redis_publish_misconfigured` after enabling `accounting.redis.enabled=true` cluster-wide. ### Breaking changes - `dispatcher.exclusion_list` and `dispatcher.scheduler_manages_resources` removed from `opencue.properties`. Any show previously listed there must be migrated to `b_scheduler_managed=true` via `cueadmin -setSchedulerManaged true` during the upgrade. - Deployments wanting to keep the scheduler running must set `accounting.redis.enabled=true` on every Cuebot before flipping any show to scheduler-managed (see deployment invariant in the dev guide). ## LLM Usage disclaimer Claude Opus was used both in the planning and implementation phases of this PR. All code has been reviewed and tested manually. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Per-show "scheduler-managed" toggle exposed in CLI, gRPC and Python APIs. * Redis-backed live accounting and booking for scheduler-managed shows; scheduler startup reseed/recompute loops. * **Bug Fixes / Behavior** * Cuebot dispatching and accounting now skip shows marked scheduler-managed; booking ownership moved to scheduler when enabled. * **Documentation** * Expanded developer and deployment guides with migration and operational workflows for Redis accounting. * **Chores** * Version bumped to 1.25; added Redis dependency and integration tests. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 55eb54b | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuegui/cuebot] Optimize CueMonitorTree (#2370) CueJobMonitorTree was fetching the same job data twice every 22s: once via cached getJobWhiteboard, then once per group via an uncached getJobs(id=...). On a show with N populated groups, one tick cost 1 + N gRPC round-trips and SQL executions. Changes: - Add `repeated Job inline_jobs = 18` to NestedGroup (strictly additive; `repeated string jobs` retained). Cuebot populates it from the existing GET_NESTED_GROUPS row data — the only column added to the SELECT is `str_loki_url`. Reuses WhiteboardDaoJdbc.JOB_MAPPER. - Bump whiteboard cache TTL 5s→10s and add per-show single-flight (synchronized-on-show), so concurrent clients share one SQL execution per TTL window. - cuegui: drop UPDATE_INTERVAL 22s→5s; override _update with a skip-if-running guard; rewrite _processUpdate as an incremental diff (takeChild only stale IDs, no clear()), so selection, scroll, and expansion survive add/remove/reparent. - cuegui: consume inline_jobs; fall back to opencue.api.getJobs against older Cuebot. ## LLM usage disclosure Claude Opus was used to implement this optimization <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Display inline job data within nested job groups. * **Performance** * Faster job tree refresh (22s → 5s). * Incremental tree updates to avoid full rebuilds. * Improved whiteboard caching with per-show refresh control and longer timeout. * **Bug Fixes** * Ensure work/task completion callbacks fire even on failure. * **Tests** * Added a test verifying inline jobs populate in nested groups. * **Chores** * Project version updated to 1.24. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/AcademySoftwareFoundation/OpenCue/pull/2370?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | aa359d5 | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/proto/pycue/cuegui/docs] Add startTime() and stopTime() to Layer (#2338) ## Related Issues - https://github.com/AcademySoftwareFoundation/OpenCue/issues/2339 ## Summarize your change. [cuebot/proto/pycue/cuegui/docs] Add Layer startTime() and stopTime() Layer previously had no start/stop time accessors. Callers that needed the execution window for a layer had to fetch every frame and compute MIN/MAX client-side, which was wasteful in CueGUI (N extra RPCs per refresh for a job with N layers) and unavailable to tools that only queried layers. This change denormalizes layer timing onto `layer_stat` and exposes the values directly on the Layer API: - `Layer.startTime()` = `layer_stat.ts_started` (stamped on first entry to RUNNING) - `Layer.stopTime()` = `layer_stat.ts_stopped` (stamped on each exit from RUNNING, but surfaced as 0 until every frame on the layer has stopped) `stopTime()` remains `0` while any frame is still pending, running, or in DEPEND, mirroring `Job.stopTime()` so callers can use the same "is it done?" idiom consistently. Proto - Add `start_time` (field 24) and `stop_time` (field 25) to the `Layer` message. Cuebot - Add `ts_started` and `ts_stopped` (`TIMESTAMP WITH TIME ZONE`) to `layer_stat`. - Maintain both values through the existing `trigger__update_frame_status_counts` trigger (`AFTER UPDATE ON frame`): * entry to RUNNING stamps `ts_started` from `NEW.ts_started` via `COALESCE(...)` (first-writer-wins; retries do not update it) * exit from RUNNING stamps `ts_stopped` from `NEW.ts_stopped` (latest-writer-wins) - Copy timestamps from the updated frame row instead of sampling `current_timestamp`, ensuring `layer_stat.ts_stopped` exactly matches `MAX(frame.ts_stopped)`. - Preserve `COALESCE(..., current_timestamp)` as a fallback for callers that change state without explicitly updating timestamps. - Update `GET_LAYER` and `GET_LAYER_WITH_LIMITS` to read `layer_stat.ts_started` and `layer_stat.ts_stopped` directly, replacing two correlated frame-table aggregates per layer query. - Move "stopTime stays 0 until all frames are done" logic into `WhiteboardDaoJdbc.LAYER_MAPPER` using existing counters: `int_waiting_count + int_running_count + int_depend_count == 0` - Align layer timing behavior with existing denormalized `job.ts_started` / `job.ts_stopped`. - Add V43 migration to create and backfill both columns from existing frame aggregates, with no manual follow-up required. PyCue - Add `Layer.startTime(format=None)` and `Layer.stopTime(format=None)`, matching `Job.startTime()` formatting behavior. - Add unit tests for both epoch and formatted outputs. CueGUI - Add "Start Time" and "Stop Time" columns to `LayerMonitorTree`, alongside the existing "Eligible" column. Docs - Add `startTime` and `stopTime` to the Layer example payload in the REST API reference. - Document the new monitor-tree columns in the Cuetopia monitoring guide. VERSION.in - Bump version to 1.23.
| Commit: | bb6bd61 | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/proto/pycue/cuegui/docs] Add submissionTime() to Frame (#2337) ## Related Issues - https://github.com/AcademySoftwareFoundation/OpenCue/issues/2326 ## Summarize your change. Adds `submissionTime()` to `Frame`, exposing the parent job's submission timestamp directly on the frame object. This avoids requiring callers to fetch the parent job or overload `eligibleTime()` to infer submission time. `Frame.startTime()` represents when the frame began executing on a render host, not when the job was submitted. Since `Job.startTime()` and `Layer.startTime()` already serve as submission timestamps for those objects, only `Frame` needed this additional accessor. With `submissionTime()`, callers can now compute frame lifecycle timing directly from a single `Frame` object: - `blocked_by_depends = frame.eligibleTime() - frame.submissionTime()` - `blocked_by_pickup = frame.startTime() - frame.eligibleTime()` - `total_turnaround = frame.stopTime() - frame.submissionTime()` Proto files - Adds `submission_time` field to `Frame`. Cuebot - Updates `WhiteboardDaoJdbc.FRAME_MAPPER` to populate `submission_time` from the existing `job.ts_started` join (already aliased as `job_ts_started` for the `eligibleTime()` fallback). - No database migration is required, since the source column already exists. PyCue - Adds `Frame.submissionTime()`. - Includes a new unit test covering the Python wrapper. CueGUI - Adds a new "Submission Time" column to `FrameMonitorTree`, positioned next to the existing "Eligible Time" column. - Re-anchors the `*_COLUMN` visual-index constants in `FrameMonitorTree`, which had drifted from their intended columns over years of insertions (last touched in 2018). The new "Submission Time" column made the staleness visible by shifting `LASTLINE_COLUMN` further out of place: - `PROC_COLUMN`: 5 -> 6 (was pointing at GPUs; now correctly points to Host). - `CHECKPOINT_COLUMN`: 7 -> 8 (was pointing at Retries; now correctly points to the icon-only `_CheckpointEnabled` column where the checkmark decoration belongs). - `RUNTIME_COLUMN`: 9 -> 10 (was pointing at the hidden `_CheckpointEnabled`; now correctly points to Runtime). - `MEMORY_COLUMN`: 11 -> 12 (was pointing at LLU; now correctly points to Memory (RSS)). - `LASTLINE_COLUMN`: 15 -> 20 (was pointing at Remain; now correctly points to Last Line). - As a side effect, `redrawRunning()` now emits `dataChanged` over the correct Runtime -> Last Line range, restoring smooth repaints for Runtime/Memory/Last Line cells on running frames. The `PROC_COLUMN` foreground-color and alignment, plus the `CHECKPOINT_COLUMN` icon decoration, also land on the right cells now. - Adds a header comment noting these are visual indices that must be updated in lockstep when columns are inserted, removed, or reordered. Docs - Adds `submissionTime` to the Frame REST API reference schema and example payloads. - Updates the Cuetopia monitoring guide to document the new column. VERSION.in - Bumped up to 1.22
| Commit: | 043c07e | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/proto/pycue/cuegui/docs] Add eligibleTime() to Job, Layer, and Frame (#2325) ## Related Issues - https://github.com/AcademySoftwareFoundation/OpenCue/issues/2319 ## Summarize your change. Exposes when an object became eligible to run (left DEPEND for WAITING, or the job's submission time when never blocked) so callers can measure how long a frame waited to be picked up by a render proc: wait_for_pickup = frame.startTime() - frame.eligibleTime() Proto files - Adds `eligible_time` field to Frame, Job, NestedJob, and Layer. Cuebot - V41 migration adds `ts_eligible` column to the frame, layer, and job tables. - `layer.ts_eligible` and `job.ts_eligible` default to `current_timestamp`; existing rows are backfilled from `job.ts_started`. - Extends the existing DEPEND -> WAITING trigger so it stamps `frame.ts_eligible` whenever a frame unblocks. - V42 migration adds a SETUP -> WAITING trigger to stamp `ts_eligible` on the path frames actually take through Cuebot (frames are inserted as SETUP and bulk-transitioned to WAITING by `JobManagerService.activateJob`, so V41's BEFORE INSERT trigger never fires in practice). - V42 also backfills `ts_eligible` for frames that already made the SETUP -> WAITING jump before this migration ran. - `WhiteboardDaoJdbc` and `NestedWhiteboardDaoJdbc` map the column into the proto's `eligible_time` via a `getEligibleTimeInEpoch` helper, falling back to the job's submission time when `ts_eligible` is NULL (frames still in DEPEND). PyCue - Adds `Frame.eligibleTime()`. - Adds `Job.eligibleTime(format=None)` and `Layer.eligibleTime(format=None)`, mirroring the format-string behavior of `Job.startTime()`. - Propagates `eligible_time` through `NestedJob.asJob()`. - New unit tests cover all four wrappers. CueGUI - Adds an "Eligible Time" column to `FrameMonitorTree`. - Adds an "Eligible" column to `JobMonitorTree` and `LayerMonitorTree`. - "Eligible" was chosen over "Available" because the latter can imply the object will run next, when other gates (resources, paused state, etc.) may still block dispatch. Docs - Adds `eligibleTime` to the Job and Frame REST API reference schemas and example payloads. - Documents the new monitor-tree columns in the Cuetopia monitoring guide.
| Commit: | 2a27f49 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuebot/cuegui/pycue/rqd] Store PSS and MaxPSS (#2112) **Overview** Update modules to properly store PSS (Proportional Set Size) alongside RSS (Resident Set Size) for measuring process memory usage on Linux systems. **Key Differences:** - **RSS**: Total physical memory including full count of shared libraries (can be misleading) - **PSS**: Proportional share - shared pages divided by number of processes sharing them (more accurate) - **Source**: `/proc/[pid]/smaps_rollup` (Linux kernel 4.14+) provides pre-summed PSS values **Current State:** Rqd contains a config property to collect memory as either RSS or PSS. Information is saved on Cuebot and displayed as Rss. **Proposed Solution:** Rqd collects and reports both RSS and PSS. Cuebot stores both in the database. pycue and cuegui display both. Tasks: - [x] Update rqd to collect PSS - [x] Update proto and cuebot to store data on the database - [x] Update pycue and cuegui to display PSS - [x] Fix accidentally refformated python files
| Commit: | 5b8b02d | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/pycue/proto/sandbox/docs] Add full event-driven monitoring stack, enhance metrics, dashboards, and documentation (#2086) **Link the Issue(s) this Pull Request is related to.** - https://github.com/AcademySoftwareFoundation/OpenCue/issues/2085 **Summarize your change.** [cuebot/pycue/proto/rust/sandbox/docs] Add event-driven monitoring stack for OpenCue Implement event-driven monitoring infrastructure enabling real-time and historical analysis of render farm activity. Adds a Kafka + Elasticsearch pipeline for collecting job, layer, frame, host, and proc lifecycle events, with Prometheus and Grafana integration for live dashboards and operational visibility. Proto & Event Model: - Define monitoring.proto with job/layer/frame/host/proc lifecycle events - Use proto composition pattern - embed Job, Layer, Frame, Host messages - Exclude HostReportEvent from pipeline (too high frequency for Kafka/ES) Cuebot Event Publishing: - Add KafkaEventPublisher for async event publishing to Kafka topics - Add KafkaAdminClient for topic creation with configurable partitions/retention - Add MonitoringEventBuilder as Spring-managed bean for event construction - Hook publishing into FrameCompleteHandler, HostReportHandler, DispatchSupportService, JobManagerSupport, DependManagerService - Publish pickup time tracking events (FRAME_STARTED, FRAME_DISPATCHED) - Add isFrameDispatchable() to DependDao for dependency checking Prometheus Metrics: - cue_frames_completed_total (with show, shot, state labels) - cue_jobs_completed_total (with show, shot, state labels) - cue_job_core_seconds histogram - cue_layer_max_runtime_seconds histogram - cue_layer_max_memory_bytes histogram Rust monitoring-indexer Service: - Add rust/crates/monitoring-indexer: standalone Kafka-to-Elasticsearch indexer - Async Kafka consumer with configurable batch processing - Elasticsearch bulk indexing with date-based indices and field mappings - Parallel event processing using rayon for CPU-bound operations - Index templates for all event types (job, layer, frame, host, proc) - Graceful handling of UnknownTopicOrPartition during startup gRPC & PyCue: - Add MonitoringInterface gRPC service - Implement pycue monitoring wrapper with historical data API methods Infrastructure (docker-compose.monitoring-full.yml): - Zookeeper, Kafka, Kafka UI - Elasticsearch, Kibana - Prometheus (with cuebot scrape config) - Grafana (with provisioned dashboard) - monitoring-indexer service Grafana Dashboard: - Frame completion rates by state (DEAD/red, SUCCEEDED/green, WAITING/yellow) - Job completion by show - Frame runtime and memory distribution - Job core seconds distribution - Pickup time metrics (FRAME_STARTED/FRAME_DISPATCHED) - Layer max runtime/memory panels Documentation: - Architecture, concepts, and pipeline explanation - Deployment and Quick Start guides - User and Developer guides - API Reference and tutorials - Elasticsearch query reference guide Utilities: - sandbox/monitor_events.py: Example Kafka consumer - sandbox/load_test_jobs.py: Test data generator with CLI args Configuration (opt-in, disabled by default): - monitoring.kafka.enabled, monitoring.kafka.bootstrap.servers - monitoring.kafka.topic.partitions, .replication.factor, .retention.ms - monitoring.elasticsearch.enabled, monitoring.elasticsearch.host --------- Signed-off-by: Ramon Figueiredo <ramon.fgrd@gmail.com>
| Commit: | 747474f | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/cuegui/pycue/cueadmin] Add cue filter actions for UTIL and PRE layers (#2050) **Link the Issue(s) this Pull Request is related to.** - https://github.com/AcademySoftwareFoundation/OpenCue/issues/2049 - #1800 **Summarize your change.** Add filter actions for UTIL and PRE layer types to match existing RENDER layer functionality. The following actions are now available: UTIL layer actions: - SET_ALL_UTIL_LAYER_TAGS - SET_ALL_UTIL_LAYER_MEMORY - SET_ALL_UTIL_LAYER_MIN_CORES - SET_ALL_UTIL_LAYER_MAX_CORES PRE layer actions: - SET_ALL_PRE_LAYER_TAGS - SET_ALL_PRE_LAYER_MEMORY - SET_ALL_PRE_LAYER_MIN_CORES - SET_ALL_PRE_LAYER_MAX_CORES Changes: - proto: Add 8 new ActionType enum values - pycue: Update Action wrapper to support new action types - cuebot: Add action handlers in FilterManagerService - cuegui: Update FilterDialog UI for new action types - cueadmin: Update ActionUtil to handle new action types
| Commit: | 7c50aa5 | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuebot/pycue/cueadmin/docs] Add show archive automation feature (#2024) **Link the Issue(s) this Pull Request is related to.** - #1362 **Summarize your change.** Implement archive functionality to automate archiving inactive shows by creating aliases to target shows. This enables jobs submitted to archived shows to run on target show allocations. Changes: - Add Archive RPC method to `show.proto` - Implement `show.archive()` method in pycue - Add `-archive-show` command to `cueadmin` - Implement `archiveShow()` in `ShowDao` with database support - Add comprehensive unit tests for all layers - Update documentation (command reference, tutorials, glossary) - Bump version to 1.12
| Commit: | 0e469f9 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Rust RQD (#1759) Introduce a Rust directory containing a Rust version of the RQD module and its dependencies. For more information about the workspace organization, see `Opencue/rust/OVERVIEW.md` Modules can be compiled for the desired OS with `cargo built -r`, this version supports both MacOS and Linux. Compiling at debug mode favours the Linux version build. Binaries can be found after compilation on the default directory (target/release). --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 5e0786a | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Rust rqd (#1762) temporary branch for testing cicd pipeline changes on the rust_rqd PR prior to merging it to master.
| Commit: | 638212f | |
|---|---|---|
| Author: | Jimmy Christensen | |
| Committer: | GitHub | |
Split proto into it's own package and create packages for all python modules (#1681) Summary of changes : ### Proto split - Split proto files into it's own folder (proto) and package (opencue_proto) ### Packaging - Removed `build_proto.sh` script - Replace `setup.py` and `requirements.txt` with `pyproject.toml` with proper dependencies for testing, building and installation - Prefixed all packages with "opencue_" to not clash with pypi packages. - Uses versioningit for versiosing the packages. If current commit is tagged, it will use that as version name. Otherwise it will add how many commits since last tag and current commit hash. Eg. `1.4.11.post156+g23df172.d20250416` ### CI/CD - Change test workflow from using PYTHONPATH to use installed packages of dependencies. - Use pre-built packages (built with python 3.7) for use in CI/CI testing. (with workflow dependencies) - Added test for installing all packages using python 3.11 and python 3.12 (can easily add more) - Test packages using `python -m pytest ${package}` which uses definded test dirs in `pyproject.toml` --------- Signed-off-by: Jimmy Christensen <Lithorus@gmail.com> Co-authored-by: Robin (Ubisoft) <146888956+robin-ubisoft-helix@users.noreply.github.com>
| Commit: | 94d1761 | |
|---|---|---|
| Author: | Ramon Figueiredo | |
| Committer: | GitHub | |
[cuegui] Add LockState Filter to "Monitor Hosts" window in CueCommander (#1679) - Add `LockStateSeq` message with `repeated LockState state` in `host.proto` and update HostSearchCriteria - Update `HostMonitor.py` to include the menu to filter by lock state - Update `HostSearch.java` to include lock state filtering - Add lock state handling in `_setOptions` function in `search.py` **Link the Issue(s) this Pull Request is related to.** https://github.com/AcademySoftwareFoundation/OpenCue/issues/1678
| Commit: | 81b0fe1 | |
|---|---|---|
| Author: | Jimmy Christensen | |
| Committer: | GitHub | |
[rqd] [cuegui] Add support for Loki for frame logs (#1577) **Link the Issue(s) this Pull Request is related to.** #1571 **Summarize your change.** This adds the ability to use loki as the backend for frame logs in rqd. It also adds a new plugin/widget in cuegui to read the logs from the loki server. This enables logs files to not be bound by a single namespace and also adds the potential to also store telemetry about the frame. This is still on an experimental stage and any inputs are appreciated. Screenshot of new widget :  The loki-urllib3-client python module is optional and if it's not detected, the cuegui widget will show and error message. Not yet implemented : - Search log - Timestamp in log view --------- Co-authored-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 219444b | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[rqd] Add frame recovery logic for docker mode (#1614) Whenever RQD restarts it loses track of all the frames launched by it that haven't finished. This change adds a new configurable option to backup frame states to a file, that is used to recover the frame cache state and try to re-bind to the running frames. This first version only works on docker mode --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | c00d214 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[rqd/cuebot] Hard and Soft memory limits (#1589) Currently, frames are created with minimal requirements, but limits are not enforced. This PR implements soft and hard limits on RQD when running on docker mode. For more information about soft and hard limits [read](https://docs.docker.com/engine/containers/resource_constraints/). Limits are calculated using the minimum memory defined for the layer and a multiplier that can be tuned at Dispatcher.java. Ideally, these values should be extracted to opencue.properties, but they are being used in a static context, and interpreted before the file is actually read. --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 633df41 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuegui/pycue] Fix Local Booking widget (#1581) This feature has been inactive on opencue since the beginning. Changes to port from Ice to Grpc were not properly tested and this widget never really worked. Local Rendering if a feature that allows users to claim the ownership of a host (their workstation) and assign a job to execute frames on that host. This is very useful in situations where the farm is busy but user workstations aren't. To access the feature, right-click on a job/layer and select "Use local cores..". On the opened widget, the user can select how much cores, memory and gpu to allocate to execute cue jobs. When confirmed, cuebot will start dispatching frames to that host. --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 291b694 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuebot/rqd] Add feature to run frames on a containerized environment using docker (#1549) ### Motivation Running OpenCue In a multi operational system environment requires segregating the farm, which means hosts have to be assigned to one OS and cannot be shared between shows that have different OS requirements. This can be a challenge when sharing resources between shows is necessary. ### Proposed solution A new execution mode on **rqd** `runDocker` to live alongside `runLinux`, `runWindows`, and `runDarwin` (macOs). This mode will launch the frame command on a docker container based on the frame expected OS. With this, rqd is now able to run jobs from different OSs on the same host. But to make this possible, a rqd host needs to advertise itself not with its own OS code (defined by `SP_OS` on rqd.conf), but with all the OSs of images it is capable of executing. ### Configuration changes The following sections were added to rqd.conf: ```ini [docker.config] # Setting this to True requires all the additional "docker.[]" sections to be filled RUN_ON_DOCKER=True # This section is only required if RUN_ON_DOCKER=True # List of volume mounts following docker run's format, but replacing = with : [docker.mounts] TEMP=type:bind,source:/tmp,target:/tmp,bind-propagation:slave NET=type:bind,source:/net,target:/net,bind-propagation:slave # This section is only required if RUN_ON_DOCKER=True # - keys represent OSs this rqd is capable of executing jobs in # - values are docker image tags [docker.images] centos7=centos7.3:latest rocky9=rocky9.3:latest ``` In this case, the rqd host would advertise itself with `OS=centos7,rocky9`, and the dispatch logic has been changed accordingly to account for dispatching frames to nodes that support multiple OSs. Feature has been documented at https://github.com/AcademySoftwareFoundation/opencue.io/pull/302 --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 2c0a97e | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Rest gateway (#1355) ## Summarize your change Create a service to expose a REST endpoint for the grpc interface. The motivation behind having a REST endpoint is to create a web version of cuegui (coming soon). ## How does it work See the [module README](https://github.com/AcademySoftwareFoundation/OpenCue/blob/1f3229599a58af64aa9c7feda7657f8fece9c97d/rest_gateway/README.md) for a full documentation. --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com> Co-authored-by: Zachary Fong <zfong@imageworks.com> Co-authored-by: Ramon Figueiredo <rfigueiredo@imageworks.com>
| Commit: | b117568 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Update placeholder branch for containerized_rqd (#1550) Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | e67a8b3 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
[cuebot/rqd] Prevent running frames on Swap memory (#1497) Improve logic previously implemented to handle Out-of-memory conditions to consider swap usage. When a host is using more than `dispatcher.oom_max_safe_used_physical_memory_threshold` if its physical memory and more than `dispatcher.oom_max_safe_used_swap_memory_threshold` of its swap memory, a logic that kills frames that are relying heavily on swap memory is triggered. This logic will automatically mark killed frames to be retried and possibly increase its parent layer memory requirements if it had been using more memory than initially reserved. Co-authored-by: Ramon Figueiredo <rfigueiredo@imageworks.com>
| Commit: | 7bb39c2 | |
|---|---|---|
| Author: | Zach-Fong | |
| Committer: | GitHub | |
[cueweb] CueWeb improvements and add unit testing (#1457) Features and improvements 1. CueWeb authorization updates - Modified CueWeb to include authorization headers in all HTTP requests to the gRPC REST gateway. - Added functionality to generate JWT tokens using a secret for inclusion in authorization headers. 2. Include unit testing - Introduced Jest tests for CueWeb to cover: Authentication middleware, error handling, and JWT creation. Co-authored-by: Zachary Fong <zfong@imageworks.com> Co-authored-by: Ramon Figueiredo <rfigueiredo@imageworks.com>
| Commit: | 1219377 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Rest gateway (#1449) Merge changes from local fork into ASWF repo --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 4e35887 | |
|---|---|---|
| Author: | Jimmy Christensen | |
| Committer: | GitHub | |
Add command to layerDetails (#1436) **Summarize your change.** This adds the layer `command` attribute to the layer details in the cuegui attribute widget.
| Commit: | 85050da | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Remove rqd restart feature (#1435) The feature was never really functional. Its implementation relied on a hardcoded path only valid for the init.d deployment of rqd, and even for this use case it didn't work as expected. For the three existing rqd deployment modes (docker, init.d and systemd) restarting should be accomplished by calling stop and start sequentially. Out of the three modes, only Docker is not handled by this PR, as it requires external control of the rqd service on docker, and service definitions are out of the scope of this repo.
| Commit: | 8ea92bf | |
|---|---|---|
| Author: | Rosa Behrens Camp | |
| Committer: | GitHub | |
Implement feature to override frame state display text/color in UI (#1246) Implement feature to override frame state display text/color in UI The scheduled task to remove old jobs has been failing for jobs with frames that used the new override feature due to a foreign key not being handled at the delete trigger. --------- Authored-by: RosaBehrensCamp <rbehrens@imageworks.com> Signed-off-by: Diego Tavares <dtavares@imageworks.com> Co-authored-by: Diego Tavares <dtavares@imageworks.com>
| Commit: | 174f397 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Subscribe to a job using email (#1368) Summarize your change. This change give users the ability to subscribe to a job through the API or using the GUI. An user subscribed to a job will receive the same emails as the owner of the job. Signed-off-by: Diego Tavares <dtavares@imageworks.com> Co-authored-by: Akim Ruslanov <aruslanov@imageworks.com>
| Commit: | a314c6c | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Kill job reason (#1367) Adding requester information to JobKillRequest This feature requires more information from job kill actions requested through the API. Link the Issue(s) this Pull Request is related to. This feature is motivated by a situation where a script was misusing the API and calling kill on all the jobs for a show on a regular basis. Without this feature, finding where the requests were coming from was a big endeavor. Summarize your change. This change requires that a kill request also provide username, pid, host_kill and reason. --------- Signed-off-by: Diego Tavares <dtavares@imageworks.com> Co-authored-by: Roula O'Regan <roregan@imageworks.com>
| Commit: | 9a033a9 | |
|---|---|---|
| Author: | Diego Tavares | |
| Committer: | GitHub | |
Fix Criteria.java query search parameters (#1369) Fix a bug in the overloaded method addPhraseRange for InRangeIntegerSearchCriterion. The method needs an extra search parameter and needs to call min/max and not value. Added two new parameters to the buildWhereClause for "greater than" and "lower than" memory proc searches. --------- Co-authored-by: Roula O'Regan <roregan@imageworks.com>
| Commit: | d9d24f0 | |
|---|---|---|
| Author: | Rosa Behrens Camp | |
| Committer: | GitHub | |
Min mem increase (#1157) Added the ability for admins to set the minimum memory increase value on a service. OpenCue increases the minimum memory requirements every time a job is retried when it fails from running out of memory but the old memory increase (hardcoded to 2G) was causing some jobs to be retried many times before it finally succeeded.
| Commit: | 6fafd62 | |
|---|---|---|
| Author: | Diego Tavares da Silva | |
| Committer: | GitHub | |
[rqd] Core affinity for cache optimization (#1171) When possible, try to book frames from the same Layer on the same core to leverage shared cache
| Commit: | 81a272a | |
|---|---|---|
| Author: | Akim Ruslanov | |
| Committer: | GitHub | |
Add layer max cores. (#1125)
| Commit: | 3893b87 | |
|---|---|---|
| Author: | Diego Tavares da Silva | |
| Committer: | GitHub | |
Improve view running procs (#1141) * Improve view running procs This changes the widget to only display info about the selected frame instead of all the running frames for the job. * pylint pass * pylint pass * Update VERSION.in Co-authored-by: Brian Cipriano <brian.cipriano@gmail.com> Co-authored-by: Brian Cipriano <brian.cipriano@gmail.com>
| Commit: | 02cb67f | |
|---|---|---|
| Author: | roulaoregan-spi | |
| Committer: | GitHub | |
Add more exit codes to Frame state waiting (#1131) * Add more exit codes to Frame state waiting When determining the frame state cuebot needs to make sure that certain exit statuses put the frame state back into waiting, this will help save time for users when a frame fails for host hardware issues. (cherry picked from commit cbeda9387b09a8713bb76d9075fdee72c3c795f1) * Add more exit codes to Frame state waiting * Removed unused method updateFrameHostDown * Removed deprecated oracle FrameDaoJdbc file * Remove log debugging from FrameCompleteHandler * Reverting, adding updateFrameHostDown FrameDao method * Verion bump, add missing interface checkRetries method Co-authored-by: Diego Tavares da Silva <dtavares@imageworks.com>
| Commit: | 5536904 | |
|---|---|---|
| Author: | roulaoregan-spi | |
| Committer: | GitHub | |
Add Proc's child PIDs to Host report stats (#1130) * Add Proc's child PIDs to Host report stats Users require additional information about the running frame.data pid. For each parent process (frame.pid) add to report.proto the child process: name, rss, vsize, state, cmdline, pid. This additional info will get stored in the Proc table, while proc is running; users can view child proc stats via Cuegui and rqlog will output the highest recorded values for rss for each child pid. * Fix Proc Pylint errors * Add more exit codes to Frame state waiting When determining the frame state cuebot needs to make sure that certain exit statuses put the frame state back into waiting, this will help save time for users when a frame fails for host hardware issues. (cherry picked from commit cbeda9387b09a8713bb76d9075fdee72c3c795f1) * Add more exit codes to Frame state waiting * Removed unused method updateFrameHostDown * Removed deprecated oracle FrameDaoJdbc file * Remove log debugging from FrameCompleteHandler * Fixes to RQD and unittests * Remove unrelated changes from FrameDao * Fix pylint errors for rqmachine.py * Remove unrelated frame changes from pycue * Removing unrelated change from DispatchSupportService * Fix merged conflicts for ProcDaoTests
| Commit: | 9e03b95 | |
|---|---|---|
| Author: | Kazuki Sakamoto | |
| Committer: | GitHub | |
Add Job.shutdownIfCompleted API method. (#1033)
| Commit: | c22fe12 | |
|---|---|---|
| Author: | Kazuki Sakamoto | |
| Committer: | GitHub | |
Add multiple GPU support #760 (#924)
| Commit: | 847ee50 | |
|---|---|---|
| Author: | Kazuki Sakamoto | |
| Committer: | GitHub | |
Add GetDefault and SetDefault to AllcationInterface (#939)
| Commit: | a77c1ff | |
|---|---|---|
| Author: | Kazuki Sakamoto | |
| Committer: | GitHub | |
Remove blackout (#946) * Remove blackout * Bump up version
| Commit: | dff882c | |
|---|---|---|
| Author: | Lars van der Bijl | |
| Committer: | GitHub | |
feat: Add timeout and LLU timeout (#761) Add support for layers to have timeout. If a frame goes past it's hard timeout it get's killed. LLU timeout is usually a lower value that check when the last log update has happend. if no update happens in the LLU window it's also killed. Closes #462
| Commit: | 3877834 | |
|---|---|---|
| Author: | George Pollard | |
| Committer: | GitHub | |
Make UID optional in frame submission (#618)
| Commit: | a481531 | |
|---|---|---|
| Author: | Lars van der Bijl | |
| Committer: | Brian Cipriano | |
Fix passing message to kill frame (#546)
| Commit: | 9e4fb1c | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Add basic limits functionality (#414) * Initial add of Limits to Layers. Allows users to specify arbitrary limits to job layers, to prevent running too many tasks. This is just the backend implementation, there will be separate commits for the front end and dispatcher updates. * Adding helper get limit names method to LayerDao, to make it easier to populate the Limit list on a returned layer object * cleanup * remove unnecessary import * initial add of limit client code * hooking up limit database queries * adding current_value to limit object * adding limits to pycue * update layer when properties change * adding current running column to LimitsWidget * Add functionality to edit limits on an existing layer * improving tests * fixing some layer tests * switch to use streams instead of loops
| Commit: | cebab82 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Fixes for Layer.getFrames (#447) * Remove unnecessary layer clean logic * Allow getFrames to set limit value
| Commit: | 14b3b43 | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
Add more MenuActions tests. (#410)
| Commit: | 0ffe7b2 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Adding unittests for group and host wrappers. (#324) NestedGroup asGroup function now returns a Group wrapper object. Correctly labeling allocation id as id in Host SetAllocation call.
| Commit: | 2e95537 | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
CueAdmin code cleanup and test coverage. (#295)
| Commit: | 7f874e0 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
getJobWhiteboard returns groups only and a list of job ids (#264) * getJobWhiteboard returns groups only and a list of job ids, instead of all nested items. In response to Issue #251.
| Commit: | 1addf71 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Fixing subgroups for monitor cue plugin in cuegui (#236) * Fixing subgroups for monitor cue plugin in cuegui
| Commit: | 9a5a114 | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
Clean up PyCue unit tests and enable them in the docker build. (#201)
| Commit: | 2489e55 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
opencue python renaming (#109) * opencue python renaming
| Commit: | dd8b4ae | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Rqd cleanup & fixes (#98) * adding attrs so rqd doesnt need to overload the message object * grpc messages should not be overloaded and use snake case * switch syslog setup to to try to use /dev/log, if not available use localhost on all OSs.
| Commit: | a280b6a | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
Move proto files to be a top-level directory. (#47)
| Commit: | cca6828 | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
Migrate RQD to only use GRPC. (#32)
| Commit: | 02f79f9 | |
|---|---|---|
| Author: | Brian Cipriano | |
| Committer: | GitHub | |
Migrate Criterion usage to GRPC. (#30)
| Commit: | daf1b38 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
grpc for spi_cue (#23) * grpc for spi-cue
| Commit: | d58f05a | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
GRPC changes for cuebot (#15) * Switch the servants to GRPC and remove the ICE servants. * Rename the top level entity objects to clear up naming conflicts with rpc objects. The naming convention is now: Action : rpc object ActionEntity : Object that inherits from Entity ActionInterface: Interface to the Entity * Updates to the Whiteboard to work with the gRPC objects. * Move methods in CueStatic into object specific classes since they are all static now. * Enums are capital by convention
| Commit: | 1b05364 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Adding proto files for grpc (#11) * Adding protos for cuebot * gRPC setup for Allocations, Subscriptions, and Tasks * Update rqd and spi_cue to use new protos * Rename top level Allocation object to AllocationEntity and AllocationInterface
| Commit: | 01677b9 | |
|---|---|---|
| Author: | Greg Denton | |
| Committer: | GitHub | |
Initial GRPC setup for cue3 (#3) This is an initial commit showing the general process of how we are adding in gRPC. - Add grpc servers to cue3bot and rqd - Add cue and rqd proto files in cue3bot/src/main/proto - Add grpc applicationContext to spring - Switch Facility to using gRPC - Update spi_cue to use gRPC and add tests * Cleaning up whitespace * remove todo question