aboutsummaryrefslogtreecommitdiff
path: root/seaweedfs-rdma-sidecar/scripts/mount-helper.sh
blob: 4159dd180d36e5a5923c2f577f6ad931b33201e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/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 from environment variables
FILER_ADDR=${FILER_ADDR:-"seaweedfs-filer:8888"}
RDMA_SIDECAR_ADDR=${RDMA_SIDECAR_ADDR:-"rdma-sidecar:8081"}
MOUNT_POINT=${MOUNT_POINT:-"/mnt/seaweedfs"}
RDMA_ENABLED=${RDMA_ENABLED:-"true"}
RDMA_FALLBACK=${RDMA_FALLBACK:-"true"}
RDMA_MAX_CONCURRENT=${RDMA_MAX_CONCURRENT:-"64"}
RDMA_TIMEOUT_MS=${RDMA_TIMEOUT_MS:-"5000"}
DEBUG=${DEBUG:-"false"}

echo -e "${BLUE}๐Ÿš€ SeaweedFS RDMA Mount Helper${NC}"
echo "================================"
echo "Filer Address: $FILER_ADDR"
echo "RDMA Sidecar: $RDMA_SIDECAR_ADDR"
echo "Mount Point: $MOUNT_POINT"
echo "RDMA Enabled: $RDMA_ENABLED"
echo "RDMA Fallback: $RDMA_FALLBACK"
echo "Debug Mode: $DEBUG"
echo ""

# Function to wait for service
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 2
        ((attempt++))
    done
    
    echo -e "${RED}โŒ $name failed to be ready within $max_attempts attempts${NC}"
    return 1
}

# Function to check RDMA sidecar capabilities
check_rdma_capabilities() {
    echo -e "${BLUE}๐Ÿ” Checking RDMA capabilities...${NC}"
    
    local response
    if response=$(curl -s "http://$RDMA_SIDECAR_ADDR/stats" 2>/dev/null); then
        echo "RDMA Sidecar Stats:"
        echo "$response" | jq . 2>/dev/null || echo "$response"
        echo ""
        
        # Check if RDMA is actually enabled
        if echo "$response" | grep -q '"rdma_enabled":true'; then
            echo -e "${GREEN}โœ… RDMA is enabled and ready${NC}"
            return 0
        else
            echo -e "${YELLOW}โš ๏ธ  RDMA sidecar is running but RDMA is not enabled${NC}"
            if [[ "$RDMA_FALLBACK" == "true" ]]; then
                echo -e "${YELLOW}   Will use HTTP fallback${NC}"
                return 0
            else
                return 1
            fi
        fi
    else
        echo -e "${RED}โŒ Failed to get RDMA sidecar stats${NC}"
        if [[ "$RDMA_FALLBACK" == "true" ]]; then
            echo -e "${YELLOW}   Will use HTTP fallback${NC}"
            return 0
        else
            return 1
        fi
    fi
}

# Function to cleanup on exit
cleanup() {
    echo -e "\n${YELLOW}๐Ÿงน Cleaning up...${NC}"
    
    # Unmount if mounted
    if mountpoint -q "$MOUNT_POINT" 2>/dev/null; then
        echo "๐Ÿ“ค Unmounting $MOUNT_POINT..."
        fusermount3 -u "$MOUNT_POINT" 2>/dev/null || umount "$MOUNT_POINT" 2>/dev/null || true
        sleep 2
    fi
    
    echo -e "${GREEN}โœ… Cleanup complete${NC}"
}

trap cleanup EXIT INT TERM

# Wait for required services
echo -e "${BLUE}๐Ÿ”„ Waiting for required services...${NC}"
wait_for_service "Filer" "http://$FILER_ADDR/"

if [[ "$RDMA_ENABLED" == "true" ]]; then
    wait_for_service "RDMA Sidecar" "http://$RDMA_SIDECAR_ADDR/health"
    check_rdma_capabilities
fi

# Create mount point if it doesn't exist
echo -e "${BLUE}๐Ÿ“ Preparing mount point...${NC}"
mkdir -p "$MOUNT_POINT"

# Check if already mounted
if mountpoint -q "$MOUNT_POINT"; then
    echo -e "${YELLOW}โš ๏ธ  $MOUNT_POINT is already mounted, unmounting first...${NC}"
    fusermount3 -u "$MOUNT_POINT" 2>/dev/null || umount "$MOUNT_POINT" 2>/dev/null || true
    sleep 2
fi

# Build mount command
MOUNT_CMD="/usr/local/bin/weed mount"
MOUNT_CMD="$MOUNT_CMD -filer=$FILER_ADDR"
MOUNT_CMD="$MOUNT_CMD -dir=$MOUNT_POINT"
MOUNT_CMD="$MOUNT_CMD -allowOthers=true"

# Add RDMA options if enabled
if [[ "$RDMA_ENABLED" == "true" ]]; then
    MOUNT_CMD="$MOUNT_CMD -rdma.enabled=true"
    MOUNT_CMD="$MOUNT_CMD -rdma.sidecar=$RDMA_SIDECAR_ADDR"
    MOUNT_CMD="$MOUNT_CMD -rdma.fallback=$RDMA_FALLBACK"
    MOUNT_CMD="$MOUNT_CMD -rdma.maxConcurrent=$RDMA_MAX_CONCURRENT"
    MOUNT_CMD="$MOUNT_CMD -rdma.timeoutMs=$RDMA_TIMEOUT_MS"
fi

# Add debug options if enabled
if [[ "$DEBUG" == "true" ]]; then
    MOUNT_CMD="$MOUNT_CMD -debug=true -v=2"
fi

echo -e "${BLUE}๐Ÿ—‚๏ธ  Starting SeaweedFS mount...${NC}"
echo "Command: $MOUNT_CMD"
echo ""

# Execute mount command
exec $MOUNT_CMD