Bisync with webdav fails on changed files with "corrupted on transfer"

What is the problem you are having with rclone?

I want to mirror a WebDAV directory to a local folder using bisync
2025/04/18 10:30:51 ERROR : Bisync critical error: corrupted on transfer: sizes differ src(Local file system at /home/XXXX/rsync/ionosmirror) 24 vs dst(webdav root 'mirror') 28
2025/04/18 10:30:51 ERROR : Bisync aborted. Must run --resync to recover.

Run the command 'rclone version' and share the full output of the command

rclone v1.69.1

  • os/version: ubuntu 24.04 (64 bit)
  • os/kernel: 6.11.0-112021-tuxedo (x86_64)
  • os/type: linux
  • os/arch: amd64
  • go/version: go1.24.0
  • go/linking: static
  • go/tags: none

Which cloud storage system are you using? (eg Google Drive)

ionos hidrive

The command you were trying to run (eg rclone copy /tmp remote:tmp)

Steps

  1. At first, I use resync and as WebDAV doesn't support change time, I use size-only:
rclone bisync ionos:mirror ~/rsync/ionosmirror --resync --size-only --log-level INFO

Log shows success:

2025/04/18 10:37:23 INFO  : Validating listings for Path1 "ionos:mirror/" vs Path2 "/home/XXXX/rsync/ionosmirror/"
2025/04/18 10:37:23 INFO  : Bisync successful
  1. After that, I leave out the resync
rclone bisync ionos:mirror ~/rsync/ionosmirror --resync --size-only --log-level INFO
  1. Adding and removing files works: Adding and removing files on both sides works, i.e. files are deleted and created as expected.

  2. Changing files (I used a small text file):

    • changing a file on the remote, and running the above command works, i.e. files are changed in local folder .
    • changing a file on the local folder, and running the above command gives the error posted below

Please run 'rclone config redacted' and share the full output. If you get command not found, please make sure to update rclone

[ionos]
type = webdav
url = https://webdav.hidrive.ionos.com/users/XXX
vendor = other
user = XXX@xx.de
pass = XXXX

A log from the command that you were trying to run with the -vv flag

~
❯ rclone bisync ionos:mirror ~/rsync/ionosmirror -vv --size-only
2025/04/18 10:48:13 DEBUG : rclone: Version "v1.69.1" starting with parameters ["rclone" "bisync" "ionos:mirror" "/home/konrad/rsync/ionosmirror" "-vv" "--size-only"]
2025/04/18 10:48:13 DEBUG : Creating backend with remote "ionos:mirror"
2025/04/18 10:48:13 DEBUG : Using config file from "/home/konrad/.config/rclone/rclone.conf"
2025/04/18 10:48:13 DEBUG : found headers:
2025/04/18 10:48:13 DEBUG : Creating backend with remote "/home/konrad/rsync/ionosmirror"
2025/04/18 10:48:13 NOTICE: bisync is IN BETA. Don't use in production!
2025/04/18 10:48:13 INFO  : Setting --ignore-listing-checksum as neither --checksum nor --compare checksum are set.
2025/04/18 10:48:13 INFO  : Bisyncing with Comparison Settings:
{
        "Modtime": false,
        "Size": true,
        "Checksum": false,
        "HashType1": 0,
        "HashType2": 0,
        "NoSlowHash": false,
        "SlowHashSyncOnly": false,
        "SlowHashDetected": true,
        "DownloadHash": false
}
2025/04/18 10:48:13 DEBUG : Lock file created: /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.lck
2025/04/18 10:48:13 INFO  : Synching Path1 "ionos:mirror/" with Path2 "/home/konrad/rsync/ionosmirror/"
2025/04/18 10:48:13 DEBUG : : updated backup-dir for Path1
2025/04/18 10:48:13 DEBUG : : updated backup-dir for Path2
2025/04/18 10:48:13 INFO  : Building Path1 and Path2 listings
2025/04/18 10:48:13 DEBUG : &{0xc000a5c500 0xc000bd61e0 false false false /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror /home/konrad/.cache/rclone/bisync /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path1.lst /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path2.lst /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path1.lst-new /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path2.lst-new map[] 0xc000a5fb00 {{}} {{}} false false <nil> <nil>  /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.lck map[] false}: starting to march!
2025/04/18 10:48:13 DEBUG : wurst: both path1 and path2
2025/04/18 10:48:13 DEBUG : wurst: is Object
2025/04/18 10:48:13 DEBUG : wurst_1: both path1 and path2
2025/04/18 10:48:13 DEBUG : wurst_1: is Object
2025/04/18 10:48:13 DEBUG : wurst_1_1_1: both path1 and path2
2025/04/18 10:48:13 DEBUG : wurst_1_1_1: is Object
2025/04/18 10:48:13 DEBUG : &{0xc000a5c500 0xc000bd61e0 false false false /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror /home/konrad/.cache/rclone/bisync /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path1.lst /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path2.lst /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path1.lst-new /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.path2.lst-new map[] 0xc000a5fb00 {{}} {{}} false false <nil> <nil>  /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.lck map[] false}: march completed. err: <nil>
2025/04/18 10:48:13 INFO  : Path1 checking for diffs
2025/04/18 10:48:13 INFO  : Path2 checking for diffs
2025/04/18 10:48:13 DEBUG : wurst_1: (old: 6 current: 10)
2025/04/18 10:48:13 INFO  : - Path2    File changed: size (larger) - wurst_1
2025/04/18 10:48:13 INFO  : Path2:    1 changes:    0 new,    1 modified,    0 deleted
2025/04/18 10:48:13 INFO  : (Modified:    1 larger,    0 smaller)
2025/04/18 10:48:13 INFO  : Applying changes
2025/04/18 10:48:13 INFO  : - Path2    Queue copy to Path1       - ionos:mirror/wurst_1
2025/04/18 10:48:13 INFO  : - Path2    Do queued copies to                - Path1
2025/04/18 10:48:13 DEBUG : : updated backup-dir for Path1
2025/04/18 10:48:13 DEBUG : wurst: Excluded (FilesFrom Filter)
2025/04/18 10:48:13 DEBUG : wurst: Excluded
2025/04/18 10:48:13 DEBUG : wurst_1_1_1: Excluded (FilesFrom Filter)
2025/04/18 10:48:13 DEBUG : wurst_1_1_1: Excluded
2025/04/18 10:48:13 DEBUG : wurst_1: Sizes differ (src 10 vs dst 6)
2025/04/18 10:48:13 DEBUG : webdav root 'mirror': Waiting for checks to finish
2025/04/18 10:48:13 DEBUG : writing result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 10,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 42,
        "Err": null,
        "Winner": {
                "Obj": {},
                "Side": "src",
                "Err": null
        },
        "IsWinner": true,
        "IsSrc": true,
        "IsDst": false,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : writing result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 6,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 42,
        "Err": null,
        "Winner": {
                "Obj": {},
                "Side": "src",
                "Err": null
        },
        "IsWinner": false,
        "IsSrc": false,
        "IsDst": true,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : webdav root 'mirror': Waiting for transfers to finish
2025/04/18 10:48:13 DEBUG : wurst_1: Update will use the normal upload strategy (no chunks)
2025/04/18 10:48:13 ERROR : wurst_1: corrupted on transfer: sizes differ src(Local file system at /home/konrad/rsync/ionosmirror) 10 vs dst(webdav root 'mirror') 6
2025/04/18 10:48:13 INFO  : wurst_1: Removing failed copy
2025/04/18 10:48:13 DEBUG : writing result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 10,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 33,
        "Err": {},
        "Winner": {
                "Obj": {},
                "Side": "dst",
                "Err": null
        },
        "IsWinner": false,
        "IsSrc": true,
        "IsDst": false,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : writing result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 6,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 33,
        "Err": {},
        "Winner": {
                "Obj": {},
                "Side": "dst",
                "Err": null
        },
        "IsWinner": true,
        "IsSrc": false,
        "IsDst": true,
        "Origin": "sync"
}
2025/04/18 10:48:13 ERROR : webdav root 'mirror': not deleting files as there were IO errors
2025/04/18 10:48:13 ERROR : webdav root 'mirror': not deleting directories as there were IO errors
2025/04/18 10:48:13 DEBUG : failed to marshal input: json: unsupported type: operations.LoggerFn
2025/04/18 10:48:13 DEBUG : logger:

2025/04/18 10:48:13 DEBUG : result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 10,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 42,
        "Err": null,
        "Winner": {
                "Obj": null,
                "Side": "src",
                "Err": null
        },
        "IsWinner": true,
        "IsSrc": true,
        "IsDst": false,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 6,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 42,
        "Err": null,
        "Winner": {
                "Obj": null,
                "Side": "src",
                "Err": null
        },
        "IsWinner": false,
        "IsSrc": false,
        "IsDst": true,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 10,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 33,
        "Err": null,
        "Winner": {
                "Obj": null,
                "Side": "dst",
                "Err": null
        },
        "IsWinner": false,
        "IsSrc": true,
        "IsDst": false,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : result:
{
        "Src": "/home/konrad/rsync/ionosmirror/",
        "Dst": "ionos:mirror/",
        "Name": "wurst_1",
        "AltName": "",
        "Size": 6,
        "Modtime": "0001-01-01T00:00:00Z",
        "Hash": "",
        "Flags": "-",
        "Sigil": 33,
        "Err": null,
        "Winner": {
                "Obj": null,
                "Side": "dst",
                "Err": null
        },
        "IsWinner": true,
        "IsSrc": false,
        "IsDst": true,
        "Origin": "sync"
}
2025/04/18 10:48:13 DEBUG : Got 4 results for copy2to1
2025/04/18 10:48:13 DEBUG : -       10   0001-01-01 00:00:00 +0000 UTC "wurst_1"
2025/04/18 10:48:13 DEBUG : -        6   0001-01-01 00:00:00 +0000 UTC "wurst_1"
2025/04/18 10:48:13 DEBUG : -       10   0001-01-01 00:00:00 +0000 UTC "wurst_1"
2025/04/18 10:48:13 DEBUG : -        6   0001-01-01 00:00:00 +0000 UTC "wurst_1"
2025/04/18 10:48:13 DEBUG : Lock file removed: /home/konrad/.cache/rclone/bisync/ionos_mirror..home_konrad_rsync_ionosmirror.lck
2025/04/18 10:48:13 ERROR : Bisync critical error: corrupted on transfer: sizes differ src(Local file system at /home/konrad/rsync/ionosmirror) 10 vs dst(webdav root 'mirror') 6
2025/04/18 10:48:13 ERROR : Bisync aborted. Must run --resync to recover.
2025/04/18 10:48:13 INFO  :
Transferred:             10 B / 10 B, 100%, 0 B/s, ETA -
Errors:                 2 (fatal error encountered)
Checks:                 7 / 7, 100%
Elapsed time:         0.1s

2025/04/18 10:48:13 DEBUG : 8 go routines active
2025/04/18 10:48:13 NOTICE: Failed to bisync with 2 errors: last error was: bisync aborted

trying to run bisync with WebDAV has been nothing but trouble. The "corrupted on transfer" errors pop up constantly, even though the files are fine and transfer correctly when done manually. It’s incredibly frustrating, especially since the whole point of using bisync is to have reliable two-way sync without needing to babysit it.

I’ve tried using different flags, checking the remote integrity, even switching WebDAV providers, but the problem persists. At this point, bisync with WebDAV feels way too unstable to use in any real-world scenario. Really hoping this gets some attention soon — it's a major blocker for what could be a great feature.

Can you say more about this? For example, the following error:

corrupted on transfer: sizes differ src(Local file system at /home/konrad/rsync/ionosmirror) 10 vs dst(webdav root 'mirror') 6

indicates that rclone has attempted to copy a local file with a size of 10 to webdav, but after the transfer, the file on the webdav side is still reporting a size of 6. Since rclone was expecting 10, it thinks something went wrong with the copy, and aborts.

When you say "even though the files are fine", are you saying that the file on the webdav side actually does have the expected size of 10 in this scenario, and is getting incorrectly reported as 6?

Also, when you say they "transfer correctly when done manually", do you mean like via rclone copyto? Or some other means outside of rclone?