Skip to content
Open
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: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ setup:
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
@echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(shell lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

echo 'Package: redis*' | sudo tee /etc/apt/preferences.d/redis-8.4.pref
echo 'Pin: version 6:8.4*' | sudo tee -a /etc/apt/preferences.d/redis-8.4.pref
echo 'Pin-Priority: 1000' | sudo tee -a /etc/apt/preferences.d/redis-8.4.pref

sudo apt-get update && sudo apt-get install redis -y

sudo service redis-server stop
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,36 @@
package instrumented_resp_connection

import (
"fmt"
"net"

resp_connection "github.com/codecrafters-io/redis-tester/internal/resp/connection"
resp_value "github.com/codecrafters-io/redis-tester/internal/resp/value"
"github.com/codecrafters-io/tester-utils/logger"
)

const REDIS_DEFAULT_PORT = 6379

type InstrumentedRespConnection struct {
*resp_connection.RespConnection

// Logger is used to log a connection's network activity (sent/received)
logger *logger.Logger
}

func defaultCallbacks(logger *logger.Logger) resp_connection.RespConnectionCallbacks {
func defaultCallbacks(logger *logger.Logger, remoteAddr net.Addr) resp_connection.RespConnectionCallbacks {
return resp_connection.RespConnectionCallbacks{
BeforeSendCommand: func(reusedConnection bool, command string, args ...string) {
var commandPrefix string
if reusedConnection {
commandPrefix = ">"
} else {
commandPrefix = "$ redis-cli"
remotePort := remoteAddr.(*net.TCPAddr).Port
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a reason we need to cast this to net.TCPAddr? Why can't we just accept net.TCPAddr directly in the function args?

if remotePort == REDIS_DEFAULT_PORT {
commandPrefix = "$ redis-cli"
} else {
commandPrefix = fmt.Sprintf("$ redis-cli -p %d", remotePort)
}
}

commandWithArgs := append([]string{command}, args...)
Expand All @@ -46,7 +54,13 @@ func defaultCallbacks(logger *logger.Logger) resp_connection.RespConnectionCallb
func NewFromAddr(baseLogger *logger.Logger, addr string, connIdentifier string) (*InstrumentedRespConnection, error) {
logger := baseLogger.Clone()
logger.PushSecondaryPrefix(connIdentifier)
c, err := resp_connection.NewRespConnectionFromAddr(addr, defaultCallbacks(logger))

remoteAddr, err := net.ResolveTCPAddr("tcp", addr)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure exactly what this does but Resolve sounds like it's doing a DNS lookup or something - is there a more safer version of this like "Parse" or so?

if err != nil {
return nil, err
}

c, err := resp_connection.NewRespConnectionFromAddr(addr, defaultCallbacks(logger, remoteAddr))
if err != nil {
return nil, err
}
Expand All @@ -59,7 +73,8 @@ func NewFromAddr(baseLogger *logger.Logger, addr string, connIdentifier string)
func NewFromConn(baseLogger *logger.Logger, conn net.Conn, connIdentifier string) (*InstrumentedRespConnection, error) {
logger := baseLogger.Clone()
logger.PushSecondaryPrefix(connIdentifier)
c, err := resp_connection.NewRespConnectionFromConn(conn, defaultCallbacks(logger))

c, err := resp_connection.NewRespConnectionFromConn(conn, defaultCallbacks(logger, conn.RemoteAddr()))
if err != nil {
return nil, err
}
Expand All @@ -83,7 +98,8 @@ func (c *InstrumentedRespConnection) UpdateBaseLogger(l *logger.Logger) {
newLogger := l.Clone()
newLogger.PushSecondaryPrefix(c.GetIdentifier())
c.logger = newLogger
c.UpdateCallBacks(defaultCallbacks(c.logger))

c.UpdateCallBacks(defaultCallbacks(c.logger, c.Conn.RemoteAddr()))
}

func (c *InstrumentedRespConnection) SetReadValueInterceptor(transformer func(value resp_value.Value) resp_value.Value) {
Expand Down
Loading
Loading