From 3b4af8f44694e545af28d9f353e57bc304b22a44 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Sat, 21 Oct 2017 01:08:17 -0400 Subject: [PATCH 1/2] fix(longevity): StackOverflowError on serializing (APP-126) --- src/main/kotlin/app/hashers/CodeLongevity.kt | 27 +++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/app/hashers/CodeLongevity.kt b/src/main/kotlin/app/hashers/CodeLongevity.kt index 6553dab8..e570a462 100644 --- a/src/main/kotlin/app/hashers/CodeLongevity.kt +++ b/src/main/kotlin/app/hashers/CodeLongevity.kt @@ -25,6 +25,7 @@ import org.eclipse.jgit.util.io.DisabledOutputStream import java.io.InputStream import java.io.File import java.io.FileInputStream +import java.io.FileNotFoundException import java.io.FileOutputStream import java.io.ObjectOutputStream import java.io.ObjectInputStream @@ -146,7 +147,9 @@ class CodeLongevity(private val serverRepo: Repo, git: Git) { val repo: Repository = git.repository val head: RevCommit = - RevWalk(repo).parseCommit(repo.resolve(RepoHelper.MASTER_BRANCH)) + try { RevWalk(repo).parseCommit(repo.resolve("HEAD")) } + catch(e: Exception) { throw Exception("No default branch") } + val df = DiffFormatter(DisabledOutputStream.INSTANCE) val storageDir = ".sourcerer/data/longevity" val storagePath = "$storageDir/${serverRepo.rehash}" @@ -215,15 +218,21 @@ class CodeLongevity(private val serverRepo: Repo, * Scans the repo to extract code line ages. */ fun scan() : CodeLineAges? { + var storedHead: RevCommit? = null + var ageData: CodeLineAges = CodeLineAges() + // Load existing age data if any. - val iStream = try { ObjectInputStream(FileInputStream(storagePath)) } - catch(e : Exception ) { null } - val storedHead = iStream?.readObject() as RevCommit? - if (storedHead == head) { - return null + try { + val iStream = ObjectInputStream(FileInputStream(storagePath)) + val storedHeadId = iStream.readUTF() + Logger.debug("Stored repo head: storedHeadId") + storedHead = RevWalk(repo).parseCommit(repo.resolve(storedHeadId)) + if (storedHead == head) { + return null + } + ageData = (iStream.readObject() ?: CodeLineAges()) as CodeLineAges } - - val ageData = (iStream?.readObject() ?: CodeLineAges()) as CodeLineAges + catch(e: FileNotFoundException) { } // Update ages. getLinesObservable(storedHead).blockingSubscribe { line -> @@ -253,7 +262,7 @@ class CodeLongevity(private val serverRepo: Repo, Files.createDirectories(Paths.get(storageDir)) } val oStream = ObjectOutputStream(FileOutputStream(storagePath)) - oStream.writeObject(head) + oStream.writeUTF(head.getName()) oStream.writeObject(ageData) return ageData } From 3d85a5a2d8db28a3e94f7dcad6a1fa0fcb872229 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Tue, 24 Oct 2017 12:12:59 -0400 Subject: [PATCH 2/2] reviewer's comments --- src/main/kotlin/app/hashers/CodeLongevity.kt | 27 +++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/app/hashers/CodeLongevity.kt b/src/main/kotlin/app/hashers/CodeLongevity.kt index e570a462..420b5112 100644 --- a/src/main/kotlin/app/hashers/CodeLongevity.kt +++ b/src/main/kotlin/app/hashers/CodeLongevity.kt @@ -147,8 +147,8 @@ class CodeLongevity(private val serverRepo: Repo, git: Git) { val repo: Repository = git.repository val head: RevCommit = - try { RevWalk(repo).parseCommit(repo.resolve("HEAD")) } - catch(e: Exception) { throw Exception("No default branch") } + try { RevWalk(repo).parseCommit(repo.resolve(RepoHelper.MASTER_BRANCH)) } + catch(e: Exception) { throw Exception("No branch") } val df = DiffFormatter(DisabledOutputStream.INSTANCE) val storageDir = ".sourcerer/data/longevity" @@ -221,11 +221,12 @@ class CodeLongevity(private val serverRepo: Repo, var storedHead: RevCommit? = null var ageData: CodeLineAges = CodeLineAges() - // Load existing age data if any. + // Load existing age data if any. Expected format: commit id and + // CodeLineAges structure following it. try { val iStream = ObjectInputStream(FileInputStream(storagePath)) val storedHeadId = iStream.readUTF() - Logger.debug("Stored repo head: storedHeadId") + Logger.debug("Stored repo head: $storedHeadId") storedHead = RevWalk(repo).parseCommit(repo.resolve(storedHeadId)) if (storedHead == head) { return null @@ -233,6 +234,11 @@ class CodeLongevity(private val serverRepo: Repo, ageData = (iStream.readObject() ?: CodeLineAges()) as CodeLineAges } catch(e: FileNotFoundException) { } + catch(e: Exception) { + Logger.error( + "Failed to read longevity data. CAUTION: data will be recomputed.", + e) + } // Update ages. getLinesObservable(storedHead).blockingSubscribe { line -> @@ -261,9 +267,16 @@ class CodeLongevity(private val serverRepo: Repo, if (Files.notExists(Paths.get(storageDir))) { Files.createDirectories(Paths.get(storageDir)) } - val oStream = ObjectOutputStream(FileOutputStream(storagePath)) - oStream.writeUTF(head.getName()) - oStream.writeObject(ageData) + try { + val oStream = ObjectOutputStream(FileOutputStream(storagePath)) + oStream.writeUTF(head.getName()) + oStream.writeObject(ageData) + } + catch(e: Exception) { + Logger.error( + "Failed to save longevity data. CAUTION: data will be recomputed on a next run.", + e) + } return ageData }