Version
tokio v1.14.0
tokio-macros v1.6.0 (proc-macro)
Platform
Linux 4.15.0-163-generic #171~16.04.1-Ubuntu SMP Wed Nov 10 11:19:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Description
While using write_all to write data to file I noticed that in some rare cases it does not write anything to the file despite the awaiting on corresponding future.
To reproduce the issue I've got the code from the write_all documentation:
use tokio::io::{self, AsyncWriteExt};
use tokio::fs::File;
#[tokio::main]
async fn main() -> io::Result<()> {
let mut file = File::create("foo.txt").await?;
file.write_all(b"some bytes").await?;
//file.flush().await?;
Ok(())
}
This code should create foo.txt file in the current directory. To test the binary executable I created following bash script which calls test binary in a loop a checks if non-zero length foo.txt was created:
i=0
ctrl_c() {
echo
echo "Ctrl-c captured on iteration $i"
exit 0
}
trap 'ctrl_c' SIGINT
while true; do
((++i))
target/debug/walltest
if ! [ -s foo.txt ]; then
echo "failure occurred on iteration $i"
exit 1
fi
rm foo.txt
done
I expected to see this happen:
bash script must run infinitely until Ctrl-C is pressed
Instead, this happened:
the script stops in less than a second reporting that zero-length foo.txt was created. Number of successful iteration varies from less than 10 to few hundreds.
Additional information:
- If I uncomment the
file.flush call then file is always written as expected.
- Identical code executed under
async-std runtime works as expected without file.flush.
Version
tokio v1.14.0
tokio-macros v1.6.0 (proc-macro)
Platform
Linux 4.15.0-163-generic #171~16.04.1-Ubuntu SMP Wed Nov 10 11:19:51 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Description
While using write_all to write data to file I noticed that in some rare cases it does not write anything to the file despite the
awaiting on corresponding future.To reproduce the issue I've got the code from the write_all documentation:
This code should create
foo.txtfile in the current directory. To test the binary executable I created following bash script which calls test binary in a loop a checks if non-zero lengthfoo.txtwas created:I expected to see this happen:
bash script must run infinitely until Ctrl-C is pressed
Instead, this happened:
the script stops in less than a second reporting that zero-length
foo.txtwas created. Number of successful iteration varies from less than 10 to few hundreds.Additional information:
file.flushcall then file is always written as expected.async-stdruntime works as expected withoutfile.flush.