* Fix TUS chunked upload and resume failures caused by request context cancellation (#8783) The filer's TCP connections use a 10-second inactivity timeout (net_timeout.go). After the TUS PATCH request body is fully consumed, internal operations (assigning file IDs via gRPC to the master, uploading data to volume servers, completing uploads) do not generate any activity on the client connection, so the inactivity timer fires and Go's HTTP server cancels the request context. This caused HTTP 500 errors on PATCH requests where body reading + internal processing exceeded the timeout. Fix by using context.WithoutCancel in TUS create and patch handlers, matching the existing pattern used by assignNewFileInfo. This ensures internal operations complete regardless of client connection state. Fixes seaweedfs/seaweedfs#8783 * Add comment to tusCreateHandler explaining context.WithoutCancel rationale * Run TUS integration tests on all PRs, not just TUS file changes The previous path filter meant these tests only ran when TUS-specific files changed. This allowed regressions from changes to shared infrastructure (net_timeout.go, upload paths, gRPC) to go undetected — which is exactly how the context cancellation bug in #8783 was missed. Matches the pattern used by s3-go-tests.yml.
104 lines
2.8 KiB
YAML
104 lines
2.8 KiB
YAML
name: "TUS Protocol Tests"
|
|
|
|
on:
|
|
pull_request:
|
|
|
|
concurrency:
|
|
group: ${{ github.head_ref || github.ref }}/tus-tests
|
|
cancel-in-progress: true
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
defaults:
|
|
run:
|
|
working-directory: weed
|
|
|
|
jobs:
|
|
tus-integration-tests:
|
|
name: TUS Protocol Integration Tests
|
|
runs-on: ubuntu-22.04
|
|
timeout-minutes: 20
|
|
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v6
|
|
|
|
- name: Set up Go
|
|
uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: 'go.mod'
|
|
id: go
|
|
|
|
- name: Install SeaweedFS
|
|
run: |
|
|
go install -buildvcs=false
|
|
|
|
- name: Run TUS Integration Tests
|
|
timeout-minutes: 15
|
|
working-directory: test/tus
|
|
run: |
|
|
set -x
|
|
echo "=== System Information ==="
|
|
uname -a
|
|
free -h
|
|
df -h
|
|
echo "=== Starting TUS Tests ==="
|
|
|
|
# Run tests with automatic server management
|
|
make test-with-server || {
|
|
echo "TUS integration tests failed, checking logs..."
|
|
if [ -f /tmp/seaweedfs-tus-filer.log ]; then
|
|
echo "=== Filer logs ==="
|
|
tail -100 /tmp/seaweedfs-tus-filer.log
|
|
fi
|
|
if [ -f /tmp/seaweedfs-tus-master.log ]; then
|
|
echo "=== Master logs ==="
|
|
tail -50 /tmp/seaweedfs-tus-master.log
|
|
fi
|
|
if [ -f /tmp/seaweedfs-tus-volume.log ]; then
|
|
echo "=== Volume logs ==="
|
|
tail -50 /tmp/seaweedfs-tus-volume.log
|
|
fi
|
|
exit 1
|
|
}
|
|
|
|
- name: Show server logs on failure
|
|
if: failure()
|
|
working-directory: test/tus
|
|
run: |
|
|
echo "=== Filer Server Logs ==="
|
|
if [ -f /tmp/seaweedfs-tus-filer.log ]; then
|
|
echo "Last 100 lines of filer logs:"
|
|
tail -100 /tmp/seaweedfs-tus-filer.log
|
|
else
|
|
echo "No filer log file found"
|
|
fi
|
|
|
|
echo "=== Master Server Logs ==="
|
|
if [ -f /tmp/seaweedfs-tus-master.log ]; then
|
|
tail -50 /tmp/seaweedfs-tus-master.log
|
|
else
|
|
echo "No master log file found"
|
|
fi
|
|
|
|
echo "=== Volume Server Logs ==="
|
|
if [ -f /tmp/seaweedfs-tus-volume.log ]; then
|
|
tail -50 /tmp/seaweedfs-tus-volume.log
|
|
else
|
|
echo "No volume log file found"
|
|
fi
|
|
|
|
echo "=== Test Environment ==="
|
|
ps aux | grep -E "(weed|test)" || true
|
|
netstat -tlnp 2>/dev/null | grep -E "(18888|19333|18080)" || true
|
|
|
|
- name: Upload test logs on failure
|
|
if: failure()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
name: tus-test-logs
|
|
path: |
|
|
/tmp/seaweedfs-tus-*.log
|
|
retention-days: 3
|