fix
zhangqian
2023-10-30 10c65da3d2af7056f48d9301e83f53f102f76e18
serf/sync.go
@@ -20,7 +20,7 @@
)
var (
   agent = SyncServer{}
   agent       = SyncServer{}
   dependProcs = []string{
      bhomeclient.Proc_System_Service,
   }
@@ -124,7 +124,6 @@
                  }
               }
               if diff := arrayContains(existingProcs, dependProcs); diff == "" {
                  initChan <- true
                  break loop
               } else {
                  logx.Errorf("Proc: %s is not running!", diff)
@@ -153,9 +152,9 @@
   // 启动后查询一次集群状态
   ss.QueryClusterStat()
   if ss.ClusterStatus != "" {
      ss.sqlDB.LogMode(true)
   }
   //if ss.ClusterStatus != "" {
   ss.sqlDB.LogMode(true)
   //}
   initChan <- true
   <-q
@@ -253,7 +252,7 @@
                  // 退出集群, 开启日志跟踪, 设置角色slave
                  ss.clusterEventFn(EventLeaveCluster)
                  ss.ClusterStatus = ""
                  ss.sqlDB.LogMode(false)
                  ss.sqlDB.LogMode(true)
               case "slave2master":
                  ss.clusterEventFn(EventSlave2Master)
                  ss.ClusterStatus = "master"
@@ -372,7 +371,7 @@
}
func (ss *SyncServer) handleClusterMessage(msg []byte) {
   //fmt.Println("clusterMessage:", string(msg))
   logx.Infof("clusterMessage:", string(msg))
   sql := string(msg)
   if len(sql) <= 0 {
@@ -403,17 +402,37 @@
   }
}
// serf 同步数据的限制为92160 byte
func (ss *SyncServer) handleSyncTableMessage(msg []byte) error {
   sizeLimit := 61440
   targetId := string(msg)
   //fmt.Println("同步全量数据给节点:", targetId)
   sqls, err := DumpTables(ss.sqlDB, ss.syncTables)
   if err != nil {
      fmt.Println("DumpTables error, ", err.Error())
      logx.Errorf("DumpTables error: %s", err.Error())
      return err
   }
   logx.Infof("DumpTables sql:%v", sqls)
   syncSql := strings.Join(sqls, ";")
   err = ss.pubSyncSqlMessage([]byte(syncSql), targetId)
   if len(syncSql) < sizeLimit {
      err = ss.pubSyncSqlMessage([]byte(syncSql), targetId)
   } else {
      shard := ""
      for _, sql := range sqls {
         if len(shard)+len(sql) > sizeLimit {
            err = ss.pubSyncSqlMessage([]byte(shard), targetId)
            shard = ""
         }
         shard = fmt.Sprintf("%s%s;", shard, sql)
      }
      if len(shard) > 0 {
         err = ss.pubSyncSqlMessage([]byte(shard), targetId)
      }
   }
   return err
}