Agent startup holds the manager's global lock

This commit is contained in:
Ian Gulliver
2026-10-16 12:56:53 -07:00
parent 3da0394116
commit be4b4dda0d
5 changed files with 125 additions and 20 deletions
+32 -4
View File
@@ -6,14 +6,42 @@ import (
"fmt"
"log/slog"
"strings"
"sync"
"g.fc.run/misc/byre/internal/api"
"g.fc.run/misc/byre/internal/store"
)
func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model string, images ...string) (api.AgentSession, error) {
type sessionLock struct {
mu sync.Mutex
refs int
}
func (m *Manager) lockDelivery(sessionID string) func() {
m.deliverMu.Lock()
defer m.deliverMu.Unlock()
sl := m.deliverLocks[sessionID]
if sl == nil {
sl = &sessionLock{}
m.deliverLocks[sessionID] = sl
}
sl.refs++
m.deliverMu.Unlock()
sl.mu.Lock()
return func() {
sl.mu.Unlock()
m.deliverMu.Lock()
sl.refs--
if sl.refs == 0 {
delete(m.deliverLocks, sessionID)
}
m.deliverMu.Unlock()
}
}
func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model string, images ...string) (api.AgentSession, error) {
unlock := m.lockDelivery(sessionID)
defer unlock()
sess, err := m.store.GetSession(ctx, sessionID)
if err != nil {
@@ -77,9 +105,9 @@ func (m *Manager) deliverAllQueued(ctx context.Context) {
if sess.Role != api.Implementer {
continue
}
m.deliverMu.Lock()
unlock := m.lockDelivery(sess.Id)
_, err = m.deliverQueued(ctx, sess)
m.deliverMu.Unlock()
unlock()
if err != nil {
slog.Error("deliver queued message", "session", sess.Id, "err", err)
}