func execRestore()

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
}