SCB-1059 Bug fixes (#540)

diff --git a/pkg/log/logrotate.go b/pkg/log/logrotate.go
index 3bc9571..bf7e906 100644
--- a/pkg/log/logrotate.go
+++ b/pkg/log/logrotate.go
@@ -284,7 +284,8 @@
 		return err
 	}
 	defer file.Close()
-	dest, err := os.Create(destFile)
+
+	dest, err := os.OpenFile(destFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
 	if err != nil {
 		return err
 	}
diff --git a/scctl/pkg/cmd/cmd.go b/scctl/pkg/cmd/cmd.go
index dd56006..4de89dd 100644
--- a/scctl/pkg/cmd/cmd.go
+++ b/scctl/pkg/cmd/cmd.go
@@ -41,7 +41,9 @@
 	rootCmd.PersistentFlags().BoolP("verbose", "v", false, "make the operation more talkative")
 	rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) {
 		if v, _ := cmd.Flags().GetBool("verbose"); v {
-			os.Setenv("DEBUG_MODE", "1")
+			if err := os.Setenv("DEBUG_MODE", "1"); err != nil {
+				StopAndExit(ExitError, err)
+			}
 		}
 		if d, err := time.ParseDuration(timeout); err == nil && d > 0 {
 			ScClientConfig.RequestTimeout = d
diff --git a/scctl/pkg/cmd/help.go b/scctl/pkg/cmd/help.go
index 7efbbfc..d36df6a 100644
--- a/scctl/pkg/cmd/help.go
+++ b/scctl/pkg/cmd/help.go
@@ -145,7 +145,7 @@
 func UsageFunc(cmd *cobra.Command) error {
 	subCommands := getSubCommands(cmd)
 	tabOut := getTabOutWithWriter(os.Stdout)
-	commandUsageTemplate.Execute(tabOut, struct {
+	if err := commandUsageTemplate.Execute(tabOut, struct {
 		Cmd         *cobra.Command
 		LocalFlags  string
 		GlobalFlags string
@@ -157,9 +157,10 @@
 		toolFlagUsages(cmd.InheritedFlags()),
 		subCommands,
 		version.Ver().Version,
-	})
-	tabOut.Flush()
-	return nil
+	}); err != nil {
+		return err
+	}
+	return tabOut.Flush()
 }
 
 func getTabOutWithWriter(writer io.Writer) *tabwriter.Writer {
diff --git a/server/broker/controller.go b/server/broker/controller.go
index 1146346..055ad2e 100644
--- a/server/broker/controller.go
+++ b/server/broker/controller.go
@@ -106,6 +106,8 @@
 	resp, err := BrokerServiceAPI.GetAllProviderPacts(r.Context(), request /*, href*/)
 	linksObj, err := json.Marshal(resp)
 	if err != nil {
+		PactLogger.Errorf(err, "invalid ProviderPacts")
+		controller.WriteError(w, scerr.ErrInternal, "Marshal error")
 		return
 	}
 	PactLogger.Infof("Pact info: %s\n", string(linksObj))
diff --git a/server/broker/service.go b/server/broker/service.go
index 80e765a..fb7e637 100644
--- a/server/broker/service.go
+++ b/server/broker/service.go
@@ -699,6 +699,11 @@
 	verificationDate := time.Now().Format(time.RFC3339)
 	verificationKey := GenerateBrokerVerificationKey(tenant, pactVersion.Id, lastNumber)
 	id, err := GetData(ctx, GetBrokerLatestVerificationIDKey())
+	if err != nil {
+		return &brokerpb.PublishVerificationResponse{
+			Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+		}, err
+	}
 	verification := &brokerpb.Verification{
 		Id:               int32(id) + 1,
 		Number:           lastNumber,
@@ -786,6 +791,11 @@
 	}
 	if providerParticipant == nil {
 		id, err := GetData(ctx, GetBrokerLatestParticipantIDKey())
+		if err != nil {
+			return &brokerpb.PublishPactResponse{
+				Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+			}, err
+		}
 		providerParticipant = &brokerpb.Participant{Id: int32(id) + 1, AppId: provider.AppId, ServiceName: provider.ServiceName}
 		response, err := CreateParticipant(PactLogger, ctx, providerParticipantKey, *providerParticipant)
 		if err != nil {
@@ -804,6 +814,11 @@
 	}
 	if consumerParticipant == nil {
 		id, err := GetData(ctx, GetBrokerLatestParticipantIDKey())
+		if err != nil {
+			return &brokerpb.PublishPactResponse{
+				Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+			}, err
+		}
 		consumerParticipant = &brokerpb.Participant{Id: int32(id) + 1, AppId: consumer.AppId, ServiceName: consumer.ServiceName}
 		response, err := CreateParticipant(PactLogger, ctx, consumerParticipantKey, *consumerParticipant)
 		if err != nil {
@@ -825,6 +840,11 @@
 		PactLogger.Infof("Old version order: %d", order)
 		order++
 		id, err := GetData(ctx, GetBrokerLatestVersionIDKey())
+		if err != nil {
+			return &brokerpb.PublishPactResponse{
+				Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+			}, err
+		}
 		version = &brokerpb.Version{Id: int32(id) + 1, Number: in.Version, ParticipantId: consumerParticipant.Id, Order: order}
 		response, err := CreateVersion(PactLogger, ctx, versionKey, *version)
 		if err != nil {
@@ -845,6 +865,11 @@
 	}
 	if pact == nil {
 		id, err := GetData(ctx, GetBrokerLatestPactIDKey())
+		if err != nil {
+			return &brokerpb.PublishPactResponse{
+				Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+			}, err
+		}
 		pact = &brokerpb.Pact{Id: int32(id) + 1, ConsumerParticipantId: consumerParticipant.Id,
 			ProviderParticipantId: providerParticipant.Id, Sha: sha, Content: in.Pact}
 		response, err := CreatePact(PactLogger, ctx, pactKey, *pact)
@@ -864,6 +889,11 @@
 	}
 	if pactVersion == nil {
 		id, err := GetData(ctx, GetBrokerLatestPactVersionIDKey())
+		if err != nil {
+			return &brokerpb.PublishPactResponse{
+				Response: pb.CreateResponse(scerr.ErrInternal, "get data error."),
+			}, err
+		}
 		pactVersion = &brokerpb.PactVersion{Id: int32(id) + 1, VersionId: version.Id, PactId: pact.Id, ProviderParticipantId: providerParticipant.Id}
 		response, err := CreatePactVersion(PactLogger, ctx, pactVersionKey, *pactVersion)
 		if err != nil {
diff --git a/server/core/backend/defer_instance.go b/server/core/backend/defer_instance.go
index 3dd79e3..ffba31d 100644
--- a/server/core/backend/defer_instance.go
+++ b/server/core/backend/defer_instance.go
@@ -62,7 +62,7 @@
 	return true
 }
 
-func (iedh *InstanceEventDeferHandler) recoverOrDefer(evt discovery.KvEvent) error {
+func (iedh *InstanceEventDeferHandler) recoverOrDefer(evt discovery.KvEvent) {
 	kv := evt.KV
 	key := util.BytesToStringWithNoCopy(kv.Key)
 	_, ok := iedh.items[key]
@@ -75,7 +75,7 @@
 		iedh.recover(evt)
 	case pb.EVT_DELETE:
 		if ok {
-			return nil
+			return
 		}
 
 		instance := kv.Value.(*pb.MicroServiceInstance)
@@ -88,7 +88,6 @@
 			event: evt,
 		}
 	}
-	return nil
 }
 
 func (iedh *InstanceEventDeferHandler) HandleChan() <-chan discovery.KvEvent {
diff --git a/server/core/backend/registry.go b/server/core/backend/registry.go
index 4534d33..09a88d2 100644
--- a/server/core/backend/registry.go
+++ b/server/core/backend/registry.go
@@ -131,7 +131,9 @@
 	s.goroutine.Close(true)
 
 	ctx, _ := context.WithTimeout(context.Background(), 3*time.Second)
-	s.unregisterInstance(ctx)
+	if err := s.unregisterInstance(ctx); err != nil {
+		log.Error("stop registry engine failed", err)
+	}
 }
 
 func (s *registryEngine) selfRegister(ctx context.Context) error {
diff --git a/server/notify/websocket.go b/server/notify/websocket.go
index 6eaac0c..16e8d21 100644
--- a/server/notify/websocket.go
+++ b/server/notify/websocket.go
@@ -200,9 +200,14 @@
 			return
 		}
 
+		if err := wh.heartbeat(websocket.PingMessage); err != nil {
+			log.Errorf(err, "send 'Ping' message to watcher[%s] failed, subject: %s, group: %s",
+				remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
+			return
+		}
+
 		log.Debugf("send 'Ping' message to watcher[%s], subject: %s, group: %s",
 			remoteAddr, wh.watcher.Subject(), wh.watcher.Group())
-		wh.heartbeat(websocket.PingMessage)
 		return
 	case *InstanceEvent:
 		job = o.(*InstanceEvent)
diff --git a/server/server.go b/server/server.go
index d84ee90..72ea40b 100644
--- a/server/server.go
+++ b/server/server.go
@@ -88,7 +88,10 @@
 	if s.needUpgrade() {
 		core.ServerInfo.Version = version.Ver().Version
 
-		UpgradeServerVersion()
+		if err := UpgradeServerVersion(); err != nil {
+			log.Errorf(err, "upgrade server version failed")
+			os.Exit(1)
+		}
 	}
 	lock.Unlock()
 }