@@ -60,17 +60,22 @@ func (cfg *IndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, prefix str
60
60
61
61
// Validate the config.
62
62
func (cfg * IndexCacheConfig ) Validate () error {
63
- if ! util .StringsContain (supportedIndexCacheBackends , cfg .Backend ) {
64
- return errUnsupportedIndexCacheBackend
65
- }
66
63
67
- if cfg .Backend == IndexCacheBackendMemcached {
68
- if err := cfg .Memcached .Validate (); err != nil {
69
- return err
64
+ splitedBackends := strings .Split (cfg .Backend , "," )
65
+
66
+ for _ , backend := range splitedBackends {
67
+ if ! util .StringsContain (supportedIndexCacheBackends , backend ) {
68
+ return errUnsupportedIndexCacheBackend
70
69
}
71
- } else if cfg .Backend == IndexCacheBackendRedis {
72
- if err := cfg .Redis .Validate (); err != nil {
73
- return err
70
+
71
+ if backend == IndexCacheBackendMemcached {
72
+ if err := cfg .Memcached .Validate (); err != nil {
73
+ return err
74
+ }
75
+ } else if backend == IndexCacheBackendRedis {
76
+ if err := cfg .Redis .Validate (); err != nil {
77
+ return err
78
+ }
74
79
}
75
80
}
76
81
@@ -87,16 +92,42 @@ func (cfg *InMemoryIndexCacheConfig) RegisterFlagsWithPrefix(f *flag.FlagSet, pr
87
92
88
93
// NewIndexCache creates a new index cache based on the input configuration.
89
94
func NewIndexCache (cfg IndexCacheConfig , logger log.Logger , registerer prometheus.Registerer ) (storecache.IndexCache , error ) {
90
- switch cfg .Backend {
91
- case IndexCacheBackendInMemory :
92
- return newInMemoryIndexCache (cfg .InMemory , logger , registerer )
93
- case IndexCacheBackendMemcached :
94
- return newMemcachedIndexCache (cfg .Memcached , logger , registerer )
95
- case IndexCacheBackendRedis :
96
- return newRedisIndexCache (cfg .Redis , logger , registerer )
97
- default :
98
- return nil , errUnsupportedIndexCacheBackend
95
+ splitBackends := strings .Split (cfg .Backend , "," )
96
+ var caches []storecache.IndexCache
97
+
98
+ for i , backend := range splitBackends {
99
+ iReg := registerer
100
+
101
+ // Create the level label if we have more than one cache
102
+ if len (splitBackends ) > 1 {
103
+ iReg = prometheus .WrapRegistererWith (prometheus.Labels {"level" : fmt .Sprintf ("L%v" , i )}, registerer )
104
+ }
105
+
106
+ switch backend {
107
+ case IndexCacheBackendInMemory :
108
+ c , err := newInMemoryIndexCache (cfg .InMemory , logger , iReg )
109
+ if err != nil {
110
+ return c , err
111
+ }
112
+ caches = append (caches , c )
113
+ case IndexCacheBackendMemcached :
114
+ c , err := newMemcachedIndexCache (cfg .Memcached , logger , iReg )
115
+ if err != nil {
116
+ return c , err
117
+ }
118
+ caches = append (caches , c )
119
+ case IndexCacheBackendRedis :
120
+ c , err := newRedisIndexCache (cfg .Redis , logger , iReg )
121
+ if err != nil {
122
+ return c , err
123
+ }
124
+ caches = append (caches , c )
125
+ default :
126
+ return nil , errUnsupportedIndexCacheBackend
127
+ }
99
128
}
129
+
130
+ return newMultiLevelCache (caches ... ), nil
100
131
}
101
132
102
133
func newInMemoryIndexCache (cfg InMemoryIndexCacheConfig , logger log.Logger , registerer prometheus.Registerer ) (storecache.IndexCache , error ) {
0 commit comments