Troubleshooting RVC jobs
Use this page to find out why an SC//Reliantâ„¢ Virtual Controller (RVC) job created with POST api/v2/jobs/rvc did not do what you expected, and to avoid the most common problems. An RVC job can fail at three different points, and each one reports the problem in a different place.
| Where it fails | How you see it | Where to look |
|---|---|---|
| The request is rejected | The POST returns an HTTP error, such as 400, and no job is created. | The message field in the response body. |
| The method fails on a node | The job finishes, failed_nodes_count is greater than 0, and the node has an error object in the payload. | The payload, retrieved with GET api/jobs/<job_id>?include_payload=true. |
| A background operation fails after the method returns | The job finishes successfully, but the operation never completes. For example, a backup file is never created. | The RVC log on the node, or the progress messages sent to a notify_uri. |
Read the job result
Creating a job only schedules it. Retrieve the job with its payload to see what happened on each node.
ruby api.rb <customer_code> GET "api/jobs/<job_id>?include_payload=true"
Check the following fields in the response:
status:pendingwhile the job runs andfinishedwhen every target node has replied. A finished job is not necessarily a successful one.success_nodes_count,failed_nodes_count, andtotal_nodes_count: how many target nodes succeeded and failed.payload: one entry per node hostname. Each entry contains either aresultor anerror.
The following example shows a job that ran on a node group with two nodes, both of which failed for different reasons.
{
"id": 1781943,
"type": "RVC3",
"status": "finished",
"message": null,
"trigged_by": "test.user",
"success_nodes_count": 0,
"failed_nodes_count": 2,
"total_nodes_count": 2,
"parameters": {
"method": "cluster.maintenance_mode?",
"params": {},
"hostnames": [],
"update_rpm": true,
"node_group_id": 2392
},
"time_started": "2026-10-11T20:39:56Z",
"time_finished": "2026-10-11T20:40:06Z",
"payload": {
"sit0001red0": [
{
"error": {
"code": 1,
"data": "This is an RVC agent error. The call did not reach the RVC server.",
"message": "Error connecting to RVC server."
},
"timestamp": 1791751207
}
],
"sit0001red1": [
{
"error": {
"message": "Node sit0001red1 not discovered by RJE broker"
},
"timestamp": 1791751207
}
]
}
}
Request errors
These errors are returned when the job is created. No job is created and nothing runs on any node.
| HTTP code | Message | Cause and fix |
|---|---|---|
400 | RVC does not have the method <module>.<method> | The module is not available through the Jobs v2 API. Only the cluster, docker, kvm, rvc, shell, and sys modules are accepted. Other modules, such as puppet, are rejected. |
400 | Saved Filter name <name> does not exist | The value of saved_filter_name does not match a saved filter. Names must match exactly. Names containing spaces and apostrophes are supported. |
404 | Not Found | The endpoint path is wrong. Check the path and the HTTP method. |
The API does not check the method name itself when the job is created. A misspelled method in an allowed module, such as sys.bogus, creates a job that then fails on each node with -32601.
Node errors
These errors appear in the error object for a node in the job payload. Errors with a negative code are returned by the RVC server on the node. Errors without a code, or with code 1, are returned before the call reaches the RVC server.
| Code | Message | Cause and fix |
|---|---|---|
| None | Node <hostname> not discovered by RJE broker | RJE has no connection to a node by that name. Check its keepalive check with GET api/nodes/<hostname>/checks?filter_by_name=keepalive. The other nodes in the job are not affected.
|
1 | Error connecting to RVC server. with data set to This is an RVC agent error. The call did not reach the RVC server. | The node is reachable, but the RVC agent on the node cannot reach the RVC server. Check that the RVC server is running on the node. A node in this state also reports Error connecting to RVC server. in the service_checks of GET api/nodes/<hostname>. |
-32601 | Method not found: <module>.<method>. | The RVC version on the node does not have this method, or the name is misspelled. Run rvc.api on the node to list the methods and parameters it supports. |
-32602 | '<method>' method expects 1 parameter, but none was passed. | A required method parameter is missing from params. Run rvc.api to see the parameters the method expects. |
-32083 | <name> already running | The virtual machine is already running. kvm.restore starts the virtual machine when it finishes, so you do not need to start it afterward. |
-32085 | Virtual Machine <name> is busy running the <operation> operation. | Another operation on the virtual machine has not finished. A virtual machine can report running before a start operation has finished. Wait until rvc.busy returns an empty list, then try again. |
-32086 | Virtual Machine <name> not found on host. | The hostname in params is not a virtual machine on that node. Run kvm.list to see the virtual machines on the node. In a node group, the virtual machine might only exist on some of the nodes. |
-32071 | Backup file <path> does not exist. | kvm.full_backup_info was given a path that does not exist. Use the full path to the archive. If you just started a backup with kvm.full_backup, it might still be running. |
-32063 | This operation can only be performed by the cluster passive node. | The method, such as kvm.snapshot_redefine, only runs on the passive cluster node. Target the passive node instead. |
Methods that run in the background
Some methods start a long-running operation and return immediately. Their job finishes with a success status and a short message, such as Creating snapshot for kvm1... or Starting full backup for kvm1, while the operation continues on the node. A successful job for one of these methods only means that the operation was started. If the operation fails later, the job result does not change.
Methods that accept a notify_uri parameter can run in the background. In testing, the following methods returned before their operation completed:
kvm.snapshotkvm.full_backupdocker.pullkvm.startandkvm.shutdownkvm.snapshot_restorekvm.restore
To confirm that a background operation completed, use one of the following approaches:
- Check the result with a read-only method. For example, run
kvm.snapshot_listafterkvm.snapshot,kvm.statusafterkvm.startorkvm.shutdown, anddocker.imagesafterdocker.pull. Allow time for the operation to finish before you check. - Receive progress messages. Pass a
notify_urithat you control, or subscribe to the module and topic withrvc.subscribe. RVC sends progress messages to the URI, including a final message with the exit code of the operation. - Wait until the virtual machine is no longer busy. Run
rvc.busyuntil the virtual machine no longer appears in the result. An empty list means no tracked operation is running on the node.rvc.busytracks the operations started bykvm.start,kvm.full_backup,kvm.restore,kvm.snapshot, andkvm.snapshot_restore, but notkvm.shutdownordocker.pull, so check those with a read-only method instead. For an example of the result, see RVC module examples. - Read the RVC log on the node. See the next section.
Find the cause in the RVC log on a node
The RVC server on each node writes every request, response, progress message, and error to the system journal. If you have shell access to the node, this is the most direct way to find out why an operation failed.
Search the journal for the time the job ran. Journal times are in the node's local time zone, while job timestamps are in UTC.
sudo journalctl --since "<start_time>" --until "<end_time>" --no-pager | grep -iE "rvc|<vm_name>"
The following entries are the most useful:
| Log entry | Meaning |
|---|---|
jsonrpc.server: <-- {...} | The JSON-RPC request the node received, including the exact params. |
jsonrpc.server: --> {...} | The response returned to the job. |
rvc.messenger: [<module>.<topic>]: ... | Progress messages from a background operation. |
ERROR rvc.messenger: ... Aborting ... | A background operation failed. The message gives the reason. |
Final message sent to topic ... with exit code <n> | A background operation ended. An exit code of 0 means it succeeded. |
For example, the following entries show a full backup that was accepted but then failed because filename was given as a full path:
INFO rvc.messenger: [kvm.kvm1]: Creating /mnt/kvm_backups/mnt/kvm_backups/kvm1.tar.gz file...
ERROR rvc.messenger: [kvm.kvm1]: Aborting full backup. Reason: Error creating full backup file: tar (child): /mnt/kvm_backups/mnt/kvm_backups/kvm1.tar.gz: Cannot open: No such file or directory
INFO rvc.messenger: Final message sent to topic 'kvm1' on module 'kvm' with exit code 1.
Check a node with the RVC module
The following read-only methods help you check a node before or after a job. Run them as RVC jobs like any other method.
| Method | Use it to |
|---|---|
rvc.version | Check the RVC version on the node. Some methods and fields are only available in later versions. |
rvc.api | List every method the node supports, with the name, type, and default value of each parameter. Use this to confirm a method exists and to check its parameter names before you create a job. |
rvc.diagnostics | Check that the tools each module depends on are installed. Pass {"module":"kvm"} in params to check a single module. A module whose tools are missing reports a failure status. |
rvc.busy | List the long-running operations that are still in progress on the node. |
rvc.external_connectivity_check | Check whether the node can reach an external HTTP server. Pass the URL in params as {"uri":"<url>"}. |
Avoid common problems
- Test on one node first. Run a new method against a single hostname and check the payload before you target a node group or saved filter.
- Check the method with
rvc.api. Method names and parameters can differ between RVC versions. For example,kvm.destroyandkvm.resetare not available in RVC 3.13.0. - Use the method names from
rvc.api. RVC accepts hyphens in place of underscores, sokvm.snapshot-listandkvm.snapshot_listboth work, but the names returned byrvc.apiuse underscores. - Do not treat a finished job as a finished operation. For methods that run in the background, confirm the result separately. See Methods that run in the background.
- Give
kvm.full_backupa file name, not a path. The archive is written to the directory in thetargetparameter, or to thefull_backupdirectory in the RVC configuration file iftargetis not set. A full path infilenameis accepted, but the backup fails. In contrast,kvm.full_backup_infoneeds the full path to the archive. - Plan for downtime during a full backup.
kvm.full_backupshuts the virtual machine down while it copies the disk, and starts it again before it creates the archive. This happens even if the backup later fails. - Check maintenance mode after restoring a snapshot. In RVC 3.13.0,
kvm.snapshot_restoreputs the cluster in maintenance mode and does not take it out of maintenance mode when it finishes. While the cluster is in maintenance mode, no cluster resources fail over. After the restore, runcluster.maintenance_mode?and, if it returnstrue, runcluster.disable_maintenance_mode. Other methods, such askvm.start,kvm.shutdown, andkvm.restore, take the cluster out of maintenance mode when they finish. - Wait for one operation to finish before starting the next. Operations on the same virtual machine cannot overlap and fail with
-32085. Wait untilrvc.busyreturns an empty list. - Do not use
kvm.full_backup_infoto check whether a backup has finished. It reads only the first members of the archive, and the disk is the last member, so it can succeed while the disk is still being written. Wait for the final progress message with exit code0, or confirm in the RVC log on the node, before you restore from or copy a new archive. - Be careful with
optimize. Settingoptimizetotrueinkvm.full_backupremoves all snapshots of the virtual machine. - Consolidating snapshots needs at least two snapshots.
kvm.snapshot_consolidatemerges the oldest snapshots into the latest one. With a single snapshot, it returnsNothing to consolidate. - Expect offline nodes in large targets. A node group or saved filter can include nodes that are offline. They fail with
not discovered by RJE brokerwithout affecting the other nodes. Checkfailed_nodes_countand the payload for each node. - Quote URLs on the command line. When you retrieve a job with
ruby api.rb, put the path in double quotes, for example"api/jobs/<job_id>?include_payload=true". Some shells, such as zsh, otherwise treat the?as a wildcard.