// Copyright 2015 The etcd Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package wal import ( "errors" "fmt" "strings" "github.com/coreos/etcd/pkg/fileutil" ) var ( badWalName = errors.New("bad wal name") ) func Exist(dirpath string) bool { names, err := fileutil.ReadDir(dirpath) if err != nil { return false } return len(names) != 0 } // searchIndex returns the last array index of names whose raft index section is // equal to or smaller than the given index. // The given names MUST be sorted. func searchIndex(names []string, index uint64) (int, bool) { for i := len(names) - 1; i >= 0; i-- { name := names[i] _, curIndex, err := parseWalName(name) if err != nil { plog.Panicf("parse correct name should never fail: %v", err) } if index >= curIndex { return i, true } } return -1, false } // names should have been sorted based on sequence number. // isValidSeq checks whether seq increases continuously. func isValidSeq(names []string) bool { var lastSeq uint64 for _, name := range names { curSeq, _, err := parseWalName(name) if err != nil { plog.Panicf("parse correct name should never fail: %v", err) } if lastSeq != 0 && lastSeq != curSeq-1 { return false } lastSeq = curSeq } return true } func checkWalNames(names []string) []string { wnames := make([]string, 0) for _, name := range names { if _, _, err := parseWalName(name); err != nil { plog.Warningf("ignored file %v in wal", name) continue } wnames = append(wnames, name) } return wnames } func parseWalName(str string) (seq, index uint64, err error) { if !strings.HasSuffix(str, ".wal") { return 0, 0, badWalName } _, err = fmt.Sscanf(str, "%016x-%016x.wal", &seq, &index) return seq, index, err } func walName(seq, index uint64) string { return fmt.Sprintf("%016x-%016x.wal", seq, index) }