HADOOP-18755. openFile builder new optLong() methods break hbase-filesystem (#5704)
This is a followup to HADOOP-18724. Open file fails with NumberFormatException for S3AFileSystem Contributed by Steve Loughran
This commit is contained in:
parent
9f1e23cc67
commit
160b9fc3c9
@ -78,7 +78,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B opt(@Nonnull String key, boolean value);
|
default B opt(@Nonnull String key, boolean value) {
|
||||||
|
return opt(key, Boolean.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set optional int parameter for the Builder.
|
* Set optional int parameter for the Builder.
|
||||||
@ -88,7 +90,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B opt(@Nonnull String key, int value);
|
default B opt(@Nonnull String key, int value) {
|
||||||
|
return optLong(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This parameter is converted to a long and passed
|
* This parameter is converted to a long and passed
|
||||||
@ -102,7 +106,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @deprecated use {@link #optDouble(String, double)}
|
* @deprecated use {@link #optDouble(String, double)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
B opt(@Nonnull String key, float value);
|
default B opt(@Nonnull String key, float value) {
|
||||||
|
return optLong(key, (long) value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set optional long parameter for the Builder.
|
* Set optional long parameter for the Builder.
|
||||||
@ -112,7 +118,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @deprecated use {@link #optLong(String, long)} where possible.
|
* @deprecated use {@link #optLong(String, long)} where possible.
|
||||||
*/
|
*/
|
||||||
B opt(@Nonnull String key, long value);
|
default B opt(@Nonnull String key, long value) {
|
||||||
|
return optLong(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass an optional double parameter for the Builder.
|
* Pass an optional double parameter for the Builder.
|
||||||
@ -126,7 +134,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @deprecated use {@link #optDouble(String, double)}
|
* @deprecated use {@link #optDouble(String, double)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
B opt(@Nonnull String key, double value);
|
default B opt(@Nonnull String key, double value) {
|
||||||
|
return optLong(key, (long) value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an array of string values as optional parameter for the Builder.
|
* Set an array of string values as optional parameter for the Builder.
|
||||||
@ -146,7 +156,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B optLong(@Nonnull String key, long value);
|
default B optLong(@Nonnull String key, long value) {
|
||||||
|
return opt(key, Long.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set optional double parameter for the Builder.
|
* Set optional double parameter for the Builder.
|
||||||
@ -156,7 +168,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B optDouble(@Nonnull String key, double value);
|
default B optDouble(@Nonnull String key, double value) {
|
||||||
|
return opt(key, Double.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set mandatory option to the Builder.
|
* Set mandatory option to the Builder.
|
||||||
@ -178,7 +192,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #must(String, String)
|
* @see #must(String, String)
|
||||||
*/
|
*/
|
||||||
B must(@Nonnull String key, boolean value);
|
default B must(@Nonnull String key, boolean value) {
|
||||||
|
return must(key, Boolean.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set mandatory int option.
|
* Set mandatory int option.
|
||||||
@ -188,7 +204,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #must(String, String)
|
* @see #must(String, String)
|
||||||
*/
|
*/
|
||||||
B must(@Nonnull String key, int value);
|
default B must(@Nonnull String key, int value) {
|
||||||
|
return mustLong(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This parameter is converted to a long and passed
|
* This parameter is converted to a long and passed
|
||||||
@ -201,7 +219,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @deprecated use {@link #mustDouble(String, double)} to set floating point.
|
* @deprecated use {@link #mustDouble(String, double)} to set floating point.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
B must(@Nonnull String key, float value);
|
default B must(@Nonnull String key, float value) {
|
||||||
|
return mustLong(key, (long) value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set mandatory long option.
|
* Set mandatory long option.
|
||||||
@ -212,7 +232,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @see #must(String, String)
|
* @see #must(String, String)
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
B must(@Nonnull String key, long value);
|
default B must(@Nonnull String key, long value) {
|
||||||
|
return mustLong(key, (long) value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set mandatory long option, despite passing in a floating
|
* Set mandatory long option, despite passing in a floating
|
||||||
@ -224,7 +246,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @see #must(String, String)
|
* @see #must(String, String)
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
B must(@Nonnull String key, double value);
|
default B must(@Nonnull String key, double value) {
|
||||||
|
return mustLong(key, (long) value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a string array as mandatory option.
|
* Set a string array as mandatory option.
|
||||||
@ -244,7 +268,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B mustLong(@Nonnull String key, long value);
|
default B mustLong(@Nonnull String key, long value) {
|
||||||
|
return must(key, Long.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set mandatory double parameter for the Builder.
|
* Set mandatory double parameter for the Builder.
|
||||||
@ -254,7 +280,9 @@ public interface FSBuilder<S, B extends FSBuilder<S, B>> {
|
|||||||
* @return generic type B.
|
* @return generic type B.
|
||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
B mustDouble(@Nonnull String key, double value);
|
default B mustDouble(@Nonnull String key, double value) {
|
||||||
|
return must(key, Double.toString(value));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiate the object which was being built.
|
* Instantiate the object which was being built.
|
||||||
|
@ -190,12 +190,12 @@ public B opt(@Nonnull final String key, boolean value) {
|
|||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final B opt(@Nonnull final String key, int value) {
|
public B opt(@Nonnull final String key, int value) {
|
||||||
return optLong(key, value);
|
return optLong(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final B opt(@Nonnull final String key, final long value) {
|
public B opt(@Nonnull final String key, final long value) {
|
||||||
return optLong(key, value);
|
return optLong(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +210,7 @@ public B optLong(@Nonnull final String key, final long value) {
|
|||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final B opt(@Nonnull final String key, float value) {
|
public B opt(@Nonnull final String key, float value) {
|
||||||
return optLong(key, (long) value);
|
return optLong(key, (long) value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ public final B opt(@Nonnull final String key, float value) {
|
|||||||
* @see #opt(String, String)
|
* @see #opt(String, String)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final B opt(@Nonnull final String key, double value) {
|
public B opt(@Nonnull final String key, double value) {
|
||||||
return optLong(key, (long) value);
|
return optLong(key, (long) value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,22 +291,22 @@ public B mustDouble(@Nonnull final String key, double value) {
|
|||||||
* @see #must(String, String)
|
* @see #must(String, String)
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final B must(@Nonnull final String key, int value) {
|
public B must(@Nonnull final String key, int value) {
|
||||||
return mustLong(key, value);
|
return mustLong(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final B must(@Nonnull final String key, final long value) {
|
public B must(@Nonnull final String key, final long value) {
|
||||||
return mustLong(key, value);
|
return mustLong(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final B must(@Nonnull final String key, final float value) {
|
public B must(@Nonnull final String key, final float value) {
|
||||||
return mustLong(key, (long) value);
|
return mustLong(key, (long) value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final B must(@Nonnull final String key, double value) {
|
public B must(@Nonnull final String key, double value) {
|
||||||
return mustLong(key, (long) value);
|
return mustLong(key, (long) value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,11 +20,12 @@
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.FSBuilder;
|
import org.apache.hadoop.fs.FSBuilder;
|
||||||
import org.apache.hadoop.fs.Path;
|
|
||||||
import org.apache.hadoop.fs.impl.AbstractFSBuilderImpl;
|
|
||||||
import org.apache.hadoop.fs.impl.FSBuilderSupport;
|
import org.apache.hadoop.fs.impl.FSBuilderSupport;
|
||||||
import org.apache.hadoop.test.AbstractHadoopTestBase;
|
import org.apache.hadoop.test.AbstractHadoopTestBase;
|
||||||
|
|
||||||
@ -127,18 +128,45 @@ private interface SimpleBuilder
|
|||||||
extends FSBuilder<FSBuilderSupport, SimpleBuilder> {
|
extends FSBuilder<FSBuilderSupport, SimpleBuilder> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a minimal builder which relies on default implementations of the interface.
|
||||||
|
* If it ever stops compiling, it means a new interface has been added which
|
||||||
|
* is not backwards compatible with external implementations, such as that
|
||||||
|
* in HBoss (see HBASE-26483).
|
||||||
|
*
|
||||||
|
*/
|
||||||
private static final class BuilderImpl
|
private static final class BuilderImpl
|
||||||
extends AbstractFSBuilderImpl<FSBuilderSupport, SimpleBuilder>
|
|
||||||
implements SimpleBuilder {
|
implements SimpleBuilder {
|
||||||
|
private final Configuration options = new Configuration(false);
|
||||||
|
|
||||||
private BuilderImpl() {
|
@Override
|
||||||
super(new Path("/"));
|
public SimpleBuilder opt(@Nonnull final String key, @Nonnull final String value) {
|
||||||
|
options.set(key, value);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SimpleBuilder opt(@Nonnull final String key, @Nonnull final String... values) {
|
||||||
|
options.setStrings(key, values);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SimpleBuilder must(@Nonnull final String key, @Nonnull final String value) {
|
||||||
|
return opt(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SimpleBuilder must(@Nonnull final String key, @Nonnull final String... values) {
|
||||||
|
return opt(key, values);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FSBuilderSupport build()
|
public FSBuilderSupport build()
|
||||||
throws IOException {
|
throws IllegalArgumentException, UnsupportedOperationException, IOException {
|
||||||
return new FSBuilderSupport(getOptions());
|
return new FSBuilderSupport(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user