func (app *App) RestoreFromDir(dumpDir string, storeFunc func(*points.Points)) {
	startTime := time.Now()

	logger := zapwriter.Logger("restore").With(zap.String("dir", dumpDir))

	defer func() {
		logger.Info("restore finished",
			zap.Duration("runtime", time.Since(startTime)),
		)
	}()

	files, err := ioutil.ReadDir(dumpDir)
	if err != nil {
		logger.Error("readdir failed", zap.Error(err))
		return
	}

	// read files and lazy sorting
	list := make([]string, 0)

FilesLoop:
	for _, file := range files {
		if file.IsDir() {
			continue
		}

		r := strings.Split(file.Name(), ".")
		if len(r) < 3 { // {input,cache}.pid.nanotimestamp(.+)?
			continue
		}

		var fileWithSortPrefix string

		switch r[0] {
		case "cache":
			fileWithSortPrefix = fmt.Sprintf("%s_%s:%s", r[2], "1", file.Name())
		case "input":
			fileWithSortPrefix = fmt.Sprintf("%s_%s:%s", r[2], "2", file.Name())
		default:
			continue FilesLoop
		}

		list = append(list, fileWithSortPrefix)
	}

	if len(list) == 0 {
		logger.Info("nothing for restore")
		return
	}

	sort.Strings(list)

	for index, fileWithSortPrefix := range list {
		list[index] = strings.SplitN(fileWithSortPrefix, ":", 2)[1]
	}

	logger.Info("start restore", zap.Int("files", len(list)))

	for _, fn := range list {
		filename := path.Join(dumpDir, fn)
		app.RestoreFromFile(filename, storeFunc)

		err = os.Remove(filename)
		if err != nil {
			logger.Error("remove failed", zap.String("filename", filename), zap.Error(err))
		}
	}
}
func (app *App) RestoreFromDir(dumpDir string, storeFunc func(*points.Points)) {
	startTime := time.Now()

	logger := zapwriter.Logger("restore").With(zap.String("dir", dumpDir))

	defer func() {
		logger.Info("restore finished",
			zap.Duration("runtime", time.Since(startTime)),
		)
	}()

	files, err := ioutil.ReadDir(dumpDir)
	if err != nil {
		logger.Error("readdir failed", zap.Error(err))
		return
	}

	
	list := make([]string, 0)

FilesLoop:
	for _, file := range files {
		if file.IsDir() {
			continue
		}

		r := strings.Split(file.Name(), ".")
		if len(r) < 3 { 
			continue
		}

		var fileWithSortPrefix string

		switch r[0] {
		case "cache":
			fileWithSortPrefix = fmt.Sprintf("%s_%s:%s", r[2], "1", file.Name())
		case "input":
			fileWithSortPrefix = fmt.Sprintf("%s_%s:%s", r[2], "2", file.Name())
		default:
			continue FilesLoop
		}

		list = append(list, fileWithSortPrefix)
	}

	if len(list) == 0 {
		logger.Info("nothing for restore")
		return
	}

	sort.Strings(list)

	for index, fileWithSortPrefix := range list {
		list[index] = strings.SplitN(fileWithSortPrefix, ":", 2)[1]
	}

	logger.Info("start restore", zap.Int("files", len(list)))

	for _, fn := range list {
		filename := path.Join(dumpDir, fn)
		app.RestoreFromFile(filename, storeFunc)

		err = os.Remove(filename)
		if err != nil {
			logger.Error("remove failed", zap.String("filename", filename), zap.Error(err))
		}
	}
}
func ( app * App ) RestoreFromDir ( dumpDir string , storeFunc func ( * points . Points ) ) { startTime := time . Now ( ) logger := zapwriter . Logger ( " " ) . With ( zap . String ( " " , dumpDir ) ) defer func ( ) { logger . Info ( " " , zap . Duration ( " " , time . Since ( startTime ) ) , ) } ( ) files , err := ioutil . ReadDir ( dumpDir ) if err != nil { logger . Error ( " " , zap . Error ( err ) ) return } // read files and lazy sorting list := make ( [ ] string , 0 ) FilesLoop : for _ , file := range files { if file . IsDir ( ) { continue } r := strings . Split ( file . Name ( ) , " " ) if len ( r ) < 3 { // {input,cache}.pid.nanotimestamp(.+)? continue } var fileWithSortPrefix string switch r [ 0 ] { case " " : fileWithSortPrefix = fmt . Sprintf ( " " , r [ 2 ] , " " , file . Name ( ) ) case " " : fileWithSortPrefix = fmt . Sprintf ( " " , r [ 2 ] , " " , file . Name ( ) ) default : continue FilesLoop } list = append ( list , fileWithSortPrefix ) } if len ( list ) == 0 { logger . Info ( " " ) return } sort . Strings ( list ) for index , fileWithSortPrefix := range list { list [ index ] = strings . SplitN ( fileWithSortPrefix , " " , 2 ) [ 1 ] } logger . Info ( " " , zap . Int ( " " , len ( list ) ) ) for _ , fn := range list { filename := path . Join ( dumpDir , fn ) app . RestoreFromFile ( filename , storeFunc ) err = os . Remove ( filename ) if err != nil { logger . Error ( " " , zap . String ( " " , filename ) , zap . Error ( err ) ) } } }
// RestoreFromDir cache and input dumps from disk to memory
RestoreFromDir cache and input dumps from disk to memory