good morning!!!!

Skip to content
Snippets Groups Projects
Commit 5601c72c authored by Garet Halliday's avatar Garet Halliday
Browse files

fix

parent bfa2c7f3
No related merge requests found
......@@ -32,10 +32,10 @@ func NewOven(logger *zap.Logger) *Oven {
return &oven
}
// Learn will add a recipe to the kitchen. Returns initial conns
func (T *Oven) Learn(name string, recipe *pool.Recipe) []*fed.Conn {
// Learn will add a recipe to the kitchen. Returns initial removed and added conns
func (T *Oven) Learn(name string, recipe *pool.Recipe) (removed []*fed.Conn, added []*fed.Conn) {
n := recipe.AllocateInitial()
initial := make([]*fed.Conn, 0, n)
added = make([]*fed.Conn, 0, n)
for i := 0; i < n; i++ {
conn, err := recipe.Dial()
if err != nil {
......@@ -47,13 +47,15 @@ func (T *Oven) Learn(name string, recipe *pool.Recipe) []*fed.Conn {
break
}
initial = append(initial, conn)
added = append(added, conn)
}
T.mu.Lock()
defer T.mu.Unlock()
r := NewRecipe(recipe, initial)
removed = T.forget(name)
r := NewRecipe(recipe, added)
if T.byName == nil {
T.byName = make(map[string]*Recipe)
......@@ -63,21 +65,16 @@ func (T *Oven) Learn(name string, recipe *pool.Recipe) []*fed.Conn {
if T.byConn == nil {
T.byConn = make(map[*fed.Conn]*Recipe)
}
for _, conn := range initial {
for _, conn := range added {
T.byConn[conn] = r
}
T.order = append(T.order, r)
return initial
return
}
// Forget will remove a recipe from the kitchen. All conn made with the recipe will be closed. Returns conns made with
// recipe.
func (T *Oven) Forget(name string) []*fed.Conn {
T.mu.Lock()
defer T.mu.Unlock()
func (T *Oven) forget(name string) []*fed.Conn {
r, ok := T.byName[name]
if !ok {
return nil
......@@ -97,6 +94,15 @@ func (T *Oven) Forget(name string) []*fed.Conn {
return conns
}
// Forget will remove a recipe from the kitchen. All conn made with the recipe will be closed. Returns conns made with
// recipe.
func (T *Oven) Forget(name string) []*fed.Conn {
T.mu.Lock()
defer T.mu.Unlock()
return T.forget(name)
}
func (T *Oven) cook(r *Recipe) (*fed.Conn, error) {
T.mu.Unlock()
defer T.mu.Lock()
......
......@@ -14,7 +14,6 @@ import (
"gfx.cafe/gfx/pggat/lib/gat/handlers/pool"
"gfx.cafe/gfx/pggat/lib/gat/handlers/pool/spool/kitchen"
"gfx.cafe/gfx/pggat/lib/gat/metrics"
"gfx.cafe/gfx/pggat/lib/util/slices"
)
type Pool struct {
......@@ -73,16 +72,29 @@ func (T *Pool) addServer(conn *fed.Conn) {
T.pooler.AddServer(server.ID)
}
func (T *Pool) removeServer(conn *fed.Conn) {
// TODO(garet) do something that isn't O(n)
for id, server := range T.servers {
if server.Conn == conn {
delete(T.servers, id)
}
}
}
func (T *Pool) AddRecipe(name string, recipe *pool.Recipe) {
servers := T.oven.Learn(name, recipe)
if len(servers) == 0 {
removed, added := T.oven.Learn(name, recipe)
if len(removed) == 0 && len(added) == 0 {
return
}
T.mu.Lock()
defer T.mu.Unlock()
for _, server := range servers {
for _, server := range removed {
T.removeServer(server)
}
for _, server := range added {
T.addServer(server)
}
}
......@@ -96,11 +108,8 @@ func (T *Pool) RemoveRecipe(name string) {
T.mu.Lock()
defer T.mu.Unlock()
// TODO(garet) do something that isn't O(n^2)
for id, server := range T.servers {
if slices.Contains(servers, server.Conn) {
delete(T.servers, id)
}
for _, server := range servers {
T.removeServer(server)
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment