You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2019/08/22 01:34:12 UTC

[kudu] 02/02: [thirdparty] introduce chrony

This is an automated email from the ASF dual-hosted git repository.

alexey pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git

commit 0f38821c4867b86044be22dbceb80c7bc04b5d33
Author: Alexey Serbin <al...@apache.org>
AuthorDate: Wed Jul 24 14:36:07 2019 -0700

    [thirdparty] introduce chrony
    
    Added chrony into the thirdparty: a set of follow-up patches use the
    chronyd NTP implementation and its chronyc CLI to provide the
    functionality of reference NTP servers for test scenarios involving
    Kudu built-in NTP client.
    
    One nice feature that chronyd has is the ability to run in server-only
    mode, i.e. not driving the system clock: 'man chronyd', the '-x' option.
    Also, it's possible to chronyd NTP server using the system clock
    as a source instead of a physical device (GPS, oscillator, etc.).
    In addition, it's possible to manually set the reference time for
    chrony NTP server running in server-only local mode.  The chrony suite
    has 'chronyc' CLI tool to send control commands to chronyd NTP daemon.
    
    As of now, the latest version 3.5 is used with not-yet-upstream patch
    to drop the requirements of being run under superuser UID when driving
    the system clock is not required (e.g., when running in server-only
    mode, see '-x' command-line flag).
    
    Change-Id: I71ed12311b10979af8a12094881b6b8b47ef8008
    Reviewed-on: http://gerrit.cloudera.org:8080/13915
    Tested-by: Kudu Jenkins
    Reviewed-by: Adar Dembo <ad...@cloudera.com>
    Reviewed-by: Grant Henke <gr...@apache.org>
---
 thirdparty/build-definitions.sh              | 40 ++++++++++++++++++++++++++++
 thirdparty/build-thirdparty.sh               |  5 ++++
 thirdparty/download-thirdparty.sh            |  7 +++++
 thirdparty/patches/chrony-no-superuser.patch | 31 +++++++++++++++++++++
 thirdparty/vars.sh                           |  3 +++
 5 files changed, 86 insertions(+)

diff --git a/thirdparty/build-definitions.sh b/thirdparty/build-definitions.sh
index f125ea5..8dcad99 100644
--- a/thirdparty/build-definitions.sh
+++ b/thirdparty/build-definitions.sh
@@ -1004,3 +1004,43 @@ build_yaml() {
     popd
   done
 }
+
+build_chrony() {
+  CHRONY_BDIR=$TP_BUILD_DIR/$CHRONY_NAME$MODE_SUFFIX
+  mkdir -p $CHRONY_BDIR
+  pushd $CHRONY_BDIR
+
+  # The configure script for chrony doesn't follow the common policy of
+  # the autogen tools (probably, it's manually written from scratch).
+  # It's not possible to configure and build chrony in a separate directory;
+  # it's necessary to do so in the source directory itself.
+  rsync -av --delete $CHRONY_SOURCE/ .
+
+  # In the scope of using chrony in Kudu test framework, it's better to have
+  # leaner binaries for chronyd and chronyc, stripping off everything but
+  # essential functionality.
+  CFLAGS="$EXTRA_CFLAGS" \
+    CXXFLAGS="$EXTRA_CXXFLAGS" \
+    LDFLAGS="$EXTRA_LDFLAGS" \
+    LIBS="$EXTRA_LIBS" \
+    ./configure \
+    --prefix=$PREFIX \
+    --sysconfdir=$PREFIX/etc \
+    --localstatedir=$PREFIX/var \
+    --enable-debug \
+    --disable-ipv6 \
+    --disable-pps \
+    --disable-privdrop \
+    --disable-readline \
+    --without-editline \
+    --without-nettle \
+    --without-nss \
+    --without-tomcrypt \
+    --without-libcap \
+    --without-seccomp \
+    --disable-forcednsretry \
+    --disable-sechash
+
+  make -j$PARALLEL $EXTRA_MAKEFLAGS install
+  popd
+}
diff --git a/thirdparty/build-thirdparty.sh b/thirdparty/build-thirdparty.sh
index 169300d..81d36d6 100755
--- a/thirdparty/build-thirdparty.sh
+++ b/thirdparty/build-thirdparty.sh
@@ -102,6 +102,7 @@ else
       "hive")         F_HIVE=1 ;;
       "sentry")       F_SENTRY=1 ;;
       "yaml")         F_YAML=1 ;;
+      "chrony")       F_CHRONY=1 ;;
       *)              echo "Unknown module: $arg"; exit 1 ;;
     esac
   done
@@ -247,6 +248,10 @@ if [ -n "$F_COMMON" -o -n "$F_BISON" ]; then
   build_bison
 fi
 
+if [ -n "$F_COMMON" -o -n "$F_CHRONY" ]; then
+  build_chrony
+fi
+
 # Install Hadoop, Hive, and Sentry by symlinking their source directories (which
 # are pre-built) into $PREFIX/opt.
 if [ -n "$F_COMMON" -o -n "$F_HADOOP" ]; then
diff --git a/thirdparty/download-thirdparty.sh b/thirdparty/download-thirdparty.sh
index ee481c3..7160c5d 100755
--- a/thirdparty/download-thirdparty.sh
+++ b/thirdparty/download-thirdparty.sh
@@ -442,5 +442,12 @@ fetch_and_patch \
  $YAML_SOURCE \
  $YAML_PATCHLEVEL
 
+CHRONY_PATCHLEVEL=1
+fetch_and_patch \
+ $CHRONY_NAME.tar.gz \
+ $CHRONY_SOURCE \
+ $CHRONY_PATCHLEVEL \
+ "patch -p1 < $TP_DIR/patches/chrony-no-superuser.patch"
+
 echo "---------------"
 echo "Thirdparty dependencies downloaded successfully"
diff --git a/thirdparty/patches/chrony-no-superuser.patch b/thirdparty/patches/chrony-no-superuser.patch
new file mode 100644
index 0000000..937f5d9
--- /dev/null
+++ b/thirdparty/patches/chrony-no-superuser.patch
@@ -0,0 +1,31 @@
+commit ecdaaf222a126ec9aeecb0479e2337f875a9618f
+Author: Alexey Serbin <al...@apache.org>
+Date:   Tue Aug 20 16:47:02 2019 -0700
+
+    main: allow to run under regular user in server-only mode
+    
+    This patch allows for running chronyd under non-superuser account when
+    no clock control is requested (i.e. when '-d' option is specified).
+    
+    The motivation for this change is to run chronyd in server-only mode
+    (i.e. not driving system's clock) in various development and testing
+    environments.  Of course, it's assumed non-standard ports are used
+    for the NTP and the command endpoints in such a case, otherwise
+    chronyd would fail to bind to the standard NTP (123) and
+    command (323) ports since these are privileged ones.
+
+diff --git a/main.c b/main.c
+index fafca65..d94a3b5 100644
+--- a/main.c
++++ b/main.c
+@@ -501,8 +501,9 @@ int main
+     }
+   }
+ 
+-  if (getuid() && !client_only)
++  if (getuid() && !(client_only || !clock_control)) {
+     LOG_FATAL("Not superuser");
++  }
+ 
+   /* Turn into a daemon */
+   if (!nofork) {
diff --git a/thirdparty/vars.sh b/thirdparty/vars.sh
index 3bbcaa1..1c386c0 100644
--- a/thirdparty/vars.sh
+++ b/thirdparty/vars.sh
@@ -244,3 +244,6 @@ YAML_VERSION=0.6.2
 YAML_NAME=yaml-cpp-yaml-cpp-$YAML_VERSION
 YAML_SOURCE=$TP_SOURCE_DIR/$YAML_NAME
 
+CHRONY_VERSION=3.5
+CHRONY_NAME=chrony-$CHRONY_VERSION
+CHRONY_SOURCE=$TP_SOURCE_DIR/$CHRONY_NAME