|
|
@ -384,7 +384,7 @@ func (w *SegmentWAL) Truncate(mint int64, keep func(uint64) bool) error {
|
|
|
|
w.putBuffer(buf)
|
|
|
|
w.putBuffer(buf)
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return errors.Wrap(err, "write to compaction segment")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if r.Err() != nil {
|
|
|
|
if r.Err() != nil {
|
|
|
@ -401,14 +401,15 @@ func (w *SegmentWAL) Truncate(mint int64, keep func(uint64) bool) error {
|
|
|
|
csf.Sync()
|
|
|
|
csf.Sync()
|
|
|
|
csf.Close()
|
|
|
|
csf.Close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
candidates[0].Close() // need close before remove on platform windows
|
|
|
|
if err := renameFile(csf.Name(), candidates[0].Name()); err != nil {
|
|
|
|
if err := renameFile(csf.Name(), candidates[0].Name()); err != nil {
|
|
|
|
return err
|
|
|
|
return errors.Wrap(err, "rename compaction segment")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for _, f := range candidates[1:] {
|
|
|
|
for _, f := range candidates[1:] {
|
|
|
|
|
|
|
|
f.Close() // need close before remove on platform windows
|
|
|
|
if err := os.RemoveAll(f.Name()); err != nil {
|
|
|
|
if err := os.RemoveAll(f.Name()); err != nil {
|
|
|
|
return errors.Wrap(err, "delete WAL segment file")
|
|
|
|
return errors.Wrap(err, "delete WAL segment file")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f.Close()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if err := w.dirFile.Sync(); err != nil {
|
|
|
|
if err := w.dirFile.Sync(); err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
@ -522,6 +523,15 @@ func (w *SegmentWAL) openSegmentFile(name string) (*os.File, error) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
metab := make([]byte, 8)
|
|
|
|
metab := make([]byte, 8)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// If there is an error, we need close f for platform windows before gc.
|
|
|
|
|
|
|
|
// Otherwise, file op may fail.
|
|
|
|
|
|
|
|
hasError := true
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
|
|
if hasError {
|
|
|
|
|
|
|
|
f.Close()
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
if n, err := f.Read(metab); err != nil {
|
|
|
|
if n, err := f.Read(metab); err != nil {
|
|
|
|
return nil, errors.Wrapf(err, "validate meta %q", f.Name())
|
|
|
|
return nil, errors.Wrapf(err, "validate meta %q", f.Name())
|
|
|
|
} else if n != 8 {
|
|
|
|
} else if n != 8 {
|
|
|
@ -534,6 +544,7 @@ func (w *SegmentWAL) openSegmentFile(name string) (*os.File, error) {
|
|
|
|
if metab[4] != WALFormatDefault {
|
|
|
|
if metab[4] != WALFormatDefault {
|
|
|
|
return nil, errors.Errorf("unknown WAL segment format %d in %q", metab[4], f.Name())
|
|
|
|
return nil, errors.Errorf("unknown WAL segment format %d in %q", metab[4], f.Name())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
hasError = false
|
|
|
|
return f, nil
|
|
|
|
return f, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -702,7 +713,8 @@ func (w *SegmentWAL) Close() error {
|
|
|
|
if hf := w.head(); hf != nil {
|
|
|
|
if hf := w.head(); hf != nil {
|
|
|
|
return errors.Wrapf(hf.Close(), "closing WAL head %s", hf.Name())
|
|
|
|
return errors.Wrapf(hf.Close(), "closing WAL head %s", hf.Name())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
|
|
|
|
|
|
|
|
return w.dirFile.Close()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
const (
|
|
|
|