@@ -14,6 +14,7 @@ import (
14
14
"path/filepath"
15
15
"strings"
16
16
"sync/atomic"
17
+ "time"
17
18
18
19
"github.com/spf13/viper"
19
20
"go.opentelemetry.io/otel"
@@ -185,7 +186,9 @@ func (f *Factory) CreateSpanReader() (spanstore.Reader, error) {
185
186
186
187
// CreateSpanWriter implements storage.Factory
187
188
func (f * Factory ) CreateSpanWriter () (spanstore.Writer , error ) {
188
- return createSpanWriter (f .getPrimaryClient , f .primaryConfig , false , f .metricsFactory , f .logger )
189
+ ctx , cancel := context .WithTimeout (context .Background (), 30 * time .Second )
190
+ defer cancel ()
191
+ return createSpanWriter (ctx , f .getPrimaryClient , f .primaryConfig , false , f .metricsFactory , f .logger )
189
192
}
190
193
191
194
// CreateDependencyReader implements storage.Factory
@@ -238,6 +241,7 @@ func createSpanReader(
238
241
}
239
242
240
243
func createSpanWriter (
244
+ ctx context.Context ,
241
245
clientFn func () es.Client ,
242
246
cfg * config.Configuration ,
243
247
archive bool ,
@@ -276,13 +280,36 @@ func createSpanWriter(
276
280
if err != nil {
277
281
return nil , err
278
282
}
279
- if err := writer . CreateTemplates ( spanMapping , serviceMapping , cfg .Indices .IndexPrefix ); err != nil {
283
+ if err := CreateTemplatesWithRetry ( ctx , writer , spanMapping , serviceMapping , cfg .Indices .IndexPrefix , logger ); err != nil {
280
284
return nil , err
281
285
}
282
286
}
283
287
return writer , nil
284
288
}
285
289
290
+ func CreateTemplatesWithRetry (
291
+ ctx context.Context ,
292
+ writer * esSpanStore.SpanWriter ,
293
+ spanMapping string ,
294
+ serviceMapping string ,
295
+ indexPrefix cfg.IndexPrefix ,
296
+ logger * zap.Logger ,
297
+ ) error {
298
+ for i := 0 ; i < 3 ; i ++ {
299
+ select {
300
+ case <- ctx .Done ():
301
+ return fmt .Errorf ("template creation timeout: %w" , ctx .Err ())
302
+ default :
303
+ if err := writer .CreateTemplates (ctx , spanMapping , serviceMapping , indexPrefix ); err == nil {
304
+ return nil
305
+ }
306
+ logger .Warn ("Template creation failed, retrying" , zap .Int ("attempt" , i + 1 ))
307
+ time .Sleep (time .Duration (100 * (1 << i )) * time .Millisecond )
308
+ }
309
+ }
310
+ return errors .New ("failed to create templates after retries" )
311
+ }
312
+
286
313
func (f * Factory ) CreateSamplingStore (int /* maxBuckets */ ) (samplingstore.Store , error ) {
287
314
params := esSampleStore.Params {
288
315
Client : f .getPrimaryClient ,
0 commit comments