Explorar el Código

debugging in progress 5

flashmob hace 5 años
padre
commit
41544ffa21
Se han modificado 6 ficheros con 79 adiciones y 70 borrados
  1. 0 2
      api_test.go
  2. 20 10
      backends/config.go
  3. 0 1
      backends/gateway.go
  4. 7 4
      backends/p_guerrilla_db_redis.go
  5. 36 38
      cmd/guerrillad/serve_test.go
  6. 16 15
      guerrilla.go

+ 0 - 2
api_test.go

@@ -462,8 +462,6 @@ var funkyLogger = func() backends.Decorator {
 						e.RcptTo[len(e.RcptTo)-1])
 					// if valid then forward call to the next processor in the chain
 					return p.Process(e, task)
-					// if invalid, return a backend result
-					//return backends.NewResult(response.Canned.FailRcptCmd), nil
 				} else if task == backends.TaskSaveMail {
 					backends.Log().Info("Another funky email!")
 				}

+ 20 - 10
backends/config.go

@@ -150,16 +150,26 @@ func (c BackendConfig) Changes(oldConfig BackendConfig) (changed, added, removed
 	changed = make(map[string]bool, 0)
 	added = make(map[string]bool, 0)
 	removed = make(map[string]bool, 0)
-
+	cp := ConfigProcessors.String()
+	csp := ConfigProcessors.String()
+	cg := ConfigGateways.String()
 	changedProcessors := changedConfigGroups(
-		oldConfig[ConfigProcessors.String()], c[ConfigProcessors.String()])
+		oldConfig[cp], c[cp])
 	changedStreamProcessors := changedConfigGroups(
-		oldConfig[ConfigProcessors.String()], c[ConfigProcessors.String()])
+		oldConfig[csp], c[csp])
 	configType := BaseConfig(&GatewayConfig{})
-
+	// oldList keeps a track of gateways that have been compared for changes.
+	// We remove the from the list when a gateway was processed
+	// remaining items are assumed to be removed from the new config
+	oldList := map[string]bool{}
+	for g := range oldConfig[cg] {
+		oldList[g] = true
+	}
 	// go through all the gateway configs,
 	// make a list of all the ones that have processors whose config had changed
-	for key, _ := range c[ConfigGateways.String()] {
+	for key, _ := range c[cg] {
+		// check the processors in the SaveProcess and StreamSaveProcess settings to see if
+		// they changed. If changed, then make a record of which gateways use the processors
 		e, _ := Svc.ExtractConfig(ConfigGateways, key, c, configType)
 		bcfg := e.(*GatewayConfig)
 		config := NewStackConfig(bcfg.SaveProcess)
@@ -174,9 +184,9 @@ func (c BackendConfig) Changes(oldConfig BackendConfig) (changed, added, removed
 				changed[key] = true
 			}
 		}
-		if o, ok := oldConfig[key]; ok {
-			delete(oldConfig, key)
-			if !reflect.DeepEqual(c[key], o) {
+		if o, ok := oldConfig[cg][key]; ok {
+			delete(oldList, key)
+			if !reflect.DeepEqual(c[cg][key], o) {
 				// whats changed
 				changed[key] = true
 			}
@@ -186,7 +196,7 @@ func (c BackendConfig) Changes(oldConfig BackendConfig) (changed, added, removed
 		}
 	}
 	// whats been removed
-	for p := range oldConfig {
+	for p := range oldList {
 		removed[p] = true
 	}
 	return
@@ -200,7 +210,7 @@ func changedConfigGroups(old map[string]ConfigGroup, new map[string]ConfigGroup)
 	all = append(all, added...)
 	changed := make(map[string]bool, 0)
 	for p := range all {
-		changed[all[p]] = true
+		changed[strings.ToLower(all[p])] = true
 	}
 	return changed
 }

+ 0 - 1
backends/gateway.go

@@ -357,7 +357,6 @@ func (gw *BackendGateway) Reinitialize() error {
 
 	err := gw.Initialize(gw.config)
 	if err != nil {
-		fmt.Println("reinitialize to ", gw.config, err)
 		return fmt.Errorf("error while initializing the backend: %s", err)
 	}
 

+ 7 - 4
backends/p_guerrilla_db_redis.go

@@ -390,11 +390,14 @@ func GuerrillaDbRedis() Decorator {
 	}))
 
 	Svc.AddShutdowner(ShutdownWith(func() error {
-		if err := db.Close(); err != nil {
-			Log().WithError(err).Error("close mysql failed")
-		} else {
-			Log().Infof("closed mysql")
+		if db != nil {
+			if err := db.Close(); err != nil {
+				Log().WithError(err).Error("close sql database")
+			} else {
+				Log().Infof("closed sql database")
+			}
 		}
+
 		if redisClient.conn != nil {
 			if err := redisClient.conn.Close(); err != nil {
 				Log().WithError(err).Error("close redis failed")

+ 36 - 38
cmd/guerrillad/serve_test.go

@@ -277,12 +277,15 @@ var configJsonE = `
 				"log_received_mails" : true
 			},
             "sql" : {
- 				"sql_dsn": "root:ok@tcp(127.0.0.1:3306)/gmail_mail?readTimeout=10s&writeTimeout=10s",
+ 				"sql_dsn": "root:secret@tcp(127.0.0.1:3306)/gmail_mail?readTimeout=10s&writeTimeout=10s",
             	"mail_table":"new_mail",
 				"sql_driver": "mysql",
-				"primary_mail_host":"sharklasers.com",
+				"primary_mail_host":"sharklasers.com"
 			},
 			"GuerrillaRedisDB" : {
+				"sql_dsn": "root:secret@tcp(127.0.0.1:3306)/gmail_mail?readTimeout=10s&writeTimeout=10s",
+            	"mail_table":"new_mail",
+				"sql_driver": "mysql",
 				"redis_interface" : "127.0.0.1:6379",
             	"redis_expire_seconds" : 7200,
 				"primary_mail_host":"sharklasers.com"
@@ -291,8 +294,7 @@ var configJsonE = `
 		"gateways" : {
 			"default" : {
 				"save_workers_size" : 3,
-    			"save_process_old": "HeadersParser|Debugger|Hasher|Header|Compressor|Redis|MySql",
-				"save_process": "GuerrillaRedisDB",
+				"save_process": "GuerrillaRedisDB"
 			}
 		}
 	},
@@ -1542,47 +1544,51 @@ func TestDebugLevelChange(t *testing.T) {
 }
 
 // When reloading with a bad backend config, it should revert to old backend config
-func TestBadBackendReload(t *testing.T) {
+// using the API way
+func TestBadBackendReload2(t *testing.T) {
+
+	defer cleanTestArtifacts(t)
 	var err error
 	err = testcert.GenerateCert("mail2.guerrillamail.com", "", 365*24*time.Hour, false, 2048, "P256", "../../tests/")
 	if err != nil {
 		t.Error("failed to generate a test certificate", err)
 		t.FailNow()
 	}
-	defer cleanTestArtifacts(t)
-
-	mainlog, err = getTestLog()
-	if err != nil {
-		t.Error("could not get logger,", err)
-		t.FailNow()
-	}
-
 	if err = ioutil.WriteFile("configJsonA.json", []byte(configJsonA), 0644); err != nil {
 		t.Error(err)
 	}
-	cmd := &cobra.Command{}
-	configPath = "configJsonA.json"
-	go func() {
-		serve(cmd, []string{})
-	}()
-	if _, err := grepTestlog("Listening on TCP 127.0.0.1:3536", 0); err != nil {
-		t.Error("server didn't start")
-	}
 
-	// change the config file to the one with a broken backend
-	if err = ioutil.WriteFile("configJsonA.json", []byte(configJsonE), 0644); err != nil {
-		t.Error(err)
+	d := guerrilla.Daemon{}
+	_, err = d.LoadConfig("configJsonA.json")
+	if err != nil {
+		t.Error("ReadConfig error", err)
+		return
 	}
+	err = d.Start()
+	if err != nil {
+		t.Error("start error", err)
+		return
+	} else {
+		if err = ioutil.WriteFile("configJsonA.json", []byte(configJsonE), 0644); err != nil {
+			t.Error(err)
+			return
+		}
+		if err = d.ReloadConfigFile("configJsonA.json"); err != nil {
+			t.Error(err)
+			return
+		}
+
+		d.Shutdown()
 
-	// test SIGHUP via the kill command
-	// Would not work on windows as kill is not available.
-	// TODO: Implement an alternative test for windows.
-	if runtime.GOOS != "windows" {
-		sigHup()
-		// did config update?
 		if _, err := grepTestlog("Configuration was reloaded", 0); err != nil {
 			t.Error("config didn't update")
 		}
+
+		// reverted to old gateway config?
+		if _, err := grepTestlog("reverted to old gateway config", 0); err != nil {
+			t.Error("Did not revert to old gateway config")
+		}
+
 		// did the pidfile change as expected?
 
 		if _, err := grepTestlog("pid_file (./pidfile2.pid) written", 0); err != nil {
@@ -1591,14 +1597,6 @@ func TestBadBackendReload(t *testing.T) {
 		if _, err := os.Stat("./pidfile2.pid"); os.IsNotExist(err) {
 			t.Error("pidfile not changed after sighup SIGHUP", err)
 		}
-	}
 
-	// send kill signal and wait for exit
-	d.Shutdown()
-
-	// did backend started as expected?
-	if _, err := grepTestlog("reverted to old backend config", 0); err != nil {
-		t.Error("did not revert to old backend config")
-		t.FailNow()
 	}
 }

+ 16 - 15
guerrilla.go

@@ -453,31 +453,36 @@ func (g *guerrilla) subscribeEvents() {
 		logger, _ := log.GetLogger(appConfig.LogFile, appConfig.LogLevel)
 		// shutdown the backend first.
 		var err error
-		fields := logrus.Fields{"error": err, "gateway": name}
+
 		if err = g.backend(name).Shutdown(); err != nil {
+			fields := logrus.Fields{"error": err, "gateway": name}
 			logger.WithFields(fields).Warn("gateway failed to shutdown")
 			return
 		}
 		// init a new backend, Revert to old backend config if it fails
 		if newBackend, newErr := backends.New(name, appConfig.BackendConfig, logger); newErr != nil {
-			logger.WithFields(fields).Error("error while loading the gateway")
+			fields := logrus.Fields{"error": newErr, "gateway": name}
+			logger.WithFields(fields).Error("cannot change gateway config")
 			err = g.backend(name).Reinitialize()
 			if err != nil {
-				logger.WithFields(fields).Fatal("failed to revert to old gateway config")
+				fields = logrus.Fields{"error": err, "gateway": name}
+				logger.WithFields(fields).Error("failed to revert to old gateway config")
 				return
 			}
 			err = g.backend(name).Start()
 			if err != nil {
+				fields = logrus.Fields{"error": err, "gateway": name}
 				logger.WithFields(fields).Fatal("failed to start gateway with old config")
 				return
 			}
 			logger.WithField("gateway", name).Info("reverted to old gateway config")
 		} else {
-			// swap to the bew backend (assuming old gateway was shutdown so it can be safely swapped)
+			// revert to the bew backend (assuming old gateway was shutdown so it can be safely swapped)
 			if err := newBackend.Start(); err != nil {
+				fields := logrus.Fields{"error": err, "gateway": name}
 				logger.WithFields(fields).Error("gateway could not start")
 			}
-			logger.WithField("gateway", name).Info("new gateway started")
+			logger.WithField("gateway", name).Info("no gateway changed")
 			g.storeBackend(newBackend)
 		}
 	})
@@ -486,14 +491,15 @@ func (g *guerrilla) subscribeEvents() {
 	events[EventConfigBackendConfigAdded] = backendEvent(func(appConfig *AppConfig, name string) {
 		logger, _ := log.GetLogger(appConfig.LogFile, appConfig.LogLevel)
 		// shutdown any old backend first.
-		var err error
-		fields := logrus.Fields{"error": err, "gateway": name}
+
 		if newBackend, newErr := backends.New(name, appConfig.BackendConfig, logger); newErr != nil {
-			logger.WithFields(fields).Error("Error while loading the gateway")
+			fields := logrus.Fields{"error": newErr, "gateway": name}
+			logger.WithFields(fields).Error("cannot add new gateway")
 		} else {
 			// swap to the bew gateway (assuming old gateway was shutdown so it can be safely swapped)
 			if err := newBackend.Start(); err != nil {
-				logger.WithFields(fields).Error("gateway could not start")
+				fields := logrus.Fields{"error": err, "gateway": name}
+				logger.WithFields(fields).Error("cannot start new gateway")
 			}
 			logger.WithField("gateway", name).Info("new gateway started")
 			g.storeBackend(newBackend)
@@ -516,12 +522,7 @@ func (g *guerrilla) subscribeEvents() {
 
 	var err error
 	for topic, fn := range events {
-		switch f := fn.(type) {
-		case daemonEvent:
-			err = g.Subscribe(topic, f)
-		case serverEvent:
-			err = g.Subscribe(topic, f)
-		}
+		err = g.Subscribe(topic, fn)
 		if err != nil {
 			g.mainlog().WithError(err).Errorf("failed to subscribe on topic [%s]", topic)
 			break