Replication of Unencrypted data to a nested Unencrypted dataset with an encrypted parent dataset Failure after the new replication completes will fail if task is restarted or tried again see error below.
[EFAULT] Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.
Data is moved with the First attempt and any attempt after exits with the above error.
below is the failed config
midclt call replication.query '[["id", "=", 4]]' |jq
[
{
"id": 4,
"name": "data/Nintendo,data/Sony - SlowRust/TestPlex",
"direction": "PUSH",
"transport": "LOCAL",
"ssh_credentials": null,
"netcat_active_side": null,
"netcat_active_side_listen_address": null,
"netcat_active_side_port_min": null,
"netcat_active_side_port_max": null,
"netcat_passive_side_connect_address": null,
"sudo": false,
"source_datasets": [
"data/Sony",
"data/Nintendo"
],
"target_dataset": "SlowRust/TestPlex",
"recursive": true,
"exclude": [],
"properties": true,
"properties_exclude": [],
"properties_override": {},
"replicate": true,
"encryption": true,
"encryption_inherit": true,
"encryption_key": null,
"encryption_key_format": null,
"encryption_key_location": null,
"periodic_snapshot_tasks": [],
"naming_schema": [],
"also_include_naming_schema": [
"auto-%Y-%m-%d_%H-%M"
],
"name_regex": null,
"auto": false,
"schedule": null,
"restrict_schedule": null,
"only_matching_schedule": false,
"allow_from_scratch": true,
"readonly": "IGNORE",
"hold_pending_snapshots": false,
"retention_policy": "SOURCE",
"lifetime_value": null,
"lifetime_unit": null,
"lifetimes": [],
"compression": null,
"speed_limit": null,
"large_block": true,
"embed": false,
"compressed": true,
"retries": 5,
"logging_level": null,
"enabled": true,
"state": {
"state": "ERROR",
"datetime": {
"$date": 1772382150000
},
"error": "Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.",
"last_snapshot": "data/Sony@auto-2026-03-01_02-20"
},
"job": {
"id": 1901,
"message_ids": [
"00134c06-8356-47bc-b15b-d6d86f4ef923"
],
"method": "replication.run",
"arguments": [
4
],
"transient": false,
"description": null,
"abortable": false,
"logs_path": "/var/log/jobs/1901.log",
"logs_excerpt": "[2026/03/01 08:22:30] ERROR [replication_task__task_4] [zettarepl.replication.run] For task 'task_4' non-recoverable replication error ReplicationError(\"Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.\")\n",
"progress": {
"percent": 0,
"description": "",
"extra": null
},
"result": null,
"result_encoding_error": null,
"error": "[EFAULT] Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.",
"exception": "Traceback (most recent call last):\n File \"/usr/lib/python3/dist-packages/middlewared/job.py\", line 527, in run\n await self.future\n File \"/usr/lib/python3/dist-packages/middlewared/job.py\", line 572, in __run_body\n rv = await self.method(*args)\n ^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3/dist-packages/middlewared/api/base/decorator.py\", line 108, in wrapped\n result = await func(*args)\n ^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/replication.py\", line 318, in run\n await self.middleware.call(\"zettarepl.run_replication_task\", id_, really_run, job)\n File \"/usr/lib/python3/dist-packages/middlewared/main.py\", line 1053, in call\n return await self._call(\n ^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3/dist-packages/middlewared/main.py\", line 784, in _call\n return await self.run_in_executor(prepared_call.executor, methodobj, *prepared_call.args)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3/dist-packages/middlewared/main.py\", line 667, in run_in_executor\n return await loop.run_in_executor(pool, functools.partial(method, *args, **kwargs))\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3.11/concurrent/futures/thread.py\", line 58, in run\n result = self.fn(*self.args, **self.kwargs)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/zettarepl.py\", line 403, in run_replication_task\n self._run_replication_task_job(f\"task_{id_}\", job)\n File \"/usr/lib/python3/dist-packages/middlewared/plugins/zettarepl.py\", line 463, in _run_replication_task_job\n raise CallError(make_sentence(message.error))\nmiddlewared.service_exception.CallError: [EFAULT] Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.\n",
"exc_info": {
"repr": "CallError(\"Encryption requested for destination dataset 'SlowRust/TestPlex/Nintendo', but it already exists and is not encrypted.\")",
"type": "CallError",
"errno": 14,
"extra": null
},
"state": "FAILED",
"time_started": {
"$date": 1772382149000
},
"time_finished": {
"$date": 1772382150000
},
"credentials": null
},
"has_encrypted_dataset_keys": false
}
]
one that does not fail
midclt call replication.query ‘[[“id”, “=”, 3]]’ |jq
[
{
“id”: 3,
“name”: “data/Plex,data/Plex/Movies,data/Plex/TV Shows - SlowRust/TestPlex”,
“direction”: “PUSH”,
“transport”: “LOCAL”,
“ssh_credentials”: null,
“netcat_active_side”: null,
“netcat_active_side_listen_address”: null,
“netcat_active_side_port_min”: null,
“netcat_active_side_port_max”: null,
“netcat_passive_side_connect_address”: null,
“sudo”: false,
“source_datasets”: [
“data/Plex”,
“data/Plex/Movies”,
“data/Plex/TV Shows”
],
“target_dataset”: “SlowRust/TestPlex”,
“recursive”: true,
“exclude”: ,
“properties”: true,
“properties_exclude”: ,
“properties_override”: {},
“replicate”: false,
“encryption”: false,
“encryption_inherit”: null,
“encryption_key”: null,
“encryption_key_format”: null,
“encryption_key_location”: null,
“periodic_snapshot_tasks”: ,
“naming_schema”: ,
“also_include_naming_schema”: [
“auto-%Y-%m-%d_%H-%M”
],
“name_regex”: null,
“auto”: false,
“schedule”: null,
“restrict_schedule”: null,
“only_matching_schedule”: false,
“allow_from_scratch”: true,
“readonly”: “IGNORE”,
“hold_pending_snapshots”: false,
“retention_policy”: “SOURCE”,
“lifetime_value”: null,
“lifetime_unit”: null,
“lifetimes”: ,
“compression”: null,
“speed_limit”: null,
“large_block”: true,
“embed”: false,
“compressed”: true,
“retries”: 5,
“logging_level”: null,
“enabled”: true,
“state”: {
“state”: “FINISHED”,
“datetime”: {
“$date”: 1772557966000
},
“warnings”: ,
“last_snapshot”: “data/Plex/TV Shows@auto-2026-02-27_22-53”
},
“job”: {
“id”: 7894,
“message_ids”: [
“78cb0436-763b-4b0b-a644-429adbca6ceb”
],
“method”: “replication.run”,
“arguments”: [
3
],
“transient”: false,
“description”: null,
“abortable”: false,
“logs_path”: “/var/log/jobs/7894.log”,
“logs_excerpt”: “[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.retention.calculate] Not destroying ‘auto-2026-03-01_02-20’ as it is the only snapshot left for naming schema ‘auto-%Y-%m-%d_%H-%M’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.replication.pre_retention] Pre-retention destroying snapshots: \n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.replication.run] No snapshots to send for replication task ‘task_3’ on dataset ‘data/Plex’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.replication.run] No snapshots to send for replication task ‘task_3’ on dataset ‘data/Plex/Movies’\n[2026/03/03 09:12:45] INFO [replication_task__task_3] [zettarepl.replication.run] No snapshots to send for replication task ‘task_3’ on dataset ‘data/Plex/TV Shows’\n[2026/03/03 09:12:46] INFO [replication_task__task_3] [zettarepl.replication.pre_retention] Pre-retention destroying snapshots: \n[2026/03/03 09:12:46] INFO [replication_task__task_3] [zettarepl.replication.run] No snapshots to send for replication task ‘task_3’ on dataset ‘data/Plex/Movies’\n[2026/03/03 09:12:46] INFO [replication_task__task_3] [zettarepl.replication.pre_retention] Pre-retention destroying snapshots: \n[2026/03/03 09:12:46] INFO [replication_task__task_3] [zettarepl.replication.run] No snapshots to send for replication task ‘task_3’ on dataset ‘data/Plex/TV Shows’\n”,
“progress”: {
“percent”: 100,
“description”: “”,
“extra”: null
},
“result”: null,
“result_encoding_error”: null,
“error”: null,
“exception”: null,
“exc_info”: null,
“state”: “SUCCESS”,
“time_started”: {
“$date”: 1772557965000
},
“time_finished”: {
“$date”: 1772557966000
},
“credentials”: {
“type”: “LOGIN_PASSWORD”,
“data”: {
“username”: “root”,
“login_id”: “1c2960b2-64ad-4e4f-b2c3-9fae52431978”,
“login_at”: {
“$date”: 1772557794000
}
}
}
},
“has_encrypted_dataset_keys”: false
}
]
The Thing i noticed is the new task 4 is missing credentials and there is no ui elemant allowing that to be entered. how do i fix this?