// NewIndexer new a indexer for async merge index data to disk. func NewIndexer(file string, options Options) (i *Indexer, err error) { var stat os.FileInfo i = &Indexer{} i.File = file i.closed = false i.syncOffset = 0 i.Options = options // must align size i.Options.NeedleMaxSize = needle.Size(i.Options.NeedleMaxSize) i.ring = NewRing(options.RingBuffer) i.bn = 0 i.buf = make([]byte, options.BufferSize) if i.f, err = os.OpenFile(file, os.O_RDWR|os.O_CREATE|myos.O_NOATIME, 0664); err != nil { log.Errorf("os.OpenFile(\"%s\") error(%v)", file, err) return nil, err } if stat, err = i.f.Stat(); err != nil { log.Errorf("index: %s Stat() error(%v)", i.File, err) return nil, err } if stat.Size() == 0 { if err = myos.Fallocate(i.f.Fd(), myos.FALLOC_FL_KEEP_SIZE, 0, _fallocSize); err != nil { log.Errorf("index: %s fallocate() error(err)", i.File, err) i.Close() return nil, err } } i.wg.Add(1) i.signal = make(chan int, 1) go i.merge() return }
// Needle get a needle from sync.Pool. func (s *Store) Needle() *needle.Needle { var n interface{} if n = s.np.Get(); n != nil { return n.(*needle.Needle) } return &needle.Needle{ Buffer: make([]byte, needle.Size(s.conf.NeedleMaxSize)), } }
// Needles get needles from sync.Pool. func (s *Store) Needles(i int) *needle.Needles { var n interface{} if n = s.nsp[i].Get(); n != nil { return n.(*needle.Needles) } return &needle.Needles{ Items: make([]needle.Needle, i), Buffer: make([]byte, needle.Size(s.conf.NeedleMaxSize)*i), } }