Skip to content

Commit 4cd71f7

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

File tree

3 files changed

+49
-11
lines changed

3 files changed

+49
-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: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,27 @@ import (
1313
"github.com/ethereum/go-ethereum/accounts/abi"
1414
)
1515

16+
var (
17+
httpClient *http.Client
18+
httpClientOnce sync.Once
19+
)
20+
21+
func getHTTPClient() *http.Client {
22+
httpClientOnce.Do(func() {
23+
httpClient = &http.Client{
24+
Transport: &http.Transport{
25+
MaxIdleConns: config.Cfg.API.ContractApiRequest.MaxIdleConns,
26+
MaxIdleConnsPerHost: config.Cfg.API.ContractApiRequest.MaxIdleConnsPerHost,
27+
MaxConnsPerHost: config.Cfg.API.ContractApiRequest.MaxConnsPerHost,
28+
IdleConnTimeout: time.Duration(config.Cfg.API.ContractApiRequest.IdleConnTimeout) * time.Second,
29+
DisableCompression: config.Cfg.API.ContractApiRequest.DisableCompression,
30+
},
31+
Timeout: time.Duration(config.Cfg.API.ContractApiRequest.Timeout) * time.Second,
32+
}
33+
})
34+
return httpClient
35+
}
36+
1637
func GetABIForContractWithCache(chainId string, contract string, abiCache map[string]*abi.ABI, mut *sync.Mutex) *abi.ABI {
1738
abi, ok := abiCache[contract]
1839
if !ok {
@@ -35,12 +56,7 @@ func GetABIForContractWithCache(chainId string, contract string, abiCache map[st
3556
func GetABIForContract(chainId string, contract string) (*abi.ABI, error) {
3657
url := fmt.Sprintf("%s/abi/%s/%s", config.Cfg.API.ThirdwebContractApi, chainId, contract)
3758

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

0 commit comments

Comments
 (0)