aboutsummaryrefslogtreecommitdiff
path: root/other/java/client
diff options
context:
space:
mode:
Diffstat (limited to 'other/java/client')
-rw-r--r--other/java/client/pom.xml20
-rw-r--r--other/java/client/src/main/java/seaweedfs/client/FilerClient.java32
-rw-r--r--other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java46
-rw-r--r--other/java/client/src/main/java/seaweedfs/client/FilerSslContext.java64
-rw-r--r--other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java25
-rw-r--r--other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java12
-rw-r--r--other/java/client/src/main/proto/filer.proto5
-rw-r--r--other/java/client/src/test/java/seaweedfs/client/SeaweedFilerTest.java23
8 files changed, 162 insertions, 65 deletions
diff --git a/other/java/client/pom.xml b/other/java/client/pom.xml
index 5882c726d..0c585a941 100644
--- a/other/java/client/pom.xml
+++ b/other/java/client/pom.xml
@@ -4,7 +4,7 @@
<groupId>com.github.chrislusf</groupId>
<artifactId>seaweedfs-client</artifactId>
- <version>1.1.0</version>
+ <version>1.2.4</version>
<parent>
<groupId>org.sonatype.oss</groupId>
@@ -13,12 +13,18 @@
</parent>
<properties>
- <protobuf.version>3.5.1</protobuf.version>
- <grpc.version>1.16.1</grpc.version>
- <guava.version>26.0-jre</guava.version>
+ <protobuf.version>3.9.1</protobuf.version>
+ <!-- follow https://github.com/grpc/grpc-java -->
+ <grpc.version>1.23.0</grpc.version>
+ <guava.version>28.0-jre</guava.version>
</properties>
<dependencies>
+ <dependency>
+ <groupId>com.moandjiezana.toml</groupId>
+ <artifactId>toml4j</artifactId>
+ <version>0.7.2</version>
+ </dependency>
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java -->
<dependency>
<groupId>com.google.protobuf</groupId>
@@ -74,7 +80,7 @@
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
- <version>1.5.0.Final</version>
+ <version>1.6.2</version>
</extension>
</extensions>
<plugins>
@@ -89,9 +95,9 @@
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
- <version>0.5.1</version>
+ <version>0.6.1</version>
<configuration>
- <protocArtifact>com.google.protobuf:protoc:${protobuf.version}-1:exe:${os.detected.classifier}</protocArtifact>
+ <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
diff --git a/other/java/client/src/main/java/seaweedfs/client/FilerClient.java b/other/java/client/src/main/java/seaweedfs/client/FilerClient.java
index f4bd0944b..84aa26ad9 100644
--- a/other/java/client/src/main/java/seaweedfs/client/FilerClient.java
+++ b/other/java/client/src/main/java/seaweedfs/client/FilerClient.java
@@ -7,6 +7,7 @@ import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
public class FilerClient {
@@ -34,13 +35,12 @@ public class FilerClient {
public boolean mkdirs(String path, int mode, int uid, int gid, String userName, String[] groupNames) {
- Path pathObject = Paths.get(path);
- String parent = pathObject.getParent().toString();
- String name = pathObject.getFileName().toString();
-
if ("/".equals(path)) {
return true;
}
+ Path pathObject = Paths.get(path);
+ String parent = pathObject.getParent().toString();
+ String name = pathObject.getFileName().toString();
mkdirs(parent, mode, uid, gid, userName, groupNames);
@@ -71,7 +71,7 @@ public class FilerClient {
}
- public boolean rm(String path, boolean isRecursive) {
+ public boolean rm(String path, boolean isRecursive, boolean ignoreRecusiveError) {
Path pathObject = Paths.get(path);
String parent = pathObject.getParent().toString();
@@ -81,7 +81,8 @@ public class FilerClient {
parent,
name,
true,
- isRecursive);
+ isRecursive,
+ ignoreRecusiveError);
}
public boolean touch(String path, int mode) {
@@ -173,17 +174,18 @@ public class FilerClient {
}
public List<FilerProto.Entry> listEntries(String path, String entryPrefix, String lastEntryName, int limit) {
- List<FilerProto.Entry> entries = filerGrpcClient.getBlockingStub().listEntries(FilerProto.ListEntriesRequest.newBuilder()
+ Iterator<FilerProto.ListEntriesResponse> iter = filerGrpcClient.getBlockingStub().listEntries(FilerProto.ListEntriesRequest.newBuilder()
.setDirectory(path)
.setPrefix(entryPrefix)
.setStartFromFileName(lastEntryName)
.setLimit(limit)
- .build()).getEntriesList();
- List<FilerProto.Entry> fixedEntries = new ArrayList<>(entries.size());
- for (FilerProto.Entry entry : entries) {
- fixedEntries.add(fixEntryAfterReading(entry));
+ .build());
+ List<FilerProto.Entry> entries = new ArrayList<>();
+ while (iter.hasNext()){
+ FilerProto.ListEntriesResponse resp = iter.next();
+ entries.add(fixEntryAfterReading(resp.getEntry()));
}
- return fixedEntries;
+ return entries;
}
public FilerProto.Entry lookupEntry(String directory, String entryName) {
@@ -195,6 +197,9 @@ public class FilerClient {
.build()).getEntry();
return fixEntryAfterReading(entry);
} catch (Exception e) {
+ if (e.getMessage().indexOf("filer: no entry is found in filer store")>0){
+ return null;
+ }
LOG.warn("lookupEntry {}/{}: {}", directory, entryName, e);
return null;
}
@@ -227,13 +232,14 @@ public class FilerClient {
return true;
}
- public boolean deleteEntry(String parent, String entryName, boolean isDeleteFileChunk, boolean isRecursive) {
+ public boolean deleteEntry(String parent, String entryName, boolean isDeleteFileChunk, boolean isRecursive, boolean ignoreRecusiveError) {
try {
filerGrpcClient.getBlockingStub().deleteEntry(FilerProto.DeleteEntryRequest.newBuilder()
.setDirectory(parent)
.setName(entryName)
.setIsDeleteData(isDeleteFileChunk)
.setIsRecursive(isRecursive)
+ .setIgnoreRecursiveError(ignoreRecusiveError)
.build());
} catch (Exception e) {
LOG.warn("deleteEntry {}/{}: {}", parent, entryName, e);
diff --git a/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java b/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java
index c28c1dcf2..3626c76de 100644
--- a/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java
+++ b/other/java/client/src/main/java/seaweedfs/client/FilerGrpcClient.java
@@ -2,39 +2,46 @@ package seaweedfs.client;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
-import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
import io.grpc.netty.shaded.io.grpc.netty.NegotiationType;
import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder;
import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
-import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import javax.net.ssl.SSLException;
-import java.io.File;
import java.util.concurrent.TimeUnit;
-import java.util.logging.Logger;
public class FilerGrpcClient {
- private static final Logger logger = Logger.getLogger(FilerGrpcClient.class.getName());
+ private static final Logger logger = LoggerFactory.getLogger(FilerGrpcClient.class);
private final ManagedChannel channel;
private final SeaweedFilerGrpc.SeaweedFilerBlockingStub blockingStub;
private final SeaweedFilerGrpc.SeaweedFilerStub asyncStub;
private final SeaweedFilerGrpc.SeaweedFilerFutureStub futureStub;
+ static SslContext sslContext;
+
+ static {
+ try {
+ sslContext = FilerSslContext.loadSslContext();
+ } catch (SSLException e) {
+ logger.warn("failed to load ssl context", e);
+ }
+ }
public FilerGrpcClient(String host, int grpcPort) {
- this(ManagedChannelBuilder.forAddress(host, grpcPort).usePlaintext());
+ this(host, grpcPort, sslContext);
}
- public FilerGrpcClient(String host, int grpcPort,
- String caFilePath,
- String clientCertFilePath,
- String clientPrivateKeyFilePath) throws SSLException {
+ public FilerGrpcClient(String host, int grpcPort, SslContext sslContext) {
+
+ this(sslContext == null ?
+ ManagedChannelBuilder.forAddress(host, grpcPort).usePlaintext() :
+ NettyChannelBuilder.forAddress(host, grpcPort)
+ .negotiationType(NegotiationType.TLS)
+ .sslContext(sslContext));
- this(NettyChannelBuilder.forAddress(host, grpcPort)
- .negotiationType(NegotiationType.TLS)
- .sslContext(buildSslContext(caFilePath,clientCertFilePath,clientPrivateKeyFilePath)));
}
public FilerGrpcClient(ManagedChannelBuilder<?> channelBuilder) {
@@ -60,17 +67,4 @@ public class FilerGrpcClient {
return futureStub;
}
- private static SslContext buildSslContext(String trustCertCollectionFilePath,
- String clientCertChainFilePath,
- String clientPrivateKeyFilePath) throws SSLException {
- SslContextBuilder builder = GrpcSslContexts.forClient();
- if (trustCertCollectionFilePath != null) {
- builder.trustManager(new File(trustCertCollectionFilePath));
- }
- if (clientCertChainFilePath != null && clientPrivateKeyFilePath != null) {
- builder.keyManager(new File(clientCertChainFilePath), new File(clientPrivateKeyFilePath));
- }
- return builder.build();
- }
-
}
diff --git a/other/java/client/src/main/java/seaweedfs/client/FilerSslContext.java b/other/java/client/src/main/java/seaweedfs/client/FilerSslContext.java
new file mode 100644
index 000000000..5a88c1da3
--- /dev/null
+++ b/other/java/client/src/main/java/seaweedfs/client/FilerSslContext.java
@@ -0,0 +1,64 @@
+package seaweedfs.client;
+
+import com.google.common.base.Strings;
+import com.moandjiezana.toml.Toml;
+import io.grpc.netty.shaded.io.grpc.netty.GrpcSslContexts;
+import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext;
+import io.grpc.netty.shaded.io.netty.handler.ssl.SslContextBuilder;
+import io.grpc.netty.shaded.io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.SSLException;
+import java.io.File;
+
+public class FilerSslContext {
+
+ private static final Logger logger = LoggerFactory.getLogger(FilerSslContext.class);
+
+ public static SslContext loadSslContext() throws SSLException {
+ String securityFileName = "security.toml";
+ String home = System.getProperty("user.home");
+ File f1 = new File("./"+securityFileName);
+ File f2 = new File(home + "/.seaweedfs/"+securityFileName);
+ File f3 = new File(home + "/etc/seaweedfs/"+securityFileName);
+
+ File securityFile = f1.exists()? f1 : f2.exists() ? f2 : f3.exists()? f3 : null;
+
+ if (securityFile==null){
+ return null;
+ }
+
+ Toml toml = new Toml().read(securityFile);
+ logger.debug("reading ssl setup from {}", securityFile);
+
+ String trustCertCollectionFilePath = toml.getString("grpc.ca");
+ logger.debug("loading ca from {}", trustCertCollectionFilePath);
+ String clientCertChainFilePath = toml.getString("grpc.client.cert");
+ logger.debug("loading client ca from {}", clientCertChainFilePath);
+ String clientPrivateKeyFilePath = toml.getString("grpc.client.key");
+ logger.debug("loading client key from {}", clientPrivateKeyFilePath);
+
+ if (Strings.isNullOrEmpty(clientPrivateKeyFilePath) && Strings.isNullOrEmpty(clientPrivateKeyFilePath)){
+ return null;
+ }
+
+ // possibly fix the format https://netty.io/wiki/sslcontextbuilder-and-private-key.html
+
+ return buildSslContext(trustCertCollectionFilePath, clientCertChainFilePath, clientPrivateKeyFilePath);
+ }
+
+
+ private static SslContext buildSslContext(String trustCertCollectionFilePath,
+ String clientCertChainFilePath,
+ String clientPrivateKeyFilePath) throws SSLException {
+ SslContextBuilder builder = GrpcSslContexts.forClient();
+ if (trustCertCollectionFilePath != null) {
+ builder.trustManager(new File(trustCertCollectionFilePath));
+ }
+ if (clientCertChainFilePath != null && clientPrivateKeyFilePath != null) {
+ builder.keyManager(new File(clientCertChainFilePath), new File(clientPrivateKeyFilePath));
+ }
+ return builder.trustManager(InsecureTrustManagerFactory.INSTANCE).build();
+ }
+}
diff --git a/other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java b/other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java
index a906a689b..2efa64580 100644
--- a/other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java
+++ b/other/java/client/src/main/java/seaweedfs/client/SeaweedRead.java
@@ -5,16 +5,13 @@ import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.DefaultHttpClient;
+import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
public class SeaweedRead {
@@ -23,7 +20,7 @@ public class SeaweedRead {
// returns bytesRead
public static long read(FilerGrpcClient filerGrpcClient, List<VisibleInterval> visibleIntervals,
final long position, final byte[] buffer, final int bufferOffset,
- final int bufferLength) {
+ final int bufferLength) throws IOException {
List<ChunkView> chunkViews = viewFromVisibles(visibleIntervals, position, bufferLength);
@@ -58,8 +55,8 @@ public class SeaweedRead {
return readCount;
}
- private static int readChunkView(long position, byte[] buffer, int startOffset, ChunkView chunkView, FilerProto.Locations locations) {
- HttpClient client = HttpClientBuilder.create().build();
+ private static int readChunkView(long position, byte[] buffer, int startOffset, ChunkView chunkView, FilerProto.Locations locations) throws IOException {
+ HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(
String.format("http://%s/%s", locations.getLocations(0).getUrl(), chunkView.fileId));
@@ -80,13 +77,15 @@ public class SeaweedRead {
return len;
- } catch (IOException e) {
- e.printStackTrace();
+ } finally {
+ if (client instanceof Closeable) {
+ Closeable t = (Closeable) client;
+ t.close();
+ }
}
- return 0;
}
- public static List<ChunkView> viewFromVisibles(List<VisibleInterval> visibleIntervals, long offset, long size) {
+ protected static List<ChunkView> viewFromVisibles(List<VisibleInterval> visibleIntervals, long offset, long size) {
List<ChunkView> views = new ArrayList<>();
long stop = offset + size;
diff --git a/other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java b/other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java
index 15db87195..0663e8d98 100644
--- a/other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java
+++ b/other/java/client/src/main/java/seaweedfs/client/SeaweedWrite.java
@@ -1,13 +1,14 @@
package seaweedfs.client;
import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.DefaultHttpClient;
import java.io.ByteArrayInputStream;
+import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
@@ -59,7 +60,7 @@ public class SeaweedWrite {
final byte[] bytes,
final long bytesOffset, final long bytesLength) throws IOException {
- CloseableHttpClient client = HttpClientBuilder.create().setUserAgent("hdfs-client").build();
+ HttpClient client = new DefaultHttpClient();
InputStream inputStream = new ByteArrayInputStream(bytes, (int) bytesOffset, (int) bytesLength);
@@ -84,7 +85,10 @@ public class SeaweedWrite {
return etag;
} finally {
- client.close();
+ if (client instanceof Closeable) {
+ Closeable t = (Closeable) client;
+ t.close();
+ }
}
}
diff --git a/other/java/client/src/main/proto/filer.proto b/other/java/client/src/main/proto/filer.proto
index d72bced12..ef847cbe7 100644
--- a/other/java/client/src/main/proto/filer.proto
+++ b/other/java/client/src/main/proto/filer.proto
@@ -12,7 +12,7 @@ service SeaweedFiler {
rpc LookupDirectoryEntry (LookupDirectoryEntryRequest) returns (LookupDirectoryEntryResponse) {
}
- rpc ListEntries (ListEntriesRequest) returns (ListEntriesResponse) {
+ rpc ListEntries (ListEntriesRequest) returns (stream ListEntriesResponse) {
}
rpc CreateEntry (CreateEntryRequest) returns (CreateEntryResponse) {
@@ -64,7 +64,7 @@ message ListEntriesRequest {
}
message ListEntriesResponse {
- repeated Entry entries = 1;
+ Entry entry = 1;
}
message Entry {
@@ -141,6 +141,7 @@ message DeleteEntryRequest {
// bool is_directory = 3;
bool is_delete_data = 4;
bool is_recursive = 5;
+ bool ignore_recursive_error = 6;
}
message DeleteEntryResponse {
diff --git a/other/java/client/src/test/java/seaweedfs/client/SeaweedFilerTest.java b/other/java/client/src/test/java/seaweedfs/client/SeaweedFilerTest.java
new file mode 100644
index 000000000..eaf17e5c6
--- /dev/null
+++ b/other/java/client/src/test/java/seaweedfs/client/SeaweedFilerTest.java
@@ -0,0 +1,23 @@
+package seaweedfs.client;
+
+import java.util.List;
+
+public class SeaweedFilerTest {
+ public static void main(String[] args){
+
+ FilerClient filerClient = new FilerClient("localhost", 18888);
+
+ List<FilerProto.Entry> entries = filerClient.listEntries("/");
+
+ for (FilerProto.Entry entry : entries) {
+ System.out.println(entry.toString());
+ }
+
+ filerClient.mkdirs("/new_folder", 0755);
+ filerClient.touch("/new_folder/new_empty_file", 0755);
+ filerClient.touch("/new_folder/new_empty_file2", 0755);
+ filerClient.rm("/new_folder/new_empty_file", false, true);
+ filerClient.rm("/new_folder", true, true);
+
+ }
+}