예제 #1
0
파일: index.go 프로젝트: wareseeker/bfs
// 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
}
예제 #2
0
파일: store.go 프로젝트: 1d7500/bfs
// 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)),
	}
}
예제 #3
0
파일: store.go 프로젝트: 1d7500/bfs
// 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),
	}
}