Project

General

Profile

Bug #10153

File.open block does not throw "No space left on device (Errno::ENOSPC)" if the data fits the buffer of IO.write

Added by butching314 (Marvin Reyes) over 3 years ago. Updated over 3 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 1.9.3p484 (2013-11-22) [x86_64-linux]
[ruby-core:64463]

Description

When writing to file in disk using File.open with a block as an argument, if the diskspace is full and IO.write does not flush right away, the block just exits successfully instead of throwing Errno:ENOSPC.

Setup: Drive partition needs to be full

Eg. of a write that will succeed normally with no exception given that the drive is full (this means that the expected failure is being swallowed)

File.open('/full_drive/test.txt','wb') do |file|
  file.write("test")
end

#This will complete normally because the "test" data does not get flushed
#This will leave a 0kb file on the disk

Eg. force a flush to see the error

File.open('/full_drive/test.txt','wb') do |file|
  file.write("test")
  file.flush
end

#This will throw Errno::ENOSPC
#This will leave a 0kb file on the disk

Eg. write a large enough data that file.write will flush by itself (most likely it hits the buffer cap)

fills = '1'*1048576
File.open('/full_drive/test.txt','wb') do |file|
  file.write(fills)
end

#This will throw Errno::ENOSPC
#This will leave a 0kb file on the disk

Eg. When not using File.open block argument and closing the IO with an ensure block

begin
  io = File.open('/full_drive/test.txt', 'wb')
  io.write("test")
ensure
  io.close
end

#This will throw Errno::ENOSPC
#This will leave a 0kb file on the disk

Currently tested in RHEL5.

Notes:


Related issues

Related to Ruby trunk - Bug #13405: IO#close raises "stream closed"Closed

Associated revisions

Revision febf2cef
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47288 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 47288
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

Revision 47288
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

Revision 47288
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

Revision 47288
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

Revision 47288
Added by nobu (Nobuyoshi Nakada) over 3 years ago

io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

Revision 8f01a278
Added by nagachika (Tomoyuki Chikanaga) over 3 years ago

merge revision(s) r47288: [Backport #10153]

* io.c (io_close): ignore only "closed stream" IOError and
  NoMethodError, do not swallow other exceptions at the end of
  block.   [Bug #10153]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@47486 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 47486
Added by nagachika (Tomoyuki Chikanaga) over 3 years ago

merge revision(s) r47288: [Backport #10153]

* io.c (io_close): ignore only "closed stream" IOError and
  NoMethodError, do not swallow other exceptions at the end of
  block.   [Bug #10153]

Revision 9d742d73
Added by usa (Usaku NAKAMURA) over 3 years ago

merge revision(s) 47288: [Backport #10153]

* io.c (io_close): ignore only "closed stream" IOError and
  NoMethodError, do not swallow other exceptions at the end of
  block.   [Bug #10153]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@47503 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 47503
Added by usa (Usaku NAKAMURA) over 3 years ago

merge revision(s) 47288: [Backport #10153]

* io.c (io_close): ignore only "closed stream" IOError and
  NoMethodError, do not swallow other exceptions at the end of
  block.   [Bug #10153]

History

#1 [ruby-core:64532] Updated by znz (Kazuhiro NISHIYAMA) over 3 years ago

  • Priority changed from 5 to Normal
  • Target version changed from 2.6 to 2.2.0

I can reproduce 2.2.0dev with /dev/full.

% ruby -ve 'File.open("/dev/full", "w"){|f|f.puts "test"}'
ruby 2.2.0dev (2014-06-28 trunk 46598) [x86_64-linux]
% ruby -ve 'File.open("/dev/full", "w"){|f|f.puts "test"; f.flush}'
ruby 2.2.0dev (2014-06-28 trunk 46598) [x86_64-linux]
-e:1:in `flush': No space left on device (Errno::ENOSPC)
        from -e:1:in `block in <main>'
        from -e:1:in `open'
        from -e:1:in `<main>'
%

#2 [ruby-core:64541] Updated by nobu (Nobuyoshi Nakada) over 3 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

This behavior was introduced at r10623 by matz, but the commit log is only:

* io.c (io_close): always calls "close" method of the receiver.
   

#3 [ruby-core:64561] Updated by nobu (Nobuyoshi Nakada) over 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

Applied in changeset r47288.


io.c: do not swallow exceptions at end of block

  • io.c (io_close): ignore only "closed stream" IOError and NoMethodError, do not swallow other exceptions at the end of block. [Bug #10153]

#4 [ruby-core:64562] Updated by nobu (Nobuyoshi Nakada) over 3 years ago

Seems intended to ignore IOError and NoMethodError.

#5 [ruby-core:64563] Updated by nagachika (Tomoyuki Chikanaga) over 3 years ago

  • Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED

#6 [ruby-core:64566] Updated by butching314 (Marvin Reyes) over 3 years ago

What is the conclusion for this post?

#7 [ruby-core:64904] Updated by nagachika (Tomoyuki Chikanaga) over 3 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE

Backported into ruby_2_1 branch at r47486.

#8 [ruby-core:64919] Updated by usa (Usaku NAKAMURA) over 3 years ago

  • Backport changed from 2.0.0: REQUIRED, 2.1: DONE to 2.0.0: DONE, 2.1: DONE

backported into ruby_2_0_0 at r47503.

#9 Updated by shyouhei (Shyouhei Urabe) about 1 year ago

  • Related to Bug #13405: IO#close raises "stream closed" added

Also available in: Atom PDF