Merge pull request #14967 from ZhouyihaiDing/windows_pecl

Upmerge #14973 to the master
diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc
index 0ef7c03..44d8cf2 100644
--- a/src/core/lib/iomgr/ev_epollex_linux.cc
+++ b/src/core/lib/iomgr/ev_epollex_linux.cc
@@ -59,7 +59,10 @@
 //#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1
 
 #define MAX_EPOLL_EVENTS 100
-#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 1
+// TODO(juanlishen): We use a greater-than-one value here as a workaround fix to
+// a keepalive ping timeout issue. We may want to revert https://github
+// .com/grpc/grpc/pull/14943 once we figure out the root cause.
+#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 16
 
 grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false,
                                                            "pollable_refcount");
@@ -198,6 +201,7 @@
 
 struct grpc_pollset {
   gpr_mu mu;
+  gpr_atm worker_count;
   pollable* active_pollable;
   bool kicked_without_poller;
   grpc_closure* shutdown_closure;
@@ -685,6 +689,7 @@
 
 static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) {
   gpr_mu_init(&pollset->mu);
+  gpr_atm_no_barrier_store(&pollset->worker_count, 0);
   pollset->active_pollable = POLLABLE_REF(g_empty_pollable, "pollset");
   pollset->kicked_without_poller = false;
   pollset->shutdown_closure = nullptr;
@@ -758,8 +763,20 @@
                                            pollable* pollable_obj, bool drain) {
   GPR_TIMER_SCOPE("pollable_process_events", 0);
   static const char* err_desc = "pollset_process_events";
+  // Use a simple heuristic to determine how many fd events to process
+  // per loop iteration.  (events/workers)
+  int handle_count = 1;
+  int worker_count = gpr_atm_no_barrier_load(&pollset->worker_count);
+  GPR_ASSERT(worker_count > 0);
+  handle_count =
+      (pollable_obj->event_count - pollable_obj->event_cursor) / worker_count;
+  if (handle_count == 0) {
+    handle_count = 1;
+  } else if (handle_count > MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) {
+    handle_count = MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL;
+  }
   grpc_error* error = GRPC_ERROR_NONE;
-  for (int i = 0; (drain || i < MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) &&
+  for (int i = 0; (drain || i < handle_count) &&
                   pollable_obj->event_cursor != pollable_obj->event_count;
        i++) {
     int n = pollable_obj->event_cursor++;
@@ -884,6 +901,7 @@
   GPR_TIMER_SCOPE("begin_worker", 0);
   bool do_poll =
       (pollset->shutdown_closure == nullptr && !pollset->already_shutdown);
+  gpr_atm_no_barrier_fetch_add(&pollset->worker_count, 1);
   if (worker_hdl != nullptr) *worker_hdl = worker;
   worker->initialized_cv = false;
   worker->kicked = false;
@@ -964,6 +982,7 @@
   if (worker->initialized_cv) {
     gpr_cv_destroy(&worker->cv);
   }
+  gpr_atm_no_barrier_fetch_add(&pollset->worker_count, -1);
 }
 
 #ifndef NDEBUG
diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile.template
deleted file mode 100644
index 1f6755e..0000000
--- a/templates/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile.template
+++ /dev/null
@@ -1,80 +0,0 @@
-%YAML 1.2
---- |
-  # Copyright 2017 gRPC authors.
-  #
-  # Licensed under the Apache License, Version 2.0 (the "License");
-  # you may not use this file except in compliance with the License.
-  # You may obtain a copy of the License at
-  #
-  #     http://www.apache.org/licenses/LICENSE-2.0
-  #
-  # Unless required by applicable law or agreed to in writing, software
-  # distributed under the License is distributed on an "AS IS" BASIS,
-  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  # See the License for the specific language governing permissions and
-  # limitations under the License.
-
-  FROM debian:jessie
-
-  # Install JDK 8 and Git
-  RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && ${'\\'}
-    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && ${'\\'}
-    echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && ${'\\'}
-    apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
-  RUN apt-get update && apt-get -y install ${'\\'}
-        git ${'\\'}
-        libapr1 ${'\\'}
-        oracle-java8-installer ${'\\'}
-        && ${'\\'}
-      apt-get clean && rm -r /var/cache/oracle-jdk8-installer/
-  ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
-  ENV PATH $PATH:$JAVA_HOME/bin
-
-  # Install protobuf
-  RUN apt-get update && apt-get install -y ${'\\'}
-        autoconf ${'\\'}
-        build-essential ${'\\'}
-        curl ${'\\'}
-        gcc ${'\\'}
-        libtool ${'\\'}
-        unzip ${'\\'}
-        && ${'\\'}
-      apt-get clean
-  WORKDIR /
-  RUN git clone https://github.com/google/protobuf.git
-  WORKDIR /protobuf
-  RUN git checkout v3.3.1 && ${'\\'}
-    ./autogen.sh && ${'\\'}
-    ./configure && ${'\\'}
-    make && ${'\\'}
-    make check && ${'\\'}
-    make install
-
-  # Install gcloud command line tools
-  ENV CLOUD_SDK_REPO "cloud-sdk-jessie"
-  RUN echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && ${'\\'}
-    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && ${'\\'}
-    apt-get update && apt-get install -y google-cloud-sdk && apt-get clean && ${'\\'}
-    gcloud config set component_manager/disable_update_check true
-
-  # Install Android SDK
-  WORKDIR /
-  RUN mkdir android-sdk
-  WORKDIR android-sdk
-  RUN wget -q https://dl.google.com/android/repository/tools_r25.2.5-linux.zip && ${'\\'}
-    unzip -qq tools_r25.2.5-linux.zip && ${'\\'}
-    rm tools_r25.2.5-linux.zip && ${'\\'}
-    echo y | tools/bin/sdkmanager "platforms;android-22" && ${'\\'}
-    echo y | tools/bin/sdkmanager "build-tools;25.0.2" && ${'\\'}
-    echo y | tools/bin/sdkmanager "extras;android;m2repository" && ${'\\'}
-    echo y | tools/bin/sdkmanager "extras;google;google_play_services" && ${'\\'}
-    echo y | tools/bin/sdkmanager "extras;google;m2repository" && ${'\\'}
-    echo y | tools/bin/sdkmanager "patcher;v4" && ${'\\'}
-    echo y | tools/bin/sdkmanager "platform-tools"
-  ENV ANDROID_HOME "/android-sdk"
-
-  # Reset the working directory
-  WORKDIR /
-
-  # Define the default command.
-  CMD ["bash"]
diff --git a/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile
deleted file mode 100644
index 519cdbf..0000000
--- a/tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright 2017 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-FROM debian:jessie
-
-# Install JDK 8 and Git
-RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
-  echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && \
-  echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && \
-  apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
-RUN apt-get update && apt-get -y install \
-      git \
-      libapr1 \
-      oracle-java8-installer \
-      && \
-    apt-get clean && rm -r /var/cache/oracle-jdk8-installer/
-ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
-ENV PATH $PATH:$JAVA_HOME/bin
-
-# Install protobuf
-RUN apt-get update && apt-get install -y \
-      autoconf \
-      build-essential \
-      curl \
-      gcc \
-      libtool \
-      unzip \
-      && \
-    apt-get clean
-WORKDIR /
-RUN git clone https://github.com/google/protobuf.git
-WORKDIR /protobuf
-RUN git checkout v3.3.1 && \
-  ./autogen.sh && \
-  ./configure && \
-  make && \
-  make check && \
-  make install
-
-# Install gcloud command line tools
-ENV CLOUD_SDK_REPO "cloud-sdk-jessie"
-RUN echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
-  curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \
-  apt-get update && apt-get install -y google-cloud-sdk && apt-get clean && \
-  gcloud config set component_manager/disable_update_check true
-
-# Install Android SDK
-WORKDIR /
-RUN mkdir android-sdk
-WORKDIR android-sdk
-RUN wget -q https://dl.google.com/android/repository/tools_r25.2.5-linux.zip && \
-  unzip -qq tools_r25.2.5-linux.zip && \
-  rm tools_r25.2.5-linux.zip && \
-  echo y | tools/bin/sdkmanager "platforms;android-22" && \
-  echo y | tools/bin/sdkmanager "build-tools;25.0.2" && \
-  echo y | tools/bin/sdkmanager "extras;android;m2repository" && \
-  echo y | tools/bin/sdkmanager "extras;google;google_play_services" && \
-  echo y | tools/bin/sdkmanager "extras;google;m2repository" && \
-  echo y | tools/bin/sdkmanager "patcher;v4" && \
-  echo y | tools/bin/sdkmanager "platform-tools"
-ENV ANDROID_HOME "/android-sdk"
-
-# Reset the working directory
-WORKDIR /
-
-# Define the default command.
-CMD ["bash"]
diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh
index dac29b9..e6d0fdf 100755
--- a/tools/run_tests/helper_scripts/build_python.sh
+++ b/tools/run_tests/helper_scripts/build_python.sh
@@ -132,7 +132,7 @@
 # Perform build operations #
 ############################
 
-# Instnatiate the virtualenv, preferring to do so from the relevant python
+# Instantiate the virtualenv, preferring to do so from the relevant python
 # version. Even if these commands fail (e.g. on Windows due to name conflicts)
 # it's possible that the virtualenv is still usable and we trust the tester to
 # be able to 'figure it out' instead of us e.g. doing potentially expensive and
@@ -158,7 +158,7 @@
   ;;
 esac
 
-$VENV_PYTHON -m pip install --upgrade pip==9.0.1
+$VENV_PYTHON -m pip install --upgrade pip
 $VENV_PYTHON -m pip install setuptools
 $VENV_PYTHON -m pip install cython
 $VENV_PYTHON -m pip install six enum34 protobuf futures
diff --git a/tools/run_tests/interop/android/android_interop_helper.sh b/tools/run_tests/interop/android/android_interop_helper.sh
deleted file mode 100755
index 116549b..0000000
--- a/tools/run_tests/interop/android/android_interop_helper.sh
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-# Copyright 2017 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Helper that runs inside the docker container and builds the APKs and
-# invokes Firebase Test Lab via gcloud.
-
-SERVICE_KEY=$1
-
-gcloud auth activate-service-account --key-file="$SERVICE_KEY" || exit 1
-gcloud config set project grpc-testing || exit 1
-
-rm -rf grpc-java
-git clone https://github.com/grpc/grpc-java.git
-cd grpc-java
-./gradlew install || exit 1
-cd android-interop-testing
-../gradlew assembleDebug
-../gradlew assembleDebugAndroidTest
-
-gcloud firebase test android run \
-  --type instrumentation \
-  --app app/build/outputs/apk/app-debug.apk \
-  --test app/build/outputs/apk/app-debug-androidTest.apk \
-  --device model=Nexus6,version=21,locale=en,orientation=portrait
diff --git a/tools/run_tests/interop/android/run_android_tests_on_firebase.sh b/tools/run_tests/interop/android/run_android_tests_on_firebase.sh
deleted file mode 100755
index f6472eb..0000000
--- a/tools/run_tests/interop/android/run_android_tests_on_firebase.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-# Copyright 2017 gRPC authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Builds the gRPC Android instrumented interop tests inside a docker container
-# and runs them on Firebase Test Lab
-
-DOCKERFILE=tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile
-DOCKER_TAG=android_interop_test
-SERVICE_KEY=~/android-interops-service-key.json
-HELPER=$(pwd)/tools/run_tests/interop/android/android_interop_helper.sh
-
-docker build -t "$DOCKER_TAG" -f "$DOCKERFILE" .
-
-docker run --interactive --rm \
-  --volume="$SERVICE_KEY":/service-key.json:ro \
-  --volume="$HELPER":/android_interop_helper.sh:ro \
-  $DOCKER_TAG \
-      /bin/bash -c "/android_interop_helper.sh /service-key.json"