Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions content/product/cluster_configuration/backup_system/veeam.md
Original file line number Diff line number Diff line change
Expand Up @@ -279,13 +279,17 @@ Successful restores and restores cancelled from Veeam complete the cleanup lifec

However, if a restore fails, Veeam reports the error and the incomplete OpenNebula Image remains in `LOCKED` state. In that case, remove the incomplete Image manually from OpenNebula:

{{< alert title="Important" type="info" >}}
Get the restore transfer port from the Image `PATH` attribute, which has the form `onebex://<IMAGE_DS_ID>:<PORT_ID>`, and terminate the writer process associated with that port:
{{< alert title="Note" type="info" >}}
Get the restore transfer port from the Image `PATH` attribute, which has the form `onebex://<IMAGE_DS_ID>:<PORT_ID>`. Send the `FINISH` frame (`0x01`) to the writer listening on that port. This stops the writer gracefully and allows OpenNebula to complete the transfer cleanup. Use a Front-end address that is reachable from the system where you run the command. If you run it directly on the Front-end, you can use `127.0.0.1`. The restore transfer port must be allowed by any intervening firewall:

```shell
PORT=<PORT_ID>
pgrep -f "onebex_writer.rb .* ${PORT} " | xargs -r kill -TERM
oneimage delete --force <IMAGE_ID>
python3 -c 'import socket, sys; s = socket.create_connection((sys.argv[1], int(sys.argv[2]))); s.sendall(b"\x01"); s.close()' <FRONTEND_ADDRESS> <PORT_ID>
```

After the writer finishes, delete the incomplete Image:

```shell
oneimage delete <IMAGE_ID>
```

{{< /alert >}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,15 +138,28 @@ onebex://<IMAGE_DS_ID>:<PORT_ID>

`IMAGE_DS_ID` is the destination Image Datastore ID where the restored disk image will be created. `PORT_ID` is the restore transfer port allocated for the interactive restore session.

The writer accepts one frame per TCP connection. Each frame starts with a one-byte type:

| Type | Name | Payload |
|------|------|---------|
| `0x00` | `DATA` | Three unsigned 64-bit big-endian integers containing the start byte, payload size, and total image size, followed by the image data. |
| `0x01` | `FINISH` | No payload. Stops the writer and lets OpenNebula finalize the restore transfer. |

After sending all the image data, the integration must open one final connection to the restore transfer port and send the `FINISH` frame. The integration must also send this frame when a restore is cancelled or fails. Do not send more data after the `FINISH` frame.

If a restore fails, the restored Image remains in `LOCKED` state and should be removed manually:

{{< alert title="Important" type="info" >}}
Get the restore transfer port from the Image `PATH` attribute, which has the form `onebex://<IMAGE_DS_ID>:<PORT_ID>`, and terminate the writer process associated with that port:
{{< alert title="Note" type="info" >}}
Get the restore transfer port from the Image `PATH` attribute and send the `FINISH` frame to the writer. This stops the writer gracefully and allows OpenNebula to complete the transfer cleanup. Use a Front-end address that is reachable from the system where you run the command. If you run it directly on the Front-end, you can use `127.0.0.1`. The restore transfer port must be allowed by any intervening firewall:

```shell
python3 -c 'import socket, sys; s = socket.create_connection((sys.argv[1], int(sys.argv[2]))); s.sendall(b"\x01"); s.close()' <FRONTEND_ADDRESS> <PORT_ID>
```

After the writer finishes, delete the incomplete Image:

```shell
PORT=<PORT_ID>
pgrep -f "onebex_writer.rb .* ${PORT} " | xargs -r kill -TERM
oneimage delete --force <IMAGE_ID>
oneimage delete <IMAGE_ID>
```
{{< /alert >}}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Additionally, the following functionalities are present that were not in OpenNeb

- Log HA hearbeat and replication messages at log level 5
- Option to configure network lease policy for internal Address Ranges. The policy can be set globally in [oned.conf]({{% relref "oned#virtual-networks" %}}) or [overridden for each Virtual Network]({{% relref "manage_vnets#lease-allocation-policy" %}}).
- Added a dedicated [FINISH frame to gracefully finalize interactive restore transfers]({{% relref "product/integration_references/infrastructure_drivers_development/interactive_backup.md#restoring-interactive-backups" %}}), eliminating the need to manually terminate the OneBEX writer process

## Other Issues Solved

Expand Down
Loading