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.
146 lines
3.0 KiB
146 lines
3.0 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"io/ioutil" |
|
"os" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/job/main/passport-game-data/conf" |
|
"go-common/app/job/main/passport-game-data/dao" |
|
"go-common/app/job/main/passport-game-data/model" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_defaultInitCloudOffsetFilePath = "/data/passport-game-data-job.initcloud.offset" |
|
|
|
_defaultInitCloudSleep = time.Second |
|
) |
|
|
|
type initCloudConfig struct { |
|
OffsetFilePath string |
|
UseOldOffset bool |
|
|
|
Start, End int64 |
|
|
|
Batch int |
|
|
|
Sleep time.Duration |
|
} |
|
|
|
func newInitCloudConfigFrom(c *conf.Config) (ic *initCloudConfig) { |
|
ic = &initCloudConfig{ |
|
OffsetFilePath: c.InitCloud.OffsetFilePath, |
|
UseOldOffset: c.InitCloud.UseOldOffset, |
|
|
|
Start: c.InitCloud.Start, |
|
End: c.InitCloud.End, |
|
|
|
Batch: c.InitCloud.Batch, |
|
|
|
Sleep: time.Duration(c.InitCloud.Sleep), |
|
} |
|
|
|
ic.fix() |
|
|
|
if ic.UseOldOffset { |
|
data, err := ioutil.ReadFile(ic.OffsetFilePath) |
|
if err != nil { |
|
log.Error("failed to read old offset, skip") |
|
return |
|
} |
|
|
|
oldOffset, err := strconv.ParseInt(string(data), 10, 64) |
|
if err != nil { |
|
log.Error("failed to parse offset, strconv.ParseInt(%s, 10, 64)", string(data), err) |
|
return |
|
} |
|
|
|
if oldOffset > 0 { |
|
ic.Start = oldOffset |
|
} |
|
} |
|
return |
|
} |
|
|
|
func (ic *initCloudConfig) fix() { |
|
if len(ic.OffsetFilePath) == 0 { |
|
ic.OffsetFilePath = _defaultInitCloudOffsetFilePath |
|
} |
|
if ic.Start < 0 { |
|
ic.Start = 0 |
|
} |
|
if ic.End < 0 { |
|
ic.End = 0 |
|
} |
|
|
|
if ic.Batch <= 0 { |
|
ic.Batch = _defaultBatchSize |
|
} |
|
|
|
if int64(ic.Sleep) < 0 { |
|
ic.Sleep = _defaultInitCloudSleep |
|
} |
|
} |
|
|
|
// NewInitCloud new a service for initiating cloud. |
|
func NewInitCloud(c *conf.Config) (s *Service) { |
|
s = &Service{ |
|
c: c, |
|
d: dao.New(c), |
|
|
|
ic: newInitCloudConfigFrom(c), |
|
} |
|
return |
|
} |
|
|
|
// InitCloud init cloud. |
|
func (s *Service) InitCloud(c context.Context) { |
|
var err error |
|
ic := s.ic |
|
|
|
dstFile, err := os.Create(ic.OffsetFilePath) |
|
if err != nil { |
|
log.Error("failed to open file %s, error(%v)", ic.OffsetFilePath, err) |
|
return |
|
} |
|
defer dstFile.Close() |
|
|
|
for i := ic.Start; i <= ic.End; { |
|
time.Sleep(ic.Sleep) |
|
if err = ioutil.WriteFile(ic.OffsetFilePath, []byte(strconv.FormatInt(i, 10)), os.ModeAppend); err != nil { |
|
log.Error("failed to record offset, offsetFilePath: %s, offset: %d, error(%v)", ic.OffsetFilePath, i, err) |
|
continue |
|
} |
|
st := i |
|
ed := i + int64(ic.Batch) |
|
if ed > ic.End { |
|
ed = ic.End |
|
} |
|
|
|
mids := make([]int64, 0) |
|
for j := st; j <= ed; j++ { |
|
mids = append(mids, j) |
|
} |
|
|
|
var as []*model.OriginAsoAccount |
|
if as, err = s.d.AsoAccountsLocal(c, mids); err != nil { |
|
log.Error("failed to get local aso accounts by mids, service.dao.AsoAccountsLocal(%v) error(%v)", mids, err) |
|
continue |
|
} |
|
|
|
cloudAs := make([]*model.AsoAccount, 0) |
|
for _, a := range as { |
|
cloudAs = append(cloudAs, model.Default(a)) |
|
} |
|
if err = s.d.AddAsoAccountsCloud(c, cloudAs); err != nil { |
|
str, _ := json.Marshal(cloudAs) |
|
log.Error("failed to add aso accounts to cloud, service.dao.AddAsoAccountsCloud(%v) error(%v)", str, err) |
|
continue |
|
} |
|
i += int64(ic.Batch) |
|
} |
|
}
|
|
|