about summary refs log tree commit diff stats
path: root/internal/index
diff options
context:
space:
mode:
authorAlan Pearce2025-03-12 22:39:51 +0100
committerAlan Pearce2025-03-12 22:39:51 +0100
commit9015baf955c94a806c01b3dcd5648c8e68ad2685 (patch)
tree5f59386c2ab31b6e45b85576e45a1fc8ae448ae0 /internal/index
parent7bb77ff5729cc9434afee895a470fd3b4c12e6d1 (diff)
downloadsearchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.tar.lz
searchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.tar.zst
searchix-9015baf955c94a806c01b3dcd5648c8e68ad2685.zip
refactor: ensure errors have stack traces HEAD main
Diffstat (limited to 'internal/index')
-rw-r--r--internal/index/index_meta.go18
-rw-r--r--internal/index/indexer.go59
-rw-r--r--internal/index/search.go12
3 files changed, 43 insertions, 46 deletions
diff --git a/internal/index/index_meta.go b/internal/index/index_meta.go
index 336bae0..635965a 100644
--- a/internal/index/index_meta.go
+++ b/internal/index/index_meta.go
@@ -8,7 +8,7 @@ import (
 	"go.alanpearce.eu/searchix/internal/file"
 	"go.alanpearce.eu/x/log"
 
-	"github.com/pkg/errors"
+	"gitlab.com/tozd/go/errors"
 )
 
 const CurrentSchemaVersion = 3
@@ -31,7 +31,7 @@ type Meta struct {
 	data
 }
 
-func createMeta(path string, log *log.Logger) (*Meta, error) {
+func createMeta(path string, log *log.Logger) (*Meta, errors.E) {
 	exists, err := file.Exists(path)
 	if err != nil {
 		return nil, errors.WithMessage(err, "could not check for existence of index metadata")
@@ -49,7 +49,7 @@ func createMeta(path string, log *log.Logger) (*Meta, error) {
 	}, nil
 }
 
-func openMeta(path string, log *log.Logger) (*Meta, error) {
+func openMeta(path string, log *log.Logger) (*Meta, errors.E) {
 	exists, err := file.Exists(path)
 	if err != nil {
 		return nil, errors.WithMessage(err, "could not check for existence of index metadata")
@@ -58,16 +58,16 @@ func openMeta(path string, log *log.Logger) (*Meta, error) {
 		return createMeta(path, log)
 	}
 
-	j, err := os.ReadFile(path)
-	if err != nil {
-		return nil, errors.WithMessage(err, "could not open index metadata file")
+	j, baseErr := os.ReadFile(path)
+	if baseErr != nil {
+		return nil, errors.WithMessage(baseErr, "could not open index metadata file")
 	}
 	meta := Meta{
 		path: path,
 		log:  log,
 	}
-	err = json.Unmarshal(j, &meta.data)
-	if err != nil {
+
+	if err := json.Unmarshal(j, &meta.data); err != nil {
 		return nil, errors.WithMessage(err, "index metadata is corrupt, try replacing the index")
 	}
 
@@ -88,7 +88,7 @@ func (i *Meta) checkSchemaVersion() {
 	}
 }
 
-func (i *Meta) Save() error {
+func (i *Meta) Save() errors.E {
 	i.SchemaVersion = CurrentSchemaVersion
 	j, err := json.Marshal(i.data)
 	if err != nil {
diff --git a/internal/index/indexer.go b/internal/index/indexer.go
index 6a1dcf0..6000358 100644
--- a/internal/index/indexer.go
+++ b/internal/index/indexer.go
@@ -26,7 +26,7 @@ import (
 	"github.com/blevesearch/bleve/v2/document"
 	"github.com/blevesearch/bleve/v2/mapping"
 	indexAPI "github.com/blevesearch/bleve_index_api"
-	"github.com/pkg/errors"
+	"gitlab.com/tozd/go/errors"
 )
 
 type WriteIndex struct {
@@ -36,16 +36,16 @@ type WriteIndex struct {
 }
 
 type BatchError struct {
-	error
+	errors.E
 }
 
 func (e *BatchError) Error() string {
-	return e.error.Error()
+	return e.E.Error()
 }
 
 var batchSize = 10_000
 
-func createIndexMapping() (mapping.IndexMapping, error) {
+func createIndexMapping() (mapping.IndexMapping, errors.E) {
 	indexMapping := bleve.NewIndexMapping()
 	indexMapping.StoreDynamic = false
 	indexMapping.IndexDynamic = false
@@ -124,7 +124,7 @@ func createIndexMapping() (mapping.IndexMapping, error) {
 	return indexMapping, nil
 }
 
-func createIndex(indexPath string, options *Options) (bleve.Index, error) {
+func createIndex(indexPath string, options *Options) (bleve.Index, errors.E) {
 	indexMapping, err := createIndexMapping()
 	if err != nil {
 		return nil, err
@@ -136,15 +136,15 @@ func createIndex(indexPath string, options *Options) (bleve.Index, error) {
 			"PersisterNapUnderNumFiles": 500,
 		}
 	}
-	idx, err := bleve.NewUsing(
+	idx, baseErr := bleve.NewUsing(
 		indexPath,
 		indexMapping,
 		bleve.Config.DefaultIndexType,
 		bleve.Config.DefaultKVStore,
 		kvconfig,
 	)
-	if err != nil {
-		return nil, errors.WithMessagef(err, "unable to create index at path %s", indexPath)
+	if baseErr != nil {
+		return nil, errors.WithMessagef(baseErr, "unable to create index at path %s", indexPath)
 	}
 
 	return idx, nil
@@ -162,7 +162,7 @@ var expectedDataFiles = []string{
 	"nixpkgs-programs.db",
 }
 
-func deleteIndex(dataRoot string) error {
+func deleteIndex(dataRoot string) errors.E {
 	dir, err := os.ReadDir(dataRoot)
 	if err != nil {
 		return errors.WithMessagef(err, "could not read data directory %s", dataRoot)
@@ -195,8 +195,8 @@ func OpenOrCreate(
 	dataRoot string,
 	force bool,
 	options *Options,
-) (*ReadIndex, *WriteIndex, bool, error) {
-	var err error
+) (*ReadIndex, *WriteIndex, bool, errors.E) {
+	var err errors.E
 	bleve.SetLog(zap.NewStdLog(options.Logger.Named("bleve").GetLogger()))
 
 	indexPath := path.Join(dataRoot, indexBaseName)
@@ -231,9 +231,10 @@ func OpenOrCreate(
 		}
 
 	} else {
-		idx, err = bleve.Open(indexPath)
-		if err != nil {
-			return nil, nil, exists, errors.WithMessagef(err, "could not open index at path %s", indexPath)
+		var baseErr error
+		idx, baseErr = bleve.Open(indexPath)
+		if baseErr != nil {
+			return nil, nil, exists, errors.WithMessagef(baseErr, "could not open index at path %s", indexPath)
 		}
 
 		meta, err = openMeta(metaPath, options.Logger)
@@ -260,16 +261,16 @@ func OpenOrCreate(
 		nil
 }
 
-func (i *WriteIndex) SaveMeta() error {
+func (i *WriteIndex) SaveMeta() errors.E {
 	return i.Meta.Save()
 }
 
 func (i *WriteIndex) Import(
 	ctx context.Context,
 	objects <-chan nix.Importable,
-) <-chan error {
-	var err error
-	errs := make(chan error)
+) <-chan errors.E {
+	var err errors.E
+	errs := make(chan errors.E)
 
 	go func() {
 		defer close(errs)
@@ -288,8 +289,7 @@ func (i *WriteIndex) Import(
 			}
 
 			doc := document.NewDocument(nix.GetKey(obj))
-			err = indexMapping.MapDocument(doc, obj)
-			if err != nil {
+			if err := indexMapping.MapDocument(doc, obj); err != nil {
 				errs <- errors.WithMessagef(err, "could not map document for object: %s", obj.GetName())
 
 				continue
@@ -297,8 +297,7 @@ func (i *WriteIndex) Import(
 
 			var data bytes.Buffer
 			enc := gob.NewEncoder(&data)
-			err = enc.Encode(&obj)
-			if err != nil {
+			if err := enc.Encode(&obj); err != nil {
 				errs <- errors.WithMessage(err, "could not store object in search index")
 
 				continue
@@ -307,9 +306,7 @@ func (i *WriteIndex) Import(
 			newDoc := doc.AddField(field)
 
 			// log.Debug("adding object to index", "name", opt.Name)
-			err = batch.IndexAdvanced(newDoc)
-
-			if err != nil {
+			if err := batch.IndexAdvanced(newDoc); err != nil {
 				errs <- errors.WithMessagef(err, "could not index object %s", obj.GetName())
 
 				continue
@@ -334,11 +331,11 @@ func (i *WriteIndex) Import(
 	return errs
 }
 
-func (i *WriteIndex) Flush(batch *bleve.Batch) error {
+func (i *WriteIndex) Flush(batch *bleve.Batch) errors.E {
 	size := batch.Size()
 	if size == 0 {
 		return &BatchError{
-			error: errors.New("no documents to flush"),
+			E: errors.New("no documents to flush"),
 		}
 	}
 	i.log.Debug("flushing batch", "size", size)
@@ -346,7 +343,7 @@ func (i *WriteIndex) Flush(batch *bleve.Batch) error {
 	err := i.index.Batch(batch)
 	if err != nil {
 		return &BatchError{
-			error: errors.WithMessagef(err, "could not flush batch"),
+			E: errors.WithMessagef(err, "could not flush batch"),
 		}
 	}
 
@@ -355,7 +352,7 @@ func (i *WriteIndex) Flush(batch *bleve.Batch) error {
 	return nil
 }
 
-func (i *WriteIndex) Close() (err error) {
+func (i *WriteIndex) Close() (err errors.E) {
 	if e := i.Meta.Save(); e != nil {
 		// index needs to be closed anyway
 		err = errors.WithMessage(e, "could not save metadata")
@@ -368,7 +365,7 @@ func (i *WriteIndex) Close() (err error) {
 	return err
 }
 
-func (i *WriteIndex) DeleteBySource(source string) error {
+func (i *WriteIndex) DeleteBySource(source string) errors.E {
 	query := bleve.NewTermQuery(source)
 	search := bleve.NewSearchRequest(query)
 	search.Size = math.MaxInt
@@ -392,7 +389,7 @@ func (i *WriteIndex) DeleteBySource(source string) error {
 	}
 	err = i.Flush(batch)
 	if err != nil {
-		return err
+		return errors.WithStack(err)
 	}
 
 	if uint64(search.Size) < results.Total {
diff --git a/internal/index/search.go b/internal/index/search.go
index 50a5ce2..3f9c13a 100644
--- a/internal/index/search.go
+++ b/internal/index/search.go
@@ -12,7 +12,7 @@ import (
 	"github.com/blevesearch/bleve/v2"
 	"github.com/blevesearch/bleve/v2/search"
 	"github.com/blevesearch/bleve/v2/search/query"
-	"github.com/pkg/errors"
+	"gitlab.com/tozd/go/errors"
 )
 
 const DefaultPageSize = 100
@@ -33,7 +33,7 @@ type ReadIndex struct {
 	meta  *Meta
 }
 
-func (index *ReadIndex) GetEnabledSources() ([]string, error) {
+func (index *ReadIndex) GetEnabledSources() ([]string, errors.E) {
 	facet := bleve.NewFacetRequest("Source", 100)
 	query := bleve.NewMatchAllQuery()
 	search := bleve.NewSearchRequest(query)
@@ -64,13 +64,13 @@ func setField[T query.FieldableQuery](
 func (index *ReadIndex) search(
 	ctx context.Context,
 	request *bleve.SearchRequest,
-) (*Result, error) {
+) (*Result, errors.E) {
 	request.Fields = []string{"_data", "Source"}
 
 	bleveResult, err := index.index.SearchInContext(ctx, request)
 	select {
 	case <-ctx.Done():
-		return nil, ctx.Err()
+		return nil, errors.WithStack(ctx.Err())
 	default:
 		if err != nil {
 			return nil, errors.WithMessage(err, "failed to execute search query")
@@ -104,7 +104,7 @@ func (index *ReadIndex) Search(
 	keyword string,
 	from int,
 	pageSize int,
-) (*Result, error) {
+) (*Result, errors.E) {
 	query := bleve.NewBooleanQuery()
 
 	// match the user's query in any field ...
@@ -157,7 +157,7 @@ func (index *ReadIndex) GetDocument(
 	ctx context.Context,
 	source *config.Source,
 	id string,
-) (*nix.Importable, error) {
+) (*nix.Importable, errors.E) {
 	key := nix.MakeKey(source, id)
 	query := bleve.NewDocIDQuery([]string{key})
 	search := bleve.NewSearchRequest(query)