Project

General

Profile

Actions

Bug #18676

closed

Misleading Documentation/Bug: Incorrect File.position on a file opened with "a" mode

Added by apatniv (Vivek Ak) about 2 years ago. Updated about 2 years ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
[ruby-core:108164]

Description

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:

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

 ->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

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

 ->cat /proc/22675/fdinfo/7
pos:    0
flags:  02102001
mnt_id: 30

Updated by jeremyevans0 (Jeremy Evans) about 2 years ago

  • Status changed from Open to Rejected

apatniv (Vivek Ak) wrote:

Examining the offset in /proc filesytem

 ->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.

Updated by apatniv (Vivek Ak) about 2 years ago

Hi Jeremy. Thanks you for your response. Should we update the documentation to indicate the same so that it help anyone who encounters the same issue?

Updated by jeremyevans0 (Jeremy Evans) about 2 years ago

apatniv (Vivek Ak) wrote in #note-2:

Hi Jeremy. Thanks you for your response. Should we update the documentation to indicate the same so that it help anyone who encounters the same issue?

I don't think doing so is a good idea. This is not Ruby-specific behavior, this is operating system behavior. If you run an operating system that sets the default file position for files opened in append mode to the end of the file, then that's the position that Ruby would report.

Updated by apatniv (Vivek Ak) about 2 years ago

Makes sense.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0