mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-25 22:40:44 +01:00
* topology: serialize quarantine records with their layout marks A quarantine publishes a (node, vid) record and marks the replica read-only at the layout level; release and heartbeat flag updates must observe that pair as one state. Store-then-mark let a concurrent release delete the record before the mark landed, stranding the surviving replica read-only; mark-then-store let a heartbeat clear the mark before the record was visible, returning a conflicting replica to the writable list. quarantineLock now covers every record<->mark pair: flagDuplicateVolumeId's quarantine, releaseResolvedQuarantine's undo, the isQuarantined-gated marks on registration, and the quarantine-folded read-only flag writes on heartbeat paths. Remote server pushes stay outside the lock; a push that lands after the record was released is undone, and a failed release push re-adds the record for a later retry. The release test now waits for in-flight async flags to settle instead of asserting on a single read. * topology: fold quarantine into RegisterVolume's flag rebuild RegisterVolume rewrites every replica's location read-only flag from what its node last reported, and reported flags deliberately exclude quarantine. Any registration of a shared vid -- a reconnected replica, a new copy, the self-heal and delta-heartbeat re-register paths -- therefore cleared the quarantine mark on every replica in the location, while the gate afterwards only re-marked the registering node. Two call sites had no gate at all. RegisterVolume now takes an isQuarantined predicate and evaluates it under accessLock for every replica it touches, so the mark is never dropped in the first place: a release unmarks after the rebuild, and a quarantine mark re-applies on the next rebuild, with no window between. * topology: keep quarantine when a vacuum commit re-adds a replica SetVolumeAvailable re-adds the replica into the location list; a re-added slot starts with a cleared read-only flag, so a quarantined replica came back flag-free and the next ensureCorrectWritables could return a conflicting volume to the writable list. Pass the quarantine state in and set the flag back under the same accessLock, with the caller holding quarantineLock so release cannot interleave between the check and the mark. * topology: merge quarantine records instead of overwriting them enforceQuarantine wrote back the state copy it loaded before its remote push, so a concurrent writer's enforced=true was lost: the server stayed read-only while the record said unenforced, and a later release skipped the writable push it owed. The write-back now reloads the record under quarantineLock and merges -- enforced wins from either side, reported is taken from the newer pre-enforcement observation only while no push has landed yet. All three compensating writable pushes had the same hole in reverse: a failed un-quarantine left the server read-only with no record to retry from, and release's restore blindly overwrote any record a fresh flag pass had created in between. They now go through restoreQuarantineRecord, which adds the record only when absent and otherwise sets enforced on the current one, preserving its reported flag. * topology: hold quarantineLock over registration's quarantine check-and-mark RegisterVolume reads the quarantine record and marks the replica read-only under accessLock, but the pair ran without quarantineLock. A release could push writable, watch the record get re-read, and then delete it: the replica stayed read-only with no record left to clear, and unchanged writable heartbeats skip SetReplicaReadOnlyFlag so the mark never repaired. Holding quarantineLock around the check-and-mark in all three production callers serializes it against the release clear-and-delete. * topology: serialize remote quarantine pushes behind a record recheck releaseResolvedQuarantine deletes the record under quarantineLock and sends the writable request after unlock. A conflict flagged while that request is in flight creates a fresh record and marks the replica read-only again, and the older writable request can still land last, leaving the server writable under an active quarantine. The reverse flap strands a stale read-only mark the same way. Route every QuarantineVolumeFn call through pushQuarantine, which holds quarantinePushLock across the remote call and re-checks the record under quarantineLock right before sending: a read-only push requires the pair to exist, a writable push requires it to be gone. A skipped push means the decision already moved on, so the final server state always follows the newest record. * topology: serialize quarantine pushes per replica, not globally A single quarantinePushLock held across the remote mark call let one slow volume server (up to the 10s client timeout) delay pushes for unrelated replicas. Keying the lock by (node, vid) keeps pushes to one replica ordered in record-decision order while pushes to others run in parallel. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * topology: restore the layout read-only mark with a released record A failed writable push re-armed the quarantine record but left the replica marked writable in the layout, so PickForWrite could route to a replica the server still holds read-only. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * topology: wait out async duplicate checks in the release-retry test TestFailedReleasePushRestoresQuarantineMark asserts layout marks around a release pass, but the two RegisterVolumeLayout calls each start a background flagDuplicateVolumeId that can still be mid-flight. A late mark could land after the final release and fail the writable assertion even though the code behaved correctly. Track the async passes in a WaitGroup and drain them before the explicit flag call so the rest of the test is deterministic. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * topology: keep quarantine when a replica's layout key is unreadable * topology: keep a failed writable push's restore ordered under the push lock * topology: retry the quarantine release on every duplicate check * ci: isolate Java and S3 test servers on persistent runners * ci: drop the duplicated -ip flags in the lifecycle test server The bind flags were already on the command; the isolation pass added a second pair. * topology: retry a failed quarantine writable push on the next report * topology: retry pending quarantine releases off the leader pulse A failed writable push re-arms the quarantine record with a retry that only enforceQuarantine fires, and that runs only for volumes a heartbeat carries. Once the server has reported the replica read-only it drops out of the delta reports, and restoreQuarantineRecord keeps the stored flag matching the server's so the digests agree and no full list is requested - the pending release then never retries and the idle volume stays read-only forever. Run the same release pass from the leader's pulse loop so a pending retry no longer waits on a report. * topology: exercise the pulse-driven quarantine release retry --------- Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
372 lines
16 KiB
Makefile
372 lines
16 KiB
Makefile
# S3 API Test Makefile
|
|
# This Makefile provides comprehensive targets for running S3 versioning tests
|
|
|
|
.PHONY: all test help build-weed setup-server start-server stop-server test-versioning test-versioning-quick test-versioning-regressions test-versioning-comprehensive test-all clean logs check-deps
|
|
|
|
# Configuration
|
|
WEED_BINARY := ../../../weed/weed_binary
|
|
S3_PORT := 8333
|
|
MASTER_PORT := 9333
|
|
VOLUME_PORT := 8080
|
|
FILER_PORT := 8888
|
|
TEST_TIMEOUT := 10m
|
|
# Run every test in the suite by default. "TestVersioning" used to leave whole
|
|
# tests (bucket creation, suspended delete, directory/version listing) ungated.
|
|
# Opt-in stress tests are matched by "." but self-skip without ENABLE_STRESS_TESTS
|
|
# (they run with it set in their own targets), so they don't actually execute here.
|
|
TEST_PATTERN := .
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
all: test
|
|
|
|
test: test-with-server
|
|
|
|
# Default target
|
|
help:
|
|
@echo "S3 API Test Makefile"
|
|
@echo ""
|
|
@echo "Available targets:"
|
|
@echo " help - Show this help message"
|
|
@echo " build-weed - Build the SeaweedFS binary"
|
|
@echo " check-deps - Check dependencies and build binary if needed"
|
|
@echo " start-server - Start SeaweedFS server for testing"
|
|
@echo " start-server-simple - Start server without process cleanup (for CI)"
|
|
@echo " stop-server - Stop SeaweedFS server"
|
|
@echo " test-versioning - Run all versioning tests"
|
|
@echo " test-versioning-quick - Run core versioning tests only"
|
|
@echo " test-versioning-regressions - Run targeted versioning regression tests"
|
|
@echo " test-versioning-simple - Run tests without server management"
|
|
@echo " test-versioning-comprehensive - Run comprehensive versioning tests"
|
|
@echo " test-all - Run all S3 API tests"
|
|
@echo " test-with-server - Start server, run tests, stop server"
|
|
@echo " logs - Show server logs"
|
|
@echo " clean - Clean up test artifacts and stop server"
|
|
@echo " health-check - Check if server is accessible"
|
|
@echo ""
|
|
@echo "Configuration:"
|
|
@echo " S3_PORT=${S3_PORT}"
|
|
@echo " TEST_TIMEOUT=${TEST_TIMEOUT}"
|
|
|
|
# Check dependencies
|
|
# Build the SeaweedFS binary
|
|
build-weed:
|
|
@echo "Building SeaweedFS binary..."
|
|
@cd ../../../weed && go build -o weed_binary .
|
|
@chmod +x $(WEED_BINARY)
|
|
@echo "OK SeaweedFS binary built at $(WEED_BINARY)"
|
|
|
|
check-deps: build-weed
|
|
@echo "Checking dependencies..."
|
|
@echo "DEBUG: Checking Go installation..."
|
|
@command -v go >/dev/null 2>&1 || (echo "Go is required but not installed" && exit 1)
|
|
@echo "DEBUG: Go version: $$(go version)"
|
|
@echo "🔍 DEBUG: Checking binary at $(WEED_BINARY)..."
|
|
@test -f $(WEED_BINARY) || (echo "SeaweedFS binary not found at $(WEED_BINARY)" && exit 1)
|
|
@echo "🔍 DEBUG: Binary size: $$(ls -lh $(WEED_BINARY) | awk '{print $$5}')"
|
|
@echo "🔍 DEBUG: Binary permissions: $$(ls -la $(WEED_BINARY) | awk '{print $$1}')"
|
|
@echo "🔍 DEBUG: Checking Go module dependencies..."
|
|
@go list -m github.com/aws/aws-sdk-go-v2 >/dev/null 2>&1 || (echo "AWS SDK Go v2 not found. Run 'go mod tidy'." && exit 1)
|
|
@go list -m github.com/stretchr/testify >/dev/null 2>&1 || (echo "Testify not found. Run 'go mod tidy'." && exit 1)
|
|
@echo "OK All dependencies are available"
|
|
|
|
# Start SeaweedFS server for testing
|
|
start-server: check-deps
|
|
@echo "Starting SeaweedFS server..."
|
|
@echo "🔍 DEBUG: Current working directory: $$(pwd)"
|
|
@echo "🔍 DEBUG: Checking for existing weed processes..."
|
|
@ps aux | grep weed | grep -v grep || echo "No existing weed processes found"
|
|
@echo "🔍 DEBUG: Cleaning up any existing PID file..."
|
|
@rm -f weed-server.pid
|
|
@echo "🔍 DEBUG: Checking for port conflicts..."
|
|
@if netstat -tlnp 2>/dev/null | grep $(S3_PORT) >/dev/null; then \
|
|
echo "⚠️ Port $(S3_PORT) is already in use, trying to find the process..."; \
|
|
netstat -tlnp 2>/dev/null | grep $(S3_PORT) || true; \
|
|
else \
|
|
echo "✅ Port $(S3_PORT) is available"; \
|
|
fi
|
|
@echo "🔍 DEBUG: Checking binary at $(WEED_BINARY)"
|
|
@ls -la $(WEED_BINARY) || (echo "❌ Binary not found!" && exit 1)
|
|
@echo "🔍 DEBUG: Checking config file at ../../../docker/compose/s3.json"
|
|
@ls -la ../../../docker/compose/s3.json || echo "⚠️ Config file not found, continuing without it"
|
|
@echo "🔍 DEBUG: Creating volume directory..."
|
|
@mkdir -p ./test-volume-data
|
|
@echo "🔍 DEBUG: Launching SeaweedFS server in background..."
|
|
@echo "🔍 DEBUG: Command: $(WEED_BINARY) mini -dir=./test-volume-data -s3.port=$(S3_PORT) -s3.config=../../../docker/compose/s3.json"
|
|
@$(WEED_BINARY) mini \
|
|
-ip=127.0.0.1 -ip.bind=127.0.0.1 \
|
|
-dir=./test-volume-data \
|
|
-s3.port=$(S3_PORT) \
|
|
-s3.config=../../../docker/compose/s3.json \
|
|
> weed-test.log 2>&1 & echo $$! > weed-server.pid
|
|
@echo "🔍 DEBUG: Server PID: $$(cat weed-server.pid 2>/dev/null || echo 'PID file not found')"
|
|
@echo "🔍 DEBUG: Checking if PID is still running..."
|
|
@sleep 2
|
|
@if [ -f weed-server.pid ]; then \
|
|
SERVER_PID=$$(cat weed-server.pid); \
|
|
ps -p $$SERVER_PID || echo "⚠️ Server PID $$SERVER_PID not found after 2 seconds"; \
|
|
else \
|
|
echo "⚠️ PID file not found"; \
|
|
fi
|
|
@echo "🔍 DEBUG: Waiting for server to start (up to 90 seconds)..."
|
|
@for i in $$(seq 1 90); do \
|
|
echo "🔍 DEBUG: Attempt $$i/90 - checking port $(S3_PORT)"; \
|
|
if curl -s http://localhost:$(S3_PORT) >/dev/null 2>&1; then \
|
|
echo "✅ SeaweedFS server started successfully on port $(S3_PORT) after $$i seconds"; \
|
|
exit 0; \
|
|
fi; \
|
|
if [ $$i -eq 5 ]; then \
|
|
echo "🔍 DEBUG: After 5 seconds, checking process and logs..."; \
|
|
ps aux | grep weed | grep -v grep || echo "No weed processes found"; \
|
|
if [ -f weed-test.log ]; then \
|
|
echo "=== First server logs ==="; \
|
|
head -20 weed-test.log; \
|
|
fi; \
|
|
fi; \
|
|
if [ $$i -eq 15 ]; then \
|
|
echo "🔍 DEBUG: After 15 seconds, checking port bindings..."; \
|
|
netstat -tlnp 2>/dev/null | grep $(S3_PORT) || echo "Port $(S3_PORT) not bound"; \
|
|
netstat -tlnp 2>/dev/null | grep 9333 || echo "Port 9333 not bound"; \
|
|
netstat -tlnp 2>/dev/null | grep 8080 || echo "Port 8080 not bound"; \
|
|
fi; \
|
|
if [ $$i -eq 30 ]; then \
|
|
echo "⚠️ Server taking longer than expected (30s), checking logs..."; \
|
|
if [ -f weed-test.log ]; then \
|
|
echo "=== Recent server logs ==="; \
|
|
tail -20 weed-test.log; \
|
|
fi; \
|
|
fi; \
|
|
sleep 1; \
|
|
done; \
|
|
echo "❌ Server failed to start within 90 seconds"; \
|
|
echo "🔍 DEBUG: Final process check:"; \
|
|
ps aux | grep weed | grep -v grep || echo "No weed processes found"; \
|
|
echo "🔍 DEBUG: Final port check:"; \
|
|
netstat -tlnp 2>/dev/null | grep -E "(8333|9333|8080)" || echo "No ports bound"; \
|
|
echo "=== Full server logs ==="; \
|
|
if [ -f weed-test.log ]; then \
|
|
cat weed-test.log; \
|
|
else \
|
|
echo "No log file found"; \
|
|
fi; \
|
|
exit 1
|
|
|
|
# Stop SeaweedFS server
|
|
stop-server:
|
|
@echo "Stopping SeaweedFS server..."
|
|
@if [ -f weed-server.pid ]; then \
|
|
SERVER_PID=$$(cat weed-server.pid); \
|
|
echo "Killing server PID $$SERVER_PID"; \
|
|
if ps -p $$SERVER_PID >/dev/null 2>&1; then \
|
|
kill -TERM $$SERVER_PID 2>/dev/null || true; \
|
|
sleep 2; \
|
|
if ps -p $$SERVER_PID >/dev/null 2>&1; then \
|
|
echo "Process still running, sending KILL signal..."; \
|
|
kill -KILL $$SERVER_PID 2>/dev/null || true; \
|
|
sleep 1; \
|
|
fi; \
|
|
else \
|
|
echo "Process $$SERVER_PID not found (already stopped)"; \
|
|
fi; \
|
|
rm -f weed-server.pid; \
|
|
else \
|
|
echo "No PID file found, checking for running processes..."; \
|
|
echo "⚠️ Skipping automatic process cleanup to avoid CI issues"; \
|
|
echo "Note: Any remaining weed processes should be cleaned up by the CI environment"; \
|
|
fi
|
|
@echo "✅ SeaweedFS server stopped"
|
|
|
|
# Show server logs
|
|
logs:
|
|
@if test -f weed-test.log; then \
|
|
echo "=== SeaweedFS Server Logs ==="; \
|
|
tail -f weed-test.log; \
|
|
else \
|
|
echo "No log file found. Server may not be running."; \
|
|
fi
|
|
|
|
# Core versioning tests (equivalent to Python s3tests)
|
|
test-versioning-quick: check-deps
|
|
@echo "Running core S3 versioning tests..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "TestBucketListReturnDataVersioning|TestVersioningBasicWorkflow|TestVersioningDeleteMarkers" .
|
|
@echo "✅ Core versioning tests completed"
|
|
|
|
# Targeted regressions for conditional mutation, multipart, copy, and suspended delete flows.
|
|
test-versioning-regressions: check-deps
|
|
@echo "Running targeted S3 versioning regression tests..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "TestVersioningCompleteMultipartUploadIsIdempotent|TestVersioningSelfCopyMetadataReplaceCreatesNewVersion|TestVersioningSelfCopyMetadataReplaceSuspendedKeepsNullVersion|TestSuspendedDeleteCreatesDeleteMarker" .
|
|
@echo "✅ Targeted versioning regression tests completed"
|
|
|
|
# All versioning tests
|
|
test-versioning: check-deps
|
|
@echo "Running all S3 versioning tests..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" .
|
|
@echo "✅ All versioning tests completed"
|
|
|
|
# Comprehensive versioning tests (including edge cases)
|
|
test-versioning-comprehensive: check-deps
|
|
@echo "Running comprehensive S3 versioning tests..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -count=1
|
|
@echo "✅ Comprehensive versioning tests completed"
|
|
|
|
# All S3 API tests
|
|
test-all: check-deps
|
|
@echo "Running all S3 API tests..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) ./...
|
|
@echo "✅ All S3 API tests completed"
|
|
|
|
# Run tests with automatic server management
|
|
test-with-server: start-server
|
|
@echo "🔍 DEBUG: Server started successfully, now running versioning tests..."
|
|
@echo "🔍 DEBUG: Test pattern: $(TEST_PATTERN)"
|
|
@echo "🔍 DEBUG: Test timeout: $(TEST_TIMEOUT)"
|
|
@echo "Running versioning tests with managed server..."
|
|
@trap "$(MAKE) stop-server" EXIT; \
|
|
$(MAKE) test-versioning || (echo "❌ Tests failed, showing server logs:" && echo "=== Last 50 lines of server logs ===" && tail -50 weed-test.log && echo "=== End of server logs ===" && exit 1)
|
|
@$(MAKE) stop-server
|
|
@echo "✅ Tests completed and server stopped"
|
|
|
|
# Test with different configurations
|
|
test-versioning-with-configs: check-deps
|
|
@echo "Testing with different S3 configurations..."
|
|
@echo "Testing with delete bucket not empty allowed..."
|
|
@$(WEED_BINARY) mini -ip=127.0.0.1 -ip.bind=127.0.0.1 -s3.port=$(S3_PORT) -s3.allowDeleteBucketNotEmpty=true > weed-test-config1.log 2>&1 & echo $$! > weed-config1.pid
|
|
@sleep 5
|
|
@go test -v -timeout=5m -run "TestVersioningBasicWorkflow" . || true
|
|
@if [ -f weed-config1.pid ]; then kill -TERM $$(cat weed-config1.pid) 2>/dev/null || true; rm -f weed-config1.pid; fi
|
|
@sleep 2
|
|
@echo "Testing with delete bucket not empty disabled..."
|
|
@$(WEED_BINARY) mini -ip=127.0.0.1 -ip.bind=127.0.0.1 -s3.port=$(S3_PORT) -s3.allowDeleteBucketNotEmpty=false > weed-test-config2.log 2>&1 & echo $$! > weed-config2.pid
|
|
@sleep 5
|
|
@go test -v -timeout=5m -run "TestVersioningBasicWorkflow" . || true
|
|
@if [ -f weed-config2.pid ]; then kill -TERM $$(cat weed-config2.pid) 2>/dev/null || true; rm -f weed-config2.pid; fi
|
|
@echo "✅ Configuration tests completed"
|
|
|
|
# Performance/stress testing
|
|
test-versioning-stress: check-deps
|
|
@echo "Running stress tests for versioning..."
|
|
@go test -v -timeout=20m -run "TestVersioningConcurrentOperations" . -count=5
|
|
@echo "✅ Stress tests completed"
|
|
|
|
# Pagination stress testing (tests >1000 versions)
|
|
test-versioning-pagination-stress: check-deps
|
|
@echo "Running pagination stress tests (>1000 versions)..."
|
|
@echo "This test creates 1500+ versions and may take several minutes..."
|
|
@ENABLE_STRESS_TESTS=true go test -v -timeout=30m -run "TestVersioningPagination" .
|
|
@echo "✅ Pagination stress tests completed"
|
|
|
|
# Generate test reports
|
|
test-report: check-deps
|
|
@echo "Generating test reports..."
|
|
@mkdir -p reports
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -json > reports/test-results.json 2>&1 || true
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" . -coverprofile=reports/coverage.out 2>&1 || true
|
|
@go tool cover -html=reports/coverage.out -o reports/coverage.html 2>/dev/null || true
|
|
@echo "✅ Test reports generated in reports/ directory"
|
|
|
|
# Clean up test artifacts
|
|
clean:
|
|
@echo "Cleaning up test artifacts..."
|
|
@$(MAKE) stop-server
|
|
@rm -f weed-test*.log weed-server.pid weed-config*.pid
|
|
@rm -rf reports/
|
|
@rm -rf test-volume-data/
|
|
@go clean -testcache
|
|
@echo "✅ Cleanup completed"
|
|
|
|
# Debug mode - start server with verbose logging
|
|
debug-server:
|
|
@echo "Starting SeaweedFS server in debug mode..."
|
|
@$(MAKE) stop-server
|
|
@mkdir -p ./test-volume-data
|
|
@$(WEED_BINARY) mini \
|
|
-ip=127.0.0.1 -ip.bind=127.0.0.1 \
|
|
-debug \
|
|
-s3.port=$(S3_PORT) \
|
|
-s3.allowDeleteBucketNotEmpty=true \
|
|
-s3.config=../../../docker/compose/s3.json \
|
|
-filer.maxMB=16 \
|
|
-master.peers=none \
|
|
-dir=./test-volume-data \
|
|
-metricsPort=9324
|
|
|
|
# Run a single test for debugging
|
|
debug-test: check-deps
|
|
@echo "Running single test for debugging..."
|
|
@go test -v -timeout=5m -run "TestBucketListReturnDataVersioning" . -count=1
|
|
|
|
# Continuous testing (re-run tests on file changes)
|
|
watch-tests:
|
|
@echo "Starting continuous testing (requires 'entr' command)..."
|
|
@command -v entr >/dev/null 2>&1 || (echo "Install 'entr' for file watching: brew install entr (macOS) or apt-get install entr (Linux)" && exit 1)
|
|
@find . -name "*.go" | entr -c $(MAKE) test-versioning-quick
|
|
|
|
# Install missing Go dependencies
|
|
install-deps:
|
|
@echo "Installing Go dependencies..."
|
|
@go mod download
|
|
@go mod tidy
|
|
@echo "✅ Dependencies installed"
|
|
|
|
# Validate test configuration
|
|
validate-config:
|
|
@echo "Validating test configuration..."
|
|
@test -f test_config.json || (echo "❌ test_config.json not found" && exit 1)
|
|
@python3 -m json.tool test_config.json > /dev/null 2>&1 || (echo "❌ test_config.json is not valid JSON" && exit 1)
|
|
@echo "✅ Configuration is valid"
|
|
|
|
# Quick health check
|
|
health-check:
|
|
@echo "Running health check..."
|
|
@curl -s http://localhost:$(S3_PORT) >/dev/null 2>&1 && echo "✅ S3 API is accessible" || echo "❌ S3 API is not accessible"
|
|
@curl -s http://localhost:9324/metrics >/dev/null 2>&1 && echo "✅ Metrics endpoint is accessible" || echo "❌ Metrics endpoint is not accessible"
|
|
|
|
# Simple server start without process cleanup (for CI troubleshooting)
|
|
start-server-simple: check-deps
|
|
@echo "Starting SeaweedFS server (simple mode)..."
|
|
@$(WEED_BINARY) mini \
|
|
-ip=127.0.0.1 -ip.bind=127.0.0.1 \
|
|
-dir=$(SERVER_DIR) \
|
|
-s3 \
|
|
-s3.port=$(S3_PORT) \
|
|
-s3.config=$(S3_CONFIG) \
|
|
> weed-server.log 2>&1 & \
|
|
echo $$! > weed-server.pid
|
|
|
|
@echo "Waiting for S3 server to be ready..."
|
|
@for i in $$(seq 1 90); do \
|
|
if echo | nc -z localhost $(S3_PORT); then \
|
|
echo "S3 server is ready!"; \
|
|
exit 0; \
|
|
fi; \
|
|
sleep 1; \
|
|
done; \
|
|
echo "S3 server failed to start"; \
|
|
exit 1
|
|
|
|
# Simple test run without server management
|
|
test-versioning-simple: check-deps
|
|
@echo "Running versioning tests (assuming server is already running)..."
|
|
@go test -v -timeout=$(TEST_TIMEOUT) -run "$(TEST_PATTERN)" .
|
|
@echo "✅ Tests completed"
|
|
|
|
# Force cleanup all weed processes (use with caution)
|
|
force-cleanup:
|
|
@echo "⚠️ Force cleaning up all weed processes..."
|
|
@echo "This will attempt to kill ALL weed processes on the system"
|
|
@ps aux | grep weed | grep -v grep || echo "No weed processes found"
|
|
@killall -TERM weed_binary 2>/dev/null || echo "No weed_binary processes to terminate"
|
|
@sleep 2
|
|
@killall -KILL weed_binary 2>/dev/null || echo "No weed_binary processes to kill"
|
|
@rm -f weed-server.pid weed-config*.pid
|
|
@echo "✅ Force cleanup completed"
|
|
|
|
# Compare with Python s3tests (if available)
|
|
compare-python-tests:
|
|
@echo "Comparing Go tests with Python s3tests..."
|
|
@echo "Go test: TestBucketListReturnDataVersioning"
|
|
@echo "Python equivalent: test_bucket_list_return_data_versioning"
|
|
@echo ""
|
|
@echo "Running Go version..."
|
|
@time go test -v -run "TestBucketListReturnDataVersioning" . 2>&1 | grep -E "(PASS|FAIL|took)"
|