You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.6 KiB
117 lines
2.6 KiB
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)) |
|
}() |
|
}
|
|
|