| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- #!/bin/bash
- set -euo pipefail
- # Colors for output
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- BLUE='\033[0;34m'
- YELLOW='\033[1;33m'
- NC='\033[0m' # No Color
- # Configuration - assumes script is run from seaweedfs-rdma-sidecar directory
- SEAWEEDFS_DIR="$(realpath ..)"
- SIDECAR_DIR="$(pwd)"
- MOUNT_POINT="/tmp/seaweedfs-rdma-mount"
- FILER_ADDR="localhost:8888"
- SIDECAR_ADDR="localhost:8081"
- # PIDs for cleanup
- MASTER_PID=""
- VOLUME_PID=""
- FILER_PID=""
- SIDECAR_PID=""
- MOUNT_PID=""
- cleanup() {
- echo -e "\n${YELLOW}🧹 Cleaning up processes...${NC}"
-
- # Unmount filesystem
- if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
- echo "📤 Unmounting $MOUNT_POINT..."
- fusermount -u "$MOUNT_POINT" 2>/dev/null || umount "$MOUNT_POINT" 2>/dev/null || true
- sleep 1
- fi
-
- # Kill processes
- for pid in $MOUNT_PID $SIDECAR_PID $FILER_PID $VOLUME_PID $MASTER_PID; do
- if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
- echo "🔪 Killing process $pid..."
- kill "$pid" 2>/dev/null || true
- fi
- done
-
- # Wait for processes to exit
- sleep 2
-
- # Force kill if necessary
- for pid in $MOUNT_PID $SIDECAR_PID $FILER_PID $VOLUME_PID $MASTER_PID; do
- if [[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null; then
- echo "💀 Force killing process $pid..."
- kill -9 "$pid" 2>/dev/null || true
- fi
- done
-
- # Clean up mount point
- if [[ -d "$MOUNT_POINT" ]]; then
- rmdir "$MOUNT_POINT" 2>/dev/null || true
- fi
-
- echo -e "${GREEN}✅ Cleanup complete${NC}"
- }
- trap cleanup EXIT
- wait_for_service() {
- local name=$1
- local url=$2
- local max_attempts=30
- local attempt=1
-
- echo -e "${BLUE}⏳ Waiting for $name to be ready...${NC}"
-
- while [[ $attempt -le $max_attempts ]]; do
- if curl -s "$url" >/dev/null 2>&1; then
- echo -e "${GREEN}✅ $name is ready${NC}"
- return 0
- fi
- echo " Attempt $attempt/$max_attempts..."
- sleep 1
- ((attempt++))
- done
-
- echo -e "${RED}❌ $name failed to start within $max_attempts seconds${NC}"
- return 1
- }
- echo -e "${BLUE}🚀 SEAWEEDFS RDMA MOUNT DEMONSTRATION${NC}"
- echo "======================================"
- echo ""
- echo "This demo shows SeaweedFS mount with RDMA acceleration:"
- echo " • Standard SeaweedFS cluster (master, volume, filer)"
- echo " • RDMA sidecar for acceleration"
- echo " • FUSE mount with RDMA fast path"
- echo " • Performance comparison tests"
- echo ""
- # Create mount point
- echo -e "${BLUE}📁 Creating mount point: $MOUNT_POINT${NC}"
- mkdir -p "$MOUNT_POINT"
- # Start SeaweedFS Master
- echo -e "${BLUE}🎯 Starting SeaweedFS Master...${NC}"
- cd "$SEAWEEDFS_DIR"
- ./weed master -port=9333 -mdir=/tmp/seaweedfs-master &
- MASTER_PID=$!
- wait_for_service "Master" "http://localhost:9333/cluster/status"
- # Start SeaweedFS Volume Server
- echo -e "${BLUE}💾 Starting SeaweedFS Volume Server...${NC}"
- ./weed volume -mserver=localhost:9333 -port=8080 -dir=/tmp/seaweedfs-volume &
- VOLUME_PID=$!
- wait_for_service "Volume Server" "http://localhost:8080/status"
- # Start SeaweedFS Filer
- echo -e "${BLUE}📂 Starting SeaweedFS Filer...${NC}"
- ./weed filer -master=localhost:9333 -port=8888 &
- FILER_PID=$!
- wait_for_service "Filer" "http://localhost:8888/"
- # Start RDMA Sidecar
- echo -e "${BLUE}⚡ Starting RDMA Sidecar...${NC}"
- cd "$SIDECAR_DIR"
- ./bin/demo-server --port 8081 --rdma-socket /tmp/rdma-engine.sock --volume-server-url http://localhost:8080 --enable-rdma --debug &
- SIDECAR_PID=$!
- wait_for_service "RDMA Sidecar" "http://localhost:8081/health"
- # Check RDMA capabilities
- echo -e "${BLUE}🔍 Checking RDMA capabilities...${NC}"
- curl -s "http://localhost:8081/stats" | jq . || curl -s "http://localhost:8081/stats"
- echo ""
- echo -e "${BLUE}🗂️ Mounting SeaweedFS with RDMA acceleration...${NC}"
- # Mount with RDMA acceleration
- cd "$SEAWEEDFS_DIR"
- ./weed mount \
- -filer="$FILER_ADDR" \
- -dir="$MOUNT_POINT" \
- -rdma.enabled=true \
- -rdma.sidecar="$SIDECAR_ADDR" \
- -rdma.fallback=true \
- -rdma.maxConcurrent=64 \
- -rdma.timeoutMs=5000 \
- -debug=true &
- MOUNT_PID=$!
- # Wait for mount to be ready
- echo -e "${BLUE}⏳ Waiting for mount to be ready...${NC}"
- sleep 5
- # Check if mount is successful
- if ! mountpoint -q "$MOUNT_POINT"; then
- echo -e "${RED}❌ Mount failed${NC}"
- exit 1
- fi
- echo -e "${GREEN}✅ SeaweedFS mounted successfully with RDMA acceleration!${NC}"
- echo ""
- # Demonstrate RDMA-accelerated operations
- echo -e "${BLUE}🧪 TESTING RDMA-ACCELERATED FILE OPERATIONS${NC}"
- echo "=============================================="
- # Create test files
- echo -e "${BLUE}📝 Creating test files...${NC}"
- echo "Hello, RDMA World!" > "$MOUNT_POINT/test1.txt"
- echo "This file will be read via RDMA acceleration!" > "$MOUNT_POINT/test2.txt"
- # Create a larger test file
- echo -e "${BLUE}📝 Creating larger test file (1MB)...${NC}"
- dd if=/dev/zero of="$MOUNT_POINT/large_test.dat" bs=1024 count=1024 2>/dev/null
- echo -e "${GREEN}✅ Test files created${NC}"
- echo ""
- # Test file reads
- echo -e "${BLUE}📖 Testing file reads (should use RDMA fast path)...${NC}"
- echo ""
- echo "📄 Reading test1.txt:"
- cat "$MOUNT_POINT/test1.txt"
- echo ""
- echo "📄 Reading test2.txt:"
- cat "$MOUNT_POINT/test2.txt"
- echo ""
- echo "📄 Reading first 100 bytes of large file:"
- head -c 100 "$MOUNT_POINT/large_test.dat" | hexdump -C | head -5
- echo ""
- # Performance test
- echo -e "${BLUE}🏁 PERFORMANCE COMPARISON${NC}"
- echo "========================="
- echo "🔥 Testing read performance with RDMA acceleration..."
- time_start=$(date +%s%N)
- for i in {1..10}; do
- cat "$MOUNT_POINT/large_test.dat" > /dev/null
- done
- time_end=$(date +%s%N)
- rdma_time=$((($time_end - $time_start) / 1000000)) # Convert to milliseconds
- echo "✅ RDMA-accelerated reads: 10 x 1MB file = ${rdma_time}ms total"
- echo ""
- # Check RDMA statistics
- echo -e "${BLUE}📊 RDMA Statistics:${NC}"
- curl -s "http://localhost:8081/stats" | jq . 2>/dev/null || curl -s "http://localhost:8081/stats"
- echo ""
- # List files
- echo -e "${BLUE}📋 Files in mounted filesystem:${NC}"
- ls -la "$MOUNT_POINT/"
- echo ""
- # Interactive mode
- echo -e "${BLUE}🎮 INTERACTIVE MODE${NC}"
- echo "=================="
- echo ""
- echo "The SeaweedFS filesystem is now mounted at: $MOUNT_POINT"
- echo "RDMA acceleration is active for all read operations!"
- echo ""
- echo "Try these commands:"
- echo " ls $MOUNT_POINT/"
- echo " cat $MOUNT_POINT/test1.txt"
- echo " echo 'New content' > $MOUNT_POINT/new_file.txt"
- echo " cat $MOUNT_POINT/new_file.txt"
- echo ""
- echo "Monitor RDMA stats: curl http://localhost:8081/stats | jq"
- echo "Check mount status: mount | grep seaweedfs"
- echo ""
- echo -e "${YELLOW}Press Ctrl+C to stop the demo and cleanup${NC}"
- # Keep running until interrupted
- while true; do
- sleep 5
-
- # Check if mount is still active
- if ! mountpoint -q "$MOUNT_POINT"; then
- echo -e "${RED}❌ Mount point lost, exiting...${NC}"
- break
- fi
-
- # Show periodic stats
- echo -e "${BLUE}📊 Current RDMA stats ($(date)):${NC}"
- curl -s "http://localhost:8081/stats" | jq '.rdma_enabled, .total_reads, .rdma_reads, .http_fallbacks' 2>/dev/null || echo "Stats unavailable"
- echo ""
- done
|