mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-26 16:41:53 +08:00
feat(recycler): add error cecycler (#10)
This commit is contained in:
@@ -86,7 +86,7 @@ var authServers = make(map[string]AuthServer)
|
||||
// RegisterAuthServerImpl registers an implementations of AuthServer.
|
||||
func RegisterAuthServerImpl(name string, authServer AuthServer) {
|
||||
if _, ok := authServers[name]; ok {
|
||||
log.Error("AuthServer named %v already exists", name)
|
||||
log.Warn("AuthServer named %v already exists", name)
|
||||
}
|
||||
authServers[name] = authServer
|
||||
}
|
||||
|
||||
+16
-16
@@ -344,7 +344,7 @@ func (c *Conn) readUploadFileEphemeralPacket() []byte {
|
||||
|
||||
_, err := io.ReadFull(r, data)
|
||||
if err != nil {
|
||||
log.Error("Error while reading data: %s", err)
|
||||
log.Warn("Error while reading data: %s", err)
|
||||
return nil
|
||||
} else {
|
||||
fileChunkData = append(fileChunkData, data)
|
||||
@@ -718,7 +718,7 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
// case though, and very unlikely to happen,
|
||||
// and the only downside is we log a bit more then.
|
||||
if err != io.EOF {
|
||||
log.Error("Error reading packet from %s: %v", c, err)
|
||||
log.Warn("Error reading packet from %s: %v", c, err)
|
||||
}
|
||||
return err
|
||||
}
|
||||
@@ -732,7 +732,7 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
c.RecycleReadPacket()
|
||||
c.SchemaName = db
|
||||
if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil {
|
||||
log.Error("Error writing ComInitDB result to %s: %v", c, err)
|
||||
log.Warn("Error writing ComInitDB result to %s: %v", c, err)
|
||||
return err
|
||||
}
|
||||
case ComQuery:
|
||||
@@ -749,10 +749,10 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
if c.Capabilities&CapabilityClientMultiStatements != 0 {
|
||||
queries, err = sqlparser.SplitStatementToPieces(query)
|
||||
if err != nil {
|
||||
log.Error("Conn %v: Error splitting query: %v", c, err)
|
||||
log.Warn("Conn %v: Error splitting query: %v", c, err)
|
||||
if werr := c.writeErrorPacketFromError(err); werr != nil {
|
||||
// If we can't even write the error, we're done.
|
||||
log.Error("Conn %v: Error writing query error: %v", c, werr)
|
||||
log.Warn("Conn %v: Error writing query error: %v", c, werr)
|
||||
return werr
|
||||
}
|
||||
}
|
||||
@@ -772,7 +772,7 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
timings.Record(queryTimingKey, queryStart)
|
||||
|
||||
if err := c.flush(); err != nil {
|
||||
log.Error("Conn %v: Flush() failed: %v", c.ID(), err)
|
||||
log.Warn("Conn %v: Flush() failed: %v", c.ID(), err)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -781,12 +781,12 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
// Return error if listener was shut down and OK otherwise
|
||||
if c.listener.isShutdown() {
|
||||
if err := c.writeErrorPacket(ERServerShutdown, SSServerShutdown, "Server shutdown in progress"); err != nil {
|
||||
log.Error("Error writing ComPing error to %s: %v", c, err)
|
||||
log.Warn("Error writing ComPing error to %s: %v", c, err)
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil {
|
||||
log.Error("Error writing ComPing result to %s: %v", c, err)
|
||||
log.Warn("Error writing ComPing result to %s: %v", c, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -800,28 +800,28 @@ func (c *Conn) handleNextCommand(handler Handler) error {
|
||||
case 1:
|
||||
c.Capabilities &^= CapabilityClientMultiStatements
|
||||
default:
|
||||
log.Error("Got unhandled packet (ComSetOption default) from client %v, returning error: %v", c.ConnectionID, data)
|
||||
log.Warn("Got unhandled packet (ComSetOption default) from client %v, returning error: %v", c.ConnectionID, data)
|
||||
if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil {
|
||||
log.Error("Error writing error packet to client: %v", err)
|
||||
log.Warn("Error writing error packet to client: %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := c.writeEndResult(false, 0, 0, 0); err != nil {
|
||||
log.Error("Error writeEndResult error %v ", err)
|
||||
log.Warn("Error writeEndResult error %v ", err)
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
log.Error("Got unhandled packet (ComSetOption else) from client %v, returning error: %v", c.ConnectionID, data)
|
||||
log.Warn("Got unhandled packet (ComSetOption else) from client %v, returning error: %v", c.ConnectionID, data)
|
||||
if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "error handling packet: %v", data); err != nil {
|
||||
log.Error("Error writing error packet to client: %v", err)
|
||||
log.Warn("Error writing error packet to client: %v", err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
default:
|
||||
log.Error("Got unhandled packet (default) from %s, returning error: %v", c, data)
|
||||
log.Warn("Got unhandled packet (default) from %s, returning error: %v", c, data)
|
||||
c.RecycleReadPacket()
|
||||
if err := c.writeErrorPacket(ERUnknownComError, SSUnknownComError, "command handling not implemented yet: %v", data[0]); err != nil {
|
||||
log.Error("Error writing error packet to %s: %s", c, err)
|
||||
log.Warn("Error writing error packet to %s: %s", c, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -872,7 +872,7 @@ func (c *Conn) execQuery(query string, handler Handler, more bool) error {
|
||||
// was a read operation.
|
||||
if !sendFinished {
|
||||
if err := c.writeEndResult(more, 0, 0, handler.WarningCount(c)); err != nil {
|
||||
log.Error("Error writing result to %s: %v", c, err)
|
||||
log.Warn("Error writing result to %s: %v", c, err)
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
+16
-10
@@ -23,6 +23,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/li4n0/revsuit/internal/recycler"
|
||||
log "unknwon.dev/clog/v2"
|
||||
"vitess.io/vitess/go/netutil"
|
||||
"vitess.io/vitess/go/sqltypes"
|
||||
@@ -222,6 +223,11 @@ func (l *Listener) Addr() net.Addr {
|
||||
|
||||
// Accept runs an accept loop until the listener is closed.
|
||||
func (l *Listener) Accept() {
|
||||
defer func() {
|
||||
if err := recover(); err != nil {
|
||||
recycler.Recycle(err)
|
||||
}
|
||||
}()
|
||||
for {
|
||||
conn, err := l.listener.Accept()
|
||||
if err != nil {
|
||||
@@ -253,7 +259,7 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
// Catch panics, and close the connection in any case.
|
||||
defer func() {
|
||||
if x := recover(); x != nil {
|
||||
log.Error("mysql_server caught panic:\n%v\n%s", x, tb.Stack(4))
|
||||
log.Warn("mysql_server caught panic:\n%v\n%s", x, tb.Stack(4))
|
||||
}
|
||||
// We call flush here in case there's a premature return after
|
||||
// startWriterBuffering is called
|
||||
@@ -269,7 +275,7 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
salt, err := c.writeHandshakeV10(l.ServerVersion, l.authServer, l.TLSConfig != nil)
|
||||
if err != nil {
|
||||
if err != io.EOF {
|
||||
log.Error("Cannot send HandshakeV10 packet to %s: %v", c, err)
|
||||
log.Warn("Cannot send HandshakeV10 packet to %s: %v", c, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -280,13 +286,13 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
if err != nil {
|
||||
// Don't log EOF errors. They cause too much spam, same as main read loop.
|
||||
if err != io.EOF {
|
||||
log.Error("Cannot read client handshake response from %s: %v", c, err)
|
||||
log.Warn("Cannot read client handshake response from %s: %v", c, err)
|
||||
}
|
||||
return
|
||||
}
|
||||
user, authMethod, authResponse, err := l.parseClientHandshakePacket(c, true, response)
|
||||
if err != nil {
|
||||
log.Error("Cannot parse client handshake response from %s: %v", c, err)
|
||||
log.Warn("Cannot parse client handshake response from %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -299,14 +305,14 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
// SSL was enabled. We need to re-read the auth packet.
|
||||
response, err = c.readEphemeralPacket()
|
||||
if err != nil {
|
||||
log.Error("Cannot read post-SSL client handshake response from %s: %v", c, err)
|
||||
log.Warn("Cannot read post-SSL client handshake response from %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
|
||||
// Returns copies of the data, so we can recycle the buffer.
|
||||
user, authMethod, authResponse, err = l.parseClientHandshakePacket(c, false, response)
|
||||
if err != nil {
|
||||
log.Error("Cannot parse post-SSL client handshake response from %s: %v", c, err)
|
||||
log.Warn("Cannot parse post-SSL client handshake response from %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
c.RecycleReadPacket()
|
||||
@@ -360,13 +366,13 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
data := make([]byte, 21) //nolint:ineffassign,staticcheck // SA4006 This line is required because the binary protocol requires padding with 0
|
||||
data = append(salt, byte(0x00))
|
||||
if err := c.writeAuthSwitchRequest(MysqlNativePassword, data); err != nil {
|
||||
log.Error("Error writing auth switch packet for %s: %v", c, err)
|
||||
log.Warn("Error writing auth switch packet for %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
|
||||
response, err := c.readEphemeralPacket()
|
||||
if err != nil {
|
||||
log.Error("Error reading auth switch response for %s: %v", c, err)
|
||||
log.Warn("Error reading auth switch response for %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
c.RecycleReadPacket()
|
||||
@@ -396,7 +402,7 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
data = authServerDialogSwitchData()
|
||||
}
|
||||
if err := c.writeAuthSwitchRequest(authServerMethod, data); err != nil {
|
||||
log.Error("Error writing auth switch packet for %s: %v", c, err)
|
||||
log.Warn("Error writing auth switch packet for %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
|
||||
@@ -418,7 +424,7 @@ func (l *Listener) handle(conn net.Conn, connectionID uint32, acceptTime time.Ti
|
||||
|
||||
// Negotiation worked, send OK packet.
|
||||
if err := c.writeOKPacket(0, 0, c.StatusFlags, 0); err != nil {
|
||||
log.Error("Cannot write OK packet to %s: %v", c, err)
|
||||
log.Warn("Cannot write OK packet to %s: %v", c, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user