filesink: Implement workaround for some (network) filesystems that spuriously return...
authorSebastian Dröge <sebastian@centricular.com>
Mon, 6 May 2019 19:17:50 +0000 (22:17 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 16 May 2019 11:15:02 +0000 (14:15 +0300)
commiteec9bd8db3ee5a8391dffae362c210f600655282
treea34b9412acb78ed172a2054f0e8b8a7c1109b96d
parent162c59b4a48a28f806b1415f04ef2f57ac9d9c44
filesink: Implement workaround for some (network) filesystems that spuriously return EACCES on write

This seems to happen when another client is accessing the file at the
same time, and retrying after a short amount of time solves it.

Sometimes partial data is written at that point already but we have no
idea how much it is, or if what was written is correct (it sometimes
isn't) so we always first seek back to the current position and repeat
the whole failed write.

It happens at least on Linux and macOS on SMB/CIFS and NFS file systems.

Between write attempts that failed with EACCES we wait 10ms, and after
enough consecutive tries that failed with EACCES we simply time out.

In theory a valid EACCES for files to which we simply have no access
should've happened already during the call to open(), except for NFS
(see open(2)).

This can be enabled with the new max-transient-error-timeout property, and
a new o-sync boolean property was added to open the file in O_SYNC mode
as without that it's not guaranteed that we get EACCES for the actual
writev() call that failed but might only get it at a later time.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/issues/305
plugins/elements/gstelements_private.c
plugins/elements/gstelements_private.h
plugins/elements/gstfdsink.c
plugins/elements/gstfilesink.c
plugins/elements/gstfilesink.h