Agent startup holds the manager's global lock
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user