ensureStableKey ensures that the cluster seed is stable for at least 30seconds. This is required when using gossiping kv client like memberlist which will never have the same seed but will converge eventually.
(ctx context.Context, kvClient kv.Client, logger log.Logger)
| 135 | // This is required when using gossiping kv client like memberlist which will never have the same seed |
| 136 | // but will converge eventually. |
| 137 | func ensureStableKey(ctx context.Context, kvClient kv.Client, logger log.Logger) *ClusterSeed { |
| 138 | var ( |
| 139 | previous *ClusterSeed |
| 140 | stableCount int |
| 141 | ) |
| 142 | for { |
| 143 | select { |
| 144 | case <-time.After(stabilityCheckInterval): |
| 145 | case <-ctx.Done(): |
| 146 | return nil |
| 147 | } |
| 148 | |
| 149 | value, err := kvClient.Get(ctx, seedKey) |
| 150 | if err != nil { |
| 151 | level.Debug(logger).Log("msg", "failed to get cluster seed key for stability check", "err", err) |
| 152 | continue |
| 153 | } |
| 154 | if seed, ok := value.(*ClusterSeed); ok && seed != nil { |
| 155 | if previous == nil { |
| 156 | previous = seed |
| 157 | continue |
| 158 | } |
| 159 | if previous.UID != seed.UID { |
| 160 | previous = seed |
| 161 | stableCount = 0 |
| 162 | continue |
| 163 | } |
| 164 | stableCount++ |
| 165 | if stableCount > stabilityMinimumRequired { |
| 166 | return seed |
| 167 | } |
| 168 | } |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | func (rep *Reporter) init(ctx context.Context) { |
| 173 | ctx, span := tracer.Start(ctx, "UsageReporter.init") |
no test coverage detected