From beade71aa6051cbbeda949737a168ef521bb4923 Mon Sep 17 00:00:00 2001
From: Niko Storni <niko@lbry.io>
Date: Tue, 3 Nov 2020 02:14:01 +0100
Subject: [PATCH] fix bugs

---
 manager/manager.go  |  6 ++++--
 manager/setup.go    | 12 +++++++++++-
 manager/ytsync.go   | 17 ++++++++++++-----
 ytapi/ytapi_test.go |  3 ++-
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/manager/manager.go b/manager/manager.go
index 9abe824..47fa5c7 100644
--- a/manager/manager.go
+++ b/manager/manager.go
@@ -55,6 +55,7 @@ func (s *SyncManager) Start() error {
 	}
 
 	var lastChannelProcessed string
+	var secondLastChannelProcessed string
 	syncCount := 0
 	for {
 		s.channelsToSync = make([]Sync, 0, 10) // reset sync queue
@@ -108,12 +109,13 @@ func (s *SyncManager) Start() error {
 			time.Sleep(5 * time.Minute)
 		}
 		for _, sync := range s.channelsToSync {
-			if lastChannelProcessed == sync.DbChannelData.ChannelId {
+			if lastChannelProcessed == sync.DbChannelData.ChannelId && secondLastChannelProcessed == lastChannelProcessed {
 				util.SendToSlack("We just killed a sync for %s to stop looping! (%s)", sync.DbChannelData.DesiredChannelName, sync.DbChannelData.ChannelId)
-				stopTheLoops := errors.Err("Found channel %s running twice, set it to failed, and reprocess later", sync.DbChannelData.DesiredChannelName)
+				stopTheLoops := errors.Err("Found channel %s running 3 times, set it to failed, and reprocess later", sync.DbChannelData.DesiredChannelName)
 				sync.setChannelTerminationStatus(&stopTheLoops)
 				continue
 			}
+			secondLastChannelProcessed = lastChannelProcessed
 			lastChannelProcessed = sync.DbChannelData.ChannelId
 			shouldNotCount := false
 			logUtils.SendInfoToSlack("Syncing %s (%s) to LBRY! total processed channels since startup: %d", sync.DbChannelData.DesiredChannelName, sync.DbChannelData.ChannelId, syncCount+1)
diff --git a/manager/setup.go b/manager/setup.go
index e2a809e..1f8c22e 100644
--- a/manager/setup.go
+++ b/manager/setup.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"math"
 	"strconv"
+	"strings"
 	"time"
 
 	"github.com/lbryio/lbry.go/v2/extras/errors"
@@ -382,7 +383,16 @@ func (s *Sync) ensureChannelOwnership() error {
 
 	channelInfo, err := ytapi.ChannelInfo(s.DbChannelData.ChannelId)
 	if err != nil {
-		return err
+		if strings.Contains(err.Error(), "invalid character 'e' looking for beginning of value") {
+			logUtils.SendInfoToSlack("failed to get channel data for %s. Waiting 1 minute to retry", s.DbChannelData.ChannelId)
+			time.Sleep(1 * time.Minute)
+			channelInfo, err = ytapi.ChannelInfo(s.DbChannelData.ChannelId)
+			if err != nil {
+				return err
+			}
+		} else {
+			return err
+		}
 	}
 
 	thumbnail := channelInfo.Header.C4TabbedHeaderRenderer.Avatar.Thumbnails[len(channelInfo.Header.C4TabbedHeaderRenderer.Avatar.Thumbnails)-1].URL
diff --git a/manager/ytsync.go b/manager/ytsync.go
index b8999bb..daf472d 100644
--- a/manager/ytsync.go
+++ b/manager/ytsync.go
@@ -262,11 +262,18 @@ func (s *Sync) setChannelTerminationStatus(e *error) {
 			"interrupted by user",
 			"use --skip-space-check to ignore",
 		}
+		dbWipeConditions := []string{
+			"Missing inputs",
+		}
 		if util.SubstringInSlice((*e).Error(), noFailConditions) {
 			return
 		}
+		channelStatus := shared.StatusFailed
+		if util.SubstringInSlice((*e).Error(), dbWipeConditions) {
+			channelStatus = shared.StatusWipeDb
+		}
 		failureReason := (*e).Error()
-		_, _, err := s.Manager.ApiConfig.SetChannelStatus(s.DbChannelData.ChannelId, shared.StatusFailed, failureReason, transferState)
+		_, _, err := s.Manager.ApiConfig.SetChannelStatus(s.DbChannelData.ChannelId, channelStatus, failureReason, transferState)
 		if err != nil {
 			msg := fmt.Sprintf("Failed setting failed state for channel %s", s.DbChannelData.DesiredChannelName)
 			*e = errors.Prefix(msg+err.Error(), *e)
@@ -395,15 +402,14 @@ func (s *Sync) fixDupes(claims []jsonrpc.Claim) (bool, error) {
 		}
 		if claimToAbandon.Address != s.DbChannelData.PublishAddress && !s.syncedVideos[videoID].Transferred {
 			log.Debugf("abandoning %+v", claimToAbandon)
-			_, err := s.daemon.StreamAbandon(claimToAbandon.Txid, claimToAbandon.Nout, nil, false)
+			_, err := s.daemon.StreamAbandon(claimToAbandon.Txid, claimToAbandon.Nout, nil, true)
 			if err != nil {
 				return true, err
 			}
+			abandonedClaims = true
 		} else {
 			log.Debugf("lbrynet stream abandon --txid=%s --nout=%d", claimToAbandon.Txid, claimToAbandon.Nout)
 		}
-		abandonedClaims = true
-		//return true, nil
 	}
 	return abandonedClaims, nil
 }
@@ -757,6 +763,7 @@ func (s *Sync) startWorker(workerNum int) {
 					"more than 90% of the space has been used.",
 					"Couldn't find private key for id",
 					"You already have a stream claim published under the name",
+					"Missing inputs",
 				}
 				if util.SubstringInSlice(err.Error(), fatalErrors) || s.Manager.CliFlags.StopOnError {
 					s.grp.Stop()
@@ -806,7 +813,7 @@ func (s *Sync) startWorker(workerNum int) {
 							"Not enough funds to cover this transaction",
 							"failed: Not enough funds",
 							"Error in daemon: Insufficient funds, please deposit additional LBC",
-							"Missing inputs",
+							//"Missing inputs",
 						}) {
 							log.Println("checking funds and UTXOs before retrying...")
 							err := s.walletSetup()
diff --git a/ytapi/ytapi_test.go b/ytapi/ytapi_test.go
index 93a612c..68ea26e 100644
--- a/ytapi/ytapi_test.go
+++ b/ytapi/ytapi_test.go
@@ -7,6 +7,7 @@ import (
 )
 
 func TestChannelInfo(t *testing.T) {
-	_, _, err := ChannelInfo("", "UCNQfQvFMPnInwsU_iGYArJQ")
+	info, err := ChannelInfo("UCNQfQvFMPnInwsU_iGYArJQ")
 	assert.NoError(t, err)
+	assert.NotNil(t, info)
 }