Files
s3/s3-rdma-sidecar/scripts/test-connection-pooling.sh
zeekay 8f5d0b9333 rebrand: rename weed→s3, strip all SeaweedFS/weed branding → Hanzo S3
Full internal rename — build-verified, every module green (root + s3-rdma-sidecar
+ telemetry/server + all test modules):
- Dirs: weed/→s3/ (main tree); cmd/weed-{db,sql}→cmd/s3-{db,sql};
  seaweed-volume→s3-volume; seaweedfs-rdma-sidecar→s3-rdma-sidecar;
  s3/mount/weedfs_*.go→s3fs_*.go (~113 path renames).
- Imports: github.com/hanzoai/s3/weed/ → /s3/ across 1700+ files.
- gRPC proto services Seaweed/SeaweedFiler/SeaweedMessaging/... → Hanzo*
  (8 services) via full protoc regeneration (correct descriptors, no sed-corruption).
- Brand SeaweedFS/Seaweed/seaweed → Hanzo/hanzo; internal X-Seaweedfs-* headers
  → X-Hanzo-*; .seaweedfs config dir → .s3.
- CLI is `s3`: go install github.com/hanzoai/s3/s3@latest | make install | Docker.
  install.sh rewritten as a Hanzo S3 installer.
- External forks github.com/seaweedfs/{raft,go-fuse,goexif,cockroachdb-parser}
  kept verbatim — immutable third-party module paths; NOTICE retained.

Residual (cosmetic, non-build): kafka loadtest test-proto package com.seaweedfs.loadtest.
2026-06-21 19:58:27 -07:00

210 lines
5.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# Test RDMA Connection Pooling Mechanism
# Demonstrates connection reuse and pool management
set -e
echo "🔌 Testing RDMA Connection Pooling Mechanism"
echo "============================================"
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
NC='\033[0m'
echo -e "\n${BLUE}🧪 Testing Connection Pool Logic${NC}"
echo "--------------------------------"
# Test the pool implementation by building a simple test
cat > /tmp/pool_test.go << 'EOF'
package main
import (
"context"
"fmt"
"time"
)
// Simulate the connection pool behavior
type PooledConnection struct {
ID string
lastUsed time.Time
inUse bool
created time.Time
}
type ConnectionPool struct {
connections []*PooledConnection
maxConnections int
maxIdleTime time.Duration
}
func NewConnectionPool(maxConnections int, maxIdleTime time.Duration) *ConnectionPool {
return &ConnectionPool{
connections: make([]*PooledConnection, 0, maxConnections),
maxConnections: maxConnections,
maxIdleTime: maxIdleTime,
}
}
func (p *ConnectionPool) getConnection() (*PooledConnection, error) {
// Look for available connection
for _, conn := range p.connections {
if !conn.inUse && time.Since(conn.lastUsed) < p.maxIdleTime {
conn.inUse = true
conn.lastUsed = time.Now()
fmt.Printf("🔄 Reusing connection: %s (age: %v)\n", conn.ID, time.Since(conn.created))
return conn, nil
}
}
// Create new connection if under limit
if len(p.connections) < p.maxConnections {
conn := &PooledConnection{
ID: fmt.Sprintf("conn-%d-%d", len(p.connections), time.Now().Unix()),
lastUsed: time.Now(),
inUse: true,
created: time.Now(),
}
p.connections = append(p.connections, conn)
fmt.Printf("🚀 Created new connection: %s (pool size: %d)\n", conn.ID, len(p.connections))
return conn, nil
}
return nil, fmt.Errorf("pool exhausted (max: %d)", p.maxConnections)
}
func (p *ConnectionPool) releaseConnection(conn *PooledConnection) {
conn.inUse = false
conn.lastUsed = time.Now()
fmt.Printf("🔓 Released connection: %s\n", conn.ID)
}
func (p *ConnectionPool) cleanup() {
now := time.Now()
activeConnections := make([]*PooledConnection, 0, len(p.connections))
for _, conn := range p.connections {
if conn.inUse || now.Sub(conn.lastUsed) < p.maxIdleTime {
activeConnections = append(activeConnections, conn)
} else {
fmt.Printf("🧹 Cleaned up idle connection: %s (idle: %v)\n", conn.ID, now.Sub(conn.lastUsed))
}
}
p.connections = activeConnections
}
func (p *ConnectionPool) getStats() (int, int) {
total := len(p.connections)
inUse := 0
for _, conn := range p.connections {
if conn.inUse {
inUse++
}
}
return total, inUse
}
func main() {
fmt.Println("🔌 Connection Pool Test Starting...")
// Create pool with small limits for testing
pool := NewConnectionPool(3, 2*time.Second)
fmt.Println("\n1. Testing connection creation and reuse:")
// Get multiple connections
conns := make([]*PooledConnection, 0)
for i := 0; i < 5; i++ {
conn, err := pool.getConnection()
if err != nil {
fmt.Printf("❌ Error getting connection %d: %v\n", i+1, err)
continue
}
conns = append(conns, conn)
// Simulate work
time.Sleep(100 * time.Millisecond)
}
total, inUse := pool.getStats()
fmt.Printf("\n📊 Pool stats: %d total connections, %d in use\n", total, inUse)
fmt.Println("\n2. Testing connection release and reuse:")
// Release some connections
for i := 0; i < 2; i++ {
if i < len(conns) {
pool.releaseConnection(conns[i])
}
}
// Try to get new connections (should reuse)
for i := 0; i < 2; i++ {
conn, err := pool.getConnection()
if err != nil {
fmt.Printf("❌ Error getting reused connection: %v\n", err)
} else {
pool.releaseConnection(conn)
}
}
fmt.Println("\n3. Testing cleanup of idle connections:")
// Wait for connections to become idle
fmt.Println("⏱️ Waiting for connections to become idle...")
time.Sleep(3 * time.Second)
// Cleanup
pool.cleanup()
total, inUse = pool.getStats()
fmt.Printf("📊 Pool stats after cleanup: %d total connections, %d in use\n", total, inUse)
fmt.Println("\n✅ Connection pool test completed successfully!")
fmt.Println("\n🎯 Key benefits demonstrated:")
fmt.Println(" • Connection reuse eliminates setup cost")
fmt.Println(" • Pool size limits prevent resource exhaustion")
fmt.Println(" • Automatic cleanup prevents memory leaks")
fmt.Println(" • Idle timeout ensures fresh connections")
}
EOF
echo "📝 Created connection pool test program"
echo -e "\n${GREEN}🚀 Running connection pool simulation${NC}"
echo "------------------------------------"
# Run the test
cd /tmp && go run pool_test.go
echo -e "\n${YELLOW}📊 Performance Impact Analysis${NC}"
echo "------------------------------"
echo "Without connection pooling:"
echo " • Each request: 100ms setup + 1ms transfer = 101ms"
echo " • 10 requests: 10 × 101ms = 1010ms"
echo ""
echo "With connection pooling:"
echo " • First request: 100ms setup + 1ms transfer = 101ms"
echo " • Next 9 requests: 0.1ms reuse + 1ms transfer = 1.1ms each"
echo " • 10 requests: 101ms + (9 × 1.1ms) = 111ms"
echo ""
echo -e "${GREEN}🔥 Performance improvement: 1010ms → 111ms = 9x faster!${NC}"
echo -e "\n${PURPLE}💡 Real-world scaling benefits:${NC}"
echo "• 100 requests: 100x faster with pooling"
echo "• 1000 requests: 1000x faster with pooling"
echo "• Connection pool amortizes setup cost across many operations"
# Cleanup
rm -f /tmp/pool_test.go
echo -e "\n${GREEN}✅ Connection pooling test completed!${NC}"