Skip to content

Commit 040ce32

Browse files
authored
Support memcached max_item_size (#3929)
* support memcached max_item_size configuration Signed-off-by: yeya24 <[email protected]> * add new metric Signed-off-by: yeya24 <[email protected]> * dont cast to uint Signed-off-by: yeya24 <[email protected]>
1 parent f485bc8 commit 040ce32

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
* [ENHANCEMENT] Alertmanager: load alertmanager configurations from object storage concurrently, and only load necessary configurations, speeding configuration synchronization process and executing fewer "GET object" operations to the storage when sharding is enabled. #3898
103103
* [ENHANCEMENT] Blocks storage: Ingester can now stream entire chunks instead of individual samples to the querier. At the moment this feature must be explicitly enabled either by using `-ingester.stream-chunks-when-using-blocks` flag or `ingester_stream_chunks_when_using_blocks` (boolean) field in runtime config file, but these configuration options are temporary and will be removed when feature is stable. #3889
104104
* [ENHANCEMENT] Alertmanager: New endpoint `/multitenant_alertmanager/delete_tenant_config` to delete configuration for tenant identified by `X-Scope-OrgID` header. This is an internal endpoint, available even if Alertmanager API is not enabled by using `-experimental.alertmanager.enable-api`. #3900
105+
* [ENHANCEMENT] MemCached: Add `max_item_size` support. #3929
105106
* [BUGFIX] Cortex: Fixed issue where fatal errors and various log messages where not logged. #3778
106107
* [BUGFIX] HA Tracker: don't track as error in the `cortex_kv_request_duration_seconds` metric a CAS operation intentionally aborted. #3745
107108
* [BUGFIX] Querier / ruler: do not log "error removing stale clients" if the ring is empty. #3761

docs/configuration/config-file-reference.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4123,6 +4123,11 @@ The `memcached_client_config` configures the client used to connect to Memcached
41234123
# CLI flag: -<prefix>.memcached.max-idle-conns
41244124
[max_idle_conns: <int> | default = 16]
41254125
4126+
# The maximum size of an item stored in memcached. Bigger items are not stored.
4127+
# If set to 0, no maximum size is enforced.
4128+
# CLI flag: -<prefix>.memcached.max-item-size
4129+
[max_item_size: <int> | default = 0]
4130+
41264131
# Period with which to poll DNS for memcache servers.
41274132
# CLI flag: -<prefix>.memcached.update-interval
41284133
[update_interval: <duration> | default = 1m]

pkg/chunk/cache/memcached_client.go

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,13 @@ type memcachedClient struct {
5252
cbTimeout time.Duration
5353
cbInterval time.Duration
5454

55+
maxItemSize int
56+
5557
quit chan struct{}
5658
wait sync.WaitGroup
5759

5860
numServers prometheus.Gauge
61+
skipped prometheus.Counter
5962

6063
logger log.Logger
6164
}
@@ -67,6 +70,7 @@ type MemcachedClientConfig struct {
6770
Addresses string `yaml:"addresses"` // EXPERIMENTAL.
6871
Timeout time.Duration `yaml:"timeout"`
6972
MaxIdleConns int `yaml:"max_idle_conns"`
73+
MaxItemSize int `yaml:"max_item_size"`
7074
UpdateInterval time.Duration `yaml:"update_interval"`
7175
ConsistentHash bool `yaml:"consistent_hash"`
7276
CBFailures uint `yaml:"circuit_breaker_consecutive_failures"`
@@ -86,6 +90,7 @@ func (cfg *MemcachedClientConfig) RegisterFlagsWithPrefix(prefix, description st
8690
f.UintVar(&cfg.CBFailures, prefix+"memcached.circuit-breaker-consecutive-failures", 10, description+"Trip circuit-breaker after this number of consecutive dial failures (if zero then circuit-breaker is disabled).")
8791
f.DurationVar(&cfg.CBTimeout, prefix+"memcached.circuit-breaker-timeout", 10*time.Second, description+"Duration circuit-breaker remains open after tripping (if zero then 60 seconds is used).")
8892
f.DurationVar(&cfg.CBInterval, prefix+"memcached.circuit-breaker-interval", 10*time.Second, description+"Reset circuit-breaker counts after this long (if zero then never reset).")
93+
f.IntVar(&cfg.MaxItemSize, prefix+"memcached.max-item-size", 0, description+"The maximum size of an item stored in memcached. Bigger items are not stored. If set to 0, no maximum size is enforced.")
8994
}
9095

9196
// NewMemcachedClient creates a new MemcacheClient that gets its server list
@@ -107,25 +112,33 @@ func NewMemcachedClient(cfg MemcachedClientConfig, name string, r prometheus.Reg
107112
}, r))
108113

109114
newClient := &memcachedClient{
110-
name: name,
111-
Client: client,
112-
serverList: selector,
113-
hostname: cfg.Host,
114-
service: cfg.Service,
115-
logger: logger,
116-
provider: dns.NewProvider(logger, dnsProviderRegisterer, dns.GolangResolverType),
117-
cbs: make(map[string]*gobreaker.CircuitBreaker),
118-
cbFailures: cfg.CBFailures,
119-
cbInterval: cfg.CBInterval,
120-
cbTimeout: cfg.CBTimeout,
121-
quit: make(chan struct{}),
115+
name: name,
116+
Client: client,
117+
serverList: selector,
118+
hostname: cfg.Host,
119+
service: cfg.Service,
120+
logger: logger,
121+
provider: dns.NewProvider(logger, dnsProviderRegisterer, dns.GolangResolverType),
122+
cbs: make(map[string]*gobreaker.CircuitBreaker),
123+
cbFailures: cfg.CBFailures,
124+
cbInterval: cfg.CBInterval,
125+
cbTimeout: cfg.CBTimeout,
126+
maxItemSize: cfg.MaxItemSize,
127+
quit: make(chan struct{}),
122128

123129
numServers: promauto.With(r).NewGauge(prometheus.GaugeOpts{
124130
Namespace: "cortex",
125131
Name: "memcache_client_servers",
126132
Help: "The number of memcache servers discovered.",
127133
ConstLabels: prometheus.Labels{"name": name},
128134
}),
135+
136+
skipped: promauto.With(r).NewCounter(prometheus.CounterOpts{
137+
Namespace: "cortex",
138+
Name: "memcache_client_set_skip_total",
139+
Help: "Total number of skipped set operations because of the value is larger than the max-item-size.",
140+
ConstLabels: prometheus.Labels{"name": name},
141+
}),
129142
}
130143
if cfg.CBFailures > 0 {
131144
newClient.Client.DialTimeout = newClient.dialViaCircuitBreaker
@@ -183,6 +196,12 @@ func (c *memcachedClient) Stop() {
183196
}
184197

185198
func (c *memcachedClient) Set(item *memcache.Item) error {
199+
// Skip hitting memcached at all if the item is bigger than the max allowed size.
200+
if c.maxItemSize > 0 && len(item.Value) > c.maxItemSize {
201+
c.skipped.Inc()
202+
return nil
203+
}
204+
186205
err := c.Client.Set(item)
187206
if err == nil {
188207
return nil

0 commit comments

Comments
 (0)