in nimo-full-check/checker/document-checker.go [221:292]
func (dc *DocumentChecker) executor() {
LOG.Info("%s start executor", dc.String())
diffFile := fmt.Sprintf("%s/%s", conf.Opts.DiffOutputFile, dc.ns.Collection)
f, err := os.Create(diffFile)
if err != nil {
LOG.Crashf("%s create diff output file[%v] failed", dc.String(), diffFile)
return
}
for {
data, ok := <-dc.parserChan
if !ok {
break
}
//var query map[string]interface{}
query := make(map[string]interface{})
if dc.primaryKeyWithType.name != "" {
// find by union key
if conf.Opts.ConvertType == shakeUtils.ConvertMTypeChange {
query[dc.primaryKeyWithType.name] = data.Data.(map[string]interface{})[dc.primaryKeyWithType.name]
} else {
LOG.Crashf("unknown convert type[%v]", conf.Opts.ConvertType)
}
}
if dc.sortKeyWithType.name != "" {
if conf.Opts.ConvertType == shakeUtils.ConvertMTypeChange {
query[dc.sortKeyWithType.name] = data.Data.(map[string]interface{})[dc.sortKeyWithType.name]
} else {
LOG.Crashf("unknown convert type[%v]", conf.Opts.ConvertType)
}
}
LOG.Info("query: %v", query)
// query
var output, outputMap interface{}
isSame := true
err := dc.mongoClient.Client.Database(dc.ns.Database).Collection(dc.ns.Collection).
FindOne(context.TODO(), query).Decode(&output)
if err != nil {
err = fmt.Errorf("target query failed[%v][%v][%v]", err, output, query)
LOG.Error("%s %v", dc.String(), err)
} else {
outputMap = convertToMap(output)
isSame = interIsEqual(data.Data, outputMap)
}
inputJson, _ := json.Marshal(data.Data)
outputJson, _ := json.Marshal(outputMap)
if err != nil {
f.WriteString(fmt.Sprintf("compare src[%s] to dst[%s] failed: %v\n", inputJson, outputJson, err))
} else if isSame == false {
LOG.Warn("compare src[%s] and dst[%s] failed", inputJson, outputJson)
f.WriteString(fmt.Sprintf("src[%s] != dst[%s]\n", inputJson, outputJson))
}
}
LOG.Info("%s close executor", dc.String())
f.Close()
// remove file if size == 0
if fi, err := os.Stat(diffFile); err != nil {
LOG.Warn("stat diffFile[%v] failed[%v]", diffFile, err)
return
} else if fi.Size() == 0 {
if err := os.Remove(diffFile); err != nil {
LOG.Warn("remove diffFile[%v] failed[%v]", diffFile, err)
}
}
}