// newSeriesFrontier furnishes a populated diskFrontier for a given // fingerprint. A nil diskFrontier will be returned if the series cannot // be found in the store. func newSeriesFrontier(f model.Fingerprint, d diskFrontier, i leveldb.Iterator) (s *seriesFrontier, err error) { var ( lowerSeek = firstSupertime upperSeek = lastSupertime ) // If the diskFrontier for this iterator says that the candidate fingerprint // is outside of its seeking domain, there is no way that a seriesFrontier // could be materialized. Simply bail. if !d.ContainsFingerprint(f) { return } // If we are either the first or the last key in the database, we need to use // pessimistic boundary frontiers. if f.Equal(d.firstFingerprint) { lowerSeek = indexable.EncodeTime(d.firstSupertime) } if f.Equal(d.lastFingerprint) { upperSeek = indexable.EncodeTime(d.lastSupertime) } key := &dto.SampleKey{ Fingerprint: f.ToDTO(), Timestamp: upperSeek, } raw, err := coding.NewProtocolBuffer(key).Encode() if err != nil { panic(err) } i.Seek(raw) if i.Key() == nil { return } retrievedKey, err := extractSampleKey(i) if err != nil { panic(err) } retrievedFingerprint := model.NewFingerprintFromRowKey(*retrievedKey.Fingerprint.Signature) // The returned fingerprint may not match if the original seek key lives // outside of a metric's frontier. This is probable, for we are seeking to // to the maximum allowed time, which could advance us to the next // fingerprint. // // if !retrievedFingerprint.Equal(f) { i.Previous() retrievedKey, err = extractSampleKey(i) if err != nil { panic(err) } retrievedFingerprint := model.NewFingerprintFromRowKey(*retrievedKey.Fingerprint.Signature) // If the previous key does not match, we know that the requested // fingerprint does not live in the database. if !retrievedFingerprint.Equal(f) { return } } s = &seriesFrontier{ lastSupertime: indexable.DecodeTime(retrievedKey.Timestamp), lastTime: time.Unix(*retrievedKey.LastTimestamp, 0), } key.Timestamp = lowerSeek raw, err = coding.NewProtocolBuffer(key).Encode() if err != nil { panic(err) } i.Seek(raw) retrievedKey, err = extractSampleKey(i) if err != nil { panic(err) } retrievedFingerprint = model.NewFingerprintFromRowKey(*retrievedKey.Fingerprint.Signature) s.firstSupertime = indexable.DecodeTime(retrievedKey.Timestamp) return }