X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/4a931bccab5879ab708647b2df8dadc052f128bf..e73e445bd78ba98271da6b5165f132299fca04b1:/memory.go?ds=sidebyside diff --git a/memory.go b/memory.go index 0fd7d83..5ea12b7 100644 --- a/memory.go +++ b/memory.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "fmt" + "log" "os" "path/filepath" "strings" @@ -22,9 +23,9 @@ var ( ) // 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 @@ -35,6 +36,7 @@ func openMemory(ctx context.Context, root string, clock func() time.Time, summar log: log, queue: newBuildQueue(), summarizer: summarizer, + logger: logger, changed: make(chan struct{}), } @@ -106,6 +108,7 @@ type Memory struct { cview *View queue *BuildQueue summarizer Summarizer + logger *log.Logger 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 { + m.failed(key, fmt.Errorf("read its input: %w", err)) m.queue.Fail(key) + continue } @@ -561,6 +566,10 @@ func (m *Memory) run(key NodeKey, task Task) { m.syncer.Written() } + if err != nil && m.ctx.Err() == nil { + m.failed(key, err) + } + if err != nil { m.queue.Fail(key) } else { @@ -572,6 +581,11 @@ func (m *Memory) run(key NodeKey, task Task) { 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} {