Bug #2277

Patch: Fix high CPU usage on Kernel#select

Added by zakaria (Zakaria Haris) over 2 years ago. Updated about 1 year ago.

[ruby-core:26323]
Status:Feedback Start date:10/26/2009
Priority:Normal Due date:
Assignee:nobu (Nobuyoshi Nakada) % Done:

0%

Category:-
Target version:-
ruby -v:1.8.6

Description

This bug brought my server down two times.
While my patch for p111 it still exist in p287.

diff -ru ruby-1.8.6-p111.orig/io.c ruby-1.8.6-p111/io.c
--- ruby-1.8.6-p111.orig/io.c	Tue May 22 23:28:10 2007
+++ ruby-1.8.6-p111/io.c	Sun Aug 30 19:08:09 2009
@@ -4802,12 +4802,12 @@
     if (!pending && n == 0) return Qnil; /* returns nil on timeout */

     res = rb_ary_new2(3);
-    rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0));
+    rb_ary_push(res, (rp||pending)?rb_ary_new():rb_ary_new2(0));
     rb_ary_push(res, wp?rb_ary_new():rb_ary_new2(0));
     rb_ary_push(res, ep?rb_ary_new():rb_ary_new2(0));

     if (interrupt_flag == 0) {
-	if (rp) {
+	if (rp || pending) {
 	    list = RARRAY(res)->ptr[0];
 	    for (i=0; i< RARRAY(read)->len; i++) {
 		GetOpenFile(rb_io_get_io(RARRAY(read)->ptr[i]), fptr);

History

Updated by nobu (Nobuyoshi Nakada) over 2 years ago

Hi,

At Mon, 26 Oct 2009 22:55:47 +0900,
Zakaria Haris wrote in [ruby-core:26323]:
>      res = rb_ary_new2(3);
> -    rb_ary_push(res, rp?rb_ary_new():rb_ary_new2(0));
> +    rb_ary_push(res, (rp||pending)?rb_ary_new():rb_ary_new2(0));

Seems curious.  When pending is non-zero, rp should be always
set.

-- 
Nobu Nakada

Updated by nobu (Nobuyoshi Nakada) over 2 years ago

  • Status changed from Open to Feedback

Updated by ujihisa (ujihisa .) over 2 years ago

  • Assignee set to nobu (Nobuyoshi Nakada)

Updated by rogerdpack (Roger Pack) about 2 years ago

do you have an example of how to reproduce this?

Also available in: Atom PDF