Skip to content

Commit 4377c5e

Browse files
authored
Merge pull request #59 from thushan/feature/proxy-configuration
refactor: Proxy Configurations
2 parents 876a7f4 + 3d0f39f commit 4377c5e

19 files changed

+545
-483
lines changed

internal/adapter/proxy/benchmark_comparison_test.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,10 @@ func createRefactoredSherpaProxy(endpoints []*domain.Endpoint) (ports.ProxyServi
5555
collector := createTestStatsCollector()
5656
logger := createTestLogger()
5757

58-
config := &sherpa.Configuration{
59-
ResponseTimeout: 30 * time.Second,
60-
ReadTimeout: 10 * time.Second,
61-
StreamBufferSize: 8192,
62-
}
58+
config := &sherpa.Configuration{}
59+
config.ResponseTimeout = 30 * time.Second
60+
config.ReadTimeout = 10 * time.Second
61+
config.StreamBufferSize = 8192
6362
return sherpa.NewService(discovery, selector, config, collector, nil, logger)
6463
}
6564

@@ -69,14 +68,13 @@ func createRefactoredOllaProxy(endpoints []*domain.Endpoint) (ports.ProxyService
6968
collector := createTestStatsCollector()
7069
logger := createTestLogger()
7170

72-
config := &olla.Configuration{
73-
ResponseTimeout: 30 * time.Second,
74-
ReadTimeout: 10 * time.Second,
75-
StreamBufferSize: 8192,
76-
MaxIdleConns: 200,
77-
IdleConnTimeout: 90 * time.Second,
78-
MaxConnsPerHost: 50,
79-
}
71+
config := &olla.Configuration{}
72+
config.ResponseTimeout = 30 * time.Second
73+
config.ReadTimeout = 10 * time.Second
74+
config.StreamBufferSize = 8192
75+
config.MaxIdleConns = 200
76+
config.IdleConnTimeout = 90 * time.Second
77+
config.MaxConnsPerHost = 50
8078
return olla.NewService(discovery, selector, config, collector, nil, logger)
8179
}
8280

internal/adapter/proxy/benchmark_refactor_test.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,19 @@ func createRefactoredProxy(proxyType string, endpoints []*domain.Endpoint) (port
6363

6464
switch proxyType {
6565
case "sherpa":
66-
config := &sherpa.Configuration{
67-
ResponseTimeout: 30 * time.Second,
68-
ReadTimeout: 10 * time.Second,
69-
StreamBufferSize: 8192,
70-
}
66+
config := &sherpa.Configuration{}
67+
config.ResponseTimeout = 30 * time.Second
68+
config.ReadTimeout = 10 * time.Second
69+
config.StreamBufferSize = 8192
7170
return sherpa.NewService(discovery, selector, config, collector, nil, logger)
7271
case "olla":
73-
config := &olla.Configuration{
74-
ResponseTimeout: 30 * time.Second,
75-
ReadTimeout: 10 * time.Second,
76-
StreamBufferSize: 8192,
77-
MaxIdleConns: 200,
78-
IdleConnTimeout: 90 * time.Second,
79-
MaxConnsPerHost: 50,
80-
}
72+
config := &olla.Configuration{}
73+
config.ResponseTimeout = 30 * time.Second
74+
config.ReadTimeout = 10 * time.Second
75+
config.StreamBufferSize = 8192
76+
config.MaxIdleConns = 200
77+
config.IdleConnTimeout = 90 * time.Second
78+
config.MaxConnsPerHost = 50
8179
return olla.NewService(discovery, selector, config, collector, nil, logger)
8280
default:
8381
return nil, fmt.Errorf("unknown proxy type: %s", proxyType)
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
package config
2+
3+
import (
4+
"time"
5+
6+
"github.com/thushan/olla/internal/core/constants"
7+
)
8+
9+
// Default values for proxy settings
10+
const (
11+
DefaultReadTimeout = 60 * time.Second
12+
DefaultStreamBufferSize = 8 * 1024
13+
DefaultTimeout = 60 * time.Second
14+
DefaultKeepAlive = 60 * time.Second
15+
16+
// Olla-specific defaults for high-performance
17+
OllaDefaultStreamBufferSize = 64 * 1024 // Larger buffer for better streaming performance
18+
OllaDefaultMaxIdleConns = 100
19+
OllaDefaultMaxConnsPerHost = 50
20+
OllaDefaultIdleConnTimeout = 90 * time.Second
21+
// Olla uses 30s timeouts for faster failure detection in AI workloads
22+
OllaDefaultTimeout = 30 * time.Second
23+
OllaDefaultKeepAlive = 30 * time.Second
24+
OllaDefaultReadTimeout = 30 * time.Second
25+
)
26+
27+
// ProxyConfig defines the interface for all proxy configurations
28+
type ProxyConfig interface {
29+
// Core configuration getters
30+
GetProxyProfile() string
31+
GetProxyPrefix() string
32+
GetConnectionTimeout() time.Duration
33+
GetConnectionKeepAlive() time.Duration
34+
GetResponseTimeout() time.Duration
35+
GetReadTimeout() time.Duration
36+
GetStreamBufferSize() int
37+
38+
// Validation
39+
Validate() error
40+
}
41+
42+
// BaseProxyConfig contains common configuration fields for all proxy implementations
43+
type BaseProxyConfig struct {
44+
ProxyPrefix string
45+
Profile string
46+
ConnectionTimeout time.Duration
47+
ConnectionKeepAlive time.Duration
48+
ResponseTimeout time.Duration
49+
ReadTimeout time.Duration
50+
StreamBufferSize int
51+
}
52+
53+
// GetProxyProfile returns the proxy profile, defaulting to "auto" if not set
54+
func (c *BaseProxyConfig) GetProxyProfile() string {
55+
if c.Profile == "" {
56+
return constants.ConfigurationProxyProfileAuto
57+
}
58+
return c.Profile
59+
}
60+
61+
// GetProxyPrefix returns the proxy prefix, defaulting to "/olla/" if not set
62+
func (c *BaseProxyConfig) GetProxyPrefix() string {
63+
if c.ProxyPrefix == "" {
64+
return "/olla/"
65+
}
66+
return c.ProxyPrefix
67+
}
68+
69+
// GetConnectionTimeout returns the connection timeout, defaulting to DefaultTimeout
70+
func (c *BaseProxyConfig) GetConnectionTimeout() time.Duration {
71+
if c.ConnectionTimeout == 0 {
72+
return DefaultTimeout
73+
}
74+
return c.ConnectionTimeout
75+
}
76+
77+
// GetConnectionKeepAlive returns the keep-alive duration, defaulting to DefaultKeepAlive
78+
func (c *BaseProxyConfig) GetConnectionKeepAlive() time.Duration {
79+
if c.ConnectionKeepAlive == 0 {
80+
return DefaultKeepAlive
81+
}
82+
return c.ConnectionKeepAlive
83+
}
84+
85+
// GetResponseTimeout returns the response timeout
86+
func (c *BaseProxyConfig) GetResponseTimeout() time.Duration {
87+
return c.ResponseTimeout
88+
}
89+
90+
// GetReadTimeout returns the read timeout, defaulting to DefaultReadTimeout
91+
func (c *BaseProxyConfig) GetReadTimeout() time.Duration {
92+
if c.ReadTimeout == 0 {
93+
return DefaultReadTimeout
94+
}
95+
return c.ReadTimeout
96+
}
97+
98+
// GetStreamBufferSize returns the stream buffer size, defaulting to DefaultStreamBufferSize
99+
func (c *BaseProxyConfig) GetStreamBufferSize() int {
100+
if c.StreamBufferSize == 0 {
101+
return DefaultStreamBufferSize
102+
}
103+
return c.StreamBufferSize
104+
}
105+
106+
// Validate performs basic validation on the configuration
107+
func (c *BaseProxyConfig) Validate() error {
108+
return nil
109+
}
110+
111+
// SherpaConfig extends BaseProxyConfig with Sherpa-specific configuration
112+
type SherpaConfig struct {
113+
BaseProxyConfig
114+
}
115+
116+
// OllaConfig extends BaseProxyConfig with Olla-specific configuration
117+
type OllaConfig struct {
118+
BaseProxyConfig
119+
120+
// Olla-specific fields for advanced connection pooling
121+
IdleConnTimeout time.Duration
122+
MaxIdleConns int
123+
MaxConnsPerHost int
124+
}
125+
126+
// GetStreamBufferSize returns the stream buffer size, defaulting to OllaDefaultStreamBufferSize for better performance
127+
func (c *OllaConfig) GetStreamBufferSize() int {
128+
if c.StreamBufferSize == 0 {
129+
return OllaDefaultStreamBufferSize
130+
}
131+
return c.StreamBufferSize
132+
}
133+
134+
// GetIdleConnTimeout returns the idle connection timeout, defaulting to OllaDefaultIdleConnTimeout
135+
func (c *OllaConfig) GetIdleConnTimeout() time.Duration {
136+
if c.IdleConnTimeout == 0 {
137+
return OllaDefaultIdleConnTimeout
138+
}
139+
return c.IdleConnTimeout
140+
}
141+
142+
// GetMaxIdleConns returns the maximum idle connections, defaulting to OllaDefaultMaxIdleConns
143+
func (c *OllaConfig) GetMaxIdleConns() int {
144+
if c.MaxIdleConns == 0 {
145+
return OllaDefaultMaxIdleConns
146+
}
147+
return c.MaxIdleConns
148+
}
149+
150+
// GetMaxConnsPerHost returns the maximum connections per host, defaulting to OllaDefaultMaxConnsPerHost
151+
func (c *OllaConfig) GetMaxConnsPerHost() int {
152+
if c.MaxConnsPerHost == 0 {
153+
return OllaDefaultMaxConnsPerHost
154+
}
155+
return c.MaxConnsPerHost
156+
}
157+
158+
// GetConnectionTimeout returns the connection timeout, defaulting to OllaDefaultTimeout (30s for faster failure detection)
159+
func (c *OllaConfig) GetConnectionTimeout() time.Duration {
160+
if c.ConnectionTimeout == 0 {
161+
return OllaDefaultTimeout
162+
}
163+
return c.ConnectionTimeout
164+
}
165+
166+
// GetConnectionKeepAlive returns the keep-alive duration, defaulting to OllaDefaultKeepAlive (30s for AI workloads)
167+
func (c *OllaConfig) GetConnectionKeepAlive() time.Duration {
168+
if c.ConnectionKeepAlive == 0 {
169+
return OllaDefaultKeepAlive
170+
}
171+
return c.ConnectionKeepAlive
172+
}
173+
174+
// GetReadTimeout returns the read timeout, defaulting to OllaDefaultReadTimeout (30s for faster error detection)
175+
func (c *OllaConfig) GetReadTimeout() time.Duration {
176+
if c.ReadTimeout == 0 {
177+
return OllaDefaultReadTimeout
178+
}
179+
return c.ReadTimeout
180+
}

internal/adapter/proxy/factory.go

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,32 +39,43 @@ func NewFactory(statsCollector ports.StatsCollector, metricsExtractor ports.Metr
3939

4040
// Register Sherpa implementation
4141
factory.Register(DefaultProxySherpa, func(discovery ports.DiscoveryService, selector domain.EndpointSelector, config ports.ProxyConfiguration, collector ports.StatsCollector, metricsExtractor ports.MetricsExtractor, logger logger.StyledLogger) (ports.ProxyService, error) {
42-
sherpaConfig := &sherpa.Configuration{
43-
ProxyPrefix: config.GetProxyPrefix(),
44-
ConnectionTimeout: config.GetConnectionTimeout(),
45-
ConnectionKeepAlive: config.GetConnectionKeepAlive(),
46-
ResponseTimeout: config.GetResponseTimeout(),
47-
ReadTimeout: config.GetReadTimeout(),
48-
StreamBufferSize: config.GetStreamBufferSize(),
49-
Profile: config.GetProxyProfile(),
50-
}
42+
sherpaConfig := &sherpa.Configuration{}
43+
sherpaConfig.ProxyPrefix = config.GetProxyPrefix()
44+
sherpaConfig.ConnectionTimeout = config.GetConnectionTimeout()
45+
sherpaConfig.ConnectionKeepAlive = config.GetConnectionKeepAlive()
46+
sherpaConfig.ResponseTimeout = config.GetResponseTimeout()
47+
sherpaConfig.ReadTimeout = config.GetReadTimeout()
48+
sherpaConfig.StreamBufferSize = config.GetStreamBufferSize()
49+
sherpaConfig.Profile = config.GetProxyProfile()
5150
return sherpa.NewService(discovery, selector, sherpaConfig, collector, metricsExtractor, logger)
5251
})
5352

5453
// Register Olla implementation
5554
factory.Register(DefaultProxyOlla, func(discovery ports.DiscoveryService, selector domain.EndpointSelector, config ports.ProxyConfiguration, collector ports.StatsCollector, metricsExtractor ports.MetricsExtractor, logger logger.StyledLogger) (ports.ProxyService, error) {
56-
ollaConfig := &olla.Configuration{
57-
ProxyPrefix: config.GetProxyPrefix(),
58-
ConnectionTimeout: config.GetConnectionTimeout(),
59-
ConnectionKeepAlive: config.GetConnectionKeepAlive(),
60-
ResponseTimeout: config.GetResponseTimeout(),
61-
ReadTimeout: config.GetReadTimeout(),
62-
StreamBufferSize: config.GetStreamBufferSize(),
63-
Profile: config.GetProxyProfile(),
64-
MaxIdleConns: 200,
65-
IdleConnTimeout: 90 * time.Second,
66-
MaxConnsPerHost: 50,
55+
ollaConfig := &olla.Configuration{}
56+
ollaConfig.ProxyPrefix = config.GetProxyPrefix()
57+
ollaConfig.ConnectionTimeout = config.GetConnectionTimeout()
58+
ollaConfig.ConnectionKeepAlive = config.GetConnectionKeepAlive()
59+
ollaConfig.ResponseTimeout = config.GetResponseTimeout()
60+
ollaConfig.ReadTimeout = config.GetReadTimeout()
61+
ollaConfig.StreamBufferSize = config.GetStreamBufferSize()
62+
ollaConfig.Profile = config.GetProxyProfile()
63+
64+
if ollaSpecific, ok := config.(interface {
65+
GetMaxIdleConns() int
66+
GetIdleConnTimeout() time.Duration
67+
GetMaxConnsPerHost() int
68+
}); ok {
69+
ollaConfig.MaxIdleConns = ollaSpecific.GetMaxIdleConns()
70+
ollaConfig.IdleConnTimeout = ollaSpecific.GetIdleConnTimeout()
71+
ollaConfig.MaxConnsPerHost = ollaSpecific.GetMaxConnsPerHost()
72+
} else {
73+
// fallback option with defaults
74+
ollaConfig.MaxIdleConns = 200
75+
ollaConfig.IdleConnTimeout = 90 * time.Second
76+
ollaConfig.MaxConnsPerHost = 50
6777
}
78+
6879
return olla.NewService(discovery, selector, ollaConfig, collector, metricsExtractor, logger)
6980
})
7081

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,10 @@
11
package olla
22

33
import (
4-
"time"
5-
6-
"github.com/thushan/olla/internal/core/constants"
4+
"github.com/thushan/olla/internal/adapter/proxy/config"
75
)
86

9-
// Configuration holds proxy settings
7+
// Configuration holds Olla proxy settings
108
type Configuration struct {
11-
ProxyPrefix string
12-
Profile string
13-
ConnectionTimeout time.Duration
14-
ConnectionKeepAlive time.Duration
15-
ResponseTimeout time.Duration
16-
ReadTimeout time.Duration
17-
StreamBufferSize int
18-
19-
// Olla-specific fields for advanced connection pooling
20-
IdleConnTimeout time.Duration
21-
MaxIdleConns int
22-
MaxConnsPerHost int
23-
}
24-
25-
func (c *Configuration) GetProxyProfile() string {
26-
if c.Profile == "" {
27-
return constants.ConfigurationProxyProfileAuto
28-
}
29-
return c.Profile
30-
}
31-
32-
func (c *Configuration) GetProxyPrefix() string {
33-
if c.ProxyPrefix == "" {
34-
return constants.DefaultOllaProxyPathPrefix
35-
}
36-
return c.ProxyPrefix
37-
}
38-
39-
func (c *Configuration) GetConnectionTimeout() time.Duration {
40-
if c.ConnectionTimeout == 0 {
41-
return DefaultTimeout
42-
}
43-
return c.ConnectionTimeout
44-
}
45-
46-
func (c *Configuration) GetConnectionKeepAlive() time.Duration {
47-
if c.ConnectionKeepAlive == 0 {
48-
return DefaultKeepAlive
49-
}
50-
return c.ConnectionKeepAlive
51-
}
52-
53-
func (c *Configuration) GetResponseTimeout() time.Duration {
54-
return c.ResponseTimeout
55-
}
56-
57-
func (c *Configuration) GetReadTimeout() time.Duration {
58-
if c.ReadTimeout == 0 {
59-
return DefaultReadTimeout
60-
}
61-
return c.ReadTimeout
62-
}
63-
64-
func (c *Configuration) GetStreamBufferSize() int {
65-
if c.StreamBufferSize == 0 {
66-
return DefaultStreamBufferSize
67-
}
68-
return c.StreamBufferSize
9+
config.OllaConfig
6910
}

0 commit comments

Comments
 (0)