Use buffered writer when writing tombstones
When deleting many series, the many small writes flood the disks and consume a lot of CPU time.pull/8204/head
parent
6232d5e56d
commit
a78da51b7c
|
@ -69,6 +69,12 @@ func (t *Tombstoner) AddRange(keys []string, min, max int64) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
if cap(tombstones) < len(tombstones)+len(keys) {
|
||||
ts := make([]Tombstone, len(tombstones), len(tombstones)+len(keys))
|
||||
copy(ts, tombstones)
|
||||
tombstones = ts
|
||||
}
|
||||
|
||||
for _, k := range keys {
|
||||
tombstones = append(tombstones, Tombstone{
|
||||
Key: k,
|
||||
|
@ -173,30 +179,36 @@ func (t *Tombstoner) writeTombstone(tombstones []Tombstone) error {
|
|||
|
||||
var b [8]byte
|
||||
|
||||
bw := bufio.NewWriterSize(tmp, 1024*1024)
|
||||
|
||||
binary.BigEndian.PutUint32(b[:4], v2header)
|
||||
if _, err := tmp.Write(b[:4]); err != nil {
|
||||
if _, err := bw.Write(b[:4]); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, t := range tombstones {
|
||||
binary.BigEndian.PutUint32(b[:4], uint32(len(t.Key)))
|
||||
if _, err := tmp.Write(b[:4]); err != nil {
|
||||
if _, err := bw.Write(b[:4]); err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := tmp.Write([]byte(t.Key)); err != nil {
|
||||
if _, err := bw.WriteString(t.Key); err != nil {
|
||||
return err
|
||||
}
|
||||
binary.BigEndian.PutUint64(b[:], uint64(t.Min))
|
||||
if _, err := tmp.Write(b[:]); err != nil {
|
||||
if _, err := bw.Write(b[:]); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
binary.BigEndian.PutUint64(b[:], uint64(t.Max))
|
||||
if _, err := tmp.Write(b[:]); err != nil {
|
||||
if _, err := bw.Write(b[:]); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if err := bw.Flush(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// fsync the file to flush the write
|
||||
if err := tmp.Sync(); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Reference in New Issue