Browse Source

- debugger processor name, make case insensitive
- test mysql connection & access to table
- guerrilla-redis-db processor bug fix

flashmob 8 years ago
parent
commit
0966eaa90c
4 changed files with 41 additions and 33 deletions
  1. 3 3
      backends/gateway.go
  2. 2 1
      backends/p_debugger.go
  3. 30 28
      backends/p_guerrilla_db_redis.go
  4. 6 1
      backends/p_mysql.go

+ 3 - 3
backends/gateway.go

@@ -144,11 +144,11 @@ func (gw *BackendGateway) Reinitialize() error {
 // Decorators are functions of Decorator type, source files prefixed with p_*
 // Decorators are functions of Decorator type, source files prefixed with p_*
 // Each decorator does a specific task during the processing stage.
 // Each decorator does a specific task during the processing stage.
 // This function uses the config value process_stack to figure out which Decorator to use
 // This function uses the config value process_stack to figure out which Decorator to use
-func (gw *BackendGateway) newProcessorLine() (Processor, error) {
+func (gw *BackendGateway) newProcessorStack() (Processor, error) {
 	var decorators []Decorator
 	var decorators []Decorator
 	cfg := strings.ToLower(strings.TrimSpace(gw.gwConfig.ProcessorStack))
 	cfg := strings.ToLower(strings.TrimSpace(gw.gwConfig.ProcessorStack))
 	if len(cfg) == 0 {
 	if len(cfg) == 0 {
-		cfg = defaultProcessor
+		cfg = strings.ToLower(defaultProcessor)
 	}
 	}
 	line := strings.Split(cfg, "|")
 	line := strings.Split(cfg, "|")
 	for i := range line {
 	for i := range line {
@@ -192,7 +192,7 @@ func (gw *BackendGateway) Initialize(cfg BackendConfig) error {
 		}
 		}
 		var lines []Processor
 		var lines []Processor
 		for i := 0; i < workersSize; i++ {
 		for i := 0; i < workersSize; i++ {
-			p, err := gw.newProcessorLine()
+			p, err := gw.newProcessorStack()
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}

+ 2 - 1
backends/p_debugger.go

@@ -2,6 +2,7 @@ package backends
 
 
 import (
 import (
 	"github.com/flashmob/go-guerrilla/mail"
 	"github.com/flashmob/go-guerrilla/mail"
+	"strings"
 )
 )
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
@@ -16,7 +17,7 @@ import (
 // Output        : none (only output to the log if enabled)
 // Output        : none (only output to the log if enabled)
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 func init() {
 func init() {
-	processors[defaultProcessor] = func() Decorator {
+	processors[strings.ToLower(defaultProcessor)] = func() Decorator {
 		return Debugger()
 		return Debugger()
 	}
 	}
 }
 }

+ 30 - 28
backends/p_guerrilla_db_redis.go

@@ -16,7 +16,7 @@ import (
 )
 )
 
 
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
-// Processor Name: Guerrilla-reds-db
+// Processor Name: GuerrillaRedsDB
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 // Description   : Saves the body to redis, meta data to mysql. Example
 // Description   : Saves the body to redis, meta data to mysql. Example
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
@@ -27,7 +27,7 @@ import (
 // Output        :
 // Output        :
 // ----------------------------------------------------------------------------------
 // ----------------------------------------------------------------------------------
 func init() {
 func init() {
-	processors["GuerrillaRedisDB"] = func() Decorator {
+	processors["guerrillaredisdb"] = func() Decorator {
 		return GuerrillaDbReddis()
 		return GuerrillaDbReddis()
 	}
 	}
 }
 }
@@ -279,12 +279,17 @@ func (g *GuerrillaDBAndRedisBackend) mysqlConnect() (*sql.DB, error) {
 		Params:       map[string]string{"collation": "utf8_general_ci"},
 		Params:       map[string]string{"collation": "utf8_general_ci"},
 	}
 	}
 	if db, err := sql.Open("mysql", conf.FormatDSN()); err != nil {
 	if db, err := sql.Open("mysql", conf.FormatDSN()); err != nil {
-		Log().Error("cannot open mysql", err)
+		Log().Error("cannot open mysql", err, "]")
 		return nil, err
 		return nil, err
 	} else {
 	} else {
+		// do we have access?
+		_, err = db.Query("SELECT mail_id FROM " + g.config.MysqlTable + " LIMIT 1")
+		if err != nil {
+			Log().Error("cannot select table", err)
+			return nil, err
+		}
 		return db, nil
 		return db, nil
 	}
 	}
-
 }
 }
 
 
 func (c *redisClient) redisConnection(redisInterface string) (err error) {
 func (c *redisClient) redisConnection(redisInterface string) (err error) {
@@ -313,6 +318,9 @@ func GuerrillaDbReddis() Decorator {
 
 
 	var redisErr error
 	var redisErr error
 
 
+	workerId++
+	feeder := make(chan []interface{}, 1)
+
 	Svc.AddInitializer(InitializeWith(func(backendConfig BackendConfig) error {
 	Svc.AddInitializer(InitializeWith(func(backendConfig BackendConfig) error {
 		configType := BaseConfig(&guerrillaDBAndRedisConfig{})
 		configType := BaseConfig(&guerrillaDBAndRedisConfig{})
 		bcfg, err := Svc.ExtractConfig(backendConfig, configType)
 		bcfg, err := Svc.ExtractConfig(backendConfig, configType)
@@ -322,32 +330,23 @@ func GuerrillaDbReddis() Decorator {
 		g.config = bcfg.(*guerrillaDBAndRedisConfig)
 		g.config = bcfg.(*guerrillaDBAndRedisConfig)
 		db, err = g.mysqlConnect()
 		db, err = g.mysqlConnect()
 		if err != nil {
 		if err != nil {
-			Log().Fatalf("cannot open mysql: %s", err)
+			return err
 		}
 		}
+		// start the query SQL batching where we will send data via the feeder channel
+		go func() {
+			for {
+				if feederOK := g.insertQueryBatcher(feeder, db); !feederOK {
+					Log().Debug("insertQueryBatcher exited")
+					return
+				}
+				// if insertQueryBatcher panics, it can recover and go in again
+				Log().Debug("resuming insertQueryBatcher")
+			}
+		}()
 		return nil
 		return nil
 	}))
 	}))
 
 
-	workerId++
-
-	// start the query SQL batching where we will send data via the feeder channel
-	feeder := make(chan []interface{}, 1)
-	go func() {
-		for {
-			if feederOK := g.insertQueryBatcher(feeder, db); !feederOK {
-				Log().Debug("insertQueryBatcher exited")
-				return
-			}
-			// if insertQueryBatcher panics, it can recover and go in again
-			Log().Debug("resuming insertQueryBatcher")
-		}
-
-	}()
-
-	defer func() {
-		if r := recover(); r != nil {
-			//recover form closed channel
-			Log().Error("panic recovered in saveMailWorker", r)
-		}
+	Svc.AddShutdowner(ShutdownWith(func() error {
 		db.Close()
 		db.Close()
 		if redisClient.conn != nil {
 		if redisClient.conn != nil {
 			Log().Infof("closed redis")
 			Log().Infof("closed redis")
@@ -356,15 +355,16 @@ func GuerrillaDbReddis() Decorator {
 		// close the feeder & wait for query batcher to exit.
 		// close the feeder & wait for query batcher to exit.
 		close(feeder)
 		close(feeder)
 		g.batcherWg.Wait()
 		g.batcherWg.Wait()
+		return nil
+	}))
 
 
-	}()
 	var vals []interface{}
 	var vals []interface{}
 	data := newCompressedData()
 	data := newCompressedData()
 
 
 	return func(c Processor) Processor {
 	return func(c Processor) Processor {
 		return ProcessWith(func(e *mail.Envelope, task SelectTask) (Result, error) {
 		return ProcessWith(func(e *mail.Envelope, task SelectTask) (Result, error) {
 			if task == TaskSaveMail {
 			if task == TaskSaveMail {
-				Log().Debug("Got mail from chan", e.RemoteIP)
+				Log().Debug("Got mail from chan,", e.RemoteIP)
 				to = trimToLimit(strings.TrimSpace(e.RcptTo[0].User)+"@"+g.config.PrimaryHost, 255)
 				to = trimToLimit(strings.TrimSpace(e.RcptTo[0].User)+"@"+g.config.PrimaryHost, 255)
 				e.Helo = trimToLimit(e.Helo, 255)
 				e.Helo = trimToLimit(e.Helo, 255)
 				e.RcptTo[0].Host = trimToLimit(e.RcptTo[0].Host, 255)
 				e.RcptTo[0].Host = trimToLimit(e.RcptTo[0].Host, 255)
@@ -413,6 +413,8 @@ func GuerrillaDbReddis() Decorator {
 					e.RemoteIP,
 					e.RemoteIP,
 					trimToLimit(e.MailFrom.String(), 255),
 					trimToLimit(e.MailFrom.String(), 255),
 					e.TLS)
 					e.TLS)
+				// give the values to the query batcher
+				feeder <- vals
 				return c.Process(e, task)
 				return c.Process(e, task)
 
 
 			} else {
 			} else {

+ 6 - 1
backends/p_mysql.go

@@ -70,9 +70,14 @@ func (m *MysqlProcessor) connect(config *MysqlProcessorConfig) (*sql.DB, error)
 		Log().Error("cannot open mysql", err)
 		Log().Error("cannot open mysql", err)
 		return nil, err
 		return nil, err
 	}
 	}
+	// do we have permission to access the table?
+	_, err = db.Query("SELECT mail_id FROM " + m.config.MysqlTable + "LIMIT 1")
+	if err != nil {
+		Log().Error("cannot select table", err)
+		return nil, err
+	}
 	Log().Info("connected to mysql on tcp ", config.MysqlHost)
 	Log().Info("connected to mysql on tcp ", config.MysqlHost)
 	return db, err
 	return db, err
-
 }
 }
 
 
 // prepares the sql query with the number of rows that can be batched with it
 // prepares the sql query with the number of rows that can be batched with it