diff --git a/lib/gat/handlers/pool/pools/hybrid/pool.go b/lib/gat/handlers/pool/pools/hybrid/pool.go index 221ba2760a65a921e4f30457147d76a36ebde381..96af8076a7a601a27b7767f6013af00582a6f04b 100644 --- a/lib/gat/handlers/pool/pools/hybrid/pool.go +++ b/lib/gat/handlers/pool/pools/hybrid/pool.go @@ -262,7 +262,7 @@ func (T *Pool) serveRW(conn *fed.Conn) error { } } -func (T *Pool) serveRO(conn *fed.Conn) error { +func (T *Pool) serveOnly(conn *fed.Conn, write bool) error { conn.Middleware = append( conn.Middleware, unterminate.Unterminate, @@ -275,32 +275,49 @@ func (T *Pool) serveRO(conn *fed.Conn) error { T.addClient(client) defer T.removeClient(client) - T.replica.AddClient(client.ID) - defer T.replica.RemoveClient(client.ID) + if write { + T.primary.AddClient(client.ID) + defer T.primary.RemoveClient(client.ID) + } else { + T.replica.AddClient(client.ID) + defer T.replica.RemoveClient(client.ID) + } var err, serverErr error - var replica *spool.Server + var server *spool.Server defer func() { - if replica != nil { + if server != nil { if serverErr != nil { - T.replica.RemoveServer(replica) + if write { + T.primary.RemoveServer(server) + } else { + T.replica.RemoveServer(server) + } } else { - T.replica.Release(replica) + if write { + T.primary.Release(server) + } else { + T.replica.Release(server) + } } - replica = nil + server = nil } }() if !conn.Ready { client.SetState(metrics.ConnStateAwaitingServer, nil, true) - replica = T.replica.Acquire(client.ID) - if replica == nil { + if write { + server = T.primary.Acquire(client.ID) + } else { + server = T.replica.Acquire(client.ID) + } + if server == nil { return pool.ErrClosed } - err, serverErr = T.Pair(client, replica) + err, serverErr = T.Pair(client, server) if serverErr != nil { return serverErr } @@ -317,9 +334,13 @@ func (T *Pool) serveRO(conn *fed.Conn) error { } for { - if replica != nil { - T.replica.Release(replica) - replica = nil + if server != nil { + if write { + T.primary.Release(server) + } else { + T.replica.Release(server) + } + server = nil } client.SetState(metrics.ConnStateIdle, nil, true) @@ -331,20 +352,24 @@ func (T *Pool) serveRO(conn *fed.Conn) error { client.SetState(metrics.ConnStateAwaitingServer, nil, true) - replica = T.replica.Acquire(client.ID) - if replica == nil { + if write { + server = T.primary.Acquire(client.ID) + } else { + server = T.replica.Acquire(client.ID) + } + if server == nil { return pool.ErrClosed } - err, serverErr = T.Pair(client, replica) + err, serverErr = T.Pair(client, server) if err == nil && serverErr == nil { - err, serverErr = bouncers.Bounce(conn, replica.Conn, packet) + err, serverErr = bouncers.Bounce(conn, server.Conn, packet) } if serverErr != nil { return serverErr } else { - replica.TransactionComplete() + server.TransactionComplete() client.TransactionComplete() } @@ -355,9 +380,12 @@ func (T *Pool) serveRO(conn *fed.Conn) error { } func (T *Pool) Serve(conn *fed.Conn) error { - if conn.InitialParameters[strutil.MakeCIString("hybrid.mode")] == "ro" { - return T.serveRO(conn) - } else { + switch conn.InitialParameters[strutil.MakeCIString("hybrid.mode")] { + case "ro": + return T.serveOnly(conn, false) + case "wo": + return T.serveOnly(conn, true) + default: return T.serveRW(conn) } }