# HG changeset patch # User Sascha Wilde # Date 1716994522 -7200 # Node ID 8cbe0a873e32f5a89cd41a3ca3f850c7e1b50409 # Parent ea16ae7483575cb756c4ba019dd8870ad7735483# Parent 1ea1d3ef2258cc3d1e1ad66eda4a0d2ad583e764 Merged diff -r ea16ae748357 -r 8cbe0a873e32 pkg/imports/isr.go --- a/pkg/imports/isr.go Wed May 29 12:55:50 2024 +0200 +++ b/pkg/imports/isr.go Wed May 29 16:55:22 2024 +0200 @@ -16,6 +16,7 @@ import ( "context" "database/sql" + "fmt" "time" "gemma.intevation.de/gemma/pkg/log" @@ -146,7 +147,7 @@ heights, err := mesh.ParseClassBreaks(isr.ClassBreaks) if err != nil { - return nil, err + return nil, fmt.Errorf("class breaks loading failed: %w", err) } heights = heights.Dedup() @@ -248,6 +249,7 @@ var markings, beams int // For all sounding results in bottleneck. +soundingResults: for _, sr := range bn.srs { switch sr.surveyType { case models.SurveyTypeMarking: @@ -306,7 +308,11 @@ tree, err := mesh.FetchMeshDirectly(ctx, tx, sr.id) if err != nil { - return err + return fmt.Errorf("mesh loading failed: %w", err) + } + if tree == nil { + feedback.Warn("mesh index of id %d is invalid", sr.id) + continue soundingResults } hs := heights.ExtrapolateClassBreaks(tree.Min().Z, tree.Max().Z).Dedup() diff -r ea16ae748357 -r 8cbe0a873e32 pkg/mesh/cache.go --- a/pkg/mesh/cache.go Wed May 29 12:55:50 2024 +0200 +++ b/pkg/mesh/cache.go Wed May 29 16:55:22 2024 +0200 @@ -16,6 +16,8 @@ import ( "context" "database/sql" + "errors" + "fmt" "sync" "time" ) @@ -51,6 +53,7 @@ SELECT mesh_index, coalesce(mesh_index_version, 1) AS mesh_index_version FROM waterway.sounding_results WHERE id = $1 + AND mesh_checksum IS NOT NULL AND mesh_index IS NOT NULL ` fetchMeshSQL = ` SELECT mesh_checksum, mesh_index, coalesce(mesh_index_version, 1) AS mesh_index_version @@ -107,13 +110,15 @@ ) (*STRTree, error) { var data []byte var version int - err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data, &version) - if err != nil { - return nil, err + switch err := tx.QueryRowContext(ctx, directMeshSQL, id).Scan(&data, &version); { + case errors.Is(err, sql.ErrNoRows): + return nil, nil + case err != nil: + return nil, fmt.Errorf("fetching mesh from db failed: %w", err) } tree := new(STRTree) if err := tree.FromBytes(data, version); err != nil { - return nil, err + return nil, fmt.Errorf("deserializing mesh failed: %w (version %d)", err, version) } return tree, nil } diff -r ea16ae748357 -r 8cbe0a873e32 pkg/mesh/meshserialize.go --- a/pkg/mesh/meshserialize.go Wed May 29 12:55:50 2024 +0200 +++ b/pkg/mesh/meshserialize.go Wed May 29 16:55:22 2024 +0200 @@ -80,7 +80,7 @@ version = coalesceVersion(version) r, err := gzip.NewReader(bytes.NewReader(data)) if err != nil { - return err + return fmt.Errorf("not gzip formatted: %w", err) } return s.deserialize(bufio.NewReader(r), version) } @@ -88,7 +88,7 @@ func (s *STRTree) deserialize(r *bufio.Reader, version int) error { header, err := r.Peek(8) if err != nil { - return err + return fmt.Errorf("peeking 8 bytes ahead failed: %w", err) } if bytes.HasPrefix(header, []byte(magicHeader)) { realVersion := int(binary.LittleEndian.Uint32(header[4:])) @@ -98,7 +98,7 @@ } // Skip the header if _, err := r.Discard(8); err != nil { - return err + return fmt.Errorf("discarding failed: %w", err) } return s.deserializeVn(r, realVersion) }