You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by ns...@apache.org on 2016/05/14 15:36:47 UTC

[1/3] thrift git commit: THRIFT-3814 Fix contention in TNonblockingServerTest

Repository: thrift
Updated Branches:
  refs/heads/master d7f87aa5f -> 9549b25c7


THRIFT-3814 Fix contention in TNonblockingServerTest

This closes #1005


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/8cc9175a
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/8cc9175a
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/8cc9175a

Branch: refs/heads/master
Commit: 8cc9175ae871657dfd3f2f0ea186ded0c0dbcbd9
Parents: d7f87aa
Author: Nobuaki Sukegawa <ns...@apache.org>
Authored: Sun May 15 00:24:41 2016 +0900
Committer: Nobuaki Sukegawa <ns...@apache.org>
Committed: Sun May 15 00:24:41 2016 +0900

----------------------------------------------------------------------
 .../src/thrift/server/TNonblockingServer.cpp    |  4 +-
 lib/cpp/test/TNonblockingServerTest.cpp         | 73 +++++++++++---------
 2 files changed, 41 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/8cc9175a/lib/cpp/src/thrift/server/TNonblockingServer.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/src/thrift/server/TNonblockingServer.cpp b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
index 7f44c1f..ccc37a2 100644
--- a/lib/cpp/src/thrift/server/TNonblockingServer.cpp
+++ b/lib/cpp/src/thrift/server/TNonblockingServer.cpp
@@ -1130,7 +1130,7 @@ void TNonblockingServer::listenSocket(THRIFT_SOCKET s) {
 
   if (listen(s, LISTEN_BACKLOG) == -1) {
     ::THRIFT_CLOSESOCKET(s);
-    throw TException("TNonblockingServer::serve() listen");
+    throw TTransportException(TTransportException::NOT_OPEN, "TNonblockingServer::serve() listen");
   }
 
   // Cool, this socket is good to go, set it as the serverSocket_
@@ -1438,7 +1438,7 @@ bool TNonblockingIOThread::notify(TNonblockingServer::TConnection* conn) {
   fd_set wfds, efds;
   long ret = -1;
   long kSize = sizeof(conn);
-  const char* pos = (const char*)const_cast_sockopt(&conn);
+  const char* pos = reinterpret_cast<const char*>(&conn);
 
   while (kSize > 0) {
     FD_ZERO(&wfds);

http://git-wip-us.apache.org/repos/asf/thrift/blob/8cc9175a/lib/cpp/test/TNonblockingServerTest.cpp
----------------------------------------------------------------------
diff --git a/lib/cpp/test/TNonblockingServerTest.cpp b/lib/cpp/test/TNonblockingServerTest.cpp
index 8f4ef6e..48ea913 100644
--- a/lib/cpp/test/TNonblockingServerTest.cpp
+++ b/lib/cpp/test/TNonblockingServerTest.cpp
@@ -47,14 +47,32 @@ struct Handler : public test::ParentServiceIf {
 class Fixture {
 private:
   struct Runner : public apache::thrift::concurrency::Runnable {
+    int port;
+    boost::shared_ptr<event_base> userEventBase;
+    boost::shared_ptr<TProcessor> processor;
     boost::shared_ptr<server::TNonblockingServer> server;
-    bool error;
+
     virtual void run() {
-      error = false;
+      // When binding to explicit port, allow retrying to workaround bind failures on ports in use
+      int retryCount = port ? 10 : 0;
+      startServer(retryCount);
+    }
+
+  private:
+    void startServer(int retry_count) {
       try {
+        server.reset(new server::TNonblockingServer(processor, port));
+        if (userEventBase) {
+          server->registerEvents(userEventBase.get());
+        }
         server->serve();
-      } catch (const TException&) {
-        error = true;
+      } catch (const transport::TTransportException&) {
+        if (retry_count > 0) {
+          ++port;
+          startServer(retry_count - 1);
+        } else {
+          throw;
+        }
       }
     }
   };
@@ -80,38 +98,24 @@ protected:
   }
 
   int startServer(int port) {
+    boost::shared_ptr<Runner> runner(new Runner);
+    runner->port = port;
+    runner->processor = processor;
+    runner->userEventBase = userEventBase_;
+
     boost::scoped_ptr<apache::thrift::concurrency::ThreadFactory> threadFactory(
-      new apache::thrift::concurrency::PlatformThreadFactory(
+        new apache::thrift::concurrency::PlatformThreadFactory(
 #if !USE_BOOST_THREAD && !USE_STD_THREAD
-            concurrency::PlatformThreadFactory::OTHER,
-            concurrency::PlatformThreadFactory::NORMAL,
+            concurrency::PlatformThreadFactory::OTHER, concurrency::PlatformThreadFactory::NORMAL,
             1,
 #endif
-            true));
-
-    int retry_count = port ? 10 : 0;
-    for (int p = port; p <= port + retry_count; p++) {
-      server.reset(new server::TNonblockingServer(processor, p));
-      if (userEventBase_) {
-        try {
-          server->registerEvents(userEventBase_.get());
-        } catch (const TException&) {
-          // retry with next port
-          continue;
-        }
-      }
-      boost::shared_ptr<Runner> runner(new Runner);
-      runner->server = server;
-      thread = threadFactory->newThread(runner);
-      thread->start();
-      // wait 50ms for the server to begin listening
-      THRIFT_SLEEP_USEC(50000);
-      if (!runner->error) {
-        return p;
-      }
-    }
-    throw transport::TTransportException(transport::TTransportException::NOT_OPEN,
-                                         "Failed to start server.");
+            false));
+    thread = threadFactory->newThread(runner);
+    thread->start();
+    // wait 100 ms for the server to begin listening
+    THRIFT_SLEEP_USEC(100000);
+    server = runner->server;
+    return runner->port;
   }
 
   bool canCommunicate(int serverPort) {
@@ -128,10 +132,11 @@ protected:
 private:
   boost::shared_ptr<event_base> userEventBase_;
   boost::shared_ptr<test::ParentServiceProcessor> processor;
-  boost::shared_ptr<apache::thrift::concurrency::Thread> thread;
-
 protected:
   boost::shared_ptr<server::TNonblockingServer> server;
+private:
+  boost::shared_ptr<apache::thrift::concurrency::Thread> thread;
+
 };
 
 BOOST_AUTO_TEST_SUITE(TNonblockingServerTest)


[3/3] thrift git commit: THRIFT-3815 Put appveyor dependency versions to one place

Posted by ns...@apache.org.
THRIFT-3815 Put appveyor dependency versions to one place

This closes #1006


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/9549b25c
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/9549b25c
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/9549b25c

Branch: refs/heads/master
Commit: 9549b25c77587b29be4e0b5c258221a4ed85d37a
Parents: 7be78ea
Author: Nobuaki Sukegawa <ns...@apache.org>
Authored: Sun May 15 00:25:17 2016 +0900
Committer: Nobuaki Sukegawa <ns...@apache.org>
Committed: Sun May 15 00:25:17 2016 +0900

----------------------------------------------------------------------
 appveyor.yml | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/9549b25c/appveyor.yml
----------------------------------------------------------------------
diff --git a/appveyor.yml b/appveyor.yml
index 081cf2b..ffd5334 100755
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -29,6 +29,9 @@ os:
 environment:
   BOOST_ROOT: C:\Libraries\boost_1_59_0
   BOOST_LIBRARYDIR: C:\Libraries\boost_1_59_0\lib64-msvc-14.0
+  # Unfurtunately, these versions need manual update because old versions are quickly deleted.
+  ANT_VERSION: 1.9.7
+  OPENSSL_VERSION: 1_0_2h
 
 install:
 - '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64'
@@ -41,9 +44,8 @@ install:
 - cmake --build . --config release
 - cd ..
   # OpenSSL
-  # Unfurtunately, OpenSSL version below needs constant update (2 places) because old versions are quickly deleted.
-- appveyor DownloadFile https://slproweb.com/download/Win64OpenSSL-1_0_2h.exe
-- ps: Start-Process Win64OpenSSL-1_0_2h.exe -ArgumentList "/silent /verysilent /sp- /suppressmsgboxes" -Wait
+- appveyor DownloadFile https://slproweb.com/download/Win64OpenSSL-%OPENSSL_VERSION%.exe
+- ps: Start-Process "Win64OpenSSL-${env:OPENSSL_VERSION}.exe" -ArgumentList "/silent /verysilent /sp- /suppressmsgboxes" -Wait
   # Libevent
 - appveyor DownloadFile https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
 - 7z x libevent-2.0.22-stable.tar.gz -so | 7z x -si -ttar > nul
@@ -55,15 +57,15 @@ install:
 - move *.h include\
 - cd ..
 - cinst winflexbison
-- appveyor DownloadFile http://www.us.apache.org/dist/ant/binaries/apache-ant-1.9.7-bin.zip
-- 7z x apache-ant-1.9.7-bin.zip > nul
+- appveyor DownloadFile http://www.us.apache.org/dist/ant/binaries/apache-ant-%ANT_VERSION%-bin.zip
+- 7z x apache-ant-%ANT_VERSION%-bin.zip > nul
 - cd %APPVEYOR_BUILD_FOLDER%
 # TODO: Enable Haskell build
 # - cinst HaskellPlatform -version 2014.2.0.0
 
 
 build_script:
-- set PATH=C:\ProgramData\chocolatey\bin;C:\apache-ant-1.9.7\bin;%PATH%
+- set PATH=C:\ProgramData\chocolatey\bin;C:\apache-ant-%ANT_VERSION%\bin;%PATH%
 - set JAVA_HOME=C:\Program Files\Java\jdk1.7.0
 - set PATH=%JAVA_HOME%\bin;%PATH%
 # - set PATH=%PATH%;C:\Program Files (x86)\Haskell Platform\2014.2.0.0\bin


[2/3] thrift git commit: THRIFT-3816 Reduce docker build duration on Travis-CI

Posted by ns...@apache.org.
THRIFT-3816 Reduce docker build duration on Travis-CI

This closes #1007


Project: http://git-wip-us.apache.org/repos/asf/thrift/repo
Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/7be78ea0
Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/7be78ea0
Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/7be78ea0

Branch: refs/heads/master
Commit: 7be78ea0b351d86ce4063279cf33976ba70f4b85
Parents: 8cc9175
Author: Nobuaki Sukegawa <ns...@apache.org>
Authored: Sun May 15 00:25:04 2016 +0900
Committer: Nobuaki Sukegawa <ns...@apache.org>
Committed: Sun May 15 00:25:04 2016 +0900

----------------------------------------------------------------------
 .travis.yml                     |   3 +-
 build/docker/centos/Dockerfile  |   3 +-
 build/docker/centos6/Dockerfile |   3 +-
 build/docker/debian/Dockerfile  | 146 ++++++++++++++---------------
 build/docker/ubuntu/Dockerfile  | 176 +++++++++++++++++------------------
 5 files changed, 163 insertions(+), 168 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/thrift/blob/7be78ea0/.travis.yml
----------------------------------------------------------------------
diff --git a/.travis.yml b/.travis.yml
index 33a32d8..f8a8c1e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,12 +26,11 @@ services:
   - docker
 
 install:
-  - travis_wait docker pull thrift/$DISTRO:latest || true
   - cp -r ./build/docker/scripts/*.sh ./build/docker/$DISTRO/scripts/
   - travis_retry travis_wait docker build -q -t thrift-build build/docker/$DISTRO
 
 script:
-  - docker run -e BUILD_LIBS="$BUILD_LIBS" $BUILD_ENV -v $(pwd):/thrift/src -it thrift-build $BUILD_CMD $BUILD_ARG
+  - docker run --net=host -e BUILD_LIBS="$BUILD_LIBS" $BUILD_ENV -v $(pwd):/thrift/src -it thrift-build $BUILD_CMD $BUILD_ARG
 
 env:
   global:

http://git-wip-us.apache.org/repos/asf/thrift/blob/7be78ea0/build/docker/centos/Dockerfile
----------------------------------------------------------------------
diff --git a/build/docker/centos/Dockerfile b/build/docker/centos/Dockerfile
index 011ccc0..f544a24 100644
--- a/build/docker/centos/Dockerfile
+++ b/build/docker/centos/Dockerfile
@@ -127,7 +127,8 @@ RUN yum install -y \
 
 # CMake
 RUN curl -sSL https://cmake.org/files/v3.4/cmake-3.4.0.tar.gz | tar -xz && \
-    cd cmake-3.4.0 && ./bootstrap && make -j4 && make install
+    cd cmake-3.4.0 && ./bootstrap && make -j4 && make install && \
+    cd .. && rm -rf cmake-3.4.0
 
 # Clean up
 RUN rm -rf /tmp/* && \

http://git-wip-us.apache.org/repos/asf/thrift/blob/7be78ea0/build/docker/centos6/Dockerfile
----------------------------------------------------------------------
diff --git a/build/docker/centos6/Dockerfile b/build/docker/centos6/Dockerfile
index 33d5dad..d0dc51a 100644
--- a/build/docker/centos6/Dockerfile
+++ b/build/docker/centos6/Dockerfile
@@ -42,7 +42,8 @@ RUN yum install -y epel-release && \
 
 # CMake
 RUN curl -sSL https://cmake.org/files/v3.4/cmake-3.4.1.tar.gz | tar -xz && \
-    cd cmake-3.4.1 && ./bootstrap && make -j4 && make install
+    cd cmake-3.4.1 && ./bootstrap && make -j4 && make install && \
+    cd .. && rm -rf cmake-3.4.1
 
 ENV THRIFT_ROOT /thrift
 RUN mkdir -p $THRIFT_ROOT/src

http://git-wip-us.apache.org/repos/asf/thrift/blob/7be78ea0/build/docker/debian/Dockerfile
----------------------------------------------------------------------
diff --git a/build/docker/debian/Dockerfile b/build/docker/debian/Dockerfile
index 66a52d7..5ec956e 100644
--- a/build/docker/debian/Dockerfile
+++ b/build/docker/debian/Dockerfile
@@ -15,31 +15,29 @@
 # Known missing client libraries:
 #  - None
 
-FROM debian:jessie
+FROM buildpack-deps:jessie-scm
 MAINTAINER Apache Thrift <de...@thrift.apache.org>
 
 ENV DEBIAN_FRONTEND noninteractive
 
-# General dependencies
+# Add apt sources
+# Dart
+RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
+    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
+    sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g'
+
 RUN apt-get update && apt-get install -y --no-install-recommends \
-      apt-transport-https \
-      autoconf \
-      automake \
+`# General dependencies` \
       bison \
       build-essential \
       clang \
       cmake \
-      curl \
       debhelper \
       flex \
-      g++ \
-      git \
-      libtool \
-      make \
       pkg-config
 
-# C++ dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# C++ dependencies` \
       libboost-dev \
       libboost-filesystem-dev \
       libboost-program-options-dev \
@@ -52,106 +50,124 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-# Java dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Java dependencies` \
       ant \
       ant-optional \
       openjdk-7-jdk \
-      maven \
-    && update-java-alternatives -s java-1.7.0-openjdk-amd64
+      maven
 
-# Python dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Python dependencies` \
       python-all \
-      python-all-dev \
       python-all-dbg \
+      python-all-dev \
+      python-pip \
       python-setuptools \
       python-twisted \
       python-zope.interface \
-      python-pip \
       python3-all \
       python3-all-dbg \
       python3-all-dev \
       python3-setuptools \
       python3-pip
 
-# Ruby dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Ruby dependencies` \
       ruby \
       ruby-dev \
-    && gem install bundler rake
-
-# Perl dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Perl dependencies` \
       libbit-vector-perl \
       libclass-accessor-class-perl \
       libcrypt-ssleay-perl \
       libio-socket-ssl-perl \
       libnet-ssleay-perl
 
-# Php dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Php dependencies` \
       php5 \
       php5-dev \
       php5-cli \
       php-pear \
       re2c \
-      phpunit
-
-# GlibC dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends libglib2.0-dev
+      phpunit \
+`# GlibC dependencies` \
+      libglib2.0-dev
 
-# Erlang dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Erlang dependencies` \
       erlang-base \
       erlang-eunit \
       erlang-dev \
       erlang-tools \
       rebar
 
-# Go dependencies
-RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz
-ENV PATH /usr/local/go/bin:$PATH
-
-
-# Haskell dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Haskell dependencies` \
       ghc \
-      cabal-install
-
-# Haxe
-RUN apt-get update && apt-get install -y --no-install-recommends \
+      cabal-install \
+`# Haxe dependencies` \
       neko \
       neko-dev \
-      libneko0 \
-    && mkdir -p /usr/lib/haxe && \
-    curl http://haxe.org/website-content/downloads/3.2.0/downloads/haxe-3.2.0-linux64.tar.gz | \
-    tar -C /usr/lib/haxe --strip-components=1 -xz && \
-    ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \
-    ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \
-    mkdir -p /usr/lib/haxe/lib  && \
-    chmod -R 777 /usr/lib/haxe/lib && \
-    haxelib setup /usr/lib/haxe/lib && \
-    haxelib install hxcpp
+      libneko0
 
-# Node.js dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Node.js dependencies` \
       nodejs \
       nodejs-dev \
       nodejs-legacy \
       npm
 
-# CSharp dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# CSharp dependencies` \
       libmono-system-web2.0-cil \
       mono-complete \
       mono-devel \
       mono-gmcs \
       mono-xbuild
 
-# D dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends xdg-utils && \
-    curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \
+RUN apt-get update && apt-get install -y --no-install-recommends \
+`# D dependencies` \
+      xdg-utils \
+`# Dart dependencies` \
+      dart \
+`# Lua dependencies` \
+      lua5.2 \
+      lua5.2-dev \
+`# MinGW dependencies` \
+      mingw32 \
+      mingw32-binutils \
+`#      mingw32-runtime` \
+      nsis \
+`# Clean up` \
+    && rm -rf /var/cache/apt/* && \
+    rm -rf /var/lib/apt/lists/* && \
+    rm -rf /tmp/* && \
+    rm -rf /var/tmp/*
+
+# Java
+RUN update-java-alternatives -s java-1.7.0-openjdk-amd64
+
+# Ruby
+RUN gem install bundler rake
+
+# Go
+RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz
+ENV PATH /usr/local/go/bin:$PATH
+
+# Haxe
+RUN mkdir -p /usr/lib/haxe && \
+    curl http://haxe.org/website-content/downloads/3.2.0/downloads/haxe-3.2.0-linux64.tar.gz | \
+    tar -C /usr/lib/haxe --strip-components=1 -xz && \
+    ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \
+    ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \
+    mkdir -p /usr/lib/haxe/lib  && \
+    chmod -R 777 /usr/lib/haxe/lib && \
+    haxelib setup /usr/lib/haxe/lib && \
+    haxelib install hxcpp
+
+# D
+RUN curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \
     dpkg -i /tmp/dmd_2.070.0-0_amd64.deb && \
     rm /tmp/dmd_2.070.0-0_amd64.deb && \
     curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
@@ -164,31 +180,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends xdg-utils && \
     chmod 755 /usr/local/bin/gcc-dmd && \
     echo 'CC=/usr/local/bin/gcc-dmd' >> /etc/dmd.conf
 
-# Dart dependencies
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
-    apt-get update && apt-get install -y --no-install-recommends dart
+# Dart
 ENV PATH /usr/lib/dart/bin:$PATH
 
-# Lua dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      lua5.2 \
-      lua5.2-dev
-
-# MinGW dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      mingw32 \
-      mingw32-binutils \
-#      mingw32-runtime \
-      nsis
-
-# Clean up
-RUN apt-get clean && \
-    rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
 # Force utf8 locale to successfully build Haskell tf-random
 ENV LC_ALL C.UTF-8
 

http://git-wip-us.apache.org/repos/asf/thrift/blob/7be78ea0/build/docker/ubuntu/Dockerfile
----------------------------------------------------------------------
diff --git a/build/docker/ubuntu/Dockerfile b/build/docker/ubuntu/Dockerfile
index 469f026..56708bc 100644
--- a/build/docker/ubuntu/Dockerfile
+++ b/build/docker/ubuntu/Dockerfile
@@ -15,33 +15,45 @@
 # Known missing client libraries:
 #  - None
 
-FROM ubuntu:trusty
+FROM buildpack-deps:trusty-scm
 MAINTAINER Apache Thrift <de...@thrift.apache.org>
 
 ENV DEBIAN_FRONTEND noninteractive
 
-# General dependencies
+# Add apt sources
+# Erlang
+RUN echo 'deb http://packages.erlang-solutions.com/debian trusty contrib' > /etc/apt/sources.list.d/erlang_solutions.list && \
+    curl -sSL https://packages.erlang-solutions.com/debian/erlang_solutions.asc | apt-key add -
+# Dart
+RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
+    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
+    sed -i /etc/apt/sources.list.d/dart_stable.list -e 's/https:/http:/g'
+
+# Consider using mirror nearby when building locally
+# TODO: Provide option via --build-arg=...
+# RUN sed -i /etc/apt/sources.list -e 's!http://archive.ubuntu.com/ubuntu/!http://your/mirror/!g'
+
 RUN apt-get update && apt-get install -y --no-install-recommends \
-      apt-transport-https \
-      autoconf \
-      automake \
+`# General dependencies` \
       bison \
       build-essential \
       clang \
       cmake \
-      curl \
       debhelper \
       flex \
-      g++ \
-      git \
-      libtool \
-      make \
       ninja-build \
-      pkg-config
+      pkg-config \
+`# Included in buildpack-deps` \
+`#      autoconf` \
+`#      automake` \
+`#      g++` \
+`#      git` \
+`#      libtool` \
+`#      make`
 
-# C++ dependencies
-# libevent and OpenSSL are needed by D too
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# C++ dependencies` \
+`# libevent and OpenSSL are needed by D too` \
       libboost-dev \
       libboost-filesystem-dev \
       libboost-program-options-dev \
@@ -54,19 +66,18 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
       qtbase5-dev \
       qtbase5-dev-tools
 
-# Java dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Java dependencies` \
       ant \
       ant-optional \
       openjdk-7-jdk \
-      maven \
-    && update-java-alternatives -s java-1.7.0-openjdk-amd64
+      maven
 
-# Python dependencies
-# TODO:
-# Install twisted and zope.interface via pip. we need twisted at ./configure time, otherwise
-# py.twisted tests are skipped.
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Python dependencies` \
+`# TODO:` \
+`# Install twisted and zope.interface via pip. we need twisted at ./configure time, otherwise` \
+`# py.twisted tests are skipped.` \
       python-all \
       python-all-dbg \
       python-all-dev \
@@ -80,91 +91,102 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
       python3-setuptools \
       python3-pip
 
-# Ruby dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Ruby dependencies` \
       ruby \
       ruby-dev \
-    && gem install bundler rake
-
-# Perl dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Perl dependencies` \
       libbit-vector-perl \
       libclass-accessor-class-perl \
       libcrypt-ssleay-perl \
       libio-socket-ssl-perl \
       libnet-ssleay-perl
 
-# Php dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Php dependencies` \
       php5 \
       php5-dev \
       php5-cli \
       php-pear \
       re2c \
-      phpunit
-
-# GlibC dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends libglib2.0-dev
+      phpunit \
+`# GlibC dependencies` \
+      libglib2.0-dev
 
-# Erlang dependencies
-RUN echo 'deb http://packages.erlang-solutions.com/debian trusty contrib' > /etc/apt/sources.list.d/erlang_solutions.list && \
-    curl -sSL http://packages.erlang-solutions.com/debian/erlang_solutions.asc | apt-key add - && \
-    apt-get update && apt-get install -y --no-install-recommends \
+RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Erlang dependencies` \
       erlang-base \
       erlang-eunit \
       erlang-dev \
       erlang-tools \
       rebar
 
-# Go dependencies
-RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz
-ENV PATH /usr/local/go/bin:$PATH
-
-# Haskell dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Haskell dependencies` \
       ghc \
-      cabal-install
-# Packages tend to be overwritten by build process since we're currently calling cabal update
-#       libghc-binary-dev \
-#       libghc-network-dev \
-#       libghc-http-dev \
-#       libghc-hashable-dev \
-#       libghc-unordered-containers-dev \
-#       libghc-vector-dev
-
-# Haxe
-RUN apt-get update && apt-get install -y --no-install-recommends \
+      cabal-install \
+`# Haxe dependencies` \
       neko \
       neko-dev \
-      libneko0 \
-    && mkdir -p /usr/lib/haxe && \
-    curl http://haxe.org/website-content/downloads/3.2.0/downloads/haxe-3.2.0-linux64.tar.gz | \
-    tar -C /usr/lib/haxe --strip-components=1 -xz && \
-    ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \
-    ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \
-    mkdir -p /usr/lib/haxe/lib  && \
-    chmod -R 777 /usr/lib/haxe/lib && \
-    haxelib setup /usr/lib/haxe/lib && \
-    haxelib install hxcpp
+      libneko0
 
-# Node.js dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# Node.js dependencies` \
       nodejs \
       nodejs-dev \
       nodejs-legacy \
       npm
 
-# CSharp dependencies
 RUN apt-get update && apt-get install -y --no-install-recommends \
+`# CSharp dependencies` \
       libmono-system-web2.0-cil \
       mono-complete \
       mono-devel \
       mono-gmcs \
       mono-xbuild
 
-# D dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends xdg-utils && \
-    curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \
+RUN apt-get update && apt-get install -y --no-install-recommends \
+`# D dependencies` \
+      xdg-utils \
+`# Dart dependencies` \
+      dart \
+`# Lua dependencies` \
+      lua5.2 \
+      lua5.2-dev \
+`# MinGW dependencies` \
+      mingw32 \
+      mingw32-binutils \
+      mingw32-runtime \
+      nsis \
+`# Clean up` \
+    && rm -rf /var/cache/apt/* && \
+    rm -rf /var/lib/apt/lists/* && \
+    rm -rf /tmp/* && \
+    rm -rf /var/tmp/*
+
+# Java
+RUN update-java-alternatives -s java-1.7.0-openjdk-amd64
+
+# Ruby
+RUN gem install bundler rake
+
+# Go
+RUN curl -sSL https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz | tar -C /usr/local/ -xz
+ENV PATH /usr/local/go/bin:$PATH
+
+# Haxe
+RUN mkdir -p /usr/lib/haxe && \
+    curl http://haxe.org/website-content/downloads/3.2.0/downloads/haxe-3.2.0-linux64.tar.gz | \
+    tar -C /usr/lib/haxe --strip-components=1 -xz && \
+    ln -s /usr/lib/haxe/haxe /usr/bin/haxe && \
+    ln -s /usr/lib/haxe/haxelib /usr/bin/haxelib && \
+    mkdir -p /usr/lib/haxe/lib  && \
+    chmod -R 777 /usr/lib/haxe/lib && \
+    haxelib setup /usr/lib/haxe/lib && \
+    haxelib install hxcpp
+
+# D
+RUN curl -sSL http://downloads.dlang.org/releases/2.x/2.070.0/dmd_2.070.0-0_amd64.deb -o /tmp/dmd_2.070.0-0_amd64.deb && \
     dpkg -i /tmp/dmd_2.070.0-0_amd64.deb && \
     rm /tmp/dmd_2.070.0-0_amd64.deb && \
     curl -sSL https://github.com/D-Programming-Deimos/openssl/archive/master.tar.gz| tar xz && \
@@ -177,31 +199,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends xdg-utils && \
     chmod 755 /usr/local/bin/gcc-dmd && \
     echo 'CC=/usr/local/bin/gcc-dmd' >> /etc/dmd.conf
 
-# Dart dependencies
-RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
-    curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list && \
-    apt-get update && apt-get install -y --no-install-recommends dart
+# Dart
 ENV PATH /usr/lib/dart/bin:$PATH
 
-# Lua dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      lua5.2 \
-      lua5.2-dev
-
-# MinGW dependencies
-RUN apt-get update && apt-get install -y --no-install-recommends \
-      mingw32 \
-      mingw32-binutils \
-      mingw32-runtime \
-      nsis
-
-# Clean up
-RUN apt-get clean && \
-    rm -rf /var/cache/apt/* && \
-    rm -rf /var/lib/apt/lists/* && \
-    rm -rf /tmp/* && \
-    rm -rf /var/tmp/*
-
 ENV THRIFT_ROOT /thrift
 RUN mkdir -p $THRIFT_ROOT/src
 COPY scripts $THRIFT_ROOT