good morning!!!!

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

kill clients that hang in a transaction for too long :angry:

parent 026e1c85
No related branches found
Tags v0.1.0
No related merge requests found
package bctx
import (
"time"
"pggat2/lib/bouncer/bouncers/v1/berr"
"pggat2/lib/perror"
"pggat2/lib/util/decorator"
......@@ -10,6 +12,8 @@ import (
type Context struct {
noCopy decorator.NoCopy
clientIdleTimeout time.Duration
transaction bool
query bool
copyIn bool
......@@ -20,16 +24,31 @@ type Context struct {
client, server zap.ReadWriter
}
func MakeContext(client, server zap.ReadWriter) Context {
func MakeContext(client, server zap.ReadWriter, clientIdleTimeout time.Duration) Context {
return Context{
clientIdleTimeout: clientIdleTimeout,
client: client,
server: server,
}
}
func (T *Context) Done() {
// if it fails, it's not my problem - Garet, May 12, 2023
_ = T.client.SetReadDeadline(time.Time{})
}
// io helper funcs
func (T *Context) ClientRead() (zap.In, berr.Error) {
if T.clientIdleTimeout > 0 {
err := T.client.SetReadDeadline(time.Now().Add(T.clientIdleTimeout))
if err != nil {
return zap.In{}, berr.Client{
Error: perror.Wrap(err),
}
}
}
in, err := T.client.Read()
if err != nil {
return zap.In{}, berr.Client{
......
......@@ -2,6 +2,7 @@ package bouncers
import (
"log"
"time"
"pggat2/lib/bouncer/bouncers/v1/bctx"
"pggat2/lib/bouncer/bouncers/v1/berr"
......@@ -258,7 +259,8 @@ func transaction(ctx *bctx.Context) berr.Error {
}
func Bounce(client, server zap.ReadWriter) {
ctx := bctx.MakeContext(client, server)
ctx := bctx.MakeContext(client, server, 1*time.Second) // TODO(garet) make this configurable
defer ctx.Done()
err := transaction(&ctx)
if err != nil {
log.Println("error", err)
......
package dio
import (
"io"
"time"
)
type Reader interface {
SetReadDeadline(deadline time.Time) error
io.Reader
}
package dio
import "time"
type ReadWriter interface {
SetDeadline(deadline time.Time) error
Reader
Writer
}
package dio
import (
"io"
"time"
)
type Writer interface {
SetWriteDeadline(deadline time.Time) error
io.Writer
}
package zap
import "io"
import (
"io"
"time"
)
type Reader interface {
io.ByteReader
SetReadDeadline(deadline time.Time) error
Read() (In, error)
ReadUntyped() (In, error)
}
package zap
import "time"
type ReadWriter interface {
SetDeadline(deadline time.Time) error
Reader
Writer
}
package zap
import "io"
import (
"io"
"time"
)
type Writer interface {
io.ByteWriter
SetWriteDeadline(deadline time.Time) error
Write() Out
Send(Out) error
}
package zio
import (
"io"
"time"
"pggat2/lib/util/dio"
"pggat2/lib/zap"
)
type Reader struct {
reader io.Reader
reader dio.Reader
buf zap.Buf
}
func MakeReader(reader io.Reader) Reader {
func MakeReader(reader dio.Reader) Reader {
return Reader{
reader: reader,
}
}
func (T *Reader) SetReadDeadline(deadline time.Time) error {
return T.reader.SetReadDeadline(deadline)
}
func (T *Reader) ReadByte() (byte, error) {
return T.buf.ReadByte(T.reader)
}
......
package zio
import (
"io"
"time"
"pggat2/lib/util/dio"
"pggat2/lib/zap"
)
type ReadWriter struct {
rw io.ReadWriter
rw dio.ReadWriter
buf zap.Buf
}
func MakeReadWriter(rw io.ReadWriter) ReadWriter {
func MakeReadWriter(rw dio.ReadWriter) ReadWriter {
return ReadWriter{
rw: rw,
}
}
func (T *ReadWriter) SetDeadline(deadline time.Time) error {
return T.rw.SetDeadline(deadline)
}
func (T *ReadWriter) SetReadDeadline(deadline time.Time) error {
return T.rw.SetReadDeadline(deadline)
}
func (T *ReadWriter) SetWriteDeadline(deadline time.Time) error {
return T.rw.SetWriteDeadline(deadline)
}
func (T *ReadWriter) ReadByte() (byte, error) {
return T.buf.ReadByte(T.rw)
}
......
package zio
import (
"io"
"time"
"pggat2/lib/util/dio"
"pggat2/lib/zap"
)
type Writer struct {
writer io.Writer
writer dio.Writer
buf zap.Buf
}
func MakeWriter(writer io.Writer) Writer {
func MakeWriter(writer dio.Writer) Writer {
return Writer{
writer: writer,
}
}
func (T *Writer) SetWriteDeadline(deadline time.Time) error {
return T.writer.SetWriteDeadline(deadline)
}
func (T *Writer) WriteByte(b byte) error {
return T.buf.WriteByte(T.writer, b)
}
......
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