in pitr/cli/internal/cmd/restore.go [184:242]
func execRestore(lsBackup *model.LsBackup) error {
var (
totalNum = len(lsBackup.SsBackup.StorageNodes)
dataNodeMap = make(map[string]*model.DataNode)
resultCh = make(chan *model.RestoreResult, totalNum)
dnResult = make([]*model.RestoreResult, 0)
restoreFinalStatus = "Completed"
)
for _, dataNode := range lsBackup.DnList {
dataNodeMap[dataNode.IP] = dataNode
}
if totalNum == 0 {
return xerr.NewCliErr(fmt.Sprintf("no storage node found, please check backup record [%s].", lsBackup.Info.ID))
}
pw := prettyoutput.NewPW(totalNum)
go pw.Render()
for i := 0; i < totalNum; i++ {
sn := lsBackup.SsBackup.StorageNodes[i]
dn := dataNodeMap[sn.IP]
as := pkg.NewAgentServer(fmt.Sprintf("%s:%d", convertLocalhost(sn.IP), AgentPort))
go doRestore(as, sn, dn.BackupID, resultCh, pw)
}
time.Sleep(time.Millisecond * 100)
for pw.IsRenderInProgress() {
time.Sleep(time.Millisecond * 100)
}
close(resultCh)
for result := range resultCh {
dnResult = append(dnResult, result)
if result.Status != "Completed" {
restoreFinalStatus = "Failed"
}
}
// print result formatted
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)
t.SetTitle("Restore Task Result: %s", restoreFinalStatus)
t.AppendHeader(table.Row{"#", "Data Node IP", "Data Node Port", "Result"})
for i, dn := range dnResult {
t.AppendRow([]interface{}{i + 1, dn.IP, dn.Port, dn.Status})
t.AppendSeparator()
}
t.Render()
if restoreFinalStatus == "Failed" {
return xerr.NewCliErr("restore failed, please check the log for more details.")
}
return nil
}