Files
XC_VM/tests/Support/cluster_commands.json
T
obscuremind bc72e36561 feat(cluster): send cache removals as node.purge, which signs without a licence
A MAIN whose licence lapsed queued no cache job for a node in mode 2, so
the files of movies deleted meanwhile and the connection files of viewers
MAIN closed stayed on it. xcvm_core's registry now has node.purge, a
restrictive type whose every job removes something.

ClusterRoute::cache sends the removals (CacheJobs::PURGES) first as
node.purge and the rest as node.cache; an extension from before the type
refuses it (RECORD:type) and the removals go as node.cache, as before.
cluster:exec runs node.purge with the removal jobs only, and it lives a
day like node.cache. The registry fixture and its digest follow the
extension's.
2026-09-29 15:22:43 +00:00

154 lines
2.3 KiB
JSON

{
"version": 1,
"tag": "cmd",
"envelope": [
"v",
"type",
"exp",
"iat",
"cmd_id",
"seq",
"node_uuid",
"gen",
"dedupe_key",
"args"
],
"action_key": "action",
"max_ttl_sec": 86400,
"types": {
"conn.drop": {
"class": "R",
"args": [
"uuid",
"uuids",
"reason"
]
},
"conn.drop_line": {
"class": "R",
"args": [
"line_id",
"reason"
]
},
"conn.kill_worker": {
"class": "R",
"args": [
"pid",
"uuid",
"rtmp"
]
},
"conn.close": {
"class": "R",
"args": [
"uuid",
"remove"
]
},
"stream.stop": {
"class": "R",
"args": [
"stream_id"
]
},
"vod.stop": {
"class": "R",
"args": [
"stream_id"
]
},
"token.rotate_now": {
"class": "R",
"args": []
},
"node.quarantine": {
"class": "R",
"args": [
"reason"
]
},
"node.fence": {
"class": "R",
"args": [
"reason",
"drain_min"
]
},
"resync": {
"class": "R",
"args": [
"sections"
]
},
"config.changed": {
"class": "R",
"args": [
"sections",
"etag"
]
},
"node.purge": {
"class": "R",
"args": [
"jobs"
],
"job_types": [
"delete_con",
"drop_con",
"delete_vod",
"delete_vods"
],
"job_keys": [
"type",
"id",
"uuid"
]
},
"conn.overlay": {
"class": "G"
},
"stream.start": {
"class": "G"
},
"stream.assign": {
"class": "G"
},
"vod.start": {
"class": "G"
},
"recording.start": {
"class": "G"
},
"queue.poke": {
"class": "G"
},
"node.rpc": {
"class": "G",
"action": true
},
"node.root": {
"class": "G",
"action": true,
"restrictive_actions": {
"fence": [
"reason",
"drain_min"
]
}
},
"node.cache": {
"class": "G"
},
"node.unfence": {
"class": "G"
},
"policy.update": {
"class": "G"
},
"artefact.fetch": {
"class": "G"
}
}
}