[
https://issues.apache.org/jira/browse/THRIFT-4594?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16535965#comment-16535965
]
Christopher Friedt edited comment on THRIFT-4594 at 7/8/18 3:01 AM:
--------------------------------------------------------------------
Aha!
Maybe I was too quick to lay blame. Was just instrumenting TServerSocket.cpp
and it's trying to bind to port 0 on ::1. However, Docker containers do not
support IPv6 (at least not by default), hence bind(2) fails with EADDRNOTAVAIL.
There is no effort made (in TServerSocket::listen()) to retry with AF_INET when
AF_INET6 fails.
What is particularly odd, is that getaddrinfo(3) returns an IPv6 address to
begin with, given that none exist (particularly not on lo).
{code}
~/thrift/src/thrift-0.11.0/lib/cpp/test $ ./UnitTests
Running 51 test cases...
virtual void apache::thrift::transport::TServerSocket::listen(): 518:
attempting to bind to { sin6_family: AF_INET6, sin6_port: 0, sin6_addr: ::1
}
Thrift: Sun Jul 8 01:22:54 2018 TServerSocket::listen() BIND 0
unknown location(0): fatal error: in "TServerSocketTest/test_bind_to_address":
apache::thrift::transport::TTransportException: Could not bind: Address not
available
TServerSocketTest.cpp(35): last checkpoint: "test_bind_to_address" entry.
*** 1 failure is detected in the test module "thrift"
~/thrift/src/thrift-0.11.0/lib/cpp/test $ ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65839 errors:0 dropped:0 overruns:0 frame:0
TX packets:35873 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:92097704 (87.8 MiB) TX bytes:2303356 (2.1 MiB)
ip6tnl0 Link encap:UNSPEC HWaddr
00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
NOARP MTU:1452 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tunl0 Link encap:UNSPEC HWaddr
00-00-00-00-00-00-3C-A6-00-00-00-00-00-00-00-00
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
{code}
was (Author: cfriedt):
Aha!
Maybe I was too quick to lay blame. Was just instrumenting TServerSocket.cpp
and it's trying to bind to port 0 on ::1. However, Docker containers do not
support IPv6 (at least not by default), hence bind(2) fails with ENOADDR.
There is no effort made (in TServerSocket::listen()) to retry with AF_INET when
AF_INET6 fails.
What is particularly odd, is that getaddrinfo(3) returns an IPv6 address to
begin with, given that none exist (particularly not on lo).
{code}
~/thrift/src/thrift-0.11.0/lib/cpp/test $ ./UnitTests
Running 51 test cases...
virtual void apache::thrift::transport::TServerSocket::listen(): 518:
attempting to bind to { sin6_family: AF_INET6, sin6_port: 0, sin6_addr: ::1
}
Thrift: Sun Jul 8 01:22:54 2018 TServerSocket::listen() BIND 0
unknown location(0): fatal error: in "TServerSocketTest/test_bind_to_address":
apache::thrift::transport::TTransportException: Could not bind: Address not
available
TServerSocketTest.cpp(35): last checkpoint: "test_bind_to_address" entry.
*** 1 failure is detected in the test module "thrift"
~/thrift/src/thrift-0.11.0/lib/cpp/test $ ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65839 errors:0 dropped:0 overruns:0 frame:0
TX packets:35873 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:92097704 (87.8 MiB) TX bytes:2303356 (2.1 MiB)
ip6tnl0 Link encap:UNSPEC HWaddr
00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
NOARP MTU:1452 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
tunl0 Link encap:UNSPEC HWaddr
00-00-00-00-00-00-3C-A6-00-00-00-00-00-00-00-00
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
{code}
> Unable to Build Test Suite in Alpine Linux
> ------------------------------------------
>
> Key: THRIFT-4594
> URL: https://issues.apache.org/jira/browse/THRIFT-4594
> Project: Thrift
> Issue Type: Bug
> Components: Test Suite
> Affects Versions: 0.11.0
> Environment: Ubuntu Bionic (native)
> alpine:latest (docker)
> Reporter: Christopher Friedt
> Priority: Minor
> Fix For: 0.12.0
>
> Attachments: make-check-alpine-3.8.txt,
> make-check-macos-10.13.5.text, thrift-alpine-20180701.tar.gz
>
>
> It seems that the 0.11.0 lib/cpp/test suite is not building correctly when
> run inside of Alpine Linux 3.8 in a Docker container.
> I've narrowed the culprits down to the non-portable (NP) class of Mutex
> initializers. The failure occurs in unpatched code (and obviously in my CI
> build recipe, attached).
> Currently, I'm working on automating builds of thrift for Alpine Linux 3.8,
> and they will likely require "make check" to pass successfully in future
> versions. Might as well ensure it works now.
> If you want to duplicate my build easily in Docker, you can use the
> attachment (e.g. tar xpvzf thrift-ci-build-20180627.tar.xz; cd
> thrift-20180627; docker build -t foo .)
> {noformat}
> make check
> ...
> /bin/bash ../../../libtool --tag=CXX --mode=link
> x86_64-alpine-linux-musl-g++ -Wall -Wextra -pedantic -Os -fomit-frame-pointer
> -L/usr/lib -Wl,--no-undefined -o TPipedTransportTest TPipedTransportTest.o
> TPipeInterruptTest.o libtestgencpp.la ../../../lib/cpp/libthrift.la
> /usr/lib/libboost_unit_test_framework.a /usr/lib/libboost_system.a
> /usr/lib/libboost_thread-mt.a -lrt -lpthread
> concurrency/MutexTest.o: In function `MutexTest::happy_path::test_method()':
> MutexTest.cpp:(.text+0x18): undefined reference to
> `apache::thrift::concurrency::Mutex::ERRORCHECK_INITIALIZER(void*)'
> concurrency/MutexTest.o: In function
> `MutexTest::recursive_happy_path::test_method()':
> MutexTest.cpp:(.text+0x580): undefined reference to
> `apache::thrift::concurrency::Mutex::RECURSIVE_INITIALIZER(void*)'
> concurrency/MutexTest.o: In function `MutexTest::trylock::test_method()':
> MutexTest.cpp:(.text+0x1573): undefined reference to
> `apache::thrift::concurrency::Mutex::ADAPTIVE_INITIALIZER(void*)'
> concurrency/MutexTest.o: In function `LFAT::LFAT()':
> MutexTest.cpp:(.text._ZN4LFATC2Ev[_ZN4LFATC5Ev]+0x17): undefined reference to
> `apache::thrift::concurrency::Mutex::ERRORCHECK_INITIALIZER(void*)'
> collect2: error: ld returned 1 exit status
> make[5]: *** [Makefile:1190: UnitTests] Error 1
> make[5]: *** Waiting for unfinished jobs....
> libtool: link: x86_64-alpine-linux-musl-g++ -Wall -Wextra -pedantic -Os
> -fomit-frame-pointer -Wl,--no-undefined -o .libs/TFDTransportTest
> TFDTransportTest.o -L/usr/lib ../../../lib/cpp/.libs/libthrift.so -lssl
> -lcrypto /usr/lib/libboost_unit_test_framework.a -lrt -lpthread
> libtool: link: x86_64-alpine-linux-musl-g++ -Wall -Wextra -pedantic -Os
> -fomit-frame-pointer -Wl,--no-undefined -o .libs/TPipedTransportTest
> TPipedTransportTest.o TPipeInterruptTest.o -L/usr/lib
> ./.libs/libtestgencpp.a
> /home/alpine/thrift/src/thrift-0.11.0/lib/cpp/.libs/libthrift.so
> ../../../lib/cpp/.libs/libthrift.so -lssl -lcrypto
> /usr/lib/libboost_unit_test_framework.a /usr/lib/libboost_system.a
> /usr/lib/libboost_thread-mt.a -lrt -lpthread
> make[5]: Leaving directory
> '/home/alpine/thrift/src/thrift-0.11.0/lib/cpp/test'
> make[4]: *** [Makefile:1507: check-am] Error 2
> make[4]: Leaving directory
> '/home/alpine/thrift/src/thrift-0.11.0/lib/cpp/test'
> make[3]: *** [Makefile:1510: check] Error 2
> make[3]: Leaving directory
> '/home/alpine/thrift/src/thrift-0.11.0/lib/cpp/test'
> make[2]: *** [Makefile:1661: check-recursive] Error 1
> make[2]: Leaving directory '/home/alpine/thrift/src/thrift-0.11.0/lib/cpp'
> make[1]: Leaving directory '/home/alpine/thrift/src/thrift-0.11.0/lib'
> make[1]: *** [Makefile:576: check-recursive] Error 1
> make: *** [Makefile:659: check-recursive] Error 1
> >>> ERROR: thrift*: check failed
> >>> ERROR: thrift: all failed
> >>> thrift: Uninstalling dependencies..{noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)