From: "jeremyevans0 (Jeremy Evans)" Date: 2022-04-04T00:38:32+00:00 Subject: [ruby-core:108165] [Ruby master Bug#18676] Misleading Documentation/Bug: Incorrect File.position on a file opened with "a" mode Issue #18676 has been updated by jeremyevans0 (Jeremy Evans). Status changed from Open to Rejected apatniv (Vivek Ak) wrote: > Examining the offset in /proc filesytem > ``` shell > ->cat /proc/22675/fdinfo/7 > pos: 0 > flags: 02102001 > mnt_id: 30 > > ``` If the kernel is stating the file position is `0`, it doesn't seem like a bug that Ruby is also stating the position is `0`. For files opened in append mode, the kernel doesn't update the position until a write occurs. This makes sense, as for every write, the kernel must reposition to the end of the file, so that writes to files opened in append mode always append, even when there are concurrent writes by multiple processes. ---------------------------------------- Bug #18676: Misleading Documentation/Bug: Incorrect File.position on a file opened with "a" mode https://bugs.ruby-lang.org/issues/18676#change-97139 * Author: apatniv (Vivek Ak) * Status: Rejected * Priority: Normal * ruby -v: ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- Documentation says that whenever a file is opened in "a" mode, the stream is positioned at the end of stream. However, #tell method returns 0 instead of the size of the file. (https://ruby-doc.org/core-3.1.1/IO.html#class-IO-label-Position) Issue happens with latest version of ruby 3.1.1 as well. How to reproduce: ``` ruby cat code_to_reproduce.txt fp = File.open("sample_data.txt", "a") puts "File size=#{fp.size} position=#{fp.tell}" ``` Output: See the **position value** ``` shell ->ruby -v ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu] ->wc sample_data.txt 1 2 12 sample_data.txt ->cat sample_data.txt hello world ->ruby code_to_reproduce.txt File size=12 position=0 ->cat code_to_reproduce.txt fp = File.open("sample_data.txt", "a") puts "File size=#{fp.size} position=#{fp.tell}" ``` Further debugging with **`irb`** ``` ruby rb(main):009:0> fp = File.open("sample_data.txt", "a") irb(main):010:0> fp.tell => 0 irb(main):011:0> fp.size => 12 irb(main):012:0> fp.fileno => 7 irb(main):013:0> Process.pid => 22675 ``` Examining the offset in /proc filesytem ``` shell ->cat /proc/22675/fdinfo/7 pos: 0 flags: 02102001 mnt_id: 30 ``` -- https://bugs.ruby-lang.org/ Unsubscribe: