From c32f3da33c38e18a7ed4a8c49de27898c2aa07f8 Mon Sep 17 00:00:00 2001
From: zeripath <art27@cantab.net>
Date: Fri, 28 Feb 2020 22:00:09 +0000
Subject: [PATCH] Handle panic in indexer initialisation better (#10534)

* Handle panic in indexer initialisation better
* as per @guillep2k
---
 modules/indexer/code/indexer.go   | 11 +++++++++++
 modules/indexer/issues/indexer.go |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/modules/indexer/code/indexer.go b/modules/indexer/code/indexer.go
index 6cbda1491..3e90f769d 100644
--- a/modules/indexer/code/indexer.go
+++ b/modules/indexer/code/indexer.go
@@ -64,6 +64,17 @@ func Init() {
 	go func() {
 		start := time.Now()
 		log.Info("PID: %d Initializing Repository Indexer at: %s", os.Getpid(), setting.Indexer.RepoPath)
+		defer func() {
+			if err := recover(); err != nil {
+				log.Error("PANIC whilst initializing repository indexer: %v\nStacktrace: %s", err, log.Stack(2))
+				log.Error("The indexer files are likely corrupted and may need to be deleted")
+				log.Error("You can completely remove the \"%s\" directory to make Gitea recreate the indexes", setting.Indexer.RepoPath)
+				cancel()
+				indexer.Close()
+				close(waitChannel)
+				log.Fatal("PID: %d Unable to initialize the Repository Indexer at path: %s Error: %v", os.Getpid(), setting.Indexer.RepoPath, err)
+			}
+		}()
 		bleveIndexer, created, err := NewBleveIndexer(setting.Indexer.RepoPath)
 		if err != nil {
 			if bleveIndexer != nil {
diff --git a/modules/indexer/issues/indexer.go b/modules/indexer/issues/indexer.go
index d2233ac6a..d2079e9db 100644
--- a/modules/indexer/issues/indexer.go
+++ b/modules/indexer/issues/indexer.go
@@ -143,6 +143,14 @@ func InitIssueIndexer(syncReindex bool) {
 		var populate bool
 		switch setting.Indexer.IssueType {
 		case "bleve":
+			defer func() {
+				if err := recover(); err != nil {
+					log.Error("PANIC whilst initializing issue indexer: %v\nStacktrace: %s", err, log.Stack(2))
+					log.Error("The indexer files are likely corrupted and may need to be deleted")
+					holder.cancel()
+					log.Fatal("PID: %d Unable to initialize the Bleve Issue Indexer at path: %s Error: %v", os.Getpid(), setting.Indexer.IssuePath, err)
+				}
+			}()
 			issueIndexer := NewBleveIndexer(setting.Indexer.IssuePath)
 			exist, err := issueIndexer.Init()
 			if err != nil {