118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"go-common/app/job/main/member/model"
|
|
"go-common/library/log"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var (
|
|
csclice []chan int64
|
|
|
|
maxmid int64 = 310000000
|
|
scanned int64
|
|
errCount int64
|
|
)
|
|
|
|
func (s *Service) makeChan(num int) {
|
|
csclice = make([]chan int64, num)
|
|
for i := 0; i < num; i++ {
|
|
csclice[i] = make(chan int64, 10000)
|
|
}
|
|
}
|
|
|
|
// dataCheckMids check mid
|
|
func (s *Service) dataCheckMids() {
|
|
var (
|
|
i int64
|
|
)
|
|
if s.c.SyncRange.End > maxmid {
|
|
s.c.SyncRange.End = maxmid
|
|
}
|
|
if s.c.SyncRange.Start < 0 {
|
|
s.c.SyncRange.Start = 0
|
|
}
|
|
|
|
for i = s.c.SyncRange.Start; i < s.c.SyncRange.End; i++ {
|
|
csclice[i%30] <- i
|
|
}
|
|
}
|
|
|
|
// dataFixer
|
|
func (s *Service) dataFixer(cs chan int64) {
|
|
for {
|
|
mids := make([]int64, 0, 10)
|
|
for mid := range cs {
|
|
mids = append(mids, mid)
|
|
if len(mids) >= 5 {
|
|
break
|
|
}
|
|
atomic.AddInt64(&scanned, 1)
|
|
}
|
|
s.fix(mids)
|
|
}
|
|
}
|
|
|
|
func (s *Service) fix(mids []int64) {
|
|
var (
|
|
err error
|
|
accs = make(map[int64]*model.AccountInfo)
|
|
errs = make(map[int64]map[string]bool)
|
|
c = context.TODO()
|
|
base *model.BaseInfo
|
|
)
|
|
func() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
r = errors.WithStack(r.(error))
|
|
log.Error("fixer: wocao jingran recover le error(%+v)", r)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
time.Sleep(10 * time.Millisecond)
|
|
}()
|
|
|
|
if accs, errs, err = s.dao.Accounts(c, mids); err != nil {
|
|
log.Error("fixer: dao.AccountInfo mid(%v) res(%v) error(%v)", mids, accs, err)
|
|
return
|
|
}
|
|
for mid, res := range accs {
|
|
log.Error("fixer: mid(%d) res(%+v)", mid, res)
|
|
if base, err = s.dao.BaseInfo(c, mid); err != nil {
|
|
log.Error("fixer: s.dao.BaseInfo mid(%d) err(%v)", mid, err)
|
|
continue
|
|
}
|
|
if base == nil {
|
|
log.Error("fixer: dataCheckErr mid(%d) res(%v),base(%v),detail(%v)", mid, res, base)
|
|
continue
|
|
}
|
|
// all fields are same
|
|
if sameAccInfo(base, res) {
|
|
log.Info("fixer: sameAccInfo mid(%d) result true continue", mid)
|
|
continue
|
|
}
|
|
|
|
// increase errCount and logging
|
|
bs, _ := json.Marshal(base)
|
|
jres, _ := json.Marshal(res)
|
|
atomic.AddInt64(&errCount, 1)
|
|
log.Error("fixer: dataCheckFail mid(%d) base(%s),res(%s),errCount(%d)", mid, bs, jres, atomic.LoadInt64(&errCount))
|
|
|
|
if _, ok := errs[mid]; !ok {
|
|
log.Error("fixer,errs[%v] is not ok", mid)
|
|
continue
|
|
}
|
|
|
|
if asoOK := errs[mid]["asoOK"]; asoOK && !sameName(base, res) && len(res.Name) > 0 {
|
|
s.dao.SetName(c, mid, res.Name)
|
|
}
|
|
}
|
|
log.Info("fixer: dataCheckRight mids(%v) scanned(%d) errCount(%d)", mids, scanned, atomic.LoadInt64(&errCount))
|
|
}()
|
|
}
|