Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
01d4753
added unit test sharding
daniel-sanche Jun 12, 2026
a7502d4
run system tests concurrently
daniel-sanche Jun 12, 2026
9ad0f0c
added changes to many packages for testing
daniel-sanche Jun 12, 2026
02c7653
added sharding test file
daniel-sanche Jun 12, 2026
3c8d057
added unit-complete to gather all shards
daniel-sanche Jun 12, 2026
73ab091
changed shard params
daniel-sanche Jun 12, 2026
74f1ef7
fixed tests
daniel-sanche Jun 12, 2026
a450254
fix coverage
daniel-sanche Jun 12, 2026
af4d10c
fix system tests
daniel-sanche Jun 12, 2026
15916df
split out system test logs
daniel-sanche Jun 12, 2026
49cac0f
attempt fix for lint
daniel-sanche Jun 12, 2026
d8dd522
update system tests to show logs for each target
daniel-sanche Jun 12, 2026
de74a68
update sharding logic
daniel-sanche Jun 12, 2026
46d1583
fixed lint/mypy runs
daniel-sanche Jun 12, 2026
6e3531d
removed sqlalchemy-spanner from touched packages
daniel-sanche Jun 12, 2026
e6167bd
system tests print all logs in main build log
daniel-sanche Jun 12, 2026
fd5792d
removed many SHARD_TEST files
daniel-sanche Jun 12, 2026
8b825d5
updated lint and mypy logic
daniel-sanche Jun 12, 2026
32968a9
add shard descriptions
daniel-sanche Jun 12, 2026
ff1274f
remove global run on ci/ change
daniel-sanche Jun 12, 2026
c49b06d
attempt cover fix
daniel-sanche Jun 12, 2026
1cd8c1f
attempt fix for cover
daniel-sanche Jun 12, 2026
a0f5c9a
allow hidden files for cover
daniel-sanche Jun 12, 2026
71f444a
fail fast
daniel-sanche Jun 12, 2026
cf1a1f1
use individual coverage checks
daniel-sanche Jun 12, 2026
b00967f
loosen firestore coverage requirement
daniel-sanche Jun 12, 2026
7bb323c
activated more packages
daniel-sanche Jun 12, 2026
3633089
10 packages total
daniel-sanche Jun 13, 2026
980d8eb
change default for coverage percent
daniel-sanche Jun 13, 2026
a5cc497
activated 11th package (enable sharding)
daniel-sanche Jun 13, 2026
b36b559
fixed typo
daniel-sanche Jun 13, 2026
c3cf49e
change shard logic
daniel-sanche Jun 13, 2026
acdfb18
iterating on shard logic
daniel-sanche Jun 13, 2026
9c80a51
rename tests
daniel-sanche Jun 13, 2026
cf554ca
add label to number in shard
daniel-sanche Jun 13, 2026
886d6d9
unit tests fail if initialize fails
daniel-sanche Jun 13, 2026
83ca04a
added known-bad package
daniel-sanche Jun 13, 2026
ae05642
added summary to cover step
daniel-sanche Jun 13, 2026
7b565a4
added no-fail .coveragerc to sqlalchemy-spanner
daniel-sanche Jun 13, 2026
72503de
Merge branch 'main' into ci_sharding
daniel-sanche Jun 18, 2026
e34b654
reverted systen test changes
daniel-sanche Jun 19, 2026
6c1be8b
added github tag to test all packages
daniel-sanche Jul 6, 2026
8fb68d3
re-run when label added
daniel-sanche Jul 6, 2026
fb90860
don't trigger on label changes
daniel-sanche Jul 6, 2026
6123e7a
revered unrelated changes
daniel-sanche Jul 6, 2026
c99a693
increased shard count
daniel-sanche Jul 6, 2026
ee7cabc
isolate specific packages
daniel-sanche Jul 6, 2026
40d31e3
isolated shards should be included in max_shard count
daniel-sanche Jul 6, 2026
89e5499
changed shard names
daniel-sanche Jul 6, 2026
a1fab95
use pacakge weights instead of isolation
daniel-sanche Jul 6, 2026
92626bd
parallelize final cover check
daniel-sanche Jul 6, 2026
8c4d2dd
resolve merge conflict
daniel-sanche Jul 6, 2026
7ccca59
Merge branch 'main' into ci_sharding
daniel-sanche Jul 6, 2026
2e9bafc
added additional weights
daniel-sanche Jul 6, 2026
f14d489
pack shards alphabetically
daniel-sanche Jul 6, 2026
e4495b8
fixed typo
daniel-sanche Jul 6, 2026
80f0061
avoid combining all coverage files
daniel-sanche Jul 6, 2026
964e142
optimized coverage step
daniel-sanche Jul 7, 2026
b4733da
fix coverage files
daniel-sanche Jul 7, 2026
8ea10ec
change MAX_JOBS
daniel-sanche Jul 7, 2026
bdc977a
end early if fail_under = 0
daniel-sanche Jul 7, 2026
5cb0e26
added pip cache
daniel-sanche Jul 7, 2026
deaabe7
fixing bug in coverage search
daniel-sanche Jul 7, 2026
b20bb1a
enable test against ces
daniel-sanche Jul 7, 2026
15421a7
removed empty file
daniel-sanche Jul 7, 2026
b4f9d9d
updated find call
daniel-sanche Jul 7, 2026
b9f750d
combine coverage in shards
daniel-sanche Jul 7, 2026
073dc07
Revert "combine coverage in shards"
daniel-sanche Jul 7, 2026
da2f41e
use RAM disk for coverage results
daniel-sanche Jul 7, 2026
e611fe7
made max shards configurable
daniel-sanche Jul 7, 2026
e453d2c
added test files
daniel-sanche Jul 7, 2026
45b5e68
define package weights in yaml
daniel-sanche Jul 7, 2026
fa06713
added fast path for coverage check
daniel-sanche Jul 7, 2026
cd33370
undo fast-path optimization
daniel-sanche Jul 7, 2026
5bfe2d1
only upload coverage for first and last supported version
daniel-sanche Jul 7, 2026
6c0566f
use 3.10 as lower bound
daniel-sanche Jul 7, 2026
e1bedf1
avoid going over max_shards
daniel-sanche Jul 7, 2026
60a3e74
fixed coverage condition
daniel-sanche Jul 7, 2026
a4566cf
use all runtimes in coverage
daniel-sanche Jul 7, 2026
010e1ad
remove empty files
daniel-sanche Jul 7, 2026
e35ea34
removed duplication
daniel-sanche Jul 7, 2026
d04104d
cleaned up conditional tests
daniel-sanche Jul 7, 2026
cf3de20
added back subdirs
daniel-sanche Jul 7, 2026
f1eb3a4
added comments to sharding script
daniel-sanche Jul 7, 2026
c70613a
moved script out of yaml
daniel-sanche Jul 7, 2026
eaf75e9
print only count for successes
daniel-sanche Jul 7, 2026
fb71278
Merge branch 'main' into ci_sharding
daniel-sanche Jul 17, 2026
a05d1fb
update spanner coveragerc
daniel-sanche Jul 17, 2026
04fb332
changed sqlalchemy-spanner coverage value
daniel-sanche Jul 17, 2026
4382fcc
added comment
daniel-sanche Jul 22, 2026
4e8892c
fixed truncation issues
daniel-sanche Jul 22, 2026
7ca0171
Merge branch 'main' into ci_sharding
daniel-sanche Jul 24, 2026
eefea36
Merge branch 'main' into ci_sharding
daniel-sanche Jul 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 36 additions & 7 deletions .github/workflows/unittest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,40 @@ permissions:
contents: read

jobs:
discover:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.10"
- name: Get package shards
id: set-matrix
env:
BUILD_TYPE: presubmit
TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }}
run: |
if [ -n "$TARGET_BRANCH" ]; then
git fetch origin "$TARGET_BRANCH" --deepen=200
fi
echo "matrix=$(python ci/get_package_shards.py)" >> $GITHUB_OUTPUT

unit:
needs: discover
if: needs.discover.outputs.matrix != '[]' && needs.discover.outputs.matrix != ''
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
python: ['3.9', '3.10', "3.11", "3.12", "3.13", "3.14"]
package_shard: ${{ fromJson(needs.discover.outputs.matrix) }}
name: unit (${{ matrix.package_shard.name }}, ${{ matrix.python }})
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -36,17 +65,18 @@ jobs:
python -m pip install nox
- name: Run unit tests
env:
COVERAGE_FILE: .coverage-${{ matrix.python }}
COVERAGE_FILE: ${{ github.workspace }}/.coverage-${{ matrix.python }}
BUILD_TYPE: presubmit
TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }}
TEST_TYPE: unit
PY_VERSION: ${{ matrix.python }}
PACKAGE_LIST: ${{ matrix.package_shard.packages }}
run: |
ci/run_conditional_tests.sh
- name: Upload coverage results
uses: actions/upload-artifact@v4
with:
name: coverage-artifact-${{ '{{' }} matrix.python {{ '}}' }}
name: coverage-artifact-${{ matrix.python }}-${{ matrix.package_shard.index }}
path: .coverage-${{ matrix.python }}

cover:
Expand All @@ -67,20 +97,19 @@ jobs:
python-version: "3.10"
- name: Set number of files changes in packages directory
id: packages
run: echo "::set-output name=num_files_changed::$(git diff HEAD~1 -- packages | wc -l)"
run: echo "num_files_changed=$(git diff HEAD~1 -- packages | wc -l)" >> $GITHUB_OUTPUT
- name: Install coverage
if: steps.packages.num_files_changed > 0
if: steps.packages.outputs.num_files_changed > 0
run: |
python -m pip install --upgrade setuptools pip wheel
python -m pip install coverage
- name: Download coverage results
if: ${{ steps.date.packages.num_files_changed > 0 }}
if: steps.packages.outputs.num_files_changed > 0
uses: actions/download-artifact@v4
with:
path: .coverage-results/
- name: Report coverage results
if: ${{ steps.date.packages.num_files_changed > 0 }}
if: steps.packages.outputs.num_files_changed > 0
run: |
find .coverage-results -type f -name '*.zip' -exec unzip {} \;
coverage combine .coverage-results/**/.coverage*
coverage report --show-missing --fail-under=100
88 changes: 86 additions & 2 deletions .kokoro/system.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ run_package_test() {
local package_name=$1
local package_path="packages/${package_name}"

# Isolate gcloud config for parallel execution
export CLOUDSDK_CONFIG=$(mktemp -d)
Comment thread
parthea marked this conversation as resolved.
Outdated

# Declare local overrides to prevent bleeding into the next loop iteration
local PROJECT_ID
local GOOGLE_APPLICATION_CREDENTIALS
Expand Down Expand Up @@ -87,12 +90,52 @@ run_package_test() {
set -e
popd > /dev/null

# Clean up isolated gcloud config
rm -rf "${CLOUDSDK_CONFIG}"
Comment thread
parthea marked this conversation as resolved.
Outdated

return $res
}

# A file for running system tests
system_test_script="${PROJECT_ROOT}/.kokoro/system-single.sh"

# Parallel execution settings
MAX_PARALLEL=4
running_pids=()
declare -A pid_to_pkg
declare -A pid_to_log
declare -A pid_to_resfile

# Array to keep track of results for the final summary
results=()

handle_finished_job() {
local pid=$1
local pkg=${pid_to_pkg[$pid]}
local log=${pid_to_log[$pid]}
local resfile=${pid_to_resfile[$pid]}

# wait $pid might fail if it was already reaped by wait -n,
# so we ignore its exit code and use the resfile.
wait "$pid" 2>/dev/null || true

local res=$(cat "$resfile")
rm "$resfile"

echo "------------------------------------------------------------"
echo "System tests for ${pkg} finished (Exit code: ${res})"
echo "------------------------------------------------------------"
cat "$log"
rm "$log"

if [ "${res}" -ne 0 ]; then
RETVAL=${res}
results+=("${pkg}: FAILED")
else
results+=("${pkg}: PASSED")
fi
}

# Run system tests for each package with directory packages/*/tests/system
for path in `find 'packages' \
\( -type d -wholename 'packages/*/tests/system' \) -o \
Expand Down Expand Up @@ -140,10 +183,51 @@ for path in `find 'packages' \
set -e

if [[ "${package_modified}" -gt 0 || "$KOKORO_BUILD_ARTIFACTS_SUBDIR" == *"continuous"* ]]; then
# Call the function - its internal exports won't affect the next loop
run_package_test "$package_name" || RETVAL=$?
# Wait if we have reached MAX_PARALLEL
while [[ ${#running_pids[@]} -ge $MAX_PARALLEL ]]; do
wait -n
# Find which job finished
new_pids=()
for pid in "${running_pids[@]}"; do
if kill -0 "$pid" 2>/dev/null; then
new_pids+=("$pid")
else
handle_finished_job "$pid"
fi
done
running_pids=("${new_pids[@]}")
done

# Start the next test in the background
log_file=$(mktemp)
res_file=$(mktemp)
(
run_package_test "$package_name" > "$log_file" 2>&1
echo $? > "$res_file"
) &
pid=$!
running_pids+=($pid)
pid_to_pkg[$pid]=$package_name
pid_to_log[$pid]=$log_file
pid_to_resfile[$pid]=$res_file
echo "Started system tests for ${package_name} (PID: ${pid})"
else
echo "No changes in ${package_name} and not a continuous build, skipping."
fi
done

# Wait for all remaining jobs
for pid in "${running_pids[@]}"; do
handle_finished_job "$pid"
done

echo "------------------------------------------------------------"
echo "System Test Summary"
echo "------------------------------------------------------------"
for res in "${results[@]}"; do
echo "$res"
done
echo "------------------------------------------------------------"

exit ${RETVAL}

94 changes: 94 additions & 0 deletions ci/get_package_shards.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import os
import subprocess
import json
import math
import sys

def get_packages():
subdirs = ['packages']
packages = []
for subdir in subdirs:
if not os.path.exists(subdir):
continue
# Use the same sorting as the shell script
pkg_dirs = [os.path.join(subdir, d) + '/' for d in os.listdir(subdir) if os.path.isdir(os.path.join(subdir, d))]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using os.path.join and then appending a hardcoded forward slash (/) can result in mixed path separators on Windows (e.g., packages\\google-cloud-bigtable/). Since git diff outputs always use forward slashes, this mismatch will cause the startswith check in get_packages_to_test to fail on Windows environments.

Using a consistent forward slash format for package paths avoids this issue.

Suggested change
pkg_dirs = [os.path.join(subdir, d) + '/' for d in os.listdir(subdir) if os.path.isdir(os.path.join(subdir, d))]
pkg_dirs = [f"{subdir}/{d}/" for d in os.listdir(subdir) if os.path.isdir(os.path.join(subdir, d))]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need to filter out hidden packages?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure, do we? I thought all packages have unit tests. Which ones would be candidates to filter out?

packages.extend(sorted(pkg_dirs))
return packages

def get_packages_to_test():
build_type = os.environ.get('BUILD_TYPE', 'presubmit')
target_branch = os.environ.get('TARGET_BRANCH', 'main')

all_packages = get_packages()

if build_type == 'presubmit':
git_diff_arg = f"origin/{target_branch}..."
elif build_type == 'continuous':
git_diff_arg = "HEAD~.."
else:
return all_packages

# Check if ci/ changed
try:
subprocess.check_call(['git', 'diff', '--quiet', git_diff_arg, 'ci'])
ci_changed = False
except subprocess.CalledProcessError:
ci_changed = True

if ci_changed:
return all_packages

try:
res = subprocess.check_output(['git', 'diff', '--name-only', git_diff_arg]).decode('utf-8')
changed_files = res.splitlines()
except subprocess.CalledProcessError:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add a brief comment here explaining the fallback behaviour?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added

return all_packages

to_test = []
for pkg in all_packages:
# Check if any changed file starts with the package path
if any(f.startswith(pkg) for f in changed_files):
to_test.append(pkg)

return to_test

def group_packages(packages, max_packages_per_shard=25, max_total_shards=20):
if not packages:
return []

num_packages = len(packages)

# Calculate number of shards based on packages per shard
num_shards = math.ceil(num_packages / max_packages_per_shard)

# Cap the total number of shards
num_shards = min(num_shards, max_total_shards)

# Recalculate shard size to be as even as possible given the capped shards
shard_size = math.ceil(num_packages / num_shards)

shards = []
for i in range(num_shards):
start = i * shard_size
end = min((i + 1) * shard_size, num_packages)
if start >= num_packages:
break

shard_packages = packages[start:end]
if len(shard_packages) == 1:
name = shard_packages[0].strip('/').split('/')[-1]
else:
name = f"{shard_packages[0].strip('/').split('/')[-1]}...{shard_packages[-1].strip('/').split('/')[-1]}"

shards.append({
"name": name,
"index": i + 1,
"packages": " ".join(shard_packages)
})
return shards

if __name__ == "__main__":
packages = get_packages_to_test()
# Shard into groups of ~25 libraries, up to 20 parallel jobs
shards = group_packages(packages, max_packages_per_shard=25, max_total_shards=20)
print(json.dumps(shards))
34 changes: 33 additions & 1 deletion ci/run_conditional_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,42 @@ subdirs=(
packages
)

if [ -n "${PACKAGE_LIST}" ]; then
echo "Using provided PACKAGE_LIST"
to_test=(${PACKAGE_LIST})
RETVAL=0
for d in ${to_test[@]}; do
echo "running test in ${d}"
pushd ${d}
set +e
${test_script}
ret=$?
set -e
Comment thread
parthea marked this conversation as resolved.
Outdated
if [ ${ret} -ne 0 ]; then
RETVAL=${ret}
fi
popd
done
exit ${RETVAL}
fi

# Sharding logic (fallback for manual runs)
TOTAL_SHARDS="${TOTAL_SHARDS:-1}"
SHARD_INDEX="${SHARD_INDEX:-1}"
count=0

RETVAL=0

for subdir in ${subdirs[@]}; do
for d in `ls -d ${subdir}/*/`; do
# Sort the directories to ensure consistent sharding across jobs
for d in `ls -d ${subdir}/*/ | sort`; do
# Sharding logic: only process directories that belong to this shard
if (( count % TOTAL_SHARDS != SHARD_INDEX - 1 )); then
((count++))
continue
fi
((count++))

should_test=false
if [ -n "${GIT_DIFF_ARG}" ]; then
echo "checking changes with 'git diff --quiet ${GIT_DIFF_ARG} ${d}'"
Expand Down
1 change: 1 addition & 0 deletions packages/django-google-spanner/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-appoptimize/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-artifact-registry/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-asset/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-assured-workloads/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-audit-log/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-auditmanager/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-automl/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-backupdr/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bare-metal-solution/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-batch/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-biglake-hive/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-biglake/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-analyticshub/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-biglake/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-connection/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-datapolicies/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-datatransfer/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-logging/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-migration/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-reservation/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
1 change: 1 addition & 0 deletions packages/google-cloud-bigquery-storage/SHARD_TEST.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Test change for sharding
Loading
Loading