Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ go 1.18
require (
github.com/fergusstrange/embedded-postgres v1.19.0
github.com/panjf2000/gnet/v2 v2.1.2
github.com/sirupsen/logrus v1.9.0
github.com/rs/zerolog v1.28.0
github.com/stretchr/testify v1.8.1
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/lib/pq v1.10.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.16 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
go.uber.org/atomic v1.10.0 // indirect
Expand Down
20 changes: 16 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fergusstrange/embedded-postgres v1.19.0 h1:NqDufJHeA03U7biULlPHZ0pZ10/mDOMKPILEpT50Fyk=
github.com/fergusstrange/embedded-postgres v1.19.0/go.mod h1:0B+3bPsMvcNgR9nN+bdM2x9YaNYDnf3ksUqYp1OAub0=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
Expand All @@ -15,16 +17,24 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/panjf2000/ants/v2 v2.4.8 h1:JgTbolX6K6RreZ4+bfctI0Ifs+3mrE5BIHudQxUDQ9k=
github.com/panjf2000/ants/v2 v2.4.8/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
github.com/panjf2000/gnet/v2 v2.1.2 h1:WJ/PkbfV6G0wcGOng2pyCwv8oadKiqtP8p+38smN7ao=
github.com/panjf2000/gnet/v2 v2.1.2/go.mod h1:unWr2B4jF0DQPJH3GsXBGQiDcAamM6+Pf5FiK705kc4=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
Expand Down Expand Up @@ -69,8 +79,10 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
Expand Down
40 changes: 40 additions & 0 deletions logging/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package logging

import (
"io"
"os"

"github.com/rs/zerolog"
)

func NewLogger(
writer io.Writer,
timeFieldFormat string,
level zerolog.Level,
timestamp bool,
) zerolog.Logger {
// Create a new logger
consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: timeFieldFormat}

if writer == nil {
// Default to stdout
writer = consoleWriter
}

if timeFieldFormat == "" {
timeFieldFormat = zerolog.TimeFieldFormat
}

zerolog.SetGlobalLevel(level)
zerolog.TimeFieldFormat = timeFieldFormat

// Create a new logger
logger := zerolog.New(writer)
if timestamp {
logger = logger.With().Timestamp().Logger()
}

logger.Debug().Msg("Created a new logger")

return logger
}
21 changes: 13 additions & 8 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import (
"syscall"
"time"

"github.com/gatewayd-io/gatewayd/logging"
"github.com/gatewayd-io/gatewayd/network"
"github.com/panjf2000/gnet/v2"
"github.com/sirupsen/logrus"
"github.com/rs/zerolog"
)

const (
Expand All @@ -17,23 +18,26 @@ const (

//nolint:funlen
func main() {
// Create a logger
logger := logging.NewLogger(nil, zerolog.TimeFormatUnix, zerolog.InfoLevel, true)

// Create a pool
pool := network.NewPool()
pool := network.NewPool(logger)

// Add a client to the pool
for i := 0; i < network.DefaultPoolSize; i++ {
client := network.NewClient("tcp", "localhost:5432", network.DefaultBufferSize)
client := network.NewClient("tcp", "localhost:5432", network.DefaultBufferSize, logger)
if client != nil {
if err := pool.Put(client); err != nil {
logrus.Panic(err)
logger.Panic().Err(err).Msg("Failed to add client to pool")
}
}
}

// Verify that the pool is properly populated
logrus.Infof("There are %d clients in the pool", len(pool.ClientIDs()))
logger.Debug().Msgf("There are %d clients in the pool", len(pool.ClientIDs()))
if len(pool.ClientIDs()) != network.DefaultPoolSize {
logrus.Error(
logger.Error().Msg(
"The pool size is incorrect, either because " +
"the clients are cannot connect (no network connectivity) " +
"or the server is not running. Exiting...")
Expand All @@ -45,7 +49,7 @@ func main() {
Network: "tcp",
Address: "localhost:5432",
ReceiveBufferSize: network.DefaultBufferSize,
})
}, logger)

// Create a server
server := network.NewServer(
Expand Down Expand Up @@ -89,6 +93,7 @@ func main() {
nil,
nil,
proxy,
logger,
)

// Shutdown the server gracefully
Expand Down Expand Up @@ -117,6 +122,6 @@ func main() {

// Run the server
if err := server.Run(); err != nil {
logrus.Error(err)
logger.Error().Err(err).Msg("Failed to start server")
}
}
30 changes: 16 additions & 14 deletions network/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import (
"fmt"
"net"

"github.com/sirupsen/logrus"
"github.com/rs/zerolog"
)

const (
Expand All @@ -14,6 +14,8 @@ const (
type Client struct {
net.Conn

logger zerolog.Logger

ID string
ReceiveBufferSize int
Network string // tcp/udp/unix
Expand All @@ -23,13 +25,15 @@ type Client struct {

// TODO: implement a better connection management algorithm

func NewClient(network, address string, receiveBufferSize int) *Client {
func NewClient(network, address string, receiveBufferSize int, logger zerolog.Logger) *Client {
var client Client

client.logger = logger

// Try to resolve the address and log an error if it can't be resolved
addr, err := Resolve(network, address)
addr, err := Resolve(network, address, logger)
if err != nil {
logrus.Error(err)
logger.Error().Err(err).Msg("Failed to resolve address")
}

// Create a resolved client
Expand All @@ -49,44 +53,42 @@ func NewClient(network, address string, receiveBufferSize int) *Client {
// Create a new connection
conn, err := net.Dial(client.Network, client.Address)
if err != nil {
logrus.Error(err)
logger.Error().Err(err).Msg("Failed to create a new connection")
return nil
}

client.Conn = conn
if client.ReceiveBufferSize == 0 {
client.ReceiveBufferSize = DefaultBufferSize
}
logrus.Debugf("New client created: %s", client.Address)
client.ID = GetID(conn.LocalAddr().Network(), conn.LocalAddr().String(), DefaultSeed)
logger.Debug().Msgf("New client created: %s", client.Address)
client.ID = GetID(conn.LocalAddr().Network(), conn.LocalAddr().String(), DefaultSeed, logger)

return &client
}

func (c *Client) Send(data []byte) error {
if _, err := c.Write(data); err != nil {
logrus.Errorf("Couldn't send data to the server: %s", err)
c.logger.Error().Err(err).Msgf("Couldn't send data to the server: %s", err)
return fmt.Errorf("couldn't send data to the server: %w", err)
}
logrus.Debugf("Sent %d bytes to %s", len(data), c.Address)
// logrus.Infof("Sent data: %s", data)
c.logger.Debug().Msgf("Sent %d bytes to %s", len(data), c.Address)
return nil
}

func (c *Client) Receive() (int, []byte, error) {
buf := make([]byte, c.ReceiveBufferSize)
read, err := c.Read(buf)
if err != nil {
logrus.Errorf("Couldn't receive data from the server: %s", err)
c.logger.Error().Err(err).Msgf("Couldn't receive data from the server: %s", err)
return 0, nil, fmt.Errorf("couldn't receive data from the server: %w", err)
}
logrus.Debugf("Received %d bytes from %s", read, c.Address)
// logrus.Infof("Received data: %s", buf[:read])
c.logger.Debug().Msgf("Received %d bytes from %s", read, c.Address)
return read, buf, nil
}

func (c *Client) Close() {
logrus.Debugf("Closing connection to %s", c.Address)
c.logger.Debug().Msgf("Closing connection to %s", c.Address)
if c.Conn != nil {
c.Conn.Close()
}
Expand Down
18 changes: 14 additions & 4 deletions network/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"testing"

embeddedpostgres "github.com/fergusstrange/embedded-postgres"
"github.com/gatewayd-io/gatewayd/logging"
"github.com/rs/zerolog"
"github.com/stretchr/testify/assert"
)

Expand All @@ -19,7 +21,9 @@ func TestNewClient(t *testing.T) {
}
}()

client := NewClient("tcp", "localhost:5432", DefaultBufferSize)
logger := logging.NewLogger(nil, zerolog.TimeFormatUnix, zerolog.DebugLevel, true)

client := NewClient("tcp", "localhost:5432", DefaultBufferSize, logger)
defer client.Close()

assert.Equal(t, "tcp", client.Network)
Expand All @@ -41,7 +45,9 @@ func TestSend(t *testing.T) {
}
}()

client := NewClient("tcp", "localhost:5432", DefaultBufferSize)
logger := logging.NewLogger(nil, zerolog.TimeFormatUnix, zerolog.DebugLevel, true)

client := NewClient("tcp", "localhost:5432", DefaultBufferSize, logger)
defer client.Close()

assert.NotNil(t, client)
Expand All @@ -61,7 +67,9 @@ func TestReceive(t *testing.T) {
}
}()

client := NewClient("tcp", "localhost:5432", DefaultBufferSize)
logger := logging.NewLogger(nil, zerolog.TimeFormatUnix, zerolog.DebugLevel, true)

client := NewClient("tcp", "localhost:5432", DefaultBufferSize, logger)
defer client.Close()

assert.NotNil(t, client)
Expand Down Expand Up @@ -91,7 +99,9 @@ func TestClose(t *testing.T) {
}
}()

client := NewClient("tcp", "localhost:5432", DefaultBufferSize)
logger := logging.NewLogger(nil, zerolog.TimeFormatUnix, zerolog.DebugLevel, true)

client := NewClient("tcp", "localhost:5432", DefaultBufferSize, logger)
assert.NotNil(t, client)
client.Close()
assert.Equal(t, "", client.ID)
Expand Down
15 changes: 8 additions & 7 deletions network/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package network
import (
"sync"

"github.com/sirupsen/logrus"
"github.com/rs/zerolog"
)

type Pool interface {
Expand All @@ -18,7 +18,8 @@ type Pool interface {
}

type PoolImpl struct {
pool sync.Map
pool sync.Map
logger zerolog.Logger
}

var _ Pool = &PoolImpl{}
Expand All @@ -28,7 +29,7 @@ func (p *PoolImpl) ForEach(callback func(client *Client) error) {
if c, ok := value.(*Client); ok {
err := callback(c)
if err != nil {
logrus.Errorf("an error occurred running the callback: %v", err)
p.logger.Debug().Err(err).Msg("an error occurred running the callback")
}
return true
}
Expand All @@ -55,15 +56,15 @@ func (p *PoolImpl) ClientIDs() []string {

func (p *PoolImpl) Put(client *Client) error {
p.pool.Store(client.ID, client)
logrus.Debugf("Client %s has been put on the pool", client.ID)
p.logger.Debug().Msgf("Client %s has been put on the pool", client.ID)

return nil
}

func (p *PoolImpl) Pop(id string) *Client {
if client, ok := p.pool.Load(id); ok {
p.pool.Delete(id)
logrus.Debugf("Client %s has been popped from the pool", id)
p.logger.Debug().Msgf("Client %s has been popped from the pool", id)
if c, ok := client.(*Client); ok {
return c
}
Expand Down Expand Up @@ -104,6 +105,6 @@ func (p *PoolImpl) Shutdown() {
p.pool = sync.Map{}
}

func NewPool() *PoolImpl {
return &PoolImpl{pool: sync.Map{}}
func NewPool(logger zerolog.Logger) *PoolImpl {
return &PoolImpl{pool: sync.Map{}, logger: logger}
}
Loading