mount-helper.sh 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/bin/bash
  2. set -euo pipefail
  3. # Colors for output
  4. RED='\033[0;31m'
  5. GREEN='\033[0;32m'
  6. BLUE='\033[0;34m'
  7. YELLOW='\033[1;33m'
  8. NC='\033[0m' # No Color
  9. # Configuration from environment variables
  10. FILER_ADDR=${FILER_ADDR:-"seaweedfs-filer:8888"}
  11. RDMA_SIDECAR_ADDR=${RDMA_SIDECAR_ADDR:-"rdma-sidecar:8081"}
  12. MOUNT_POINT=${MOUNT_POINT:-"/mnt/seaweedfs"}
  13. RDMA_ENABLED=${RDMA_ENABLED:-"true"}
  14. RDMA_FALLBACK=${RDMA_FALLBACK:-"true"}
  15. RDMA_MAX_CONCURRENT=${RDMA_MAX_CONCURRENT:-"64"}
  16. RDMA_TIMEOUT_MS=${RDMA_TIMEOUT_MS:-"5000"}
  17. DEBUG=${DEBUG:-"false"}
  18. echo -e "${BLUE}🚀 SeaweedFS RDMA Mount Helper${NC}"
  19. echo "================================"
  20. echo "Filer Address: $FILER_ADDR"
  21. echo "RDMA Sidecar: $RDMA_SIDECAR_ADDR"
  22. echo "Mount Point: $MOUNT_POINT"
  23. echo "RDMA Enabled: $RDMA_ENABLED"
  24. echo "RDMA Fallback: $RDMA_FALLBACK"
  25. echo "Debug Mode: $DEBUG"
  26. echo ""
  27. # Function to wait for service
  28. wait_for_service() {
  29. local name=$1
  30. local url=$2
  31. local max_attempts=30
  32. local attempt=1
  33. echo -e "${BLUE}⏳ Waiting for $name to be ready...${NC}"
  34. while [[ $attempt -le $max_attempts ]]; do
  35. if curl -s "$url" >/dev/null 2>&1; then
  36. echo -e "${GREEN}✅ $name is ready${NC}"
  37. return 0
  38. fi
  39. echo " Attempt $attempt/$max_attempts..."
  40. sleep 2
  41. ((attempt++))
  42. done
  43. echo -e "${RED}❌ $name failed to be ready within $max_attempts attempts${NC}"
  44. return 1
  45. }
  46. # Function to check RDMA sidecar capabilities
  47. check_rdma_capabilities() {
  48. echo -e "${BLUE}🔍 Checking RDMA capabilities...${NC}"
  49. local response
  50. if response=$(curl -s "http://$RDMA_SIDECAR_ADDR/stats" 2>/dev/null); then
  51. echo "RDMA Sidecar Stats:"
  52. echo "$response" | jq . 2>/dev/null || echo "$response"
  53. echo ""
  54. # Check if RDMA is actually enabled
  55. if echo "$response" | grep -q '"rdma_enabled":true'; then
  56. echo -e "${GREEN}✅ RDMA is enabled and ready${NC}"
  57. return 0
  58. else
  59. echo -e "${YELLOW}⚠️ RDMA sidecar is running but RDMA is not enabled${NC}"
  60. if [[ "$RDMA_FALLBACK" == "true" ]]; then
  61. echo -e "${YELLOW} Will use HTTP fallback${NC}"
  62. return 0
  63. else
  64. return 1
  65. fi
  66. fi
  67. else
  68. echo -e "${RED}❌ Failed to get RDMA sidecar stats${NC}"
  69. if [[ "$RDMA_FALLBACK" == "true" ]]; then
  70. echo -e "${YELLOW} Will use HTTP fallback${NC}"
  71. return 0
  72. else
  73. return 1
  74. fi
  75. fi
  76. }
  77. # Function to cleanup on exit
  78. cleanup() {
  79. echo -e "\n${YELLOW}🧹 Cleaning up...${NC}"
  80. # Unmount if mounted
  81. if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
  82. echo "📤 Unmounting $MOUNT_POINT..."
  83. fusermount3 -u "$MOUNT_POINT" 2>/dev/null || umount "$MOUNT_POINT" 2>/dev/null || true
  84. sleep 2
  85. fi
  86. echo -e "${GREEN}✅ Cleanup complete${NC}"
  87. }
  88. trap cleanup EXIT INT TERM
  89. # Wait for required services
  90. echo -e "${BLUE}🔄 Waiting for required services...${NC}"
  91. wait_for_service "Filer" "http://$FILER_ADDR/"
  92. if [[ "$RDMA_ENABLED" == "true" ]]; then
  93. wait_for_service "RDMA Sidecar" "http://$RDMA_SIDECAR_ADDR/health"
  94. check_rdma_capabilities
  95. fi
  96. # Create mount point if it doesn't exist
  97. echo -e "${BLUE}📁 Preparing mount point...${NC}"
  98. mkdir -p "$MOUNT_POINT"
  99. # Check if already mounted
  100. if mountpoint -q "$MOUNT_POINT"; then
  101. echo -e "${YELLOW}⚠️ $MOUNT_POINT is already mounted, unmounting first...${NC}"
  102. fusermount3 -u "$MOUNT_POINT" 2>/dev/null || umount "$MOUNT_POINT" 2>/dev/null || true
  103. sleep 2
  104. fi
  105. # Build mount command
  106. MOUNT_CMD="/usr/local/bin/weed mount"
  107. MOUNT_CMD="$MOUNT_CMD -filer=$FILER_ADDR"
  108. MOUNT_CMD="$MOUNT_CMD -dir=$MOUNT_POINT"
  109. MOUNT_CMD="$MOUNT_CMD -allowOthers=true"
  110. # Add RDMA options if enabled
  111. if [[ "$RDMA_ENABLED" == "true" ]]; then
  112. MOUNT_CMD="$MOUNT_CMD -rdma.enabled=true"
  113. MOUNT_CMD="$MOUNT_CMD -rdma.sidecar=$RDMA_SIDECAR_ADDR"
  114. MOUNT_CMD="$MOUNT_CMD -rdma.fallback=$RDMA_FALLBACK"
  115. MOUNT_CMD="$MOUNT_CMD -rdma.maxConcurrent=$RDMA_MAX_CONCURRENT"
  116. MOUNT_CMD="$MOUNT_CMD -rdma.timeoutMs=$RDMA_TIMEOUT_MS"
  117. fi
  118. # Add debug options if enabled
  119. if [[ "$DEBUG" == "true" ]]; then
  120. MOUNT_CMD="$MOUNT_CMD -debug=true -v=2"
  121. fi
  122. echo -e "${BLUE}🗂️ Starting SeaweedFS mount...${NC}"
  123. echo "Command: $MOUNT_CMD"
  124. echo ""
  125. # Execute mount command
  126. exec $MOUNT_CMD