Skip to content

Commit c5e7712

Browse files
committed
use connection pool when querying contract abis
1 parent b95d5e4 commit c5e7712

File tree

3 files changed

+42
-11
lines changed

3 files changed

+42
-11
lines changed

cmd/root.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ func init() {
102102
rootCmd.PersistentFlags().String("api-basicAuth-username", "", "API basic auth username")
103103
rootCmd.PersistentFlags().String("api-basicAuth-password", "", "API basic auth password")
104104
rootCmd.PersistentFlags().String("api-thirdweb-clientId", "", "Thirdweb client id")
105+
rootCmd.PersistentFlags().Int("api-contractApiRequest-maxIdleConns", 100, "Max idle connections for contract API request")
106+
rootCmd.PersistentFlags().Int("api-contractApiRequest-maxIdleConnsPerHost", 100, "Max idle connections per host for contract API request")
107+
rootCmd.PersistentFlags().Int("api-contractApiRequest-maxConnsPerHost", 100, "Max connections per host for contract API request")
108+
rootCmd.PersistentFlags().Int("api-contractApiRequest-idleConnTimeout", 90, "Idle connection timeout for contract API request in seconds")
109+
rootCmd.PersistentFlags().Bool("api-contractApiRequest-disableCompression", false, "Disable compression for contract API request")
110+
rootCmd.PersistentFlags().Int("api-contractApiRequest-timeout", 10, "Timeout in seconds for contract API request")
105111
rootCmd.PersistentFlags().Bool("publisher-enabled", false, "Toggle publisher")
106112
rootCmd.PersistentFlags().String("publisher-brokers", "", "Kafka brokers")
107113
rootCmd.PersistentFlags().Bool("publisher-blocks-enabled", false, "Toggle block publisher")
@@ -182,6 +188,12 @@ func init() {
182188
viper.BindPFlag("api.basicAuth.username", rootCmd.PersistentFlags().Lookup("api-basicAuth-username"))
183189
viper.BindPFlag("api.basicAuth.password", rootCmd.PersistentFlags().Lookup("api-basicAuth-password"))
184190
viper.BindPFlag("api.thirdweb.clientId", rootCmd.PersistentFlags().Lookup("api-thirdweb-clientId"))
191+
viper.BindPFlag("api.contractApiRequest.maxIdleConns", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-maxIdleConns"))
192+
viper.BindPFlag("api.contractApiRequest.maxIdleConnsPerHost", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-maxIdleConnsPerHost"))
193+
viper.BindPFlag("api.contractApiRequest.maxConnsPerHost", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-maxConnsPerHost"))
194+
viper.BindPFlag("api.contractApiRequest.idleConnTimeout", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-idleConnTimeout"))
195+
viper.BindPFlag("api.contractApiRequest.disableCompression", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-disableCompression"))
196+
viper.BindPFlag("api.contractApiRequest.timeout", rootCmd.PersistentFlags().Lookup("api-contractApiRequest-timeout"))
185197
viper.BindPFlag("publisher.enabled", rootCmd.PersistentFlags().Lookup("publisher-enabled"))
186198
viper.BindPFlag("publisher.brokers", rootCmd.PersistentFlags().Lookup("publisher-brokers"))
187199
viper.BindPFlag("publisher.blocks.enabled", rootCmd.PersistentFlags().Lookup("publisher-blocks-enabled"))

configs/config.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,22 @@ type ThirdwebConfig struct {
112112
ClientId string `mapstructure:"clientId"`
113113
}
114114

115+
type ContractApiRequestConfig struct {
116+
MaxIdleConns int `mapstructure:"maxIdleConns"`
117+
MaxIdleConnsPerHost int `mapstructure:"maxIdleConnsPerHost"`
118+
MaxConnsPerHost int `mapstructure:"maxConnsPerHost"`
119+
IdleConnTimeout int `mapstructure:"idleConnTimeout"`
120+
DisableCompression bool `mapstructure:"disableCompression"`
121+
Timeout int `mapstructure:"timeout"`
122+
}
123+
115124
type APIConfig struct {
116-
Host string `mapstructure:"host"`
117-
BasicAuth BasicAuthConfig `mapstructure:"basicAuth"`
118-
ThirdwebContractApi string `mapstructure:"thirdwebContractApi"`
119-
AbiDecodingEnabled bool `mapstructure:"abiDecodingEnabled"`
120-
Thirdweb ThirdwebConfig `mapstructure:"thirdweb"`
125+
Host string `mapstructure:"host"`
126+
BasicAuth BasicAuthConfig `mapstructure:"basicAuth"`
127+
ThirdwebContractApi string `mapstructure:"thirdwebContractApi"`
128+
ContractApiRequest ContractApiRequestConfig `mapstructure:"contractApiRequest"`
129+
AbiDecodingEnabled bool `mapstructure:"abiDecodingEnabled"`
130+
Thirdweb ThirdwebConfig `mapstructure:"thirdweb"`
121131
}
122132

123133
type BlockPublisherConfig struct {

internal/common/abi.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,20 @@ import (
1313
"github.com/ethereum/go-ethereum/accounts/abi"
1414
)
1515

16+
var (
17+
// Global HTTP client with connection pooling
18+
httpClient = &http.Client{
19+
Transport: &http.Transport{
20+
MaxIdleConns: config.Cfg.API.ContractApiRequest.MaxIdleConns,
21+
MaxIdleConnsPerHost: config.Cfg.API.ContractApiRequest.MaxIdleConnsPerHost,
22+
MaxConnsPerHost: config.Cfg.API.ContractApiRequest.MaxConnsPerHost,
23+
IdleConnTimeout: time.Duration(config.Cfg.API.ContractApiRequest.IdleConnTimeout) * time.Second,
24+
DisableCompression: config.Cfg.API.ContractApiRequest.DisableCompression,
25+
},
26+
Timeout: time.Duration(config.Cfg.API.ContractApiRequest.Timeout) * time.Second,
27+
}
28+
)
29+
1630
func GetABIForContractWithCache(chainId string, contract string, abiCache map[string]*abi.ABI, mut *sync.Mutex) *abi.ABI {
1731
abi, ok := abiCache[contract]
1832
if !ok {
@@ -35,12 +49,7 @@ func GetABIForContractWithCache(chainId string, contract string, abiCache map[st
3549
func GetABIForContract(chainId string, contract string) (*abi.ABI, error) {
3650
url := fmt.Sprintf("%s/abi/%s/%s", config.Cfg.API.ThirdwebContractApi, chainId, contract)
3751

38-
// Create a custom client with timeouts
39-
client := &http.Client{
40-
Timeout: 10 * time.Second,
41-
}
42-
43-
resp, err := client.Get(url)
52+
resp, err := httpClient.Get(url)
4453
if err != nil {
4554
return nil, fmt.Errorf("failed to get contract abi: %v", err)
4655
}

0 commit comments

Comments
 (0)