]> git.giacomolli.uk - onechat/blobdiff - memory.go
Log the start and the length of each subagent run
[onechat] / memory.go
index 0fd7d835f584bdea877f09bc063aebe969ddf1fa..5ea12b75a330292d37e26a361026f6e03510aa2e 100644 (file)
--- a/memory.go
+++ b/memory.go
@@ -5,6 +5,7 @@ import (
        "encoding/json"
        "errors"
        "fmt"
        "encoding/json"
        "errors"
        "fmt"
+       "log"
        "os"
        "path/filepath"
        "strings"
        "os"
        "path/filepath"
        "strings"
@@ -22,9 +23,9 @@ var (
 )
 
 // openMemory opens the chat in root and starts the builds that are ready. The
 )
 
 // openMemory opens the chat in root and starts the builds that are ready. The
-// clock gives the dates of new messages and the days of new nodes. The builds
-// stop when ctx ends or at Close.
-func openMemory(ctx context.Context, root string, clock func() time.Time, summarizer Summarizer) (*Memory, error) {
+// clock gives the dates of new messages and the days of new nodes. logger gets
+// one line for each failed build. The builds stop when ctx ends or at Close.
+func openMemory(ctx context.Context, root string, clock func() time.Time, summarizer Summarizer, logger *log.Logger) (*Memory, error) {
        log, err := openLog(ctx, root, clock)
        if err != nil {
                return nil, err
        log, err := openLog(ctx, root, clock)
        if err != nil {
                return nil, err
@@ -35,6 +36,7 @@ func openMemory(ctx context.Context, root string, clock func() time.Time, summar
                log:        log,
                queue:      newBuildQueue(),
                summarizer: summarizer,
                log:        log,
                queue:      newBuildQueue(),
                summarizer: summarizer,
+               logger:     logger,
                changed:    make(chan struct{}),
        }
 
                changed:    make(chan struct{}),
        }
 
@@ -106,6 +108,7 @@ type Memory struct {
        cview      *View
        queue      *BuildQueue
        summarizer Summarizer
        cview      *View
        queue      *BuildQueue
        summarizer Summarizer
+       logger     *log.Logger
        ctx        context.Context
        cancel     context.CancelFunc
        workers    sync.WaitGroup
        ctx        context.Context
        cancel     context.CancelFunc
        workers    sync.WaitGroup
@@ -394,7 +397,9 @@ func (m *Memory) dispatch() {
 
                task, err := m.task(key)
                if err != nil {
 
                task, err := m.task(key)
                if err != nil {
+                       m.failed(key, fmt.Errorf("read its input: %w", err))
                        m.queue.Fail(key)
                        m.queue.Fail(key)
+
                        continue
                }
 
                        continue
                }
 
@@ -561,6 +566,10 @@ func (m *Memory) run(key NodeKey, task Task) {
                m.syncer.Written()
        }
 
                m.syncer.Written()
        }
 
+       if err != nil && m.ctx.Err() == nil {
+               m.failed(key, err)
+       }
+
        if err != nil {
                m.queue.Fail(key)
        } else {
        if err != nil {
                m.queue.Fail(key)
        } else {
@@ -572,6 +581,11 @@ func (m *Memory) run(key NodeKey, task Task) {
        m.dispatch()
 }
 
        m.dispatch()
 }
 
+// failed logs the failed build of the node key with its cause err.
+func (m *Memory) failed(key NodeKey, err error) {
+       m.logger.Printf("summary failed, retry at next message: node (%d, %d): %v", key.level, key.index, err)
+}
+
 // ready tells if both children of the node key are built and the node is not.
 func (m *Memory) ready(key NodeKey) (bool, error) {
        for _, index := range []int{2 * key.index, 2*key.index + 1} {
 // ready tells if both children of the node key are built and the node is not.
 func (m *Memory) ready(key NodeKey) (bool, error) {
        for _, index := range []int{2 * key.index, 2*key.index + 1} {