From 0aecfcd742ecb3b0b9b84a751e4dbca1835eaef9 Mon Sep 17 00:00:00 2001 From: "A.Unger" Date: Fri, 23 Oct 2020 23:31:37 +0200 Subject: [PATCH] small refactor on disk autoincrement index, move some helper functions --- .../pkg/indexer/index/disk/autoincrement.go | 60 +++---------------- accounts/pkg/indexer/index/disk/helper.go | 51 ++++++++++++++++ 2 files changed, 59 insertions(+), 52 deletions(-) diff --git a/accounts/pkg/indexer/index/disk/autoincrement.go b/accounts/pkg/indexer/index/disk/autoincrement.go index 33bfd82b2..846187e2a 100644 --- a/accounts/pkg/indexer/index/disk/autoincrement.go +++ b/accounts/pkg/indexer/index/disk/autoincrement.go @@ -5,8 +5,6 @@ import ( "os" "path" "path/filepath" - "reflect" - "sort" "strconv" "strings" @@ -28,22 +26,17 @@ type Autoincrement struct { bound *option.Bound } -// - Creating an autoincrement index has to be thread safe. -// - Validation: autoincrement indexes should only work on integers. - func init() { registry.IndexConstructorRegistry["disk"]["autoincrement"] = NewAutoincrementIndex } -// NewAutoincrementIndex instantiates a new AutoincrementIndex instance. Init() should be -// called afterward to ensure correct on-disk structure. +// NewAutoincrementIndex instantiates a new AutoincrementIndex instance. Init() MUST be called upon instantiation. func NewAutoincrementIndex(o ...option.Option) index.Index { opts := &option.Options{} for _, opt := range o { opt(opts) } - // validate the field if opts.Entity == nil { panic("invalid autoincrement index: configured without entity") } @@ -63,16 +56,6 @@ func NewAutoincrementIndex(o ...option.Option) index.Index { } } -var ( - validKinds = []reflect.Kind{ - reflect.Int, - reflect.Int8, - reflect.Int16, - reflect.Int32, - reflect.Int64, - } -) - // Init initializes an autoincrement index. func (idx *Autoincrement) Init() error { if _, err := os.Stat(idx.filesDir); err != nil { @@ -207,38 +190,6 @@ func (idx *Autoincrement) FilesDir() string { return idx.filesDir } -func isValidKind(k reflect.Kind) bool { - for _, v := range validKinds { - if k == v { - return true - } - } - return false -} - -func getKind(i interface{}, field string) (reflect.Kind, error) { - r := reflect.ValueOf(i) - return reflect.Indirect(r).FieldByName(field).Kind(), nil -} - -func readDir(dirname string) ([]os.FileInfo, error) { - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - list, err := f.Readdir(-1) - f.Close() - if err != nil { - return nil, err - } - sort.Slice(list, func(i, j int) bool { - a, _ := strconv.Atoi(list[i].Name()) - b, _ := strconv.Atoi(list[j].Name()) - return a < b - }) - return list, nil -} - func (idx *Autoincrement) next() (int, error) { files, err := readDir(idx.indexRootDir) if err != nil { @@ -249,7 +200,7 @@ func (idx *Autoincrement) next() (int, error) { return int(idx.bound.Lower), nil } - latest, err := strconv.Atoi(path.Base(files[len(files)-1].Name())) + latest := lastValueFromTree(err, files) if err != nil { return -1, err } @@ -261,7 +212,12 @@ func (idx *Autoincrement) next() (int, error) { return latest + 1, nil } -// Delete deletes the index folder from its storage. +// Delete deletes the index root folder from the configured storage. func (idx *Autoincrement) Delete() error { return os.RemoveAll(idx.indexRootDir) } + +func lastValueFromTree(err error, files []os.FileInfo) int { + latest, err := strconv.Atoi(path.Base(files[len(files)-1].Name())) + return latest +} diff --git a/accounts/pkg/indexer/index/disk/helper.go b/accounts/pkg/indexer/index/disk/helper.go index 8be362d5f..50eafd413 100644 --- a/accounts/pkg/indexer/index/disk/helper.go +++ b/accounts/pkg/indexer/index/disk/helper.go @@ -1 +1,52 @@ package disk + +import ( + "os" + "reflect" + "sort" + "strconv" +) + +var ( + validKinds = []reflect.Kind{ + reflect.Int, + reflect.Int8, + reflect.Int16, + reflect.Int32, + reflect.Int64, + } +) + +// verifies an autoincrement field kind on the target struct. +func isValidKind(k reflect.Kind) bool { + for _, v := range validKinds { + if k == v { + return true + } + } + return false +} + +func getKind(i interface{}, field string) (reflect.Kind, error) { + r := reflect.ValueOf(i) + return reflect.Indirect(r).FieldByName(field).Kind(), nil +} + +// readDir is an implementation of os.ReadDir but with different sorting. +func readDir(dirname string) ([]os.FileInfo, error) { + f, err := os.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + sort.Slice(list, func(i, j int) bool { + a, _ := strconv.Atoi(list[i].Name()) + b, _ := strconv.Atoi(list[j].Name()) + return a < b + }) + return list, nil +}