You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kudu.apache.org by al...@apache.org on 2019/10/17 00:58:59 UTC
[kudu] 03/04: CapturingLogAppender: synchronize access to captured
log text
This is an automated email from the ASF dual-hosted git repository.
alexey pushed a commit to branch branch-1.11.x
in repository https://gitbox.apache.org/repos/asf/kudu.git
commit a9a5001ec9cd61c3806a581ca147ea70c1ee30a0
Author: Adar Dembo <ad...@cloudera.com>
AuthorDate: Mon Oct 14 13:24:09 2019 -0700
CapturingLogAppender: synchronize access to captured log text
I have no explanation for how this could happen, but the test failure I'm
looking at speaks for itself:
1) testSessionOnceClosed(org.apache.kudu.client.TestKuduClient)
java.lang.StringIndexOutOfBoundsException: String index out of range: 419
at java.lang.String.<init>(String.java:205)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at org.apache.kudu.test.CapturingLogAppender.getAppendedText(CapturingLogAppender.java:72)
at org.apache.kudu.client.TestKuduClient.testSessionOnceClosed(TestKuduClient.java:1231)
Change-Id: I84a5d0775cba5aa1d9df5484b5e9e621c908d42d
Reviewed-on: http://gerrit.cloudera.org:8080/14431
Reviewed-by: Greg Solovyev <gs...@cloudera.com>
Tested-by: Kudu Jenkins
Reviewed-by: Grant Henke <gr...@apache.org>
(cherry picked from commit 0894eba26380036d6d6d59c29c3efc5b3a817641)
Reviewed-on: http://gerrit.cloudera.org:8080/14467
---
.../main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala | 6 ++++--
.../main/java/org/apache/kudu/test/CapturingLogAppender.java | 10 ++++++++--
2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala b/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
index 74da812..907a4d5 100644
--- a/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
+++ b/java/kudu-spark/src/main/scala/org/apache/kudu/spark/kudu/DefaultSource.scala
@@ -268,8 +268,10 @@ class KuduRelation(
table.getTableStatistics().getOnDiskSize
} catch {
case e: Exception =>
- log.warn("Error while getting table statistic from master, maybe the current" +
- " master doesn't support the rpc, please check the version.", e)
+ log.warn(
+ "Error while getting table statistic from master, maybe the current" +
+ " master doesn't support the rpc, please check the version.",
+ e)
super.sizeInBytes
}
}
diff --git a/java/kudu-test-utils/src/main/java/org/apache/kudu/test/CapturingLogAppender.java b/java/kudu-test-utils/src/main/java/org/apache/kudu/test/CapturingLogAppender.java
index 932e14a..9227016 100644
--- a/java/kudu-test-utils/src/main/java/org/apache/kudu/test/CapturingLogAppender.java
+++ b/java/kudu-test-utils/src/main/java/org/apache/kudu/test/CapturingLogAppender.java
@@ -19,6 +19,7 @@ package org.apache.kudu.test;
import java.io.Closeable;
import java.io.IOException;
import java.util.Random;
+import javax.annotation.concurrent.GuardedBy;
import com.google.common.base.Throwables;
import org.apache.logging.log4j.core.LogEvent;
@@ -42,6 +43,11 @@ public class CapturingLogAppender extends AbstractAppender {
.withPattern("%d{HH:mm:ss.SSS} [%p - %t] (%F:%L) %m%n")
.build();
+ // The caller should detach the logger before calling getAppendedText().
+ // Nevertheless, for some reason it is still possible for additional
+ // append() calls to happen _after_ the logger is detached, which may race
+ // with getAppendedText().
+ @GuardedBy("this")
private StringBuilder appended = new StringBuilder();
public CapturingLogAppender() {
@@ -57,7 +63,7 @@ public class CapturingLogAppender extends AbstractAppender {
}
@Override
- public void append(LogEvent event) {
+ public synchronized void append(LogEvent event) {
appended.append(getLayout().toSerializable(event));
if (event.getThrown() != null) {
appended.append(Throwables.getStackTraceAsString(event.getThrown()));
@@ -68,7 +74,7 @@ public class CapturingLogAppender extends AbstractAppender {
/**
* @return all of the appended messages captured thus far, joined together.
*/
- public String getAppendedText() {
+ public synchronized String getAppendedText() {
return appended.toString();
}