Project

General

Profile

Actions

Bug #17792

open

make notes and make test fail with Ruby3.0.1p64 RaspberryPI 4B Ubuntu 20.10 ARM64

Added by hanlyusarang (Hanlyu Sarang) 10 months ago. Updated 8 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [aarch64-linux]
[ruby-core:103364]

Description

I am building Ruby 3.01 from sources on a RaspberryPI 4B running Ubuntu 20.10 ARM64.

This is my first day using this PI4B + Ubuntu 20.10 ARM64, and this is the first time I have attempted to build Ruby on it.
I received a few notes during compilation and one failure during testing.

Note that on the previous day, I built the same Ruby sources on the same machine running RaspberryPI OS (32-bit Debian), no problems. FYI, you can use either a 32-bit or a 64-bit OS on the RasberryPI 4B.

Anyway, here are the details of what I experienced on the PI4B using Ubuntu 20.10 ARM64:

During the make, I get a few notes:

compiling parse.c
parse.y: In function ‘node_assign’:
parse.y:11265:1: note: parameter passing for argument of type ‘struct lex_context’ changed in GCC 9.1
11265 | node_assign(struct parser_params *p, NODE *lhs, NODE *rhs, struct lex_context ctxt, const YYLTYPE *loc)
| ~~~~~~~~~~
parse.y: In function ‘new_const_op_assign’:
parse.y:12283:1: note: parameter passing for argument of type ‘struct lex_context’ changed in GCC 9.1
12283 | new_const_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context ctxt, const YYLTYPE *loc)
| ~~~~~~~~~~~~~~~~~~
parse.y: In function ‘new_op_assign’:
parse.y:12196:1: note: parameter passing for argument of type ‘struct lex_context’ changed in GCC 9.1
12196 | new_op_assign(struct parser_params *p, NODE *lhs, ID op, NODE *rhs, struct lex_context ctxt, const YYLTYPE *loc)
| ~~~~~~~~~~~~
compiling proc.c

The build is successful, but when I run make test, I get one failure

/home/pi/builds/ruby-3.0.1# make test
BASERUBY = /usr/bin/ruby --disable=gems
CC = gcc
LD = ld
LDSHARED = gcc -shared
CFLAGS = -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -std=gnu99
XCFLAGS = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -fPIE -I. -I.ext/include/aarch64-linux -I./include -I. -I./enc/unicode/12.1.0
CPPFLAGS =

DLDFLAGS = -Wl,--compress-debug-sections=zlib -fstack-protector-strong -pie

SOLIBS = -lz -lpthread -lrt -lrt -lgmp -ldl -lcrypt -lm
LANG = en_US.UTF-8
LC_ALL =
LC_CTYPE =
MFLAGS =
gcc (Ubuntu 10.2.0-13ubuntu1) 10.2.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

./revision.h unchanged
#655 test_io.rb:87:in `block in ':
at_exit { p :foo }

   megacontent = "abc" * 12345678
   #File.open("megasrc", "w") {|f| f << megacontent }

   t0 = Thread.main
   Thread.new { sleep 0.001 until t0.stop?; Process.kill(:INT, $$) }

   r1, w1 = IO.pipe
   r2, w2 = IO.pipe
   t1 = Thread.new { w1 << megacontent; w1.close }
   t2 = Thread.new { r2.read; r2.close }
   IO.copy_stream(r1, w2) rescue nil
   w2.close
   r1.close
   t1.join
   t2.join

#=> killed by SIGKILL (signal 9) (timeout) megacontent-copy_stream
test_io.rb FAIL 1/9
Fiber count: 10000 (skipping)
FAIL 1/1486 tests failed
make: *** [uncommon.mk:766: yes-btest-ruby] Error 1

I went ahead and did the make install, which succeeded.
I now have an installation of Ruby which I will be working with over the next few months to see if it works OK.

If you need more info, please let me know.

Updated by mame (Yusuke Endoh) 10 months ago

Sorry for a less informative reply, but Ruby is not yet tested well with 64 bit Raspberry Pi. I have no environment to reproduce the issue. Contribution is welcome.

I see a similar random failure on our CI (raspbian10-aarch64, still beta) but I'm unsure if it is the same issue. And I cannot log in to the machine. znz (Kazuhiro NISHIYAMA) can you check it out?
http://rubyci.s3.amazonaws.com/raspbian10-aarch64/ruby-master/log/20210410T023158Z.fail.html.gz

Updated by hanlyusarang (Hanlyu Sarang) 10 months ago

Another FYI: The RaspberryPI 4B uses a microSD card (class 10) for the OS and all installed software. I was building Ruby on a 32GB version of this card.

The I/O on a microSD card is much slower than on a 5400 RPM HD, and much, much slower than on an SSD. I know from experience that the speed difference between the microSD card and the SSD is something on the order of 10 for intensive I/O operations.

If the test routine that failed was using a timeout mechanism. then perhaps the amount of time allowed was insufficient. But when I build Ruby on the same machine and type of card using a 32-bit Debian-like OS, no test failures. So, maybe the media speed is not a factor?

Updated by xtkoba (Tee KOBAYASHI) 10 months ago

The test code at bootstraptest/test_io.rb:87 is as follows. Try running it separately and see what happens.

at_exit { p :foo }

megacontent = "abc" * 12345678
#File.open("megasrc", "w") {|f| f << megacontent }

t0 = Thread.main
Thread.new { sleep 0.001 until t0.stop?; Process.kill(:INT, $$) }

r1, w1 = IO.pipe
r2, w2 = IO.pipe
t1 = Thread.new { w1 << megacontent; w1.close }
t2 = Thread.new { r2.read; r2.close }
IO.copy_stream(r1, w2) rescue nil
w2.close
r1.close
t1.join
t2.join

Timeout does not tell whether the code execution just takes longer than expected or hangs up forever.

Updated by hanlyusarang (Hanlyu Sarang) 10 months ago

The test code took almost two minutes to run, and it failed:

# TEST RESULTS:
pi> ruby test.rb 
:foo
test.rb:13:in `copy_stream': Interrupt
    from test.rb:13:in `<main>'

# LINE 13: IO.copy_stream(r1, w2) rescue nil

# TEST CODE:
at_exit { p :foo }

megacontent = "abc" * 12345678
#File.open("megasrc", "w") {|f| f << megacontent }

t0 = Thread.main
Thread.new { sleep 0.001 until t0.stop?; Process.kill(:INT, $$) }

r1, w1 = IO.pipe
r2, w2 = IO.pipe
t1 = Thread.new { w1 << megacontent; w1.close }
t2 = Thread.new { r2.read; r2.close }
IO.copy_stream(r1, w2) rescue nil
w2.close
r1.close
t1.join
t2.join

Updated by xtkoba (Tee KOBAYASHI) 8 months ago

Interruption in copy_stream is what this test is intended for, and so the result of the test in #note-4 is a success. But taking about 2 minutes to finish is unexpected to me. Possibly due to a bug in the pthread library?

FWIW, the megacontent-copy_stream test in bootstraptest/test_io.rb is known to fail on Cygwin (#1388, #5055, #7781; all rejected). This is different from the case here in that it never finishes on Cygwin (which I have confirmed).

I also have found that the timeout issue of this test is reported for kFreeBSD (https://bugs.debian.org/881779).

Actions

Also available in: Atom PDF