func (l *Layer) GetFilesByLocation(id [16]byte, count int) ([]File, error) { var rang kvl.RangeQuery rang.Low, rang.High = keys.PrefixRange(tuple.MustAppend(nil, "file", "location", id)) rang.Limit = count ps, err := l.index.Range(rang) if err != nil { return nil, err } fs := make([]File, 0, len(ps)) for _, p := range ps { var typ, detail, path string var loc [16]byte err := tuple.UnpackInto(p.Key, &typ, &detail, &loc, &path) if err != nil { return nil, err } f, err := l.GetFile(path) if err != nil { return nil, err } if f != nil { fs = append(fs, *f) } } return fs, nil }
func (l *Layer) AllLocations() ([]Location, error) { var query kvl.RangeQuery key, _ := tuple.Append(nil, "location") query.Low, query.High = keys.PrefixRange(key) pairs, err := l.inner.Range(query) if err != nil { return nil, err } locations := make([]Location, len(pairs)) for i, pair := range pairs { err := locations[i].fromPair(pair) if err != nil { return nil, err } } return locations, nil }
func (l *Layer) WALClearOld() error { var rang kvl.RangeQuery rang.Low, rang.High = keys.PrefixRange(tuple.MustAppend(nil, "wal2")) rang.Limit = 100 for { ps, err := l.inner.Range(rang) if err != nil { return err } now := time.Now().Unix() for _, p := range ps { var typ string var id [16]byte err = tuple.UnpackInto(p.Key, &typ, &id) if err != nil { return err } timestamps, err := walParse(p.Value) if err != nil { return err } newestAge := time.Duration(now-timestamps[len(timestamps)-1]) * time.Second oldestAge := time.Duration(now-timestamps[0]) * time.Second if newestAge < -walUnsafeFutureAge { log.Printf("WARNING: WAL entry %v is %v in the future! Skipping it.", uuid.Fmt(id), newestAge) } else if oldestAge > walUnsafeOldAge { log.Printf("WARNING: WAL entry %v is %v in the past! Skipping it.", uuid.Fmt(id), oldestAge) } else if oldestAge > walExpireAge { log.Printf("Removing expired WAL entry %v (%v old)", uuid.Fmt(id), oldestAge) // Remove the oldest timestamp (only); we'll get to the other timestamps // in future passes if needed. timestamps = timestamps[1:] if len(timestamps) == 0 { err = l.inner.Delete(p.Key) if err != nil { return err } } else { err = l.inner.Set(kvl.Pair{p.Key, walDump(timestamps)}) if err != nil { return err } } } } if len(ps) < rang.Limit { break } rang.Low = ps[len(ps)-1].Key } return nil }