Skip to content

Commit

Permalink
fix: MySQL matching problem due to absence of request and response ti…
Browse files Browse the repository at this point in the history
…mestamps (#1982)

* debug mysql

Signed-off-by: gouravkrosx <gouravgreatkr@gmail.com>

* fix: fix timestamp

Signed-off-by: Pranshu Srivastava <iampranshu24@gmail.com>

* fix: changed warn logs back to debug logs

Signed-off-by: Pranshu Srivastava <iampranshu24@gmail.com>

* chore: changed enum value of MySQL

Signed-off-by: gouravkrosx <gouravgreatkr@gmail.com>

* fix: remove unnecessary reassignment of time

Signed-off-by: Pranshu Srivastava <iampranshu24@gmail.com>

---------

Signed-off-by: gouravkrosx <gouravgreatkr@gmail.com>
Signed-off-by: Pranshu Srivastava <iampranshu24@gmail.com>
Co-authored-by: Pranshu Srivastava <iampranshu24@gmail.com>
  • Loading branch information
gouravkrosx and PranshuSrivastava committed Jun 21, 2024
1 parent 0538c5f commit 47f4cc0
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 20 deletions.
4 changes: 3 additions & 1 deletion pkg/core/proxy/integrations/mysql/decode.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,10 @@ func decodeMySQL(ctx context.Context, logger *zap.Logger, clientConn net.Conn, d
errCh <- err
return
}

logger.Debug("This is the request that it was matched to", zap.Any("matched request:", mysqlRequest.Message))
// fmt.Println("This is the matched mock", zap.Any("matched response:",matchedResponse.Message, matchedResponse.Header, ))
logger.Debug("This is the matched mocks", zap.Any("matched response:", matchedResponse.Message), zap.Any("matched response header:", matchedResponse.Header))

if matchedIndex == -1 {
logger.Debug("No matching mock found")
Expand Down Expand Up @@ -240,7 +242,7 @@ func decodeMySQL(ctx context.Context, logger *zap.Logger, clientConn net.Conn, d

func getFirstSQLMock(configMocks []*models.Mock) (*models.Mock, int, bool) {
for index, mock := range configMocks {
if len(mock.Spec.MySQLResponses) > 0 && mock.Kind == "SQL" && mock.Spec.MySQLResponses[0].Header.PacketType == "MySQLHandshakeV10" {
if len(mock.Spec.MySQLResponses) > 0 && mock.Kind == "MySQL" && mock.Spec.MySQLResponses[0].Header.PacketType == "MySQLHandshakeV10" {
return mock, index, true
}
}
Expand Down
15 changes: 6 additions & 9 deletions pkg/core/proxy/integrations/mysql/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@ import (
"go.uber.org/zap"
)

var reqTimestampMock, responseTimestampMock time.Time

func encodeMySQL(ctx context.Context, logger *zap.Logger, clientConn, destConn net.Conn, mocks chan<- *models.Mock, _ models.OutgoingOptions) error {

var (
Expand Down Expand Up @@ -54,6 +52,7 @@ func encodeMySQL(ctx context.Context, logger *zap.Logger, clientConn, destConn n
errCh <- err
return nil
}
reqTimestamp := time.Now()
if source == "destination" {
handshakeResponseBuffer := data
_, err = clientConn.Write(handshakeResponseBuffer)
Expand Down Expand Up @@ -517,10 +516,10 @@ func encodeMySQL(ctx context.Context, logger *zap.Logger, clientConn, destConn n
})
}

recordMySQLMessage(ctx, mysqlRequests, mysqlResponses, "config", oprRequest, oprResponse2, mocks, reqTimestampMock, responseTimestampMock)
recordMySQLMessage(ctx, mysqlRequests, mysqlResponses, "config", oprRequest, oprResponse2, mocks, reqTimestamp)
mysqlRequests = []models.MySQLRequest{}
mysqlResponses = []models.MySQLResponse{}
err = handleClientQueries(ctx, logger, nil, clientConn, destConn, mocks, lastCommand)
err = handleClientQueries(ctx, logger, nil, clientConn, destConn, mocks, lastCommand, reqTimestamp)
logger.Debug("we got the error here at line 517", zap.Any("err", err))
if err != nil {
if err == io.EOF {
Expand All @@ -533,7 +532,7 @@ func encodeMySQL(ctx context.Context, logger *zap.Logger, clientConn, destConn n
return nil
}
} else if source == "client" {
err := handleClientQueries(ctx, logger, nil, clientConn, destConn, mocks, lastCommand)
err := handleClientQueries(ctx, logger, nil, clientConn, destConn, mocks, lastCommand, reqTimestamp)
logger.Debug("we got the error here at line 529", zap.Any("err", err))
if err != nil {
utils.LogError(logger, err, "failed to handle client queries")
Expand All @@ -557,7 +556,7 @@ func encodeMySQL(ctx context.Context, logger *zap.Logger, clientConn, destConn n

}

func handleClientQueries(ctx context.Context, logger *zap.Logger, initialBuffer []byte, clientConn, destConn net.Conn, mocks chan<- *models.Mock, lastCommand *lastCommandMap) error {
func handleClientQueries(ctx context.Context, logger *zap.Logger, initialBuffer []byte, clientConn, destConn net.Conn, mocks chan<- *models.Mock, lastCommand *lastCommandMap, reqTimestamp time.Time) error {
firstIteration := true
var (
mysqlRequests []models.MySQLRequest
Expand All @@ -575,7 +574,6 @@ func handleClientQueries(ctx context.Context, logger *zap.Logger, initialBuffer
firstIteration = false
} else {
queryBuffer, err = pUtil.ReadBytes(ctx, logger, clientConn)
reqTimestampMock = time.Now()
if err != nil {
if err != io.EOF {
utils.LogError(logger, err, "failed to read query from the mysql client")
Expand Down Expand Up @@ -607,7 +605,6 @@ func handleClientQueries(ctx context.Context, logger *zap.Logger, initialBuffer
utils.LogError(logger, err, "failed to write query to mysql server")
return err
}
responseTimestampMock = time.Now()
if res == 9 {
return nil
}
Expand Down Expand Up @@ -660,7 +657,7 @@ func handleClientQueries(ctx context.Context, logger *zap.Logger, initialBuffer
Payload: payload,
Message: mysqlResp,
})
recordMySQLMessage(ctx, mysqlRequests, mysqlResponses, "mocks", operation, responseOperation, mocks, reqTimestampMock, responseTimestampMock)
recordMySQLMessage(ctx, mysqlRequests, mysqlResponses, "mocks", operation, responseOperation, mocks, reqTimestamp)
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/core/proxy/integrations/mysql/match.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ func matchRequestWithMock(ctx context.Context, mysqlRequest models.MySQLRequest,
maxMatchCount := 0

for i, mock := range allMocks {

if mock.Kind != "MySQL" {
continue
}

if ctx.Err() != nil {
return nil, -1, "", ctx.Err()
}
Expand Down
5 changes: 2 additions & 3 deletions pkg/core/proxy/integrations/mysql/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ func (m *MySQL) MockOutgoing(ctx context.Context, src net.Conn, dstCfg *integrat
return nil
}

func recordMySQLMessage(_ context.Context, mysqlRequests []models.MySQLRequest, mysqlResponses []models.MySQLResponse, name, operation, responseOperation string, mocks chan<- *models.Mock, reqTimestampMock time.Time, resTimestampMock time.Time) {

func recordMySQLMessage(_ context.Context, mysqlRequests []models.MySQLRequest, mysqlResponses []models.MySQLResponse, name, operation, responseOperation string, mocks chan<- *models.Mock, reqTimestampMock time.Time) {
meta := map[string]string{
"type": name,
"operation": operation,
Expand All @@ -77,7 +76,7 @@ func recordMySQLMessage(_ context.Context, mysqlRequests []models.MySQLRequest,
MySQLResponses: mysqlResponses,
Created: time.Now().Unix(),
ReqTimestampMock: reqTimestampMock,
ResTimestampMock: resTimestampMock,
ResTimestampMock: time.Now(),
},
}
mocks <- mysqlMock
Expand Down
2 changes: 1 addition & 1 deletion pkg/models/testcase.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const (
HTTP Kind = "Http"
GENERIC Kind = "Generic"
REDIS Kind = "Redis"
SQL Kind = "SQL"
SQL Kind = "MySQL"
Postgres Kind = "Postgres"
GRPC_EXPORT Kind = "gRPC"
Mongo Kind = "Mongo"
Expand Down
16 changes: 10 additions & 6 deletions pkg/platform/yaml/mockdb/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,12 @@ func EncodeMock(mock *models.Mock, logger *zap.Logger) (*yaml.NetworkTrafficDoc,
}

sqlSpec := models.MySQLSpec{
Metadata: mock.Spec.Metadata,
Requests: requests,
Response: responses,
CreatedAt: mock.Spec.Created,
Metadata: mock.Spec.Metadata,
Requests: requests,
Response: responses,
CreatedAt: mock.Spec.Created,
ReqTimestampMock: mock.Spec.ReqTimestampMock,
ResTimestampMock: mock.Spec.ResTimestampMock,
}
err := yamlDoc.Spec.Encode(sqlSpec)
if err != nil {
Expand Down Expand Up @@ -309,8 +311,10 @@ func decodeMocks(yamlMocks []*yaml.NetworkTrafficDoc, logger *zap.Logger) ([]*mo

func decodeMySQLMessage(yamlSpec *models.MySQLSpec, logger *zap.Logger) (*models.MockSpec, error) {
mockSpec := models.MockSpec{
Metadata: yamlSpec.Metadata,
Created: yamlSpec.CreatedAt,
Metadata: yamlSpec.Metadata,
Created: yamlSpec.CreatedAt,
ReqTimestampMock: yamlSpec.ReqTimestampMock,
ResTimestampMock: yamlSpec.ResTimestampMock,
}
requests := []models.MySQLRequest{}
for _, v := range yamlSpec.Requests {
Expand Down

0 comments on commit 47f4cc0

Please sign in to comment.