Skip to content

Commit 0072d86

Browse files
committed
#629 Fix PR suggestions and limit stack trace lengths of suppressed exceptions.
1 parent 2e0b973 commit 0072d86

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

pramen/core/src/main/scala/za/co/absa/pramen/core/metastore/peristence/MetastorePersistenceIceberg.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,11 @@ class MetastorePersistenceIceberg(table: CatalogTable,
112112

113113
def getExistingTable(catalogTable: CatalogTable)(implicit spark: SparkSession): Option[DataFrame] = {
114114
try {
115-
Option(spark.read.table(catalogTable.getFullTableName))
115+
val df = spark.table(catalogTable.getFullTableName)
116+
// Force analysis to surface TABLE_OR_VIEW_NOT_FOUND at this point.
117+
// Technically, not needed, but Spark can potentially skip analysis until the schema is requested.
118+
val _ = df.schema
119+
Some(df)
116120
} catch {
117121
// This is a common error
118122
case ex: AnalysisException if ex.getMessage().contains("Table or view not found") || ex.getMessage().contains("TABLE_OR_VIEW_NOT_FOUND") =>

pramen/core/src/main/scala/za/co/absa/pramen/core/utils/StringUtils.scala

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,19 +174,31 @@ object StringUtils {
174174
}
175175

176176
/** Renders an exception as a string */
177-
def renderThrowable(ex: Throwable, level: Int = 1, maximumLength: Option[Int] = None, escapeHTML: Boolean = false): String = {
177+
def renderThrowable(ex: Throwable, level: Int = 1, maximumLength: Option[Int] = None, escapeHTML: Boolean = false, maxStackDepth: Int = 256): String = {
178178
val prefix = " " * (level * 2)
179+
180+
def renderStack(stack: Array[StackTraceElement]): String = {
181+
if (stack.length > maxStackDepth) {
182+
val stackSte = stack.take(maxStackDepth).map(s => s"$prefix$s").mkString("", EOL, EOL)
183+
val more = stack.length - maxStackDepth
184+
s"$stackSte$prefix... $more more\n"
185+
186+
} else {
187+
stack.map(s => s"$prefix$s").mkString("", EOL, EOL)
188+
}
189+
}
190+
179191
val errMsg = if (escapeHTML) StringUtils.escapeHTML(ex.toString) else ex.toString
180-
val base = s"""$errMsg\n${ex.getStackTrace.map(s => s"$prefix$s").mkString("", EOL, EOL)}"""
192+
val base = s"""$errMsg\n${renderStack(ex.getStackTrace)}"""
181193

182194
val suppressed =
183195
if (ex.getSuppressed.nonEmpty && level < 6)
184-
ex.getSuppressed.map(s => s"\n${prefix}Suppressed: " + renderThrowable(s, level + 1)).mkString
196+
ex.getSuppressed.map(s => s"\n${prefix}Suppressed: " + renderThrowable(s, level + 1, maxStackDepth = 5)).mkString
185197
else
186198
""
187199

188200
val cause = Option(ex.getCause) match {
189-
case Some(c) if level < 6 => s"\n${prefix}Caused by " + renderThrowable(c, level + 1)
201+
case Some(c) if level < 6 => s"\n${prefix}Caused by " + renderThrowable(c, level + 1, None, escapeHTML = false, maxStackDepth)
190202
case _ => ""
191203
}
192204

pramen/core/src/test/scala/za/co/absa/pramen/core/tests/utils/StringUtilsSuite.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,6 @@ class StringUtilsSuite extends AnyWordSpec {
224224
ex.addSuppressed(new IllegalStateException("suppress_root"))
225225
val s = renderThrowable(ex)
226226

227-
println(s)
228-
229227
assert(s.contains("java.lang.RuntimeException: test"))
230228
assert(s.contains(" Suppressed: java.lang.IllegalStateException: suppress_root"))
231229
assert(s.contains(" Caused by java.lang.RuntimeException: cause"))

0 commit comments

Comments
 (0)