func comparePartitions(a, b partition.Partition) int { // Highest timestamp first return int(b.MinTimestamp() - a.MinTimestamp()) }
// loadPartitions reads a slice of partition file names // and updates the internal partition state. func (db *DB) loadPartitions(names []string) error { // Slice of partition IDs partitions := []int{} isWAL := map[int]bool{} for _, name := range names { partitionNum := -1 wal := false if strings.HasSuffix(name, ".wal") { _, err := fmt.Sscanf(name, "%d.wal", &partitionNum) if err != nil { return err } wal = true } if strings.HasSuffix(name, ".part") { _, err := fmt.Sscanf(name, "%d.part", &partitionNum) if err != nil { return err } } if partitionNum < 0 { return errors.New(fmt.Sprintf("catena: invalid partition %s", name)) } if seenWAL, seen := isWAL[partitionNum]; seen { if (seenWAL && !wal) || (!seenWAL && wal) { // We have both a .wal and a .part, so // we'll get rid of the .part and recompact. wal = true err := os.Remove(filepath.Join(db.baseDir, fmt.Sprintf("%d.part", partitionNum))) if err != nil { return err } } } isWAL[partitionNum] = wal } for partitionNum := range isWAL { partitions = append(partitions, partitionNum) } // Sort the partitions in increasing order. sort.Ints(partitions) for _, part := range partitions { if int64(part) > db.lastPartitionID { db.lastPartitionID = int64(part) } var p partition.Partition var err error var filename string if isWAL[part] { filename = filepath.Join(db.baseDir, fmt.Sprintf("%d.wal", part)) w, err := wal.OpenFileWAL(filename) if err != nil { return err } p, err = memory.RecoverMemoryPartition(w) if err != nil { return err } } else { filename = filepath.Join(db.baseDir, fmt.Sprintf("%d.part", part)) p, err = disk.OpenDiskPartition(filename) if err != nil { return err } } // No need for locks here. if db.partitionList.Size() == 1 { db.minTimestamp = p.MinTimestamp() db.maxTimestamp = p.MaxTimestamp() } if db.minTimestamp > p.MinTimestamp() { db.minTimestamp = p.MinTimestamp() } if db.maxTimestamp < p.MaxTimestamp() { db.maxTimestamp = p.MaxTimestamp() } db.partitionList.Insert(p) } return nil }