HBASE-27052 TestAsyncTableScanner.testScanWrongColumnFamily is flaky (#4456)
Signed-off-by: Andrew Purtell <apurtell@apache.org>
This commit is contained in:
parent
f982e6d39c
commit
8bbba7353e
|
@ -17,17 +17,22 @@
|
||||||
*/
|
*/
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.AttributesMatchers.containsEntry;
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
import static org.hamcrest.Matchers.allOf;
|
import static org.hamcrest.Matchers.allOf;
|
||||||
|
import static org.hamcrest.Matchers.anyOf;
|
||||||
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.endsWith;
|
import static org.hamcrest.Matchers.endsWith;
|
||||||
import static org.hamcrest.Matchers.hasItem;
|
import static org.hamcrest.Matchers.hasItem;
|
||||||
import static org.hamcrest.Matchers.hasProperty;
|
import static org.hamcrest.Matchers.hasProperty;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.isA;
|
import static org.hamcrest.Matchers.isA;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertThrows;
|
import static org.junit.Assert.assertThrows;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import io.opentelemetry.sdk.trace.data.SpanData;
|
import io.opentelemetry.sdk.trace.data.SpanData;
|
||||||
|
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UncheckedIOException;
|
import java.io.UncheckedIOException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -46,6 +51,7 @@ import org.apache.hadoop.hbase.MiniClusterRule;
|
||||||
import org.apache.hadoop.hbase.StartMiniClusterOption;
|
import org.apache.hadoop.hbase.StartMiniClusterOption;
|
||||||
import org.apache.hadoop.hbase.TableName;
|
import org.apache.hadoop.hbase.TableName;
|
||||||
import org.apache.hadoop.hbase.Waiter;
|
import org.apache.hadoop.hbase.Waiter;
|
||||||
|
import org.apache.hadoop.hbase.ipc.RemoteWithExtrasException;
|
||||||
import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException;
|
import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException;
|
||||||
import org.apache.hadoop.hbase.trace.OpenTelemetryClassRule;
|
import org.apache.hadoop.hbase.trace.OpenTelemetryClassRule;
|
||||||
import org.apache.hadoop.hbase.trace.OpenTelemetryTestRule;
|
import org.apache.hadoop.hbase.trace.OpenTelemetryTestRule;
|
||||||
|
@ -176,7 +182,8 @@ public abstract class AbstractTestAsyncTableScan {
|
||||||
/**
|
/**
|
||||||
* Used by implementation classes to assert the correctness of spans having errors.
|
* Used by implementation classes to assert the correctness of spans having errors.
|
||||||
*/
|
*/
|
||||||
protected abstract void assertTraceError(final Matcher<String> exceptionTypeNameMatcher);
|
protected abstract void
|
||||||
|
assertTraceError(final Matcher<io.opentelemetry.api.common.Attributes> exceptionMatcher);
|
||||||
|
|
||||||
protected final List<Result> convertFromBatchResult(List<Result> results) {
|
protected final List<Result> convertFromBatchResult(List<Result> results) {
|
||||||
assertEquals(0, results.size() % 2);
|
assertEquals(0, results.size() % 2);
|
||||||
|
@ -269,7 +276,14 @@ public abstract class AbstractTestAsyncTableScan {
|
||||||
} else {
|
} else {
|
||||||
fail("Found unexpected Exception " + e);
|
fail("Found unexpected Exception " + e);
|
||||||
}
|
}
|
||||||
assertTraceError(endsWith(NoSuchColumnFamilyException.class.getName()));
|
assertTraceError(anyOf(
|
||||||
|
containsEntry(is(SemanticAttributes.EXCEPTION_TYPE),
|
||||||
|
endsWith(NoSuchColumnFamilyException.class.getName())),
|
||||||
|
allOf(
|
||||||
|
containsEntry(is(SemanticAttributes.EXCEPTION_TYPE),
|
||||||
|
endsWith(RemoteWithExtrasException.class.getName())),
|
||||||
|
containsEntry(is(SemanticAttributes.EXCEPTION_MESSAGE),
|
||||||
|
containsString(NoSuchColumnFamilyException.class.getName())))));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testScan(int start, boolean startInclusive, int stop, boolean stopInclusive,
|
private void testScan(int start, boolean startInclusive, int stop, boolean stopInclusive,
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasExceptionWithType;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasException;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
||||||
|
@ -145,7 +145,8 @@ public class TestAsyncTableScan extends AbstractTestAsyncTableScan {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void assertTraceError(Matcher<String> exceptionTypeNameMatcher) {
|
protected void
|
||||||
|
assertTraceError(Matcher<io.opentelemetry.api.common.Attributes> exceptionMatcher) {
|
||||||
final String parentSpanName = testName.getMethodName();
|
final String parentSpanName = testName.getMethodName();
|
||||||
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
||||||
waitForSpan(parentSpanMatcher);
|
waitForSpan(parentSpanMatcher);
|
||||||
|
@ -163,7 +164,7 @@ public class TestAsyncTableScan extends AbstractTestAsyncTableScan {
|
||||||
final Matcher<SpanData> scanOperationSpanMatcher =
|
final Matcher<SpanData> scanOperationSpanMatcher =
|
||||||
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
||||||
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
||||||
hasExceptionWithType(exceptionTypeNameMatcher), hasEnded());
|
hasException(exceptionMatcher), hasEnded());
|
||||||
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
||||||
final String scanOperationSpanId = spans.stream().filter(scanOperationSpanMatcher::matches)
|
final String scanOperationSpanId = spans.stream().filter(scanOperationSpanMatcher::matches)
|
||||||
.map(SpanData::getSpanId).findAny().orElseThrow(AssertionError::new);
|
.map(SpanData::getSpanId).findAny().orElseThrow(AssertionError::new);
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasExceptionWithType;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasException;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
||||||
|
@ -116,7 +116,8 @@ public class TestAsyncTableScanAll extends AbstractTestAsyncTableScan {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void assertTraceError(Matcher<String> exceptionTypeNameMatcher) {
|
protected void
|
||||||
|
assertTraceError(Matcher<io.opentelemetry.api.common.Attributes> exceptionMatcher) {
|
||||||
final String parentSpanName = testName.getMethodName();
|
final String parentSpanName = testName.getMethodName();
|
||||||
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
||||||
waitForSpan(parentSpanMatcher);
|
waitForSpan(parentSpanMatcher);
|
||||||
|
@ -134,7 +135,7 @@ public class TestAsyncTableScanAll extends AbstractTestAsyncTableScan {
|
||||||
final Matcher<SpanData> scanOperationSpanMatcher =
|
final Matcher<SpanData> scanOperationSpanMatcher =
|
||||||
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
||||||
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
||||||
hasExceptionWithType(exceptionTypeNameMatcher), hasEnded());
|
hasException(exceptionMatcher), hasEnded());
|
||||||
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasExceptionWithType;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasException;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
||||||
|
@ -128,7 +128,8 @@ public class TestAsyncTableScanner extends AbstractTestAsyncTableScan {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void assertTraceError(Matcher<String> exceptionTypeNameMatcher) {
|
protected void
|
||||||
|
assertTraceError(Matcher<io.opentelemetry.api.common.Attributes> exceptionMatcher) {
|
||||||
final String parentSpanName = testName.getMethodName();
|
final String parentSpanName = testName.getMethodName();
|
||||||
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
||||||
waitForSpan(parentSpanMatcher);
|
waitForSpan(parentSpanMatcher);
|
||||||
|
@ -146,7 +147,7 @@ public class TestAsyncTableScanner extends AbstractTestAsyncTableScan {
|
||||||
final Matcher<SpanData> scanOperationSpanMatcher =
|
final Matcher<SpanData> scanOperationSpanMatcher =
|
||||||
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
||||||
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
||||||
hasExceptionWithType(exceptionTypeNameMatcher), hasEnded());
|
hasException(exceptionMatcher), hasEnded());
|
||||||
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
package org.apache.hadoop.hbase.client;
|
package org.apache.hadoop.hbase.client;
|
||||||
|
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasEnded;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasExceptionWithType;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasException;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasName;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasParentSpanId;
|
||||||
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
import static org.apache.hadoop.hbase.client.trace.hamcrest.SpanDataMatchers.hasStatusWithCode;
|
||||||
|
@ -142,7 +142,8 @@ public class TestRawAsyncTableScan extends AbstractTestAsyncTableScan {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void assertTraceError(Matcher<String> exceptionTypeNameMatcher) {
|
protected void
|
||||||
|
assertTraceError(Matcher<io.opentelemetry.api.common.Attributes> exceptionMatcher) {
|
||||||
final String parentSpanName = testName.getMethodName();
|
final String parentSpanName = testName.getMethodName();
|
||||||
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
final Matcher<SpanData> parentSpanMatcher = allOf(hasName(parentSpanName), hasEnded());
|
||||||
waitForSpan(parentSpanMatcher);
|
waitForSpan(parentSpanMatcher);
|
||||||
|
@ -160,7 +161,7 @@ public class TestRawAsyncTableScan extends AbstractTestAsyncTableScan {
|
||||||
final Matcher<SpanData> scanOperationSpanMatcher =
|
final Matcher<SpanData> scanOperationSpanMatcher =
|
||||||
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
allOf(hasName(startsWith("SCAN " + TABLE_NAME.getNameWithNamespaceInclAsString())),
|
||||||
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
hasParentSpanId(parentSpanId), hasStatusWithCode(StatusCode.ERROR),
|
||||||
hasExceptionWithType(exceptionTypeNameMatcher), hasEnded());
|
hasException(exceptionMatcher), hasEnded());
|
||||||
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
assertThat(spans, hasItem(scanOperationSpanMatcher));
|
||||||
final String scanOperationSpanId = spans.stream().filter(scanOperationSpanMatcher::matches)
|
final String scanOperationSpanId = spans.stream().filter(scanOperationSpanMatcher::matches)
|
||||||
.map(SpanData::getSpanId).findAny().orElseThrow(AssertionError::new);
|
.map(SpanData::getSpanId).findAny().orElseThrow(AssertionError::new);
|
||||||
|
|
Loading…
Reference in New Issue