Merge pull request #9834 from haberman/merge-to-main

Merge 3.20.x to main
diff --git a/kokoro/linux/64-bit/Dockerfile b/kokoro/linux/64-bit/Dockerfile
deleted file mode 100644
index 189d0cf..0000000
--- a/kokoro/linux/64-bit/Dockerfile
+++ /dev/null
@@ -1,242 +0,0 @@
-# This Dockerfile specifies the recipe for creating an image for the tests
-# to run in.
-#
-# We install as many test dependencies here as we can, because these setup
-# steps can be cached.  They do *not* run every time we run the build.
-# The Docker image is only rebuilt when the Dockerfile (ie. this file)
-# changes.
-
-# Base Dockerfile for gRPC dev images
-FROM debian:latest
-
-# Apt source for old Python versions.
-RUN echo 'deb http://ppa.launchpad.net/fkrull/deadsnakes/ubuntu trusty main' > /etc/apt/sources.list.d/deadsnakes.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DB82666C
-
-# Apt source for Oracle Java.
-RUN echo 'deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main' > /etc/apt/sources.list.d/webupd8team-java-trusty.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 && \
-  echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
-
-# Apt source for Mono
-RUN echo "deb http://download.mono-project.com/repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list && \
-  echo "deb http://download.mono-project.com/repo/debian wheezy-libjpeg62-compat main" | tee -a /etc/apt/sources.list.d/mono-xamarin.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
-
-# Apt source for php
-RUN echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu trusty main" | tee /etc/apt/sources.list.d/various-php.list && \
-  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F4FCBB07
-
-# Install dotnet SDK based on https://www.microsoft.com/net/core#debian
-# (Ubuntu instructions need apt to support https)
-RUN apt-get update && apt-get install -y --force-yes curl libunwind8 gettext && \
-  curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=847105 &&  \
-  mkdir -p /opt/dotnet && tar zxf dotnet.tar.gz -C /opt/dotnet && \
-  ln -s /opt/dotnet/dotnet /usr/local/bin
-
-# Install dependencies.  We start with the basic ones require to build protoc
-# and the C++ build
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  autoconf \
-  autotools-dev \
-  build-essential \
-  bzip2 \
-  ccache \
-  curl \
-  gcc \
-  git \
-  libc6 \
-  libc6-dbg \
-  libc6-dev \
-  libgtest-dev \
-  libtool \
-  make \
-  parallel \
-  time \
-  wget \
-  # -- For csharp --
-  mono-devel \
-  referenceassemblies-pcl \
-  nunit \
-  # -- For all Java builds -- \
-  maven \
-  # -- For java_jdk7 -- \
-  openjdk-7-jdk \
-  # -- For java_oracle7 -- \
-  oracle-java7-installer \
-  # -- For python / python_cpp -- \
-  python-setuptools \
-  python-pip \
-  python-dev \
-  python2.6-dev \
-  python3.3-dev \
-  python3.4-dev \
-  # -- For Ruby --
-  ruby \
-  # -- For C++ benchmarks --
-  cmake \
-  # -- For PHP --
-  php5.6     \
-  php5.6-dev \
-  php5.6-xml \
-  php7.0     \
-  php7.0-dev \
-  php7.0-xml \
-  phpunit    \
-  valgrind   \
-  libxml2-dev \
-  && apt-get clean
-
-##################
-# C# dependencies
-
-RUN wget www.nuget.org/NuGet.exe -O /usr/local/bin/nuget.exe
-
-##################
-# Python dependencies
-
-# These packages exist in apt-get, but their versions are too old, so we have
-# to get updates from pip.
-
-RUN pip install pip --upgrade
-RUN pip install virtualenv tox yattag
-
-##################
-# Ruby dependencies
-
-# Install rvm
-RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
-RUN \curl -sSL https://get.rvm.io | bash -s stable
-
-# Install Ruby 2.1, Ruby 2.2 and JRuby 1.7
-RUN /bin/bash -l -c "rvm install ruby-2.1"
-RUN /bin/bash -l -c "rvm install ruby-2.2"
-RUN /bin/bash -l -c "rvm install jruby-1.7"
-RUN /bin/bash -l -c "echo 'gem: --no-ri --no-rdoc' > ~/.gemrc"
-RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
-RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
-
-##################
-# Java dependencies
-
-# This step requires compiling protoc. :(
-
-ENV MAVEN_REPO /var/maven_local_repository
-ENV MVN mvn --batch-mode
-
-RUN cd /tmp && \
-  git clone https://github.com/google/protobuf.git && \
-  cd protobuf && \
-  git reset --hard 129a6e2aca95dcfb6c3e717d7b9cca1f104fde39 && \
-  ./autogen.sh && \
-  ./configure && \
-  make -j4 && \
-  cd java && \
-  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO && \
-  cd ../javanano && \
-  $MVN install dependency:go-offline -Dmaven.repo.local=$MAVEN_REPO
-
-##################
-# PHP dependencies.
-RUN wget http://am1.php.net/get/php-5.5.38.tar.bz2/from/this/mirror
-RUN mv mirror php-5.5.38.tar.bz2
-RUN tar -xvf php-5.5.38.tar.bz2
-RUN cd php-5.5.38 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.5-zts && \
-    make && make install && cd ..
-RUN cd php-5.5.38 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.5 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-5.6.30.tar.bz2/from/this/mirror
-RUN mv mirror php-5.6.30.tar.bz2
-RUN tar -xvf php-5.6.30.tar.bz2
-RUN cd php-5.6.30 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-5.6-zts && \
-    make && make install && cd ..
-RUN cd php-5.6.30 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-5.6 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.0.18.tar.bz2/from/this/mirror
-RUN mv mirror php-7.0.18.tar.bz2
-RUN tar -xvf php-7.0.18.tar.bz2
-RUN cd php-7.0.18 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.0-zts && \
-    make && make install && cd ..
-RUN cd php-7.0.18 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.0 && \
-    make && make install && cd ..
-
-RUN wget http://am1.php.net/get/php-7.1.4.tar.bz2/from/this/mirror
-RUN mv mirror php-7.1.4.tar.bz2
-RUN tar -xvf php-7.1.4.tar.bz2
-RUN cd php-7.1.4 && ./configure --enable-maintainer-zts --prefix=/usr/local/php-7.1-zts && \
-    make && make install && cd ..
-RUN cd php-7.1.4 && make clean && ./configure --enable-bcmath --prefix=/usr/local/php-7.1 && \
-    make && make install && cd ..
-
-RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-RUN php composer-setup.php
-RUN mv composer.phar /usr/bin/composer
-RUN php -r "unlink('composer-setup.php');"
-RUN composer config -g -- disable-tls true
-RUN composer config -g -- secure-http false
-RUN cd /tmp && \
-  rm -rf protobuf && \
-  git clone https://github.com/google/protobuf.git && \
-  cd protobuf && \
-  git reset --hard 49b44bff2b6257a119f9c6a342d6151c736586b8 && \
-  cd php && \
-  ln -sfn /usr/local/php-5.5/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.5/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.5/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.5 && \
-  ln -sfn /usr/local/php-5.6/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-5.6/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-5.6/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-5.6 && \
-  ln -sfn /usr/local/php-7.0/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.0/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.0/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.0 && \
-  ln -sfn /usr/local/php-7.1/bin/php /usr/bin/php && \
-  ln -sfn /usr/local/php-7.1/bin/php-config /usr/bin/php-config && \
-  ln -sfn /usr/local/php-7.1/bin/phpize /usr/bin/phpize && \
-  composer install && \
-  mv vendor /usr/local/vendor-7.1
-
-##################
-# Go dependencies.
-RUN apt-get install -y  \
-  # -- For go -- \
-  golang
-
-##################
-# Javascript dependencies.
-RUN apt-get install -y \
-  # -- For javascript -- \
-  npm
-
-##################
-# Python 3.5 3.6 dependencies.
-RUN apt-get clean && apt-get update && apt-get install -y --force-yes \
-  python3.5-dev \
-  python3.6-dev \
-  && apt-get clean
-
-# On Debian/Ubuntu, nodejs binary is named 'nodejs' because the name 'node'
-# is taken by another legacy binary. We don't have that legacy binary and
-# npm expects the binary to be named 'node', so we just create a symbol
-# link here.
-RUN ln -s `which nodejs` /usr/bin/node
-
-##################
-# Prepare ccache
-
-RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
-RUN ln -s /usr/bin/ccache /usr/local/bin/g++
-RUN ln -s /usr/bin/ccache /usr/local/bin/cc
-RUN ln -s /usr/bin/ccache /usr/local/bin/c++
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang
-RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
-
-# Define the default command.
-CMD ["bash"]
diff --git a/kokoro/linux/golang/build.sh b/kokoro/linux/golang/build.sh
deleted file mode 100755
index 79cddff..0000000
--- a/kokoro/linux/golang/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERFILE_DIR=kokoro/linux/64-bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="golang"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/golang/continuous.cfg b/kokoro/linux/golang/continuous.cfg
deleted file mode 100644
index 2282f78..0000000
--- a/kokoro/linux/golang/continuous.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/golang/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/golang/presubmit.cfg b/kokoro/linux/golang/presubmit.cfg
deleted file mode 100644
index 2282f78..0000000
--- a/kokoro/linux/golang/presubmit.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/golang/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/java_jdk7/build.sh b/kokoro/linux/java_jdk7/build.sh
deleted file mode 100755
index 0a5604b..0000000
--- a/kokoro/linux/java_jdk7/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERFILE_DIR=kokoro/linux/64-bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_jdk7"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_jdk7/continuous.cfg b/kokoro/linux/java_jdk7/continuous.cfg
deleted file mode 100644
index 07a9df5..0000000
--- a/kokoro/linux/java_jdk7/continuous.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk7/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/java_jdk7/presubmit.cfg b/kokoro/linux/java_jdk7/presubmit.cfg
deleted file mode 100644
index 07a9df5..0000000
--- a/kokoro/linux/java_jdk7/presubmit.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_jdk7/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/java_oracle7/build.sh b/kokoro/linux/java_oracle7/build.sh
deleted file mode 100755
index 9ab90da..0000000
--- a/kokoro/linux/java_oracle7/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERFILE_DIR=kokoro/linux/64-bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="java_oracle7"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/java_oracle7/continuous.cfg b/kokoro/linux/java_oracle7/continuous.cfg
deleted file mode 100644
index 610469b..0000000
--- a/kokoro/linux/java_oracle7/continuous.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_oracle7/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/java_oracle7/presubmit.cfg b/kokoro/linux/java_oracle7/presubmit.cfg
deleted file mode 100644
index 610469b..0000000
--- a/kokoro/linux/java_oracle7/presubmit.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/java_oracle7/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/php80/build.sh b/kokoro/linux/php80/build.sh
deleted file mode 100755
index ba269e5..0000000
--- a/kokoro/linux/php80/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the entry point for kicking off a Kokoro job. This path is referenced
-# from the .cfg files in this directory.
-
-set -ex
-
-cd $(dirname $0)
-
-# Most of our tests use a debug build of PHP, but we do one build against an opt
-# php just in case that surfaces anything unexpected.
-../test_php.sh gcr.io/protobuf-build/php/linux:8.0.5-14a06550010c0649bf69b6c9b803c1ca609bbb6d
-
-../test_php.sh gcr.io/protobuf-build/php/linux:7.0.33-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d
-../test_php.sh gcr.io/protobuf-build/php/linux:7.3.28-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d
-../test_php.sh gcr.io/protobuf-build/php/linux:7.4.18-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d
-../test_php.sh gcr.io/protobuf-build/php/linux:8.0.5-dbg-14a06550010c0649bf69b6c9b803c1ca609bbb6d
diff --git a/kokoro/linux/php80/continuous.cfg b/kokoro/linux/php80/continuous.cfg
deleted file mode 100644
index 6d67a8c..0000000
--- a/kokoro/linux/php80/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php80/build.sh"
-timeout_mins: 20
diff --git a/kokoro/linux/php80/presubmit.cfg b/kokoro/linux/php80/presubmit.cfg
deleted file mode 100644
index 6d67a8c..0000000
--- a/kokoro/linux/php80/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/php80/build.sh"
-timeout_mins: 20
diff --git a/kokoro/linux/python_compatibility/build.sh b/kokoro/linux/python_compatibility/build.sh
deleted file mode 100755
index 1ba3539..0000000
--- a/kokoro/linux/python_compatibility/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERFILE_DIR=kokoro/linux/64-bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python_compatibility"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python_compatibility/continuous.cfg b/kokoro/linux/python_compatibility/continuous.cfg
deleted file mode 100644
index 4cf6bb0..0000000
--- a/kokoro/linux/python_compatibility/continuous.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/python_compatibility/presubmit.cfg b/kokoro/linux/python_compatibility/presubmit.cfg
deleted file mode 100644
index 4cf6bb0..0000000
--- a/kokoro/linux/python_compatibility/presubmit.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_compatibility/build.sh"
-timeout_mins: 1440
diff --git a/kokoro/linux/python_cpp/build.sh b/kokoro/linux/python_cpp/build.sh
deleted file mode 100755
index add6465..0000000
--- a/kokoro/linux/python_cpp/build.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-#
-# This is the top-level script we give to Kokoro as the entry point for
-# running the "pull request" project:
-#
-# This script selects a specific Dockerfile (for building a Docker image) and
-# a script to run inside that image.  Then we delegate to the general
-# build_and_run_docker.sh script.
-
-# Change to repo root
-cd $(dirname $0)/../../..
-
-export DOCKERFILE_DIR=kokoro/linux/64-bit
-export DOCKER_RUN_SCRIPT=kokoro/linux/pull_request_in_docker.sh
-export OUTPUT_DIR=testoutput
-export TEST_SET="python_cpp"
-./kokoro/linux/build_and_run_docker.sh
diff --git a/kokoro/linux/python_cpp/continuous.cfg b/kokoro/linux/python_cpp/continuous.cfg
deleted file mode 100644
index b1b0e55..0000000
--- a/kokoro/linux/python_cpp/continuous.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_cpp/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/kokoro/linux/python_cpp/presubmit.cfg b/kokoro/linux/python_cpp/presubmit.cfg
deleted file mode 100644
index b1b0e55..0000000
--- a/kokoro/linux/python_cpp/presubmit.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-# Config file for running tests in Kokoro
-
-# Location of the build script in repository
-build_file: "protobuf/kokoro/linux/python_cpp/build.sh"
-timeout_mins: 120
-
-action {
-  define_artifacts {
-    regex: "**/sponge_log.xml"
-  }
-}
diff --git a/python/google/protobuf/internal/api_implementation.py b/python/google/protobuf/internal/api_implementation.py
index 96dd096..7458648 100644
--- a/python/google/protobuf/internal/api_implementation.py
+++ b/python/google/protobuf/internal/api_implementation.py
@@ -59,10 +59,25 @@
   pass  # Unspecified by compiler flags.
 
 
+def _CanImport(mod_name):
+  try:
+    mod = importlib.import_module(mod_name)
+    # Work around a known issue in the classic bootstrap .par import hook.
+    if not mod:
+      raise ImportError(mod_name + ' import succeeded but was None')
+    return True
+  except ImportError:
+    return False
 
 
 if _implementation_type is None:
-  _implementation_type = 'python'
+  if _CanImport('google._upb._message'):
+    _implementation_type = 'upb'
+  elif _CanImport('google.protobuf.pyext._message'):
+    _implementation_type = 'cpp'
+  else:
+    _implementation_type = 'python'
+
 
 # This environment variable can be used to switch to a certain implementation
 # of the Python API, overriding the compile-time constants in the
@@ -98,7 +113,7 @@
 if _implementation_type == 'upb':
   try:
     # pylint: disable=g-import-not-at-top
-    from google.protobuf.pyext import _upb_message as _message
+    from google._upb import _message
     _c_module = _message
     del _message
   except ImportError: