X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/d8f3785bb69288663f4cc46bf4d609c6770452d5..6c7859cfea123479aba046614ee81028651ddaf5:/tree.go?ds=sidebyside diff --git a/tree.go b/tree.go index 4309597..765016e 100644 --- a/tree.go +++ b/tree.go @@ -93,19 +93,19 @@ func (t *Tree) open(ctx context.Context, total int) error { t.order, err = openRecords(filepath.Join(t.dir, "tree.idx"), treeRecordBytes) if err != nil { - return err + return fmt.Errorf("open node order index: %w", err) } start := Position{} if t.order.count == 0 { err = t.removeLevels() if err != nil { - return err + return fmt.Errorf("remove empty level indexes: %w", err) } } else { record, _, err := t.order.Read(t.order.count - 1) if err != nil { - return err + return fmt.Errorf("read last node order: %w", err) } // A crash can stop an add between the two index writes, so the @@ -113,7 +113,7 @@ func (t *Tree) open(ctx context.Context, total int) error { node, last := treeDecodeRecord(record) err = t.writeLevel(node, last) if err != nil { - return err + return fmt.Errorf("restore last node level: %w", err) } start = Position{ @@ -122,7 +122,7 @@ func (t *Tree) open(ctx context.Context, total int) error { } } - return t.journal.Scan(ctx, start, func(line []byte, place Position) error { + err = t.journal.Scan(ctx, start, func(line []byte, place Position) error { var node Node err := json.Unmarshal(line, &node) @@ -132,15 +132,25 @@ func (t *Tree) open(ctx context.Context, total int) error { err = t.check(node) if err != nil { - return err + return fmt.Errorf("validate scanned node: %w", err) } if nodeEnd(node.Level, node.Index) > total { return fmt.Errorf("node (%d, %d) covers messages after the log", node.Level, node.Index) } - return t.addIndex(NodeKey{node.Level, node.Index}, place) + err = t.addIndex(NodeKey{node.Level, node.Index}, place) + if err != nil { + return fmt.Errorf("index scanned node: %w", err) + } + + return nil }) + if err != nil { + return fmt.Errorf("scan node journal: %w", err) + } + + return nil } // Close closes the files of the tree. @@ -182,13 +192,18 @@ func (t *Tree) removeLevels() error { func (t *Tree) writeLevel(node NodeKey, place Position) error { level, err := t.level(node.level) if err != nil { - return err + return fmt.Errorf("open node level index: %w", err) } record := make([]byte, positionBytes) encodePosition(record, place) - return level.Write(node.index, record) + err = level.Write(node.index, record) + if err != nil { + return fmt.Errorf("write node level record: %w", err) + } + + return nil } // check makes sure that node is valid and can join the tree now. @@ -203,7 +218,7 @@ func (t *Tree) check(node Node) error { built, err := t.Built(node.Level, node.Index) if err != nil { - return err + return fmt.Errorf("check target node: %w", err) } if built { @@ -217,7 +232,7 @@ func (t *Tree) check(node Node) error { for _, index := range []int{2 * node.Index, 2*node.Index + 1} { built, err = t.Built(node.Level-1, index) if err != nil { - return err + return fmt.Errorf("check child node: %w", err) } if !built { @@ -237,10 +252,15 @@ func (t *Tree) addIndex(node NodeKey, place Position) error { err := t.order.Append(record) if err != nil { - return err + return fmt.Errorf("append node order: %w", err) + } + + err = t.writeLevel(node, place) + if err != nil { + return fmt.Errorf("write indexed node level: %w", err) } - return t.writeLevel(node, place) + return nil } // level returns the index of level, and opens it at first use. @@ -274,12 +294,16 @@ func (t *Tree) place(level, index int) (Position, bool, error) { records, err := t.level(level) if err != nil { - return Position{}, false, err + return Position{}, false, fmt.Errorf("open node level index: %w", err) } record, found, err := records.Read(index) if err != nil || !found { - return Position{}, false, err + if err != nil { + return Position{}, false, fmt.Errorf("read node level record: %w", err) + } + + return Position{}, false, nil } place := decodePosition(record) @@ -295,7 +319,7 @@ func (t *Tree) Add(node Node) error { err := t.check(node) if err != nil { - return err + return fmt.Errorf("validate node: %w", err) } line, err := json.Marshal(node) @@ -320,7 +344,11 @@ func (t *Tree) Add(node Node) error { func (t *Tree) Node(level, index int) (Node, bool, error) { place, built, err := t.place(level, index) if err != nil || !built { - return Node{}, false, err + if err != nil { + return Node{}, false, fmt.Errorf("find node position: %w", err) + } + + return Node{}, false, nil } line, err := t.journal.Read(place)