// AddFreeVolume add free volumes. func (s *Store) AddFreeVolume(n int, bdir, idir string) (sn int, err error) { var ( i int bfile, ifile string v *Volume ) s.flock.Lock() for i = 0; i < n; i++ { s.FreeId++ bfile, ifile = s.freeFile(s.FreeId, bdir, idir) if myos.Exist(bfile) || myos.Exist(ifile) { continue } if v, err = NewVolume(volumeFreeId, bfile, ifile, s.conf); err != nil { // if no free space, delete the file os.Remove(bfile) os.Remove(ifile) break } v.Close() s.FreeVolumes = append(s.FreeVolumes, v) sn++ } err = s.saveFreeVolumeIndex() s.flock.Unlock() return }
// freeVolume get a free volume. func (s *Store) freeVolume(id int32) (v *Volume, err error) { var ( i int bfile, nbfile, ifile, nifile, bdir, idir string ) s.flock.Lock() defer s.flock.Unlock() if len(s.FreeVolumes) == 0 { err = errors.ErrStoreNoFreeVolume return } v = s.FreeVolumes[0] s.FreeVolumes = s.FreeVolumes[1:] v.Id = id bfile, ifile = v.Block.File, v.Indexer.File bdir, idir = filepath.Dir(bfile), filepath.Dir(ifile) for { nbfile, nifile = s.file(id, bdir, idir, i) if !myos.Exist(nbfile) && !myos.Exist(nifile) { break } i++ } log.Infof("rename block: %s to %s", bfile, nbfile) log.Infof("rename index: %s to %s", ifile, nifile) if err = os.Rename(ifile, nifile); err != nil { log.Errorf("os.Rename(\"%s\", \"%s\") error(%v)", ifile, nifile, err) v.Destroy() return } if err = os.Rename(bfile, nbfile); err != nil { log.Errorf("os.Rename(\"%s\", \"%s\") error(%v)", bfile, nbfile, err) v.Destroy() return } v.Block.File = nbfile v.Indexer.File = nifile if err = v.Open(); err != nil { v.Destroy() return } err = s.saveFreeVolumeIndex() return }