forked from hugegraph/hugegraph-sync
refact: rename pkg for client & common & core & pom.xml
Change-Id: Ieef748324b11b9d125dca915262f80a5954f5f98
This commit is contained in:
parent
bb081bcfc2
commit
7b5c5f87b7
|
|
@ -20,9 +20,9 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hugegraph-store-root</artifactId>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<version>3.6.3-SNAPSHOT</version>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
|
@ -40,19 +40,19 @@
|
|||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-store-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-store-grpc</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-pd-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ package org.apache.hugegraph.store.cli;
|
|||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.hugegraph.store.HgStoreClient;
|
||||
import org.apache.hugegraph.store.cli.loader.HgThread2DB;
|
||||
import org.apache.hugegraph.store.cli.scan.GrpcShardScanner;
|
||||
import org.apache.hugegraph.store.cli.scan.HgStoreCommitter;
|
||||
|
|
@ -30,7 +31,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
|||
|
||||
import com.baidu.hugegraph.pd.client.PDConfig;
|
||||
import com.baidu.hugegraph.pd.common.PDException;
|
||||
import com.baidu.hugegraph.store.HgStoreClient;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,18 +36,18 @@ import java.util.concurrent.TimeUnit;
|
|||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.HgStoreClient;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.cli.util.HgCliUtil;
|
||||
import org.apache.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import org.apache.hugegraph.store.client.util.MetricX;
|
||||
|
||||
import com.baidu.hugegraph.pd.client.PDClient;
|
||||
import com.baidu.hugegraph.pd.client.PDConfig;
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.HgStoreClient;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import com.baidu.hugegraph.store.client.util.MetricX;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
|
|||
|
|
@ -17,12 +17,11 @@
|
|||
|
||||
package org.apache.hugegraph.store.cli.scan;
|
||||
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgSessionManager;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.cli.util.HgCliUtil;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgSessionManager;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeManager;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeManager;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/2/28
|
||||
|
|
|
|||
|
|
@ -20,22 +20,22 @@ package org.apache.hugegraph.store.cli.scan;
|
|||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvStore;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.HgSessionManager;
|
||||
import org.apache.hugegraph.store.HgStoreClient;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.cli.util.HgCliUtil;
|
||||
import org.apache.hugegraph.store.cli.util.HgMetricX;
|
||||
import org.apache.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import org.apache.hugegraph.store.client.util.MetricX;
|
||||
|
||||
import com.baidu.hugegraph.pd.client.PDClient;
|
||||
import com.baidu.hugegraph.pd.common.PDException;
|
||||
import com.baidu.hugegraph.pd.grpc.Metapb;
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvStore;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.HgSessionManager;
|
||||
import com.baidu.hugegraph.store.HgStoreClient;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import com.baidu.hugegraph.store.client.util.MetricX;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,10 +26,10 @@ import java.util.List;
|
|||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,5 +1,22 @@
|
|||
#!/bin/bash
|
||||
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with this
|
||||
# work for additional information regarding copyright ownership. The ASF
|
||||
# licenses this file to You under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
|
||||
readonly REPO_URL=http://10.14.139.8:8081/artifactory/star-snapshot
|
||||
|
||||
mvn --settings ../settings.xml -Dmaven.test.skip=true -DaltDeploymentRepository=star-snapshot::default::${REPO_URL} clean deploy
|
||||
|
|
|
|||
|
|
@ -1,12 +1,29 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
contributor license agreements. See the NOTICE file distributed with this
|
||||
work for additional information regarding copyright ownership. The ASF
|
||||
licenses this file to You under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations
|
||||
under the License.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-store-client</artifactId>
|
||||
<version>3.6.3-SNAPSHOT</version>
|
||||
<version>${revision}</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
|
|
@ -18,15 +35,26 @@
|
|||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-store-grpc</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-store-common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-pd-client</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hg-pd-grpc</artifactId>
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
|
|
@ -37,18 +65,6 @@
|
|||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<version>${log4j2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<artifactId>hg-pd-client</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>com.baidu.hugegraph</groupId>
|
||||
<artifactId>hg-pd-grpc</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
<!-- test -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
|
|
|
|||
|
|
@ -1,14 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgKvEntry {
|
||||
byte[] key();
|
||||
|
||||
byte[] value();
|
||||
|
||||
default int code(){
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/21
|
||||
*/
|
||||
public interface HgKvIterator<E> extends Iterator<E>, HgSeekAble, Closeable {
|
||||
|
||||
byte[] key();
|
||||
|
||||
byte[] value();
|
||||
|
||||
void close();
|
||||
|
||||
}
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2022/03/10
|
||||
*/
|
||||
public interface HgKvOrderedIterator<E> extends HgKvIterator<E>, Comparable<HgKvOrderedIterator> {
|
||||
long getSequence();
|
||||
}
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/24
|
||||
*/
|
||||
public interface HgKvPagingIterator<E> extends HgKvIterator<E>, HgPageSize {
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* Return the amount of records returned by one query in pageable-query.
|
||||
*
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/24
|
||||
*/
|
||||
public interface HgPageSize {
|
||||
long getPageSize();
|
||||
default boolean isPageEmpty(){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public final class HgPrivate {
|
||||
|
||||
private static HgPrivate instance = new HgPrivate();
|
||||
|
||||
private HgPrivate() {
|
||||
}
|
||||
|
||||
static HgPrivate of() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2022/03/11
|
||||
*/
|
||||
public interface HgSeekAble {
|
||||
byte[] position();
|
||||
|
||||
void seek(byte[] position);
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
import com.baidu.hugegraph.store.client.HgStoreSessionProvider;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* Maintain HgStoreSession instances.
|
||||
* // TODO: Holding more than one HgSessionManager is available,if you want to connect multi HgStore-clusters.
|
||||
*
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
|
||||
@ThreadSafe
|
||||
public final class HgSessionManager {
|
||||
private HgSessionProvider sessionProvider;
|
||||
private final static HgSessionManager instance =new HgSessionManager();
|
||||
|
||||
private HgSessionManager(){
|
||||
// TODO: constructed by SPI
|
||||
this.sessionProvider=new HgStoreSessionProvider();
|
||||
}
|
||||
|
||||
|
||||
public static HgSessionManager getInstance(){
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve or create a HgStoreSession.
|
||||
* @param graphName
|
||||
* @return
|
||||
*/
|
||||
public HgStoreSession openSession(String graphName){
|
||||
return this.sessionProvider.createSession(graphName);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
@ThreadSafe
|
||||
public interface HgSessionProvider {
|
||||
HgStoreSession createSession(String graphName);
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
import com.baidu.hugegraph.store.client.type.HgStoreClientException;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgStoreSession extends HgKvStore {
|
||||
|
||||
void beginTx();
|
||||
|
||||
/**
|
||||
* @throws IllegalStateException when the tx hasn't been beginning.
|
||||
* @throws HgStoreClientException when failed to commit .
|
||||
*/
|
||||
void commit();
|
||||
|
||||
/**
|
||||
* @throws IllegalStateException when the tx hasn't been beginning.
|
||||
* @throws HgStoreClientException when failed to rollback.
|
||||
*/
|
||||
void rollback();
|
||||
|
||||
boolean isTx();
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgTkvEntry {
|
||||
String table();
|
||||
byte[] key();
|
||||
byte[] value();
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgTokvEntry {
|
||||
String table();
|
||||
HgOwnerKey ownerKey();
|
||||
byte[] value();
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
*/
|
||||
public class HgPrivate {
|
||||
private final static HgPrivate instance = new HgPrivate();
|
||||
|
||||
static HgPrivate getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private HgPrivate() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
* @version 0.2.0
|
||||
*/
|
||||
public interface HgStoreNode {
|
||||
|
||||
/**
|
||||
* Return boolean value of being online or not
|
||||
* @return
|
||||
*/
|
||||
default boolean isHealthy(){
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the unique ID of store-node.
|
||||
* @return
|
||||
*/
|
||||
Long getNodeId();
|
||||
|
||||
/**
|
||||
* A string value concatenated by host and port: "host:port"
|
||||
* @return
|
||||
*/
|
||||
String getAddress();
|
||||
|
||||
/**
|
||||
* Return a new HgStoreSession instance, that is not Thread safe.
|
||||
* Return null when the node is not in charge of the graph that was passed from argument.
|
||||
* @return
|
||||
*/
|
||||
HgStoreSession openSession(String graphName);
|
||||
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
*/
|
||||
public interface HgStoreNodeBuilder {
|
||||
|
||||
HgStoreNodeBuilder setNodeId(Long nodeId);
|
||||
|
||||
HgStoreNodeBuilder setAddress(String address);
|
||||
|
||||
/**
|
||||
* To build a HgStoreNode instance.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode build();
|
||||
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
public final class HgStoreNodeCandidates {
|
||||
|
||||
List<HgStoreNode> nodeList;
|
||||
|
||||
HgStoreNodeCandidates(List<HgStoreNode> nodeList){
|
||||
this.nodeList=nodeList;
|
||||
}
|
||||
|
||||
public int size(){
|
||||
return this.nodeList.size();
|
||||
}
|
||||
|
||||
public HgStoreNode getNode(int index){
|
||||
return this.nodeList.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.client.type.HgNodeStatus;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface HgStoreNodeNotifier {
|
||||
|
||||
/**
|
||||
* It will be invoked by NodeManager, when some exception or issue was happened.
|
||||
* @param graphName
|
||||
* @param storeNotice
|
||||
* @return return 0 please, for no matter what.
|
||||
*/
|
||||
int notice(String graphName, HgStoreNotice storeNotice);
|
||||
|
||||
}
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/27
|
||||
*/
|
||||
public interface HgStoreNodeProvider {
|
||||
|
||||
/**
|
||||
* Applying a new HgStoreNode instance
|
||||
* @param graphName
|
||||
* @param nodeId
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode apply(String graphName, Long nodeId);
|
||||
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @version 0.1.0
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
*/
|
||||
public interface HgStoreNodeSession extends HgStoreSession {
|
||||
|
||||
/**
|
||||
* Return the name of graph.
|
||||
* @return
|
||||
*/
|
||||
String getGraphName();
|
||||
|
||||
/**
|
||||
* Return an instance of HgStoreNode, which provided the connection of Store-Node machine.
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode getStoreNode();
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
|
||||
public class HgStoreService {
|
||||
private static HgStoreService instance=new HgStoreService();
|
||||
private HgStoreService(){}
|
||||
|
||||
static HgStoreService of(){
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.HgSessionProvider;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
@ThreadSafe
|
||||
public class HgStoreSessionProvider implements HgSessionProvider {
|
||||
private MultiNodeSessionFactory sessionFactory=MultiNodeSessionFactory.getInstance();
|
||||
|
||||
@Override
|
||||
public HgStoreSession createSession(String graphName) {
|
||||
return this.sessionFactory.createStoreSession(graphName);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgTkvEntry;
|
||||
import com.baidu.hugegraph.store.HgTokvEntry;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/14
|
||||
*/
|
||||
class HgTkvEntryImpl implements HgTkvEntry {
|
||||
private String table;
|
||||
private byte[] key;
|
||||
private byte[] value;
|
||||
|
||||
HgTkvEntryImpl(String table, byte[] key, byte[] value) {
|
||||
this.table = table;
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String table() {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] key() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
HgTkvEntryImpl that = (HgTkvEntryImpl) o;
|
||||
return Objects.equals(table, that.table) && Arrays.equals(key, that.key) && Arrays.equals(value, that.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Objects.hash(table);
|
||||
result = 31 * result + Arrays.hashCode(key);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgTkvEntryImpl{" +
|
||||
"table='" + table + '\'' +
|
||||
", key=" + Arrays.toString(key) +
|
||||
", value=" + Arrays.toString(value) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgTokvEntry;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/14
|
||||
*/
|
||||
class HgTokvEntryImpl implements HgTokvEntry {
|
||||
|
||||
private String table;
|
||||
private HgOwnerKey ownerKey;
|
||||
private byte[] value;
|
||||
|
||||
HgTokvEntryImpl(String table, HgOwnerKey ownerKey, byte[] value) {
|
||||
this.table = table;
|
||||
this.ownerKey = ownerKey;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String table() {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgOwnerKey ownerKey() {
|
||||
return this.ownerKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
HgTokvEntryImpl that = (HgTokvEntryImpl) o;
|
||||
return Objects.equals(table, that.table) && Objects.equals(ownerKey, that.ownerKey) && Arrays.equals(value, that.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Objects.hash(table, ownerKey);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgTokvEntryImpl{" +
|
||||
"table='" + table + '\'' +
|
||||
", okv=" + ownerKey +
|
||||
", value=" + Arrays.toString(value) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
class GrpcKvEntryImpl implements HgKvEntry {
|
||||
private byte[] key;
|
||||
private byte[] value;
|
||||
private int code;
|
||||
|
||||
GrpcKvEntryImpl(byte[] k, byte[] v,int code) {
|
||||
this.key = k;
|
||||
this.value = v;
|
||||
this.code=code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] key() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
GrpcKvEntryImpl hgKvEntry = (GrpcKvEntryImpl) o;
|
||||
return Arrays.equals(key, hgKvEntry.key) && Arrays.equals(value, hgKvEntry.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Arrays.hashCode(key);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgKvEntryImpl{" +
|
||||
"key=" + Arrays.toString(key) +
|
||||
", value=" + Arrays.toString(value) +
|
||||
", code=" + code +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import com.baidu.hugegraph.store.client.HgPrivate;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNode;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeBuilder;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeManager;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
public class GrpcStoreNodeBuilder implements HgStoreNodeBuilder {
|
||||
|
||||
private static GrpcStoreSessionClient sessionClient = new GrpcStoreSessionClient();
|
||||
private static GrpcStoreStreamClient streamClient = new GrpcStoreStreamClient();
|
||||
private static final AtomicLong ids = new AtomicLong(0);
|
||||
|
||||
private Long nodeId;
|
||||
private String address;
|
||||
private HgStoreNodeManager nodeManager;
|
||||
|
||||
public GrpcStoreNodeBuilder(HgStoreNodeManager nodeManager, HgPrivate hgPrivate) {
|
||||
HgAssert.isArgumentNotNull(hgPrivate, "hgPrivate");
|
||||
HgAssert.isArgumentNotNull(nodeManager, "nodeManager");
|
||||
this.nodeManager = nodeManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrpcStoreNodeBuilder setAddress(String address) {
|
||||
HgAssert.isFalse(HgAssert.isInvalid(address), "The argument is invalid: address.");
|
||||
this.address = address;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrpcStoreNodeBuilder setNodeId(Long nodeId) {
|
||||
HgAssert.isFalse(nodeId == null, "The argument is invalid: nodeId.");
|
||||
this.nodeId = nodeId;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgStoreNode build() {
|
||||
// TODO: delete
|
||||
if (this.nodeId == null) {
|
||||
this.nodeId = ids.addAndGet(-1l);
|
||||
}
|
||||
|
||||
HgAssert.isFalse(this.nodeId == null, "nodeId can't to be null");
|
||||
HgAssert.isFalse(this.address == null, "address can't to be null");
|
||||
|
||||
GrpcStoreNodeImpl node = new GrpcStoreNodeImpl(this.nodeManager, sessionClient, streamClient);
|
||||
node.setNodeId(this.nodeId);
|
||||
node.setAddress(this.address);
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/3/16
|
||||
*/
|
||||
public interface KvCloseableIterator<T> extends Iterator<T>, Closeable {
|
||||
public void close();
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/4/6
|
||||
*/
|
||||
class KvListIterator<T> implements KvCloseableIterator{
|
||||
|
||||
private final Iterator<T> iterator;
|
||||
|
||||
KvListIterator(List<T> list){
|
||||
this.iterator=list.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
/*Nothing to do.*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return this.iterator.hasNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public T next() {
|
||||
return this.iterator.next();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import com.baidu.hugegraph.store.grpc.common.Header;
|
||||
import com.google.protobuf.ByteString;
|
||||
|
||||
/**
|
||||
* @author zhangyingjie
|
||||
* @date 2022/10/8
|
||||
**/
|
||||
public class ScanUtil {
|
||||
|
||||
|
||||
public static Header getHeader(HgStoreNodeSession nodeSession) {
|
||||
return Header.newBuilder().setGraph(nodeSession.getGraphName()).build();
|
||||
}
|
||||
|
||||
public static HgOwnerKey toOk(HgOwnerKey key) {
|
||||
return key == null ? HgStoreClientConst.EMPTY_OWNER_KEY : key;
|
||||
}
|
||||
|
||||
public static ByteString toBs(byte[] bytes) {
|
||||
return ByteString.copyFrom((bytes != null) ? bytes : EMPTY_BYTES);
|
||||
}
|
||||
|
||||
public static ByteString getHgOwnerKey(HgOwnerKey ownerKey) {
|
||||
return toBs(toOk(ownerKey).getKey());
|
||||
}
|
||||
|
||||
public static byte[] getQuery(byte[] query) {
|
||||
return query != null ? query : HgStoreClientConst.EMPTY_BYTES;
|
||||
}
|
||||
public static long getLimit(long limit) {
|
||||
return limit <= HgStoreClientConst.NO_LIMIT ? Integer.MAX_VALUE : limit;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import com.baidu.hugegraph.store.HgSeekAble;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/3/11
|
||||
*/
|
||||
class SeekAbleIterator<E> implements Iterator, HgSeekAble {
|
||||
private Iterator<E> iterator;
|
||||
private Consumer<byte[]> seeker;
|
||||
private Supplier<byte[]> positioner;
|
||||
|
||||
public static <E> SeekAbleIterator of(Iterator<E> iterator,Supplier<byte[]> positioner, Consumer<byte[]> seeker) {
|
||||
HgAssert.isArgumentNotNull(iterator, "iterator");
|
||||
HgAssert.isArgumentNotNull(positioner, "positioner");
|
||||
HgAssert.isArgumentNotNull(seeker, "seeker");
|
||||
return new SeekAbleIterator(iterator,positioner, seeker);
|
||||
}
|
||||
|
||||
private SeekAbleIterator(Iterator<E> iterator, Supplier<byte[]> positioner,Consumer<byte[]> seeker) {
|
||||
this.iterator = iterator;
|
||||
this.positioner=positioner;
|
||||
this.seeker = seeker;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] position() {
|
||||
return this.positioner.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void seek(byte[] position) {
|
||||
this.seeker.accept(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return this.iterator.hasNext();
|
||||
}
|
||||
|
||||
@Override
|
||||
public E next() {
|
||||
return this.iterator.next();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2021/12/1
|
||||
*/
|
||||
@ThreadSafe
|
||||
final class SwitchingExecutor {
|
||||
|
||||
static SwitchingExecutor of(){
|
||||
return new SwitchingExecutor();
|
||||
}
|
||||
|
||||
private SwitchingExecutor(){}
|
||||
|
||||
<T> Optional<T> invoke(Supplier<Boolean> switcher,Supplier<T> trueSupplier,Supplier<T> falseSupplier){
|
||||
Optional<T> option = null;
|
||||
|
||||
if(switcher.get()){
|
||||
option= Optional.of(trueSupplier.get());
|
||||
}else{
|
||||
option=Optional.of(falseSupplier.get());
|
||||
}
|
||||
if (option == null) {
|
||||
option = Optional.empty();
|
||||
}
|
||||
|
||||
return option;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.type;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
*/
|
||||
public enum HgNodeStatus {
|
||||
|
||||
UNKNOWN(0, "UNKNOWN"),
|
||||
NOT_EXIST(100,"NOT_EXIST"), // Failed to apply for an instance via node-id from NodeManager.
|
||||
NOT_ONLINE(105,"NOT_ONLINE"), // Failed to connect to Store-Node at the first time.
|
||||
NOT_WORK(110,"NOT_WORK"), // When a Store-Node to be not work anymore.
|
||||
|
||||
PARTITION_COMMON_FAULT(200,"PARTITION_COMMON_FAULT"), //
|
||||
NOT_PARTITION_LEADER(205,"NOT_PARTITION_LEADER") // When a Store-Node is not a specific partition leader.
|
||||
|
||||
;
|
||||
|
||||
private int status;
|
||||
private String name;
|
||||
|
||||
private HgNodeStatus(int status,String name){
|
||||
this.status=status;
|
||||
this.name=name;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.type;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/27
|
||||
*/
|
||||
public class HgStoreClientException extends RuntimeException {
|
||||
|
||||
public static HgStoreClientException of(String msg) {
|
||||
return new HgStoreClientException(msg);
|
||||
}
|
||||
public static HgStoreClientException of(String msg,Throwable cause) {
|
||||
return new HgStoreClientException(msg,cause);
|
||||
}
|
||||
|
||||
public static HgStoreClientException of(Throwable cause) {
|
||||
return new HgStoreClientException(cause);
|
||||
}
|
||||
|
||||
public HgStoreClientException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
|
||||
public HgStoreClientException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public HgStoreClientException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,36 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.util;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvStore;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static com.baidu.hugegraph.store.HgKvStore.*;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public final class HgStoreClientConst {
|
||||
public final static String DEFAULT_NODE_CLUSTER_ID = "default-node-cluster";
|
||||
|
||||
public final static String EMPTY_STRING = "";
|
||||
public final static String EMPTY_TABLE = "";
|
||||
public final static byte[] EMPTY_BYTES = new byte[0];
|
||||
public final static byte[] MAX_BYTES=new byte[]{(byte)0b11111111};
|
||||
public final static List EMPTY_LIST = Collections.EMPTY_LIST;
|
||||
|
||||
public final static byte[] ALL_PARTITION_OWNER = new byte[0]; // means to dispatch to all partitions.
|
||||
public final static HgOwnerKey EMPTY_OWNER_KEY = HgOwnerKey.of(EMPTY_BYTES, EMPTY_BYTES);
|
||||
public final static HgOwnerKey ALL_PARTITION_OWNER_KEY = HgOwnerKey.of(ALL_PARTITION_OWNER, ALL_PARTITION_OWNER);
|
||||
|
||||
//public final static int SCAN_GTE_BEGIN_LT_END = SCAN_GTE_BEGIN | SCAN_LT_END;
|
||||
public final static int SCAN_TYPE_RANGE= SCAN_GTE_BEGIN | SCAN_LTE_END;
|
||||
public final static int SCAN_TYPE_ANY = SCAN_ANY;
|
||||
public final static int NO_LIMIT=0;
|
||||
|
||||
public final static int TX_SESSIONS_MAP_CAPACITY=32;
|
||||
public static final int NODE_MAX_RETRYING_TIMES=10;
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.util;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public final class HgUuid {
|
||||
|
||||
private static String encode(UUID uuid) {
|
||||
ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
|
||||
bb.putLong(uuid.getMostSignificantBits());
|
||||
bb.putLong(uuid.getLeastSignificantBits());
|
||||
return Base58.encode(bb.array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a UUID in Base58 FORM
|
||||
* @return
|
||||
*/
|
||||
public static String newUUID() {
|
||||
return encode(UUID.randomUUID());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
package com.baidu.hugegraph.store.client.util;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/1/29
|
||||
*/
|
||||
public class MetricX {
|
||||
public static AtomicLong iteratorSum=new AtomicLong();
|
||||
public static AtomicLong iteratorCount=new AtomicLong();
|
||||
public static AtomicLong iteratorMax=new AtomicLong();
|
||||
|
||||
public AtomicLong failureCount=new AtomicLong();
|
||||
|
||||
private long start;
|
||||
private long end;
|
||||
|
||||
public static MetricX ofStart(){
|
||||
return new MetricX(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
private MetricX(long start){
|
||||
this.start=start;
|
||||
};
|
||||
|
||||
public long start(){
|
||||
return this.start=System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public long end(){
|
||||
return this.end=System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public long past(){
|
||||
return this.end-this.start;
|
||||
}
|
||||
|
||||
public static void plusIteratorWait(long nanoSeconds){
|
||||
iteratorSum.addAndGet(nanoSeconds);
|
||||
iteratorCount.getAndIncrement();
|
||||
if(iteratorMax.get()<nanoSeconds){
|
||||
iteratorMax.set(nanoSeconds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amount of waiting
|
||||
* @return millisecond
|
||||
*/
|
||||
public static long getIteratorWait(){
|
||||
return iteratorSum.get()/1_000_000;
|
||||
}
|
||||
|
||||
/**
|
||||
* average of waiting
|
||||
* @return millisecond
|
||||
*/
|
||||
public static long getIteratorWaitAvg(){
|
||||
if(iteratorCount.get()==0)return -1;
|
||||
return getIteratorWait()/iteratorCount.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* maximum of waiting
|
||||
* @return millisecond
|
||||
*/
|
||||
public static long getIteratorWaitMax(){
|
||||
return iteratorMax.get()/1_000_000;
|
||||
}
|
||||
|
||||
public static long getIteratorCount(){
|
||||
return iteratorCount.get();
|
||||
}
|
||||
|
||||
public void countFail(){
|
||||
this.failureCount.getAndIncrement();
|
||||
}
|
||||
|
||||
public long getFailureCount(){
|
||||
return this.failureCount.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgKvEntry {
|
||||
byte[] key();
|
||||
|
||||
byte[] value();
|
||||
|
||||
default int code() {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/21
|
||||
*/
|
||||
public interface HgKvIterator<E> extends Iterator<E>, HgSeekAble, Closeable {
|
||||
|
||||
byte[] key();
|
||||
|
||||
byte[] value();
|
||||
|
||||
void close();
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2022/03/10
|
||||
*/
|
||||
public interface HgKvOrderedIterator<E> extends HgKvIterator<E>, Comparable<HgKvOrderedIterator> {
|
||||
long getSequence();
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/24
|
||||
*/
|
||||
public interface HgKvPagingIterator<E> extends HgKvIterator<E>, HgPageSize {
|
||||
}
|
||||
|
|
@ -1,12 +1,28 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
import com.baidu.hugegraph.store.grpc.stream.ScanStreamReq;
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.stream.ScanStreamReq;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
* @version 0.2.0
|
||||
|
|
@ -31,7 +47,8 @@ public interface HgKvStore {
|
|||
* 该版本被store内部使用。向分区写入数据,
|
||||
* partitionId与key.keyCode必须与pd存储的分区信息保持一致。
|
||||
*/
|
||||
boolean directPut(String table, int partitionId, HgOwnerKey key, byte[] value);
|
||||
boolean directPut(String table, int partitionId, HgOwnerKey key, byte[] value);
|
||||
|
||||
byte[] get(String table, HgOwnerKey ownerKey);
|
||||
|
||||
boolean clean(int partId);
|
||||
|
|
@ -45,6 +62,7 @@ public interface HgKvStore {
|
|||
boolean deleteRange(String table, HgOwnerKey start, HgOwnerKey end);
|
||||
|
||||
boolean merge(String table, HgOwnerKey key, byte[] value);
|
||||
|
||||
@Deprecated
|
||||
List<HgKvEntry> batchGetOwner(String table, List<HgOwnerKey> keyList);
|
||||
|
||||
|
|
@ -60,17 +78,22 @@ public interface HgKvStore {
|
|||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit, byte[] query);
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit,
|
||||
byte[] query);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit);
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey,
|
||||
long limit);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit, byte[] query);
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey,
|
||||
long limit, byte[] query);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit, int scanType, byte[] query);
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey,
|
||||
long limit, int scanType, byte[] query);
|
||||
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo, int scanType, byte[] query);
|
||||
HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo, int scanType,
|
||||
byte[] query);
|
||||
|
||||
// HgKvIterator<HgKvEntry> scanIterator(ScanStreamReq scanReq);
|
||||
|
||||
|
|
@ -89,10 +112,13 @@ public interface HgKvStore {
|
|||
boolean dropTable(String table);
|
||||
|
||||
boolean deleteGraph(String graph);
|
||||
|
||||
List<HgKvIterator<HgKvEntry>> scanBatch(HgScanQuery scanQuery);
|
||||
|
||||
KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch2(HgScanQuery scanQuery);
|
||||
KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch3(HgScanQuery scanQuery, KvCloseableIterator iterator);
|
||||
|
||||
KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch3(HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator);
|
||||
|
||||
HgKvIterator<HgKvEntry> batchPrefix(String table, List<HgOwnerKey> prefixList);
|
||||
}
|
||||
|
|
@ -1,18 +1,32 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.EMPTY_OWNER_KEY;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgAssert.isArgumentNotNull;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_OWNER_KEY;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/14
|
||||
* @version 1.1.0 add argument assertion.
|
||||
* @version 1.2.0 add newEmpty
|
||||
* @version 1.3.0 add canceled assert
|
||||
*/
|
||||
public class HgOwnerKey implements Serializable {
|
||||
|
|
@ -21,32 +35,34 @@ public class HgOwnerKey implements Serializable {
|
|||
private byte[] key;
|
||||
private int serialNo; //顺序号,用于批量查询保证返回结果的顺序性
|
||||
|
||||
public static HgOwnerKey emptyOf(){
|
||||
public static HgOwnerKey emptyOf() {
|
||||
return EMPTY_OWNER_KEY;
|
||||
}
|
||||
|
||||
public static HgOwnerKey newEmpty(){
|
||||
return HgOwnerKey.of(EMPTY_BYTES,EMPTY_BYTES);
|
||||
public static HgOwnerKey newEmpty() {
|
||||
return HgOwnerKey.of(EMPTY_BYTES, EMPTY_BYTES);
|
||||
}
|
||||
|
||||
public static HgOwnerKey ownerOf(byte[] owner){
|
||||
return new HgOwnerKey(owner,EMPTY_BYTES);
|
||||
public static HgOwnerKey ownerOf(byte[] owner) {
|
||||
return new HgOwnerKey(owner, EMPTY_BYTES);
|
||||
}
|
||||
public static HgOwnerKey codeOf(int code){
|
||||
|
||||
public static HgOwnerKey codeOf(int code) {
|
||||
return HgOwnerKey.of(EMPTY_BYTES, EMPTY_BYTES).setKeyCode(code);
|
||||
}
|
||||
|
||||
public static HgOwnerKey of(byte[] owner, byte[] key){
|
||||
return new HgOwnerKey(owner,key);
|
||||
public static HgOwnerKey of(byte[] owner, byte[] key) {
|
||||
return new HgOwnerKey(owner, key);
|
||||
}
|
||||
public static HgOwnerKey of(int keyCode, byte[] key){
|
||||
|
||||
public static HgOwnerKey of(int keyCode, byte[] key) {
|
||||
return new HgOwnerKey(keyCode, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see HgOwnerKey:of(byte[] owner, byte[] key)
|
||||
* @param owner
|
||||
* @param key
|
||||
* @see HgOwnerKey:of(byte[] owner, byte[] key)
|
||||
*/
|
||||
@Deprecated
|
||||
public HgOwnerKey(byte[] owner, byte[] key) {
|
||||
|
|
@ -92,14 +108,15 @@ public class HgOwnerKey implements Serializable {
|
|||
return this;
|
||||
}
|
||||
|
||||
public HgOwnerKey setSerialNo(int serialNo){
|
||||
public HgOwnerKey setSerialNo(int serialNo) {
|
||||
this.serialNo = serialNo;
|
||||
return this;
|
||||
}
|
||||
|
||||
public int getSerialNo(){
|
||||
public int getSerialNo() {
|
||||
return this.serialNo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
|
|
@ -118,10 +135,10 @@ public class HgOwnerKey implements Serializable {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "HgOwnerKey{" +
|
||||
"owner=" + Arrays.toString(owner) +
|
||||
", key=" + Arrays.toString(key) +
|
||||
", code=" + keyCode +
|
||||
'}';
|
||||
"owner=" + Arrays.toString(owner) +
|
||||
", key=" + Arrays.toString(key) +
|
||||
", code=" + keyCode +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* Return the amount of records returned by one query in pageable-query.
|
||||
*
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/24
|
||||
*/
|
||||
public interface HgPageSize {
|
||||
long getPageSize();
|
||||
|
||||
default boolean isPageEmpty() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public final class HgPrivate {
|
||||
|
||||
private static final HgPrivate instance = new HgPrivate();
|
||||
|
||||
private HgPrivate() {
|
||||
}
|
||||
|
||||
static HgPrivate of() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,13 +1,29 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
import com.baidu.hugegraph.store.grpc.common.ScanOrderType;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
import org.apache.hugegraph.store.grpc.common.ScanOrderType;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/3/4
|
||||
* @version 0.5.0
|
||||
|
|
@ -34,6 +50,7 @@ public interface HgScanQuery {
|
|||
long getSkipDegree();
|
||||
|
||||
int getScanType();
|
||||
|
||||
ScanOrderType getOrderType();
|
||||
|
||||
boolean isOnlyKey();
|
||||
|
|
@ -41,11 +58,15 @@ public interface HgScanQuery {
|
|||
byte[] getQuery();
|
||||
|
||||
enum ScanMethod {
|
||||
ALL, PREFIX, RANGE
|
||||
ALL,
|
||||
PREFIX,
|
||||
RANGE
|
||||
}
|
||||
|
||||
enum SortType {
|
||||
UNSORTED, SORT_BY_EDGE, SORT_BY_VERTEX
|
||||
UNSORTED,
|
||||
SORT_BY_EDGE,
|
||||
SORT_BY_VERTEX
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -63,7 +84,8 @@ public interface HgScanQuery {
|
|||
return ScanBuilder.prefixOf(table, prefixList).build();
|
||||
}
|
||||
|
||||
static HgScanQuery prefixOf(String table, List<HgOwnerKey> prefixList, ScanOrderType orderType) {
|
||||
static HgScanQuery prefixOf(String table, List<HgOwnerKey> prefixList,
|
||||
ScanOrderType orderType) {
|
||||
return ScanBuilder.prefixOf(table, prefixList).setOrderType(orderType).build();
|
||||
}
|
||||
|
||||
|
|
@ -71,7 +93,8 @@ public interface HgScanQuery {
|
|||
return ScanBuilder.prefixIteratorOf(table, prefixItr).build();
|
||||
}
|
||||
|
||||
static HgScanQuery prefixIteratorOf(String table, Iterator<HgOwnerKey> prefixItr, ScanOrderType orderType) {
|
||||
static HgScanQuery prefixIteratorOf(String table, Iterator<HgOwnerKey> prefixItr,
|
||||
ScanOrderType orderType) {
|
||||
return ScanBuilder.prefixIteratorOf(table, prefixItr).setOrderType(orderType).build();
|
||||
}
|
||||
|
||||
|
|
@ -93,7 +116,8 @@ public interface HgScanQuery {
|
|||
private List<HgOwnerKey> endList;
|
||||
private Iterator<HgOwnerKey> prefixItr;
|
||||
|
||||
public static ScanBuilder rangeOf(String table, List<HgOwnerKey> startList, List<HgOwnerKey> endList) {
|
||||
public static ScanBuilder rangeOf(String table, List<HgOwnerKey> startList,
|
||||
List<HgOwnerKey> endList) {
|
||||
HgAssert.isArgumentValid(table, "table");
|
||||
HgAssert.isArgumentValid(startList, "startList");
|
||||
HgAssert.isArgumentValid(endList, "endList");
|
||||
|
|
@ -158,7 +182,7 @@ public interface HgScanQuery {
|
|||
return this;
|
||||
}
|
||||
|
||||
public ScanBuilder setOrderType(ScanOrderType orderType){
|
||||
public ScanBuilder setOrderType(ScanOrderType orderType) {
|
||||
this.orderType = orderType;
|
||||
return this;
|
||||
}
|
||||
|
|
@ -167,12 +191,13 @@ public interface HgScanQuery {
|
|||
this.query = query;
|
||||
return this;
|
||||
}
|
||||
public ScanBuilder setSkipDegree(long skipDegree){
|
||||
|
||||
public ScanBuilder setSkipDegree(long skipDegree) {
|
||||
this.skipDegree = skipDegree;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ScanBuilder setOnlyKey(boolean onlyKey){
|
||||
public ScanBuilder setOnlyKey(boolean onlyKey) {
|
||||
this.onlyKey = onlyKey;
|
||||
return this;
|
||||
}
|
||||
|
|
@ -287,11 +312,13 @@ public interface HgScanQuery {
|
|||
sb.append(", orderType=").append(getOrderType());
|
||||
sb.append(", onlyKey=").append(isOnlyKey());
|
||||
sb.append(", query=");
|
||||
if (query == null) sb.append("null");
|
||||
else {
|
||||
if (query == null) {
|
||||
sb.append("null");
|
||||
} else {
|
||||
sb.append('[');
|
||||
for (int i = 0; i < query.length; ++i)
|
||||
for (int i = 0; i < query.length; ++i) {
|
||||
sb.append(i == 0 ? "" : ", ").append(query[i]);
|
||||
}
|
||||
sb.append(']');
|
||||
}
|
||||
sb.append('}');
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2022/03/11
|
||||
*/
|
||||
public interface HgSeekAble {
|
||||
byte[] position();
|
||||
|
||||
void seek(byte[] position);
|
||||
}
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.client.HgStoreSessionProvider;
|
||||
|
||||
/**
|
||||
* Maintain HgStoreSession instances.
|
||||
* // TODO: Holding more than one HgSessionManager is available,if you want to connect multi
|
||||
* HgStore-clusters.
|
||||
*
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
|
||||
@ThreadSafe
|
||||
public final class HgSessionManager {
|
||||
private final HgSessionProvider sessionProvider;
|
||||
private final static HgSessionManager INSTANCE = new HgSessionManager();
|
||||
|
||||
private HgSessionManager() {
|
||||
// TODO: constructed by SPI
|
||||
this.sessionProvider = new HgStoreSessionProvider();
|
||||
}
|
||||
|
||||
|
||||
public static HgSessionManager getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve or create a HgStoreSession.
|
||||
*
|
||||
* @param graphName
|
||||
* @return
|
||||
*/
|
||||
public HgStoreSession openSession(String graphName) {
|
||||
return this.sessionProvider.createSession(graphName);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
@ThreadSafe
|
||||
public interface HgSessionProvider {
|
||||
HgStoreSession createSession(String graphName);
|
||||
}
|
||||
|
|
@ -1,23 +1,41 @@
|
|||
package com.baidu.hugegraph.store;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.pd.client.PDClient;
|
||||
import com.baidu.hugegraph.pd.client.PDConfig;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeManager;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodePartitionerImpl;
|
||||
import com.baidu.hugegraph.store.client.HgStoreSessionProvider;
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.pd.client.PDClient;
|
||||
import org.apache.hugegraph.pd.client.PDConfig;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeManager;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodePartitionerImpl;
|
||||
import org.apache.hugegraph.store.client.HgStoreSessionProvider;
|
||||
|
||||
/**
|
||||
* Maintain HgStoreSession instances.
|
||||
* // TODO: Holding more than one HgSessionManager is available,if you want to connect multi HgStore-clusters.
|
||||
* // TODO: Holding more than one HgSessionManager is available,if you want to connect multi
|
||||
* HgStore-clusters.
|
||||
*
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
|
||||
@ThreadSafe
|
||||
public final class HgStoreClient {
|
||||
private HgSessionProvider sessionProvider;
|
||||
private final HgSessionProvider sessionProvider;
|
||||
private PDClient pdClient;
|
||||
|
||||
public HgStoreClient() {
|
||||
|
|
@ -29,10 +47,12 @@ public final class HgStoreClient {
|
|||
pdClient = PDClient.create(config);
|
||||
setPdClient(pdClient);
|
||||
}
|
||||
|
||||
public HgStoreClient(PDClient pdClient) {
|
||||
this.sessionProvider = new HgStoreSessionProvider();
|
||||
setPdClient(pdClient);
|
||||
}
|
||||
|
||||
public static HgStoreClient create(PDConfig config) {
|
||||
return new HgStoreClient(config);
|
||||
}
|
||||
|
|
@ -41,7 +61,7 @@ public final class HgStoreClient {
|
|||
return new HgStoreClient(pdClient);
|
||||
}
|
||||
|
||||
public static HgStoreClient create(){
|
||||
public static HgStoreClient create() {
|
||||
return new HgStoreClient();
|
||||
}
|
||||
|
||||
|
|
@ -71,7 +91,7 @@ public final class HgStoreClient {
|
|||
return this.sessionProvider.createSession(graphName);
|
||||
}
|
||||
|
||||
public PDClient getPdClient(){
|
||||
public PDClient getPdClient() {
|
||||
return pdClient;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
import org.apache.hugegraph.store.client.type.HgStoreClientException;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgStoreSession extends HgKvStore {
|
||||
|
||||
void beginTx();
|
||||
|
||||
/**
|
||||
* @throws IllegalStateException when the tx hasn't been beginning.
|
||||
* @throws HgStoreClientException when failed to commit .
|
||||
*/
|
||||
void commit();
|
||||
|
||||
/**
|
||||
* @throws IllegalStateException when the tx hasn't been beginning.
|
||||
* @throws HgStoreClientException when failed to rollback.
|
||||
*/
|
||||
void rollback();
|
||||
|
||||
boolean isTx();
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgTkvEntry {
|
||||
String table();
|
||||
|
||||
byte[] key();
|
||||
|
||||
byte[] value();
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
public interface HgTokvEntry {
|
||||
String table();
|
||||
|
||||
HgOwnerKey ownerKey();
|
||||
|
||||
byte[] value();
|
||||
}
|
||||
|
|
@ -1,4 +1,21 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
|
@ -8,23 +25,25 @@ import java.util.Objects;
|
|||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
*/
|
||||
public final class HgNodePartition {
|
||||
private Long nodeId;
|
||||
private final Long nodeId;
|
||||
//当前key的hashcode
|
||||
private Integer keyCode;
|
||||
private final Integer keyCode;
|
||||
|
||||
//分区的开始结束范围
|
||||
private Integer startKey;
|
||||
private Integer endKey;
|
||||
private final Integer startKey;
|
||||
private final Integer endKey;
|
||||
private int hash = -1;
|
||||
|
||||
public static HgNodePartition of(Long nodeId, Integer keyCode) {
|
||||
return new HgNodePartition(nodeId, keyCode);
|
||||
}
|
||||
public static HgNodePartition of(Long nodeId, Integer keyCode, Integer startKey, Integer endKey) {
|
||||
|
||||
public static HgNodePartition of(Long nodeId, Integer keyCode, Integer startKey,
|
||||
Integer endKey) {
|
||||
return new HgNodePartition(nodeId, keyCode, startKey, endKey);
|
||||
}
|
||||
|
||||
HgNodePartition(Long nodeId, Integer keyCode) {
|
||||
HgNodePartition(Long nodeId, Integer keyCode) {
|
||||
this.nodeId = nodeId;
|
||||
this.keyCode = keyCode;
|
||||
this.startKey = this.endKey = keyCode;
|
||||
|
|
@ -36,6 +55,7 @@ public final class HgNodePartition {
|
|||
this.startKey = startKey;
|
||||
this.endKey = endKey;
|
||||
}
|
||||
|
||||
public Long getNodeId() {
|
||||
return nodeId;
|
||||
}
|
||||
|
|
@ -44,13 +64,14 @@ public final class HgNodePartition {
|
|||
return keyCode;
|
||||
}
|
||||
|
||||
public Integer getStartKey(){
|
||||
public Integer getStartKey() {
|
||||
return startKey;
|
||||
}
|
||||
|
||||
public Integer getEndKey(){
|
||||
public Integer getEndKey() {
|
||||
return endKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
|
|
@ -61,15 +82,15 @@ public final class HgNodePartition {
|
|||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
if(this.hash==-1)this.hash=Objects.hash(nodeId, keyCode);
|
||||
if (this.hash == -1) this.hash = Objects.hash(nodeId, keyCode);
|
||||
return this.hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgNodePartition{" +
|
||||
"nodeId=" + nodeId +
|
||||
", partitionId=" + keyCode +
|
||||
'}';
|
||||
"nodeId=" + nodeId +
|
||||
", partitionId=" + keyCode +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,29 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import static org.apache.hugegraph.store.client.util.HgAssert.isFalse;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
import java.net.CookieHandler;
|
||||
import java.util.*;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgAssert.isFalse;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
|
|
@ -14,8 +33,8 @@ import static com.baidu.hugegraph.store.client.util.HgAssert.isFalse;
|
|||
public final class HgNodePartitionerBuilder {
|
||||
|
||||
private Set<HgNodePartition> partitions = null;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param nodeId
|
||||
* @param keyCode
|
||||
* @return
|
||||
|
|
@ -26,8 +45,8 @@ public final class HgNodePartitionerBuilder {
|
|||
isFalse(nodeId == null, "The argument is invalid: nodeId");
|
||||
isFalse(keyCode == null, "The argument is invalid: keyCode");
|
||||
|
||||
if(this.partitions==null){
|
||||
this.partitions=new HashSet<>(16,1);
|
||||
if (this.partitions == null) {
|
||||
this.partitions = new HashSet<>(16, 1);
|
||||
}
|
||||
|
||||
this.partitions.add(HgNodePartition.of(nodeId, keyCode));
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
*/
|
||||
public class HgPrivate {
|
||||
private final static HgPrivate instance = new HgPrivate();
|
||||
|
||||
static HgPrivate getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private HgPrivate() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
* @version 0.2.0
|
||||
*/
|
||||
public interface HgStoreNode {
|
||||
|
||||
/**
|
||||
* Return boolean value of being online or not
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
default boolean isHealthy() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the unique ID of store-node.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Long getNodeId();
|
||||
|
||||
/**
|
||||
* A string value concatenated by host and port: "host:port"
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String getAddress();
|
||||
|
||||
/**
|
||||
* Return a new HgStoreSession instance, that is not Thread safe.
|
||||
* Return null when the node is not in charge of the graph that was passed from argument.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
HgStoreSession openSession(String graphName);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
*/
|
||||
public interface HgStoreNodeBuilder {
|
||||
|
||||
HgStoreNodeBuilder setNodeId(Long nodeId);
|
||||
|
||||
HgStoreNodeBuilder setAddress(String address);
|
||||
|
||||
/**
|
||||
* To build a HgStoreNode instance.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode build();
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
public final class HgStoreNodeCandidates {
|
||||
|
||||
List<HgStoreNode> nodeList;
|
||||
|
||||
HgStoreNodeCandidates(List<HgStoreNode> nodeList) {
|
||||
this.nodeList = nodeList;
|
||||
}
|
||||
|
||||
public int size() {
|
||||
return this.nodeList.size();
|
||||
}
|
||||
|
||||
public HgStoreNode getNode(int index) {
|
||||
return this.nodeList.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,15 +1,38 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.client.grpc.GrpcStoreNodeBuilder;
|
||||
import com.baidu.hugegraph.store.client.type.HgNodeStatus;
|
||||
import com.baidu.hugegraph.store.client.type.HgStoreClientException;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.apache.hugegraph.store.client.grpc.GrpcStoreNodeBuilder;
|
||||
import org.apache.hugegraph.store.client.type.HgNodeStatus;
|
||||
import org.apache.hugegraph.store.client.type.HgStoreClientException;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* // TODO: Mapping to Store-Node-Cluster, one to one.
|
||||
|
|
@ -98,7 +121,7 @@ public final class HgStoreNodeManager {
|
|||
if (node == null) {
|
||||
|
||||
log.warn("Failed to apply a HgStoreNode instance form the nodeProvider [ "
|
||||
+ this.nodeProvider.getClass().getName() + " ].");
|
||||
+ this.nodeProvider.getClass().getName() + " ].");
|
||||
notifying(graphName, nodeId, HgNodeStatus.NOT_EXIST);
|
||||
return null;
|
||||
}
|
||||
|
|
@ -113,7 +136,8 @@ public final class HgStoreNodeManager {
|
|||
try {
|
||||
this.nodeNotifier.notice(graphName, HgStoreNotice.of(nodeId, status));
|
||||
} catch (Throwable t) {
|
||||
log.error("Failed to invoke " + this.nodeNotifier.getClass().getSimpleName() + ":notice(" + nodeId + "," + status + ")", t);
|
||||
log.error("Failed to invoke " + this.nodeNotifier.getClass().getSimpleName() +
|
||||
":notice(" + nodeId + "," + status + ")", t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -132,7 +156,9 @@ public final class HgStoreNodeManager {
|
|||
try {
|
||||
return this.nodeNotifier.notice(graphName, notice);
|
||||
} catch (Throwable t) {
|
||||
String msg = "Failed to invoke " + this.nodeNotifier.getClass().getSimpleName() + ", notice: [ " + notice + " ]";
|
||||
String msg =
|
||||
"Failed to invoke " + this.nodeNotifier.getClass().getSimpleName() +
|
||||
", notice: [ " + notice + " ]";
|
||||
log.error(msg, t);
|
||||
throw new HgStoreClientException(msg);
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
* @version 1.0.0
|
||||
*/
|
||||
public interface HgStoreNodeNotifier {
|
||||
|
||||
/**
|
||||
* It will be invoked by NodeManager, when some exception or issue was happened.
|
||||
*
|
||||
* @param graphName
|
||||
* @param storeNotice
|
||||
* @return return 0 please, for no matter what.
|
||||
*/
|
||||
int notice(String graphName, HgStoreNotice storeNotice);
|
||||
|
||||
}
|
||||
|
|
@ -1,7 +1,23 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
|
|
@ -12,7 +28,8 @@ public interface HgStoreNodePartitioner {
|
|||
/**
|
||||
* The partition algorithm implementation, that specialized by user.
|
||||
*
|
||||
* @param builder The builder of HgNodePartitionerBuilder. It's supposed to be invoked directly by user.
|
||||
* @param builder The builder of HgNodePartitionerBuilder. It's supposed to be invoked
|
||||
* directly by user.
|
||||
* <b>e.g. builder.add(nodeId,address,partitionId);</b>
|
||||
* @param graphName
|
||||
* @param startKey
|
||||
|
|
@ -23,7 +40,8 @@ public interface HgStoreNodePartitioner {
|
|||
* <li>10: The partitioner is not work.</li>
|
||||
* </ul>
|
||||
*/
|
||||
int partition(HgNodePartitionerBuilder builder, String graphName, byte[] startKey, byte[] endKey);
|
||||
int partition(HgNodePartitionerBuilder builder, String graphName, byte[] startKey,
|
||||
byte[] endKey);
|
||||
|
||||
/**
|
||||
* @param builder
|
||||
|
|
@ -32,7 +50,8 @@ public interface HgStoreNodePartitioner {
|
|||
* @param endCode hash code
|
||||
* @return
|
||||
*/
|
||||
default int partition(HgNodePartitionerBuilder builder, String graphName, int startCode, int endCode) {
|
||||
default int partition(HgNodePartitionerBuilder builder, String graphName, int startCode,
|
||||
int endCode) {
|
||||
return this.partition(builder, graphName
|
||||
, HgStoreClientConst.ALL_PARTITION_OWNER
|
||||
, HgStoreClientConst.ALL_PARTITION_OWNER);
|
||||
|
|
@ -1,22 +1,41 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.store.client.type.HgNodeStatus;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
import com.baidu.hugegraph.pd.client.PDClient;
|
||||
import com.baidu.hugegraph.pd.common.KVPair;
|
||||
import com.baidu.hugegraph.pd.common.PDException;
|
||||
import com.baidu.hugegraph.pd.common.PartitionUtils;
|
||||
import com.baidu.hugegraph.pd.grpc.Metapb;
|
||||
import com.baidu.hugegraph.store.client.type.HgNodeStatus;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
||||
HgStoreNodeProvider,
|
||||
HgStoreNodeNotifier {
|
||||
HgStoreNodeProvider,
|
||||
HgStoreNodeNotifier {
|
||||
private PDClient pdClient;
|
||||
private HgStoreNodeManager nodeManager;
|
||||
|
||||
|
|
@ -44,15 +63,17 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
}
|
||||
|
||||
} else if (endKey == HgStoreClientConst.EMPTY_BYTES
|
||||
|| startKey == endKey || Arrays.equals(startKey, endKey)) {
|
||||
|| startKey == endKey || Arrays.equals(startKey, endKey)) {
|
||||
KVPair<Metapb.Partition, Metapb.Shard> partShard =
|
||||
pdClient.getPartition(graphName, startKey);
|
||||
Metapb.Shard leader = partShard.getValue();
|
||||
partitions = new HashSet<>();
|
||||
partitions.add(HgNodePartition.of(leader.getStoreId(),
|
||||
pdClient.keyToCode(graphName, startKey)));
|
||||
pdClient.keyToCode(graphName, startKey)));
|
||||
} else {
|
||||
log.warn("StartOwnerkey is not equal to endOwnerkey, which is meaningless!!, It is a error!!");
|
||||
log.warn(
|
||||
"StartOwnerkey is not equal to endOwnerkey, which is meaningless!!, It is" +
|
||||
" a error!!");
|
||||
List<Metapb.Store> stores = pdClient.getActiveStores(graphName);
|
||||
partitions = new HashSet<>(stores.size());
|
||||
for (Metapb.Store store : stores) {
|
||||
|
|
@ -74,14 +95,15 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
HashSet<HgNodePartition> partitions = new HashSet<>();
|
||||
Metapb.Partition partition = null;
|
||||
while ((partition == null || partition.getEndKey() < endKey)
|
||||
&& startKey < PartitionUtils.MAX_VALUE) {
|
||||
&& startKey < PartitionUtils.MAX_VALUE) {
|
||||
KVPair<Metapb.Partition, Metapb.Shard> partShard =
|
||||
pdClient.getPartitionByCode(graphName, startKey);
|
||||
if (partShard != null) {
|
||||
partition = partShard.getKey();
|
||||
Metapb.Shard leader = partShard.getValue();
|
||||
partitions.add(HgNodePartition.of(leader.getStoreId(), startKey,
|
||||
(int) partition.getStartKey(), (int) partition.getEndKey()));
|
||||
(int) partition.getStartKey(),
|
||||
(int) partition.getEndKey()));
|
||||
startKey = (int) partition.getEndKey();
|
||||
} else {
|
||||
break;
|
||||
|
|
@ -108,7 +130,8 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
if (partShard != null) {
|
||||
partition = partShard.getKey();
|
||||
Metapb.Shard leader = partShard.getValue();
|
||||
partitions.add(HgNodePartition.of(leader.getStoreId(), (int) partition.getStartKey()));
|
||||
partitions.add(
|
||||
HgNodePartition.of(leader.getStoreId(), (int) partition.getStartKey()));
|
||||
}
|
||||
builder.setPartitions(partitions);
|
||||
} catch (PDException e) {
|
||||
|
|
@ -117,6 +140,7 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询hgstore信息
|
||||
*
|
||||
|
|
@ -127,7 +151,7 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
try {
|
||||
Metapb.Store store = pdClient.getStore(nodeId);
|
||||
return nodeManager.getNodeBuilder().setNodeId(store.getId())
|
||||
.setAddress(store.getAddress()).build();
|
||||
.setAddress(store.getAddress()).build();
|
||||
} catch (PDException e) {
|
||||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
|
|
@ -143,7 +167,7 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
storeNotice.getPartitionLeaders().forEach((partId, leader) -> {
|
||||
pdClient.updatePartitionLeader(graphName, partId, leader);
|
||||
log.warn("updatePartitionLeader:{}-{}-{}",
|
||||
graphName, partId, leader);
|
||||
graphName, partId, leader);
|
||||
});
|
||||
}
|
||||
if (storeNotice.getPartitionIds() != null) {
|
||||
|
|
@ -153,7 +177,7 @@ public class HgStoreNodePartitionerImpl implements HgStoreNodePartitioner,
|
|||
}
|
||||
if (!storeNotice.getNodeStatus().equals(
|
||||
HgNodeStatus.PARTITION_COMMON_FAULT)
|
||||
&& !storeNotice.getNodeStatus().equals(
|
||||
&& !storeNotice.getNodeStatus().equals(
|
||||
HgNodeStatus.NOT_PARTITION_LEADER)) {
|
||||
pdClient.invalidPartitionCache();
|
||||
log.warn("invalidPartitionCache:{} ", storeNotice.getNodeStatus());
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/27
|
||||
*/
|
||||
public interface HgStoreNodeProvider {
|
||||
|
||||
/**
|
||||
* Applying a new HgStoreNode instance
|
||||
*
|
||||
* @param graphName
|
||||
* @param nodeId
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode apply(String graphName, Long nodeId);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
* @version 0.1.0
|
||||
*/
|
||||
public interface HgStoreNodeSession extends HgStoreSession {
|
||||
|
||||
/**
|
||||
* Return the name of graph.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String getGraphName();
|
||||
|
||||
/**
|
||||
* Return an instance of HgStoreNode, which provided the connection of Store-Node machine.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
HgStoreNode getStoreNode();
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -1,21 +1,38 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.client.type.HgNodeStatus;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.client.type.HgNodeStatus;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2021/11/16
|
||||
*/
|
||||
@NotThreadSafe
|
||||
public class HgStoreNotice {
|
||||
private Long nodeId;
|
||||
private HgNodeStatus nodeStatus;
|
||||
private String message;
|
||||
private final Long nodeId;
|
||||
private final HgNodeStatus nodeStatus;
|
||||
private final String message;
|
||||
private Map<Integer, Long> partitionLeaders;
|
||||
private List<Integer> partitionIds;
|
||||
|
||||
|
|
@ -72,11 +89,11 @@ public class HgStoreNotice {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "HgStoreNotice{" +
|
||||
"nodeId=" + nodeId +
|
||||
", nodeStatus=" + nodeStatus +
|
||||
", message='" + message + '\'' +
|
||||
", partitionLeaders=" + partitionLeaders +
|
||||
", partitionIds=" + partitionIds +
|
||||
'}';
|
||||
"nodeId=" + nodeId +
|
||||
", nodeStatus=" + nodeStatus +
|
||||
", message='" + message + '\'' +
|
||||
", partitionLeaders=" + partitionLeaders +
|
||||
", partitionIds=" + partitionIds +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
|
||||
public class HgStoreService {
|
||||
private static final HgStoreService instance = new HgStoreService();
|
||||
|
||||
private HgStoreService() {
|
||||
}
|
||||
|
||||
static HgStoreService of() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgSessionProvider;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
@ThreadSafe
|
||||
public class HgStoreSessionProvider implements HgSessionProvider {
|
||||
private final MultiNodeSessionFactory sessionFactory = MultiNodeSessionFactory.getInstance();
|
||||
|
||||
@Override
|
||||
public HgStoreSession createSession(String graphName) {
|
||||
return this.sessionFactory.createStoreSession(graphName);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.hugegraph.store.HgTkvEntry;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/14
|
||||
*/
|
||||
class HgTkvEntryImpl implements HgTkvEntry {
|
||||
private final String table;
|
||||
private final byte[] key;
|
||||
private final byte[] value;
|
||||
|
||||
HgTkvEntryImpl(String table, byte[] key, byte[] value) {
|
||||
this.table = table;
|
||||
this.key = key;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String table() {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] key() {
|
||||
return this.key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
HgTkvEntryImpl that = (HgTkvEntryImpl) o;
|
||||
return Objects.equals(table, that.table) && Arrays.equals(key, that.key) &&
|
||||
Arrays.equals(value, that.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Objects.hash(table);
|
||||
result = 31 * result + Arrays.hashCode(key);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgTkvEntryImpl{" +
|
||||
"table='" + table + '\'' +
|
||||
", key=" + Arrays.toString(key) +
|
||||
", value=" + Arrays.toString(value) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgTokvEntry;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/14
|
||||
*/
|
||||
class HgTokvEntryImpl implements HgTokvEntry {
|
||||
|
||||
private final String table;
|
||||
private final HgOwnerKey ownerKey;
|
||||
private final byte[] value;
|
||||
|
||||
HgTokvEntryImpl(String table, HgOwnerKey ownerKey, byte[] value) {
|
||||
this.table = table;
|
||||
this.ownerKey = ownerKey;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String table() {
|
||||
return this.table;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgOwnerKey ownerKey() {
|
||||
return this.ownerKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return this.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
HgTokvEntryImpl that = (HgTokvEntryImpl) o;
|
||||
return Objects.equals(table, that.table) && Objects.equals(ownerKey, that.ownerKey) &&
|
||||
Arrays.equals(value, that.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Objects.hash(table, ownerKey);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgTokvEntryImpl{" +
|
||||
"table='" + table + '\'' +
|
||||
", okv=" + ownerKey +
|
||||
", value=" + Arrays.toString(value) +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,25 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
|
|
@ -13,7 +29,7 @@ public final class MultiNodeSessionFactory {
|
|||
// TODO multi-instance ?
|
||||
private final static MultiNodeSessionFactory instance = new MultiNodeSessionFactory();
|
||||
// TODO multi-instance ?
|
||||
private HgStoreNodeManager nodeManager = HgStoreNodeManager.getInstance();
|
||||
private final HgStoreNodeManager nodeManager = HgStoreNodeManager.getInstance();
|
||||
// TODO: to be a chain assigned to each graph
|
||||
//private HgStoreNodeDispatcher storeNodeDispatcher;
|
||||
|
||||
|
|
@ -1,11 +1,28 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/26
|
||||
|
|
@ -17,6 +34,7 @@ class NodeTkv {
|
|||
private final HgOwnerKey key;
|
||||
private final HgOwnerKey endKey;
|
||||
private HgStoreSession session;
|
||||
|
||||
NodeTkv(HgNodePartition nodePartition, String table, HgOwnerKey key) {
|
||||
this.nodePartition = nodePartition;
|
||||
this.table = table;
|
||||
|
|
@ -24,6 +42,7 @@ class NodeTkv {
|
|||
this.endKey = key;
|
||||
this.key.setKeyCode(this.nodePartition.getKeyCode());
|
||||
}
|
||||
|
||||
NodeTkv(HgNodePartition nodePartition, String table, HgOwnerKey key, int keyCode) {
|
||||
this.nodePartition = nodePartition;
|
||||
this.table = table;
|
||||
|
|
@ -32,6 +51,7 @@ class NodeTkv {
|
|||
|
||||
this.key.setKeyCode(keyCode);
|
||||
}
|
||||
|
||||
NodeTkv(HgNodePartition nodePartition, String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey) {
|
||||
this.nodePartition = nodePartition;
|
||||
|
|
@ -58,7 +78,7 @@ class NodeTkv {
|
|||
return endKey;
|
||||
}
|
||||
|
||||
public NodeTkv setKeyCode(int code){
|
||||
public NodeTkv setKeyCode(int code) {
|
||||
this.key.setKeyCode(code);
|
||||
return this;
|
||||
}
|
||||
|
|
@ -68,9 +88,10 @@ class NodeTkv {
|
|||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
NodeTkv nptKv = (NodeTkv) o;
|
||||
return Objects.equals(nodePartition, nptKv.nodePartition) && Objects.equals(table, nptKv.table)
|
||||
&& Objects.equals(key, nptKv.key)
|
||||
&& Objects.equals(endKey, nptKv.endKey);
|
||||
return Objects.equals(nodePartition, nptKv.nodePartition) &&
|
||||
Objects.equals(table, nptKv.table)
|
||||
&& Objects.equals(key, nptKv.key)
|
||||
&& Objects.equals(endKey, nptKv.endKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -82,11 +103,11 @@ class NodeTkv {
|
|||
@Override
|
||||
public String toString() {
|
||||
return "NptKv{" +
|
||||
"nodePartition=" + nodePartition +
|
||||
", table='" + table + '\'' +
|
||||
", key=" + key +
|
||||
", endKey=" + endKey +
|
||||
'}';
|
||||
"nodePartition=" + nodePartition +
|
||||
", table='" + table + '\'' +
|
||||
", key=" + key +
|
||||
", endKey=" + endKey +
|
||||
'}';
|
||||
}
|
||||
|
||||
public HgStoreSession getSession() {
|
||||
|
|
@ -1,8 +1,25 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_LIST;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.NODE_MAX_RETRYING_TIMES;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.TX_SESSIONS_MAP_CAPACITY;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.EMPTY_LIST;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.NODE_MAX_RETRYING_TIMES;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.TX_SESSIONS_MAP_CAPACITY;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
|
|
@ -21,13 +38,13 @@ import java.util.stream.Stream;
|
|||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.type.HgStoreClientException;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import com.baidu.hugegraph.store.term.HgPair;
|
||||
import com.baidu.hugegraph.store.term.HgTriple;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.client.type.HgStoreClientException;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.term.HgPair;
|
||||
import org.apache.hugegraph.store.term.HgTriple;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
@ -38,7 +55,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||
@Slf4j
|
||||
@NotThreadSafe
|
||||
final class NodeTxExecutor {
|
||||
private String graphName;
|
||||
private final String graphName;
|
||||
private Map<Long, HgStoreSession> sessions = new HashMap<>(TX_SESSIONS_MAP_CAPACITY, 1);
|
||||
private boolean isTx;
|
||||
NodeTxSessionProxy proxy;
|
||||
|
|
@ -46,16 +63,17 @@ final class NodeTxExecutor {
|
|||
Function<NodeTkv, Boolean>>> entries = new LinkedList<>();
|
||||
Collector<NodeTkv, ?, Map<Long, List<HgOwnerKey>>> collector = Collectors.groupingBy(
|
||||
nkv -> nkv.getNodeId(), Collectors.mapping(NodeTkv::getKey, Collectors.toList()));
|
||||
private static String maxTryMsg = "the number of retries reached the upper limit : " + NODE_MAX_RETRYING_TIMES +
|
||||
",caused by:";
|
||||
private static String msg = "Not all tx-data delivered to real-node-session successfully.";
|
||||
private static final String maxTryMsg =
|
||||
"the number of retries reached the upper limit : " + NODE_MAX_RETRYING_TIMES +
|
||||
",caused by:";
|
||||
private static final String msg = "Not all tx-data delivered to real-node-session successfully.";
|
||||
|
||||
static {
|
||||
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism",
|
||||
String.valueOf(Runtime.getRuntime().availableProcessors() * 2));
|
||||
}
|
||||
|
||||
|
||||
|
||||
static NodeTxExecutor graphOf(String graphName, NodeTxSessionProxy proxy) {
|
||||
return new NodeTxExecutor(graphName, proxy);
|
||||
}
|
||||
|
|
@ -103,7 +121,8 @@ final class NodeTxExecutor {
|
|||
return true;
|
||||
}
|
||||
AtomicBoolean allSuccess = new AtomicBoolean(true);
|
||||
for (HgPair<HgTriple<String, HgOwnerKey, Object>, Function<NodeTkv, Boolean>> e : this.entries) {
|
||||
for (HgPair<HgTriple<String, HgOwnerKey, Object>, Function<NodeTkv, Boolean>> e :
|
||||
this.entries) {
|
||||
doAction(e.getKey(), e.getValue());
|
||||
}
|
||||
if (!allSuccess.get()) {
|
||||
|
|
@ -163,10 +182,12 @@ final class NodeTxExecutor {
|
|||
// } if ( nodeParams.getZ() instanceof Integer ){
|
||||
// return this.proxy.doPartition(nodeParams.getX(), (Integer) nodeParams.getZ())
|
||||
// .stream()
|
||||
// .map(e -> new NodeTkv(e, nodeParams.getX(), nodeParams.getY(), nodeParams.getY()
|
||||
// .map(e -> new NodeTkv(e, nodeParams.getX(), nodeParams.getY(),
|
||||
// nodeParams.getY()
|
||||
// .getKeyCode()))
|
||||
// .map(
|
||||
// e -> new HgPair<>(this.proxy.getStoreNode(e.getNodeId()), e)
|
||||
// e -> new HgPair<>(this.proxy.getStoreNode(e.getNodeId
|
||||
// ()), e)
|
||||
// );
|
||||
// }else {
|
||||
// HgAssert.isTrue(nodeParams.getZ() instanceof byte[],
|
||||
|
|
@ -186,18 +207,25 @@ final class NodeTxExecutor {
|
|||
// (HgOwnerKey) nodeParams.getZ());
|
||||
// }
|
||||
// if (nodeParams.getZ() instanceof Integer) {
|
||||
// Collection<HgNodePartition> nodePartitions = this.proxy.doPartition(nodeParams.getX(),
|
||||
// (Integer) nodeParams.getZ());
|
||||
// ArrayList<HgPair<HgStoreNode, NodeTkv>> hgPairs = new ArrayList<>(nodePartitions.size());
|
||||
// Collection<HgNodePartition> nodePartitions = this.proxy.doPartition(nodeParams
|
||||
// .getX(),
|
||||
// (Integer)
|
||||
// nodeParams
|
||||
// .getZ());
|
||||
// ArrayList<HgPair<HgStoreNode, NodeTkv>> hgPairs = new ArrayList<>
|
||||
// (nodePartitions.size());
|
||||
// for (HgNodePartition nodePartition : nodePartitions) {
|
||||
// NodeTkv nodeTkv = new NodeTkv(nodePartition, nodeParams.getX(), nodeParams.getY(),
|
||||
// NodeTkv nodeTkv = new NodeTkv(nodePartition, nodeParams.getX(), nodeParams
|
||||
// .getY(),
|
||||
// nodeParams.getY().getKeyCode());
|
||||
// hgPairs.add(new HgPair<>(this.proxy.getStoreNode(nodeTkv.getNodeId()), nodeTkv));
|
||||
// hgPairs.add(new HgPair<>(this.proxy.getStoreNode(nodeTkv.getNodeId()),
|
||||
// nodeTkv));
|
||||
//
|
||||
// }
|
||||
// return hgPairs;
|
||||
// } else {
|
||||
// HgAssert.isTrue(nodeParams.getZ() instanceof byte[], "Illegal parameter to get node id");
|
||||
// HgAssert.isTrue(nodeParams.getZ() instanceof byte[], "Illegal parameter to get
|
||||
// node id");
|
||||
// throw new RuntimeException("not implemented");
|
||||
// }
|
||||
// }
|
||||
|
|
@ -206,7 +234,8 @@ final class NodeTxExecutor {
|
|||
private boolean doAction(HgTriple<String, HgOwnerKey, Object> nodeParams,
|
||||
Function<NodeTkv, Boolean> action) {
|
||||
if (nodeParams.getZ() == null) {
|
||||
return this.proxy.doAction(nodeParams.getX(), nodeParams.getY(), nodeParams.getY(), action);
|
||||
return this.proxy.doAction(nodeParams.getX(), nodeParams.getY(), nodeParams.getY(),
|
||||
action);
|
||||
} else {
|
||||
if (nodeParams.getZ() instanceof HgOwnerKey) {
|
||||
boolean result = this.proxy.doAction(nodeParams.getX(), nodeParams.getY(),
|
||||
|
|
@ -214,9 +243,11 @@ final class NodeTxExecutor {
|
|||
return result;
|
||||
}
|
||||
if (nodeParams.getZ() instanceof Integer) {
|
||||
return this.proxy.doAction(nodeParams.getX(), nodeParams.getY(), (Integer) nodeParams.getZ(), action);
|
||||
return this.proxy.doAction(nodeParams.getX(), nodeParams.getY(),
|
||||
(Integer) nodeParams.getZ(), action);
|
||||
} else {
|
||||
HgAssert.isTrue(nodeParams.getZ() instanceof byte[], "Illegal parameter to get node id");
|
||||
HgAssert.isTrue(nodeParams.getZ() instanceof byte[],
|
||||
"Illegal parameter to get node id");
|
||||
throw new RuntimeException("not implemented");
|
||||
}
|
||||
}
|
||||
|
|
@ -277,7 +308,9 @@ final class NodeTxExecutor {
|
|||
.map(
|
||||
e -> new SessionData<List<HgOwnerKey>>
|
||||
(
|
||||
openNodeSession(nodeFunction.apply(e.getKey())), e.getValue()
|
||||
openNodeSession(
|
||||
nodeFunction.apply(e.getKey())),
|
||||
e.getValue()
|
||||
)
|
||||
)
|
||||
.parallel()
|
||||
|
|
@ -378,11 +411,7 @@ final class NodeTxExecutor {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (EMPTY_LIST.equals(obj)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return !EMPTY_LIST.equals(obj);
|
||||
}
|
||||
|
||||
class SessionData<T> {
|
||||
|
|
@ -1,12 +1,29 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgAssert.isArgumentNotNull;
|
||||
import static com.baidu.hugegraph.store.client.util.HgAssert.isArgumentValid;
|
||||
import static com.baidu.hugegraph.store.client.util.HgAssert.isFalse;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_STRING;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientUtil.err;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientUtil.toStr;
|
||||
import static java.util.stream.Collectors.groupingBy;
|
||||
import static org.apache.hugegraph.store.client.util.HgAssert.isArgumentNotNull;
|
||||
import static org.apache.hugegraph.store.client.util.HgAssert.isArgumentValid;
|
||||
import static org.apache.hugegraph.store.client.util.HgAssert.isFalse;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientConst.EMPTY_STRING;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientUtil.err;
|
||||
import static org.apache.hugegraph.store.client.util.HgStoreClientUtil.toStr;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
|
@ -22,20 +39,21 @@ import java.util.stream.Stream;
|
|||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvOrderedIterator;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.grpc.KvBatchScanner;
|
||||
import com.baidu.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvOrderedIterator;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.client.grpc.KvBatchScanner;
|
||||
import org.apache.hugegraph.store.client.grpc.KvCloseableIterator;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
import org.apache.hugegraph.store.term.HgPair;
|
||||
import org.apache.hugegraph.store.term.HgTriple;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.stream.ScanStreamReq.Builder;
|
||||
import com.baidu.hugegraph.store.term.HgPair;
|
||||
import com.baidu.hugegraph.store.term.HgTriple;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
@ -103,7 +121,7 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
isArgumentNotNull(ownerKey, "ownerKey");
|
||||
|
||||
return this.txExecutor.prepareTx(
|
||||
new HgTriple(table, ownerKey, (Integer) partitionId),
|
||||
new HgTriple(table, ownerKey, partitionId),
|
||||
e -> e.getSession().put(table, e.getKey(), value)
|
||||
);
|
||||
}
|
||||
|
|
@ -369,7 +387,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit, byte[] query) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit,
|
||||
byte[] query) {
|
||||
HgAssert.isFalse(HgAssert.isInvalid(table), "The argument is invalid: table");
|
||||
HgAssert.isFalse(keyPrefix == null, "The argument is invalid: keyPrefix");
|
||||
|
||||
|
|
@ -385,12 +404,14 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey) {
|
||||
return this.scanIterator(table, startKey, endKey, 0, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey, long limit) {
|
||||
HgAssert.isFalse(HgAssert.isInvalid(table), "The argument is invalid: table");
|
||||
HgAssert.isFalse(startKey == null, "The argument is invalid: startKey");
|
||||
HgAssert.isFalse(endKey == null, "The argument is invalid: endKey");
|
||||
|
|
@ -418,7 +439,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
.parallelStream()
|
||||
.map(
|
||||
e -> this.getStoreNode(e.getNodeId()).openSession(this.graphName)
|
||||
.scanIterator(e.getTable(), e.getKey(), e.getEndKey(), limit, query)
|
||||
.scanIterator(e.getTable(), e.getKey(), e.getEndKey(), limit,
|
||||
query)
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
, limit);
|
||||
|
|
@ -437,7 +459,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
.parallelStream()
|
||||
.map(
|
||||
e -> this.getStoreNode(e.getNodeId()).openSession(this.graphName)
|
||||
.scanIterator(e.getTable(), e.getKey(), e.getEndKey(), limit, scanType, query)
|
||||
.scanIterator(e.getTable(), e.getKey(), e.getEndKey(), limit,
|
||||
scanType, query)
|
||||
)
|
||||
.collect(Collectors.toList())
|
||||
, limit);
|
||||
|
|
@ -445,7 +468,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo, int scanType, byte[] query) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo,
|
||||
int scanType, byte[] query) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("graph: {}, table: {}, codeFrom: {}, codeTo: {}, scanType: {}, query: {}"
|
||||
, graphName, table, codeFrom, codeTo, scanType, HgStoreClientUtil.toStr(query));
|
||||
|
|
@ -540,7 +564,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
return notifierWrap;
|
||||
}
|
||||
|
||||
private Function<HgScanQuery, Map<Long, List<NodeTkv>>> toTkvMapFunc(HgScanQuery.ScanMethod scanMethod) {
|
||||
private Function<HgScanQuery, Map<Long, List<NodeTkv>>> toTkvMapFunc(
|
||||
HgScanQuery.ScanMethod scanMethod) {
|
||||
switch (scanMethod) {
|
||||
case RANGE:
|
||||
return scanQuery -> {
|
||||
|
|
@ -549,7 +574,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
int size = starts.size();
|
||||
return IntStream.range(0, size)
|
||||
.boxed()
|
||||
.map(i -> this.toNodeTkvList(scanQuery.getTable(), starts.get(i), ends.get(i)))
|
||||
.map(i -> this.toNodeTkvList(scanQuery.getTable(),
|
||||
starts.get(i), ends.get(i)))
|
||||
.flatMap(List::stream)
|
||||
.collect(groupingBy(NodeTkv::getNodeId));
|
||||
};
|
||||
|
|
@ -557,7 +583,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
return scanQuery ->
|
||||
scanQuery.getPrefixList()
|
||||
.stream()
|
||||
.map(keyPrefix -> this.toNodeTkvList(scanQuery.getTable(), keyPrefix))
|
||||
.map(keyPrefix -> this.toNodeTkvList(scanQuery.getTable(),
|
||||
keyPrefix))
|
||||
.flatMap(List::stream)
|
||||
.collect(groupingBy(NodeTkv::getNodeId));
|
||||
|
||||
|
|
@ -599,7 +626,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
/*-- common --*/
|
||||
private HgKvIterator toHgKvIteratorProxy(List<HgKvIterator> iteratorList, long limit) {
|
||||
boolean isAllOrderedLimiter = iteratorList.stream()
|
||||
.allMatch(e -> HgKvOrderedIterator.class.isInstance(e));
|
||||
.allMatch(
|
||||
e -> e instanceof HgKvOrderedIterator);
|
||||
|
||||
HgKvIterator<HgKvEntry> iterator;
|
||||
if (isAllOrderedLimiter) {
|
||||
|
|
@ -623,8 +651,10 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
return res;
|
||||
}
|
||||
|
||||
public boolean doAction(String table, HgOwnerKey startKey, HgOwnerKey endKey, Function<NodeTkv, Boolean> action) {
|
||||
Collection<HgNodePartition> partitions = doPartition(table, startKey.getOwner(), endKey.getOwner());
|
||||
public boolean doAction(String table, HgOwnerKey startKey, HgOwnerKey endKey,
|
||||
Function<NodeTkv, Boolean> action) {
|
||||
Collection<HgNodePartition> partitions =
|
||||
doPartition(table, startKey.getOwner(), endKey.getOwner());
|
||||
for (HgNodePartition partition : partitions) {
|
||||
HgStoreNode storeNode = this.getStoreNode(partition.getNodeId());
|
||||
HgStoreSession session = this.txExecutor.openNodeSession(storeNode);
|
||||
|
|
@ -637,7 +667,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
return true;
|
||||
}
|
||||
|
||||
public boolean doAction(String table, HgOwnerKey startKey, Integer code, Function<NodeTkv, Boolean> action) {
|
||||
public boolean doAction(String table, HgOwnerKey startKey, Integer code,
|
||||
Function<NodeTkv, Boolean> action) {
|
||||
Collection<HgNodePartition> partitions = this.doPartition(table, code);
|
||||
for (HgNodePartition partition : partitions) {
|
||||
HgStoreNode storeNode = this.getStoreNode(partition.getNodeId());
|
||||
|
|
@ -679,7 +710,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
}
|
||||
|
||||
private List<NodeTkv> toNodeTkvList(String table, HgOwnerKey ownerKey) {
|
||||
Collection<HgNodePartition> partitions = doPartition(table, ownerKey.getOwner(), ownerKey.getOwner());
|
||||
Collection<HgNodePartition> partitions =
|
||||
doPartition(table, ownerKey.getOwner(), ownerKey.getOwner());
|
||||
ArrayList<NodeTkv> nodeTkvs = new ArrayList<>(partitions.size());
|
||||
for (HgNodePartition partition : partitions) {
|
||||
nodeTkvs.add(new NodeTkv(partition, table, ownerKey, ownerKey));
|
||||
|
|
@ -689,7 +721,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
}
|
||||
|
||||
private List<NodeTkv> toNodeTkvList(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
Collection<HgNodePartition> partitions = doPartition(table, startKey.getOwner(), endKey.getOwner());
|
||||
Collection<HgNodePartition> partitions =
|
||||
doPartition(table, startKey.getOwner(), endKey.getOwner());
|
||||
ArrayList<NodeTkv> nodeTkvs = new ArrayList<>(partitions.size());
|
||||
for (HgNodePartition partition : partitions) {
|
||||
nodeTkvs.add(new NodeTkv(partition, table, startKey, endKey));
|
||||
|
|
@ -703,17 +736,20 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
ArrayList<NodeTkv> nodeTkvs = new ArrayList<>(partitions.size());
|
||||
for (HgNodePartition partition : partitions) {
|
||||
nodeTkvs.add(
|
||||
new NodeTkv(partition, table, HgOwnerKey.codeOf(startCode), HgOwnerKey.codeOf(endCode)));
|
||||
new NodeTkv(partition, table, HgOwnerKey.codeOf(startCode),
|
||||
HgOwnerKey.codeOf(endCode)));
|
||||
}
|
||||
return nodeTkvs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return not null
|
||||
*/
|
||||
private Collection<HgNodePartition> doPartition(String table, byte[] startKey, byte[] endKey) {
|
||||
HgNodePartitionerBuilder partitionerBuilder = HgNodePartitionerBuilder.resetAndGet();
|
||||
|
||||
int status = this.nodePartitioner.partition(partitionerBuilder, this.graphName, startKey, endKey);
|
||||
int status = this.nodePartitioner.partition(partitionerBuilder, this.graphName, startKey,
|
||||
endKey);
|
||||
|
||||
if (status != 0) {
|
||||
throw err("The node-partitioner is not work.");
|
||||
|
|
@ -733,7 +769,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
*/
|
||||
private Collection<HgNodePartition> doPartition(String table, int startCode, int endCode) {
|
||||
HgNodePartitionerBuilder partitionerBuilder = HgNodePartitionerBuilder.resetAndGet();
|
||||
int status = this.nodePartitioner.partition(partitionerBuilder, this.graphName, startCode, endCode);
|
||||
int status = this.nodePartitioner.partition(partitionerBuilder, this.graphName, startCode,
|
||||
endCode);
|
||||
|
||||
if (status != 0) {
|
||||
throw err("The node-partitioner is not work.");
|
||||
|
|
@ -750,7 +787,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
|
||||
Collection<HgNodePartition> doPartition(String table, int partitionId) {
|
||||
HgNodePartitionerBuilder partitionerBuilder = HgNodePartitionerBuilder.resetAndGet();
|
||||
int status = this.nodePartitioner.partition(partitionerBuilder, this.graphName, partitionId);
|
||||
int status =
|
||||
this.nodePartitioner.partition(partitionerBuilder, this.graphName, partitionId);
|
||||
|
||||
if (status != 0) {
|
||||
throw err("The node-partitioner is not work.");
|
||||
|
|
@ -764,12 +802,13 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
|
||||
return partitions;
|
||||
}
|
||||
|
||||
private Stream<HgPair<HgStoreNode, NodeTkv>> getNodeStream(String table) {
|
||||
return this.toNodeTkvList(table)
|
||||
.stream()
|
||||
.map(
|
||||
e -> new HgPair<>(this.getStoreNode(e.getNodeId()), e)
|
||||
);
|
||||
);
|
||||
}
|
||||
|
||||
Stream<HgPair<HgStoreNode, NodeTkv>> getNodeStream(String table,
|
||||
|
|
@ -781,7 +820,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
);
|
||||
}
|
||||
|
||||
Stream<HgPair<HgStoreNode, NodeTkv>> getNodeStream(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
Stream<HgPair<HgStoreNode, NodeTkv>> getNodeStream(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey) {
|
||||
return this.toNodeTkvList(table, startKey, endKey)
|
||||
.stream()
|
||||
.map(
|
||||
|
|
@ -800,7 +840,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
return nodeTkv2Node(nodeTkvList);
|
||||
}
|
||||
|
||||
List<HgPair<HgStoreNode, NodeTkv>> getNode(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
List<HgPair<HgStoreNode, NodeTkv>> getNode(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey) {
|
||||
List<NodeTkv> nodeTkvList = this.toNodeTkvList(table, startKey, endKey);
|
||||
return nodeTkv2Node(nodeTkvList);
|
||||
|
||||
|
|
@ -814,7 +855,8 @@ class NodeTxSessionProxy implements HgStoreSession {
|
|||
|
||||
// List<HgPair<HgStoreNode, NodeTkv>> getNode(String table, Integer endKey) {
|
||||
// .stream()
|
||||
// .map(e -> new NodeTkv(e, nodeParams.getX(), nodeParams.getY(), nodeParams.getY().getKeyCode()))
|
||||
// .map(e -> new NodeTkv(e, nodeParams.getX(), nodeParams.getY(), nodeParams.getY
|
||||
// ().getKeyCode()))
|
||||
// .map(
|
||||
// e -> new HgPair<>(this.proxy.getStoreNode(e.getNodeId()), e)
|
||||
// );
|
||||
|
|
@ -1,4 +1,21 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
|
|
@ -6,9 +23,9 @@ import java.util.List;
|
|||
import java.util.NoSuchElementException;
|
||||
import java.util.Queue;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvOrderedIterator;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvOrderedIterator;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
@ -22,9 +39,9 @@ import lombok.extern.slf4j.Slf4j;
|
|||
public class SequencedIterator implements HgKvIterator {
|
||||
private static final byte[] EMPTY_BYTES = new byte[0];
|
||||
private HgKvOrderedIterator<HgKvEntry> iterator;
|
||||
private Queue<HgKvOrderedIterator> queue;
|
||||
private final Queue<HgKvOrderedIterator> queue;
|
||||
private HgKvEntry entry;
|
||||
private long limit;
|
||||
private final long limit;
|
||||
private int count;
|
||||
private byte[] position = EMPTY_BYTES;
|
||||
private byte[] position4Seeking = EMPTY_BYTES;
|
||||
|
|
@ -44,9 +61,6 @@ public class SequencedIterator implements HgKvIterator {
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (buf == null) {
|
||||
return null;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
|
@ -98,11 +112,7 @@ public class SequencedIterator implements HgKvIterator {
|
|||
this.iterator.close();
|
||||
this.iterator = this.getIterator();
|
||||
}
|
||||
if (this.iterator == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
return this.iterator != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -1,13 +1,30 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Queue;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvPagingIterator;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvPagingIterator;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
@ -21,7 +38,7 @@ public class ShiftWorkIteratorProxy implements HgKvIterator {
|
|||
private HgKvPagingIterator<HgKvEntry> iterator;
|
||||
private Queue<HgKvPagingIterator> queue = new LinkedList<>();
|
||||
private HgKvEntry entry;
|
||||
private int limit;
|
||||
private final int limit;
|
||||
private int count;
|
||||
private int shiftCount;
|
||||
|
||||
|
|
@ -112,11 +129,7 @@ public class ShiftWorkIteratorProxy implements HgKvIterator {
|
|||
|| !this.iterator.hasNext()) {
|
||||
this.iterator = this.getIterator();
|
||||
}
|
||||
if (this.iterator == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
return this.iterator != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -1,10 +1,29 @@
|
|||
package com.baidu.hugegraph.store.client;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
package org.apache.hugegraph.store.client;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Queue;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/21
|
||||
|
|
@ -13,9 +32,9 @@ import java.util.*;
|
|||
class TopWorkIteratorProxy implements HgKvIterator {
|
||||
private static final byte[] EMPTY_BYTES = new byte[0];
|
||||
private HgKvIterator<HgKvEntry> iterator;
|
||||
private Queue<HgKvIterator> queue;
|
||||
private final Queue<HgKvIterator> queue;
|
||||
private HgKvEntry entry;
|
||||
private long limit;
|
||||
private final long limit;
|
||||
private int count;
|
||||
|
||||
TopWorkIteratorProxy(List<HgKvIterator> iterators, long limit) {
|
||||
|
|
@ -42,6 +61,7 @@ class TopWorkIteratorProxy implements HgKvIterator {
|
|||
|
||||
return buf;
|
||||
}
|
||||
|
||||
private void closeIterators() {
|
||||
if (this.queue.isEmpty()) return;
|
||||
|
||||
|
|
@ -52,6 +72,7 @@ class TopWorkIteratorProxy implements HgKvIterator {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
private void setIterator() {
|
||||
this.iterator = null;
|
||||
}
|
||||
|
|
@ -79,7 +100,7 @@ class TopWorkIteratorProxy implements HgKvIterator {
|
|||
|
||||
@Override
|
||||
public void seek(byte[] position) {
|
||||
if(this.iterator!=null)this.iterator.seek(position);
|
||||
if (this.iterator != null) this.iterator.seek(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -90,11 +111,7 @@ class TopWorkIteratorProxy implements HgKvIterator {
|
|||
if (this.iterator == null) {
|
||||
this.iterator = this.getIterator();
|
||||
}
|
||||
if (this.iterator == null) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
return this.iterator != null;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -113,8 +130,8 @@ class TopWorkIteratorProxy implements HgKvIterator {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
if(this.iterator!=null)this.iterator.close();
|
||||
public void close() {
|
||||
if (this.iterator != null) this.iterator.close();
|
||||
this.closeIterators();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,21 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
|
@ -6,8 +23,8 @@ import java.util.concurrent.TimeUnit;
|
|||
import java.util.concurrent.atomic.AtomicLong;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import com.baidu.hugegraph.store.term.HgPair;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import org.apache.hugegraph.store.term.HgPair;
|
||||
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
|
|
@ -20,14 +37,16 @@ import io.grpc.stub.AbstractBlockingStub;
|
|||
**/
|
||||
public abstract class AbstractGrpcClient {
|
||||
|
||||
private static Map<String, ManagedChannel[]> channels = new ConcurrentHashMap<>();
|
||||
private static int n = 5;
|
||||
private static int concurrency = 1 << n;
|
||||
private static AtomicLong counter = new AtomicLong(0);
|
||||
private static long limit = Long.MAX_VALUE >> 1;
|
||||
private Map<String, HgPair<ManagedChannel, AbstractBlockingStub>[]> blockingStubs = new ConcurrentHashMap<>();
|
||||
private Map<String, HgPair<ManagedChannel, AbstractAsyncStub>[]> asyncStubs = new ConcurrentHashMap<>();
|
||||
private static HgStoreClientConfig config = HgStoreClientConfig.of();
|
||||
private static final Map<String, ManagedChannel[]> channels = new ConcurrentHashMap<>();
|
||||
private static final int n = 5;
|
||||
private static final int concurrency = 1 << n;
|
||||
private static final AtomicLong counter = new AtomicLong(0);
|
||||
private static final long limit = Long.MAX_VALUE >> 1;
|
||||
private final Map<String, HgPair<ManagedChannel, AbstractBlockingStub>[]> blockingStubs =
|
||||
new ConcurrentHashMap<>();
|
||||
private final Map<String, HgPair<ManagedChannel, AbstractAsyncStub>[]> asyncStubs =
|
||||
new ConcurrentHashMap<>();
|
||||
private static final HgStoreClientConfig config = HgStoreClientConfig.of();
|
||||
|
||||
public AbstractGrpcClient() {
|
||||
|
||||
|
|
@ -39,7 +58,8 @@ public abstract class AbstractGrpcClient {
|
|||
synchronized (channels) {
|
||||
if ((tc = channels.get(target)) == null) {
|
||||
ManagedChannel[] value = new ManagedChannel[concurrency];
|
||||
IntStream.range(0, concurrency).parallel().forEach(i -> value[i] = getManagedChannel(target));
|
||||
IntStream.range(0, concurrency).parallel()
|
||||
.forEach(i -> value[i] = getManagedChannel(target));
|
||||
channels.put(target, tc = value);
|
||||
}
|
||||
}
|
||||
|
|
@ -72,16 +92,18 @@ public abstract class AbstractGrpcClient {
|
|||
});
|
||||
blockingStubs.put(target, value);
|
||||
AbstractBlockingStub stub = value[index].getValue();
|
||||
return (AbstractBlockingStub) stub.withDeadlineAfter(config.getGrpcTimeoutSeconds(),
|
||||
TimeUnit.SECONDS);
|
||||
return (AbstractBlockingStub) stub.withDeadlineAfter(
|
||||
config.getGrpcTimeoutSeconds(),
|
||||
TimeUnit.SECONDS);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (AbstractBlockingStub) pairs[index].getValue().withDeadlineAfter(config.getGrpcTimeoutSeconds(),
|
||||
TimeUnit.SECONDS);
|
||||
return (AbstractBlockingStub) pairs[index].getValue()
|
||||
.withDeadlineAfter(config.getGrpcTimeoutSeconds(),
|
||||
TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public AbstractAsyncStub getAsyncStub(ManagedChannel channel){
|
||||
public AbstractAsyncStub getAsyncStub(ManagedChannel channel) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
@ -117,7 +139,6 @@ public abstract class AbstractGrpcClient {
|
|||
}
|
||||
|
||||
|
||||
|
||||
private ManagedChannel getManagedChannel(String target) {
|
||||
return ManagedChannelBuilder.forTarget(target).usePlaintext().build();
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com
|
||||
*/
|
||||
class GrpcKvEntryImpl implements HgKvEntry {
|
||||
private final byte[] key;
|
||||
private final byte[] value;
|
||||
private final int code;
|
||||
|
||||
GrpcKvEntryImpl(byte[] k, byte[] v, int code) {
|
||||
this.key = k;
|
||||
this.value = v;
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] key() {
|
||||
return key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
GrpcKvEntryImpl hgKvEntry = (GrpcKvEntryImpl) o;
|
||||
return Arrays.equals(key, hgKvEntry.key) && Arrays.equals(value, hgKvEntry.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = Arrays.hashCode(key);
|
||||
result = 31 * result + Arrays.hashCode(value);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "HgKvEntryImpl{" +
|
||||
"key=" + Arrays.toString(key) +
|
||||
", value=" + Arrays.toString(value) +
|
||||
", code=" + code +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,17 +1,34 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientUtil.toIntBytes;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvOrderedIterator;
|
||||
import com.baidu.hugegraph.store.HgKvPagingIterator;
|
||||
import com.baidu.hugegraph.store.HgPageSize;
|
||||
import com.baidu.hugegraph.store.HgSeekAble;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvOrderedIterator;
|
||||
import org.apache.hugegraph.store.HgKvPagingIterator;
|
||||
import org.apache.hugegraph.store.HgPageSize;
|
||||
import org.apache.hugegraph.store.HgSeekAble;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
|
@ -23,20 +40,22 @@ import lombok.extern.slf4j.Slf4j;
|
|||
@Slf4j
|
||||
class GrpcKvIteratorImpl implements HgKvPagingIterator<HgKvEntry>, HgKvOrderedIterator<HgKvEntry> {
|
||||
|
||||
private byte[] emptyBytes = HgStoreClientConst.EMPTY_BYTES;
|
||||
private KvCloseableIterator<Kv> iterator;
|
||||
private final byte[] emptyBytes = HgStoreClientConst.EMPTY_BYTES;
|
||||
private final KvCloseableIterator<Kv> iterator;
|
||||
private HgKvEntry element;
|
||||
private HgPageSize pageLimiter;
|
||||
private HgStoreNodeSession session;
|
||||
private final HgPageSize pageLimiter;
|
||||
private final HgStoreNodeSession session;
|
||||
|
||||
public static HgKvIterator<HgKvEntry> of(HgStoreNodeSession nodeSession, KvCloseableIterator<Kv> iterator) {
|
||||
if (HgPageSize.class.isInstance(iterator)) {
|
||||
public static HgKvIterator<HgKvEntry> of(HgStoreNodeSession nodeSession,
|
||||
KvCloseableIterator<Kv> iterator) {
|
||||
if (iterator instanceof HgPageSize) {
|
||||
return of(nodeSession, iterator, (HgPageSize) iterator);
|
||||
}
|
||||
return new GrpcKvIteratorImpl(nodeSession, iterator, () -> 1);
|
||||
}
|
||||
|
||||
public static HgKvIterator<HgKvEntry> of(HgStoreNodeSession nodeSession, KvCloseableIterator<Kv> iterator,
|
||||
public static HgKvIterator<HgKvEntry> of(HgStoreNodeSession nodeSession,
|
||||
KvCloseableIterator<Kv> iterator,
|
||||
HgPageSize pageLimiter) {
|
||||
return new GrpcKvIteratorImpl(nodeSession, iterator, pageLimiter);
|
||||
}
|
||||
|
|
@ -46,7 +65,8 @@ class GrpcKvIteratorImpl implements HgKvPagingIterator<HgKvEntry>, HgKvOrderedIt
|
|||
return new GrpcKvIteratorImpl(nodeSession, new KvListIterator<Kv>(kvList), () -> pageSize);
|
||||
}
|
||||
|
||||
private GrpcKvIteratorImpl(HgStoreNodeSession session, KvCloseableIterator<Kv> iterator, HgPageSize pageLimiter) {
|
||||
private GrpcKvIteratorImpl(HgStoreNodeSession session, KvCloseableIterator<Kv> iterator,
|
||||
HgPageSize pageLimiter) {
|
||||
this.iterator = iterator;
|
||||
this.pageLimiter = pageLimiter;
|
||||
this.session = session;
|
||||
|
|
@ -65,7 +85,8 @@ class GrpcKvIteratorImpl implements HgKvPagingIterator<HgKvEntry>, HgKvOrderedIt
|
|||
@Override
|
||||
public HgKvEntry next() {
|
||||
Kv kv = this.iterator.next();
|
||||
this.element = new GrpcKvEntryImpl(kv.getKey().toByteArray(), kv.getValue().toByteArray(), kv.getCode());
|
||||
this.element = new GrpcKvEntryImpl(kv.getKey().toByteArray(), kv.getValue().toByteArray(),
|
||||
kv.getCode());
|
||||
return this.element;
|
||||
}
|
||||
|
||||
|
|
@ -94,11 +115,11 @@ class GrpcKvIteratorImpl implements HgKvPagingIterator<HgKvEntry>, HgKvOrderedIt
|
|||
if (key == null) {
|
||||
return emptyBytes;
|
||||
}
|
||||
if (!HgSeekAble.class.isInstance(this.iterator)) {
|
||||
if (!(this.iterator instanceof HgSeekAble)) {
|
||||
return emptyBytes;
|
||||
}
|
||||
byte[] upstream = ((HgSeekAble) this.iterator).position();
|
||||
byte[] code = toIntBytes(this.element.code());
|
||||
byte[] code = HgStoreClientUtil.toIntBytes(this.element.code());
|
||||
byte[] result = new byte[upstream.length + Integer.BYTES + key.length];
|
||||
System.arraycopy(upstream, 0, result, 0, upstream.length);
|
||||
System.arraycopy(code, 0, result, upstream.length, Integer.BYTES);
|
||||
|
|
@ -108,7 +129,7 @@ class GrpcKvIteratorImpl implements HgKvPagingIterator<HgKvEntry>, HgKvOrderedIt
|
|||
|
||||
@Override
|
||||
public void seek(byte[] position) {
|
||||
if (HgSeekAble.class.isInstance(this.iterator)) {
|
||||
if (this.iterator instanceof HgSeekAble) {
|
||||
((HgSeekAble) this.iterator).seek(position);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,15 +1,34 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.HealthyGrpc;
|
||||
import com.baidu.hugegraph.store.grpc.HealthyOuterClass;
|
||||
import com.google.protobuf.Empty;
|
||||
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
|
@ -17,7 +36,8 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
public final class GrpcNodeHealthyClient {
|
||||
|
||||
private final static Map<String, ManagedChannel> CHANNEL_MAP = new ConcurrentHashMap<>();
|
||||
private final static Map<String, HealthyGrpc.HealthyBlockingStub> STUB_MAP = new ConcurrentHashMap<>();
|
||||
private final static Map<String, HealthyGrpc.HealthyBlockingStub> STUB_MAP =
|
||||
new ConcurrentHashMap<>();
|
||||
|
||||
// TODO: Forbid constructing out of the package.
|
||||
public GrpcNodeHealthyClient() {
|
||||
|
|
@ -66,11 +86,6 @@ public final class GrpcNodeHealthyClient {
|
|||
String res = response.getMessage();
|
||||
System.out.printf("gRPC response message:%s%n", res);
|
||||
|
||||
if ("ok".equals(res)) {
|
||||
return true;
|
||||
} else {
|
||||
|
||||
return false;
|
||||
}
|
||||
return "ok".equals(res);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.apache.hugegraph.store.client.HgPrivate;
|
||||
import org.apache.hugegraph.store.client.HgStoreNode;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeBuilder;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeManager;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/12
|
||||
*/
|
||||
public class GrpcStoreNodeBuilder implements HgStoreNodeBuilder {
|
||||
|
||||
private static final GrpcStoreSessionClient sessionClient = new GrpcStoreSessionClient();
|
||||
private static final GrpcStoreStreamClient streamClient = new GrpcStoreStreamClient();
|
||||
private static final AtomicLong ids = new AtomicLong(0);
|
||||
|
||||
private Long nodeId;
|
||||
private String address;
|
||||
private final HgStoreNodeManager nodeManager;
|
||||
|
||||
public GrpcStoreNodeBuilder(HgStoreNodeManager nodeManager, HgPrivate hgPrivate) {
|
||||
HgAssert.isArgumentNotNull(hgPrivate, "hgPrivate");
|
||||
HgAssert.isArgumentNotNull(nodeManager, "nodeManager");
|
||||
this.nodeManager = nodeManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrpcStoreNodeBuilder setAddress(String address) {
|
||||
HgAssert.isFalse(HgAssert.isInvalid(address), "The argument is invalid: address.");
|
||||
this.address = address;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrpcStoreNodeBuilder setNodeId(Long nodeId) {
|
||||
HgAssert.isFalse(nodeId == null, "The argument is invalid: nodeId.");
|
||||
this.nodeId = nodeId;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgStoreNode build() {
|
||||
// TODO: delete
|
||||
if (this.nodeId == null) {
|
||||
this.nodeId = ids.addAndGet(-1L);
|
||||
}
|
||||
|
||||
HgAssert.isFalse(this.nodeId == null, "nodeId can't to be null");
|
||||
HgAssert.isFalse(this.address == null, "address can't to be null");
|
||||
|
||||
GrpcStoreNodeImpl node =
|
||||
new GrpcStoreNodeImpl(this.nodeManager, sessionClient, streamClient);
|
||||
node.setNodeId(this.nodeId);
|
||||
node.setAddress(this.address);
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,18 +1,35 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import com.baidu.hugegraph.store.HgStoreSession;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNode;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeManager;
|
||||
import org.apache.hugegraph.store.HgStoreSession;
|
||||
import org.apache.hugegraph.store.client.HgStoreNode;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeManager;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2021/10/11
|
||||
*/
|
||||
class GrpcStoreNodeImpl implements HgStoreNode {
|
||||
private GrpcStoreSessionClient sessionClient;
|
||||
private GrpcStoreStreamClient streamClient;
|
||||
private HgStoreNodeManager nodeManager;
|
||||
private final GrpcStoreSessionClient sessionClient;
|
||||
private final GrpcStoreStreamClient streamClient;
|
||||
private final HgStoreNodeManager nodeManager;
|
||||
private String address;
|
||||
private Long nodeId;
|
||||
|
||||
|
|
@ -46,9 +63,11 @@ class GrpcStoreNodeImpl implements HgStoreNode {
|
|||
@Override
|
||||
public HgStoreSession openSession(String graphName) {
|
||||
// HgAssert.isFalse(HgAssert.isInvalid(graphName), "the argument: graphName is invalid.");
|
||||
// return new GrpcStoreNodeSessionImpl2(this, graphName,this.nodeManager, this.sessionClient, this
|
||||
// return new GrpcStoreNodeSessionImpl2(this, graphName,this.nodeManager, this
|
||||
// .sessionClient, this
|
||||
// .streamClient);
|
||||
return new GrpcStoreNodeSessionImpl(this, graphName, this.nodeManager, this.sessionClient, this.streamClient);
|
||||
return new GrpcStoreNodeSessionImpl(this, graphName, this.nodeManager, this.sessionClient,
|
||||
this.streamClient);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -15,14 +15,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_LIST;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_TABLE;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.SCAN_TYPE_ANY;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.SCAN_TYPE_RANGE;
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientUtil.isValid;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
|
|
@ -33,20 +26,21 @@ import java.util.stream.Collectors;
|
|||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvStore;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.client.HgStoreNode;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeManager;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.client.util.HgAssert;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientUtil;
|
||||
import org.apache.hugegraph.store.client.util.HgUuid;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc.HgStoreStreamStub;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvStore;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNode;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeManager;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgAssert;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import com.baidu.hugegraph.store.client.util.HgUuid;
|
||||
import com.baidu.hugegraph.store.grpc.common.GraphMethod;
|
||||
import com.baidu.hugegraph.store.grpc.common.Key;
|
||||
import com.baidu.hugegraph.store.grpc.common.OpType;
|
||||
|
|
@ -65,20 +59,20 @@ import lombok.extern.slf4j.Slf4j;
|
|||
@Slf4j
|
||||
@NotThreadSafe
|
||||
class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
||||
private static HgStoreClientConfig hgStoreClientConfig = HgStoreClientConfig.of();
|
||||
private HgStoreNode storeNode;
|
||||
private String graphName;
|
||||
private GrpcStoreSessionClient storeSessionClient;
|
||||
private GrpcStoreStreamClient storeStreamClient;
|
||||
private HgStoreNodeManager nodeManager;
|
||||
private NotifyingExecutor notifier;
|
||||
private SwitchingExecutor switcher;
|
||||
private BatchEntry.Builder batchEntryBuilder = BatchEntry.newBuilder();
|
||||
private Key.Builder builder = Key.newBuilder();
|
||||
private static final HgStoreClientConfig hgStoreClientConfig = HgStoreClientConfig.of();
|
||||
private final HgStoreNode storeNode;
|
||||
private final String graphName;
|
||||
private final GrpcStoreSessionClient storeSessionClient;
|
||||
private final GrpcStoreStreamClient storeStreamClient;
|
||||
private final HgStoreNodeManager nodeManager;
|
||||
private final NotifyingExecutor notifier;
|
||||
private final SwitchingExecutor switcher;
|
||||
private final BatchEntry.Builder batchEntryBuilder = BatchEntry.newBuilder();
|
||||
private final Key.Builder builder = Key.newBuilder();
|
||||
private boolean isAutoCommit = true;
|
||||
private String batchId;
|
||||
private LinkedList<BatchEntry> batchEntries = new LinkedList<>();
|
||||
private static ConcurrentHashMap<String, Integer> tables = new ConcurrentHashMap() {{
|
||||
private static final ConcurrentHashMap<String, Integer> tables = new ConcurrentHashMap() {{
|
||||
put("unknown", 0);
|
||||
put("vertex", 1);
|
||||
put("out_edge", 2);
|
||||
|
|
@ -88,8 +82,10 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
put("olap", 6);
|
||||
}};
|
||||
|
||||
GrpcStoreNodeSessionImpl(HgStoreNode storeNode, String graphName, HgStoreNodeManager nodeManager,
|
||||
GrpcStoreSessionClient sessionClient , GrpcStoreStreamClient streamClient) {
|
||||
GrpcStoreNodeSessionImpl(HgStoreNode storeNode, String graphName,
|
||||
HgStoreNodeManager nodeManager,
|
||||
GrpcStoreSessionClient sessionClient,
|
||||
GrpcStoreStreamClient streamClient) {
|
||||
|
||||
HgAssert.isFalse(HgAssert.isInvalid(graphName), "the argument: graphName is invalid.");
|
||||
HgAssert.isFalse(nodeManager == null, "the argument: nodeManager is null.");
|
||||
|
|
@ -187,7 +183,7 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean directPut(String table, int partitionId, HgOwnerKey key, byte[] value) {
|
||||
public boolean directPut(String table, int partitionId, HgOwnerKey key, byte[] value) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -241,7 +237,7 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doBatch(this, this.getBatchId(), entries),
|
||||
e -> true
|
||||
).orElse(false);
|
||||
).orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -250,7 +246,7 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
() -> this.storeSessionClient.doGet(this, table, ownerKey)
|
||||
,
|
||||
e -> e.getValueResponse().getValue().toByteArray()
|
||||
).orElse(EMPTY_BYTES);
|
||||
).orElse(HgStoreClientConst.EMPTY_BYTES);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -260,7 +256,7 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
,
|
||||
e -> true
|
||||
|
||||
).orElse(false);
|
||||
).orElse(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -271,24 +267,26 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
.stream()
|
||||
.map(kv -> (HgKvEntry) new GrpcKvEntryImpl(kv.getKey().toByteArray()
|
||||
, kv.getValue().toByteArray(), kv.getCode())
|
||||
)
|
||||
)
|
||||
.collect(Collectors.toList()))
|
||||
.orElse((List<HgKvEntry>) EMPTY_LIST);
|
||||
.orElse((List<HgKvEntry>) HgStoreClientConst.EMPTY_LIST);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> batchPrefix(String table, List<HgOwnerKey> keyList) {
|
||||
return GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doBatchScanOneShot(this,
|
||||
HgScanQuery.prefixOf(table,
|
||||
keyList))
|
||||
);
|
||||
HgScanQuery.prefixOf(
|
||||
table,
|
||||
keyList))
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean existsTable(String table) {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doTable(this, table, TableMethod.TABLE_METHOD_EXISTS),
|
||||
() -> this.storeSessionClient.doTable(this, table,
|
||||
TableMethod.TABLE_METHOD_EXISTS),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
}
|
||||
|
|
@ -296,7 +294,8 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
@Override
|
||||
public boolean createTable(String table) {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doTable(this, table, TableMethod.TABLE_METHOD_CREATE),
|
||||
() -> this.storeSessionClient.doTable(this, table,
|
||||
TableMethod.TABLE_METHOD_CREATE),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
}
|
||||
|
|
@ -304,7 +303,8 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
@Override
|
||||
public boolean deleteTable(String table) {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doTable(this, table, TableMethod.TABLE_METHOD_DELETE),
|
||||
() -> this.storeSessionClient.doTable(this, table,
|
||||
TableMethod.TABLE_METHOD_DELETE),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
}
|
||||
|
|
@ -312,7 +312,8 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
@Override
|
||||
public boolean dropTable(String table) {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doTable(this, table, TableMethod.TABLE_METHOD_DROP),
|
||||
() -> this.storeSessionClient.doTable(this, table,
|
||||
TableMethod.TABLE_METHOD_DROP),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
}
|
||||
|
|
@ -320,7 +321,8 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
@Override
|
||||
public boolean deleteGraph(String graph) {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doGraph(this, graph, GraphMethod.GRAPH_METHOD_DELETE),
|
||||
() -> this.storeSessionClient.doGraph(this, graph,
|
||||
GraphMethod.GRAPH_METHOD_DELETE),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
}
|
||||
|
|
@ -328,7 +330,8 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
@Override
|
||||
public boolean truncate() {
|
||||
return this.notifier.invoke(
|
||||
() -> this.storeSessionClient.doTable(this, EMPTY_TABLE
|
||||
() -> this.storeSessionClient.doTable(this,
|
||||
HgStoreClientConst.EMPTY_TABLE
|
||||
, TableMethod.TABLE_METHOD_TRUNCATE),
|
||||
e -> true)
|
||||
.orElse(false);
|
||||
|
|
@ -343,11 +346,14 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
public HgKvIterator<HgKvEntry> scanIterator(String table, long limit) {
|
||||
return this.switcher.invoke(getSwitcherSupplier(limit)
|
||||
, () -> GrpcKvIteratorImpl.of(this, this.storeStreamClient.doScan
|
||||
(this, table, limit))
|
||||
(this, table,
|
||||
limit))
|
||||
, () -> GrpcKvIteratorImpl.of(this, this.storeStreamClient.doScanOneShot
|
||||
(this, table, limit))
|
||||
).get();
|
||||
(this, table,
|
||||
limit))
|
||||
).get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(ScanStreamReq.Builder builder) {
|
||||
HgStoreStreamStub stub = getStub();
|
||||
|
|
@ -379,15 +385,18 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
public HgKvIterator<HgKvEntry> scanIterator(String table, long limit, byte[] query) {
|
||||
return this.switcher.invoke(getSwitcherSupplier(limit)
|
||||
, () -> GrpcKvIteratorImpl.of(this, this.storeStreamClient.doScan
|
||||
(this, table, limit, query))
|
||||
(this, table,
|
||||
limit, query))
|
||||
, () -> GrpcKvIteratorImpl.of(this, this.storeStreamClient.doScanOneShot
|
||||
(this, table, limit, query))
|
||||
).get();
|
||||
(this, table,
|
||||
limit, query))
|
||||
).get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix) {
|
||||
return GrpcKvIteratorImpl.of(this, this.storeStreamClient.doScan(this, table, keyPrefix, 0));
|
||||
return GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScan(this, table, keyPrefix, 0));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -399,103 +408,119 @@ class GrpcStoreNodeSessionImpl implements HgStoreNodeSession {
|
|||
keyPrefix,
|
||||
limit)),
|
||||
() -> GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScanOneShot(this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit)))
|
||||
this.storeStreamClient.doScanOneShot(
|
||||
this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit)))
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit, byte[] query) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey keyPrefix, long limit,
|
||||
byte[] query) {
|
||||
return this.switcher.invoke(getSwitcherSupplier(limit),
|
||||
() -> GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScan(
|
||||
this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit,
|
||||
query)),
|
||||
this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit,
|
||||
query)),
|
||||
() -> GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScanOneShot(this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit,
|
||||
query)))
|
||||
this.storeStreamClient.doScanOneShot(
|
||||
this,
|
||||
table,
|
||||
keyPrefix,
|
||||
limit,
|
||||
query)))
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey) {
|
||||
return scanIterator(table, startKey, endKey, 0, HgKvStore.SCAN_ANY, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit) {
|
||||
return scanIterator(table, startKey, endKey, limit, isValid(endKey) ? SCAN_TYPE_RANGE : SCAN_TYPE_ANY, null);
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey, long limit) {
|
||||
return scanIterator(table, startKey, endKey, limit,
|
||||
HgStoreClientUtil.isValid(endKey) ? HgStoreClientConst.SCAN_TYPE_RANGE :
|
||||
HgStoreClientConst.SCAN_TYPE_ANY, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey, long limit, byte[] query) {
|
||||
return scanIterator(table, startKey, endKey, limit, isValid(endKey) ? SCAN_TYPE_RANGE : SCAN_TYPE_ANY, query);
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey, long limit, byte[] query) {
|
||||
return scanIterator(table, startKey, endKey, limit,
|
||||
HgStoreClientUtil.isValid(endKey) ? HgStoreClientConst.SCAN_TYPE_RANGE :
|
||||
HgStoreClientConst.SCAN_TYPE_ANY, query);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey, HgOwnerKey endKey,
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, HgOwnerKey startKey,
|
||||
HgOwnerKey endKey,
|
||||
long limit, int scanType, byte[] query) {
|
||||
|
||||
return this.switcher.invoke(getSwitcherSupplier(limit),
|
||||
() -> GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScan(
|
||||
this,
|
||||
table,
|
||||
startKey,
|
||||
endKey,
|
||||
limit,
|
||||
scanType,
|
||||
query)),
|
||||
this,
|
||||
table,
|
||||
startKey,
|
||||
endKey,
|
||||
limit,
|
||||
scanType,
|
||||
query)),
|
||||
() -> GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScanOneShot(this,
|
||||
table,
|
||||
startKey,
|
||||
endKey,
|
||||
limit,
|
||||
scanType,
|
||||
query)))
|
||||
this.storeStreamClient.doScanOneShot(
|
||||
this,
|
||||
table,
|
||||
startKey,
|
||||
endKey,
|
||||
limit,
|
||||
scanType,
|
||||
query)))
|
||||
.get();
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo, int scanType, byte[] query) {
|
||||
public HgKvIterator<HgKvEntry> scanIterator(String table, int codeFrom, int codeTo,
|
||||
int scanType, byte[] query) {
|
||||
//TODO: Should be changed when start using hashcode as partitionId.
|
||||
if(log.isDebugEnabled())log.debug("scanIterator-scanType: {}", scanType);
|
||||
if (log.isDebugEnabled()) log.debug("scanIterator-scanType: {}", scanType);
|
||||
return GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doScan(this, table
|
||||
, HgOwnerKey.newEmpty().codeToKey(codeFrom)
|
||||
, HgOwnerKey.newEmpty().codeToKey(codeTo)
|
||||
, HgStoreClientConst.NO_LIMIT
|
||||
, SCAN_PREFIX_BEGIN | SCAN_HASHCODE | scanType
|
||||
, HgKvStore.SCAN_PREFIX_BEGIN |
|
||||
HgKvStore.SCAN_HASHCODE | scanType
|
||||
, query
|
||||
)
|
||||
);
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<HgKvIterator<HgKvEntry>> scanBatch(HgScanQuery scanQuery) {
|
||||
return Collections.singletonList(GrpcKvIteratorImpl.of(this,
|
||||
this.storeStreamClient.doBatchScan(this, scanQuery)
|
||||
));
|
||||
this.storeStreamClient.doBatchScan(
|
||||
this, scanQuery)
|
||||
));
|
||||
}
|
||||
|
||||
@Override
|
||||
public KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch2(HgScanQuery scanQuery) {
|
||||
throw new RuntimeException("not implemented");
|
||||
throw new RuntimeException("not implemented");
|
||||
}
|
||||
|
||||
@Override
|
||||
public KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch3(HgScanQuery scanQuery, KvCloseableIterator iterator) {
|
||||
public KvCloseableIterator<HgKvIterator<HgKvEntry>> scanBatch3(HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
return this.storeStreamClient.doBatchScan3(this, scanQuery, iterator);
|
||||
}
|
||||
|
||||
|
|
@ -1,15 +1,29 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import static com.baidu.hugegraph.store.client.grpc.GrpcUtil.getHeader;
|
||||
import static com.baidu.hugegraph.store.client.grpc.GrpcUtil.toKey;
|
||||
import static com.baidu.hugegraph.store.client.grpc.GrpcUtil.toTk;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.common.GraphMethod;
|
||||
import com.baidu.hugegraph.store.grpc.common.TableMethod;
|
||||
import com.baidu.hugegraph.store.grpc.session.BatchEntry;
|
||||
|
|
@ -44,21 +58,26 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
|
||||
private HgStoreSessionBlockingStub getBlockingStub(HgStoreNodeSession nodeSession) {
|
||||
HgStoreSessionBlockingStub stub =
|
||||
(HgStoreSessionBlockingStub) getBlockingStub(nodeSession.getStoreNode().getAddress());
|
||||
(HgStoreSessionBlockingStub) getBlockingStub(
|
||||
nodeSession.getStoreNode().getAddress());
|
||||
return stub;
|
||||
}
|
||||
|
||||
FeedbackRes doGet(HgStoreNodeSession nodeSession, String table, HgOwnerKey ownerKey) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("doGet: {}-{}-{}-{}", nodeSession, table, ownerKey, GetReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setTk(toTk(table, ownerKey))
|
||||
.setHeader(
|
||||
GrpcUtil.getHeader(
|
||||
nodeSession))
|
||||
.setTk(GrpcUtil.toTk(
|
||||
table,
|
||||
ownerKey))
|
||||
.build());
|
||||
}
|
||||
return this.getBlockingStub(nodeSession)
|
||||
.get2(GetReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setTk(toTk(table, ownerKey))
|
||||
.setHeader(GrpcUtil.getHeader(nodeSession))
|
||||
.setTk(GrpcUtil.toTk(table, ownerKey))
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
|
@ -66,7 +85,7 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
FeedbackRes doClean(HgStoreNodeSession nodeSession, int partId) {
|
||||
return this.getBlockingStub(nodeSession)
|
||||
.clean(CleanReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setHeader(GrpcUtil.getHeader(nodeSession))
|
||||
.setPartition(partId)
|
||||
.build()
|
||||
);
|
||||
|
|
@ -74,10 +93,10 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
|
||||
FeedbackRes doBatchGet(HgStoreNodeSession nodeSession, String table, List<HgOwnerKey> keyList) {
|
||||
BatchGetReq.Builder builder = BatchGetReq.newBuilder();
|
||||
builder.setHeader(getHeader(nodeSession)).setTable(table);
|
||||
builder.setHeader(GrpcUtil.getHeader(nodeSession)).setTable(table);
|
||||
|
||||
for (HgOwnerKey key : keyList) {
|
||||
builder.addKey(toKey(key));
|
||||
builder.addKey(GrpcUtil.toKey(key));
|
||||
}
|
||||
|
||||
if (log.isDebugEnabled()) {
|
||||
|
|
@ -92,7 +111,7 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
writeReq.addAllEntry(entries);
|
||||
return this.getBlockingStub(nodeSession)
|
||||
.batch(BatchReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setHeader(GrpcUtil.getHeader(nodeSession))
|
||||
.setWriteReq(writeReq)
|
||||
.setBatchId(batchId)
|
||||
.build()
|
||||
|
|
@ -102,7 +121,7 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
FeedbackRes doTable(HgStoreNodeSession nodeSession, String table, TableMethod method) {
|
||||
return this.getBlockingStub(nodeSession)
|
||||
.table(TableReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setHeader(GrpcUtil.getHeader(nodeSession))
|
||||
.setTableName(table)
|
||||
.setMethod(method)
|
||||
.build()
|
||||
|
|
@ -112,7 +131,7 @@ class GrpcStoreSessionClient extends AbstractGrpcClient {
|
|||
FeedbackRes doGraph(HgStoreNodeSession nodeSession, String graph, GraphMethod method) {
|
||||
return this.getBlockingStub(nodeSession)
|
||||
.graph(GraphReq.newBuilder()
|
||||
.setHeader(getHeader(nodeSession))
|
||||
.setHeader(GrpcUtil.getHeader(nodeSession))
|
||||
.setGraphName(graph)
|
||||
.setMethod(method)
|
||||
.build()
|
||||
|
|
@ -1,4 +1,21 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
|
@ -15,19 +15,19 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package com.baidu.hugegraph.store.client.grpc;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc.HgStoreStreamBlockingStub;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc.HgStoreStreamStub;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
|
||||
import io.grpc.ManagedChannel;
|
||||
|
|
@ -48,7 +48,7 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
}
|
||||
|
||||
@Override
|
||||
public AbstractAsyncStub getAsyncStub(ManagedChannel channel){
|
||||
public AbstractAsyncStub getAsyncStub(ManagedChannel channel) {
|
||||
return HgStoreStreamGrpc.newStub(channel);
|
||||
}
|
||||
|
||||
|
|
@ -58,10 +58,11 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
|
||||
@Override
|
||||
public AbstractBlockingStub getBlockingStub(ManagedChannel channel) {
|
||||
return HgStoreStreamGrpc.newBlockingStub(channel);
|
||||
return HgStoreStreamGrpc.newBlockingStub(channel);
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, long limit, byte[] query) {
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, long limit,
|
||||
byte[] query) {
|
||||
return KvOneShotScanner.scanAll(nodeSession
|
||||
, this.getBlockingStub(nodeSession)
|
||||
, table
|
||||
|
|
@ -70,7 +71,8 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
);
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, long limit) {
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table,
|
||||
long limit) {
|
||||
return KvOneShotScanner.scanAll(nodeSession
|
||||
, this.getBlockingStub(nodeSession)
|
||||
, table
|
||||
|
|
@ -79,7 +81,8 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
);
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, HgOwnerKey prefix, long limit) {
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table,
|
||||
HgOwnerKey prefix, long limit) {
|
||||
return KvOneShotScanner.scanPrefix(nodeSession
|
||||
, this.getBlockingStub(nodeSession)
|
||||
, table
|
||||
|
|
@ -89,7 +92,8 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
);
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, HgOwnerKey prefix, long limit,
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table,
|
||||
HgOwnerKey prefix, long limit,
|
||||
byte[] query) {
|
||||
return KvOneShotScanner.scanPrefix(nodeSession
|
||||
, this.getBlockingStub(nodeSession)
|
||||
|
|
@ -100,7 +104,8 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
);
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table, HgOwnerKey startKey,
|
||||
KvCloseableIterator<Kv> doScanOneShot(HgStoreNodeSession nodeSession, String table,
|
||||
HgOwnerKey startKey,
|
||||
HgOwnerKey endKey
|
||||
, long limit
|
||||
, int scanType
|
||||
|
|
@ -198,13 +203,17 @@ public class GrpcStoreStreamClient extends AbstractGrpcClient {
|
|||
|
||||
// 返回多个小的迭代器,允许上层并行处理
|
||||
KvCloseableIterator<HgKvIterator<HgKvEntry>> doBatchScan3(HgStoreNodeSession nodeSession,
|
||||
HgScanQuery scanQuery, KvCloseableIterator iterator) {
|
||||
KvBatchScanner.scan(this.getStub(nodeSession), nodeSession.getGraphName(), scanQuery, iterator);
|
||||
HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
KvBatchScanner.scan(this.getStub(nodeSession), nodeSession.getGraphName(), scanQuery,
|
||||
iterator);
|
||||
return iterator;
|
||||
}
|
||||
|
||||
KvCloseableIterator<Kv> doBatchScanOneShot(HgStoreNodeSession nodeSession, HgScanQuery scanQuery) {
|
||||
return KvBatchOneShotScanner.scan(nodeSession, this.getBlockingStub(nodeSession), scanQuery);
|
||||
KvCloseableIterator<Kv> doBatchScanOneShot(HgStoreNodeSession nodeSession,
|
||||
HgScanQuery scanQuery) {
|
||||
return KvBatchOneShotScanner.scan(nodeSession, this.getBlockingStub(nodeSession),
|
||||
scanQuery);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,15 +1,31 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
import com.baidu.hugegraph.store.grpc.common.Header;
|
||||
import com.baidu.hugegraph.store.grpc.common.Key;
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
|
|
@ -27,20 +43,20 @@ import io.grpc.StatusRuntimeException;
|
|||
*/
|
||||
final class GrpcUtil {
|
||||
|
||||
private static ThreadLocal<Key.Builder> keyBuilder = new ThreadLocal<Key.Builder>();
|
||||
private static final ThreadLocal<Key.Builder> keyBuilder = new ThreadLocal<Key.Builder>();
|
||||
|
||||
static Header getHeader(HgStoreNodeSession nodeSession) {
|
||||
return Header.newBuilder()
|
||||
.setGraph(nodeSession.getGraphName())
|
||||
.build();
|
||||
.setGraph(nodeSession.getGraphName())
|
||||
.build();
|
||||
}
|
||||
|
||||
static Tk toTk(String table, HgOwnerKey ownerKey) {
|
||||
return Tk.newBuilder()
|
||||
.setTable(table)
|
||||
.setKey(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
.setTable(table)
|
||||
.setKey(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
}
|
||||
|
||||
static Key.Builder getOwnerKeyBuilder() {
|
||||
|
|
@ -82,27 +98,27 @@ final class GrpcUtil {
|
|||
|
||||
static Tkv toTkv(String table, HgOwnerKey ownerKey, byte[] value) {
|
||||
return Tkv.newBuilder()
|
||||
.setTable(table)
|
||||
.setKey(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setValue(ByteString.copyFrom(value))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
.setTable(table)
|
||||
.setKey(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setValue(ByteString.copyFrom(value))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
}
|
||||
|
||||
static Tp toTp(String table, HgOwnerKey ownerKey) {
|
||||
return Tp.newBuilder()
|
||||
.setTable(table)
|
||||
.setPrefix(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
.setTable(table)
|
||||
.setPrefix(ByteString.copyFrom(ownerKey.getKey()))
|
||||
.setCode(ownerKey.getKeyCode())
|
||||
.build();
|
||||
}
|
||||
|
||||
static Tse toTse(String table, HgOwnerKey startKey, HgOwnerKey endKey) {
|
||||
return Tse.newBuilder()
|
||||
.setTable(table)
|
||||
.setStart(toKey(startKey))
|
||||
.setEnd(toKey(endKey))
|
||||
.build();
|
||||
.setTable(table)
|
||||
.setStart(toKey(startKey))
|
||||
.setEnd(toKey(endKey))
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -116,17 +132,18 @@ final class GrpcUtil {
|
|||
|
||||
while (iter.hasNext()) {
|
||||
Kv entry = iter.next();
|
||||
resList.add(new GrpcKvEntryImpl(entry.getKey().toByteArray(), entry.getValue().toByteArray(),entry.getCode()));
|
||||
resList.add(new GrpcKvEntryImpl(entry.getKey().toByteArray(),
|
||||
entry.getValue().toByteArray(), entry.getCode()));
|
||||
}
|
||||
|
||||
return resList;
|
||||
}
|
||||
|
||||
static StatusRuntimeException toErr(String msg){
|
||||
static StatusRuntimeException toErr(String msg) {
|
||||
return new StatusRuntimeException(Status.UNKNOWN.withDescription(msg));
|
||||
}
|
||||
|
||||
static ByteString toBs(byte[] bytes){
|
||||
return ByteString.copyFrom((bytes != null) ? bytes : EMPTY_BYTES);
|
||||
static ByteString toBs(byte[] bytes) {
|
||||
return ByteString.copyFrom((bytes != null) ? bytes : HgStoreClientConst.EMPTY_BYTES);
|
||||
}
|
||||
}
|
||||
|
|
@ -15,23 +15,23 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package com.baidu.hugegraph.store.client.grpc;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.EMPTY_POSITION;
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.createQueryReq;
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.getHeader;
|
||||
import static org.apache.hugegraph.store.client.grpc.KvBatchUtil.EMPTY_POSITION;
|
||||
import static org.apache.hugegraph.store.client.grpc.KvBatchUtil.createQueryReq;
|
||||
import static org.apache.hugegraph.store.client.grpc.KvBatchUtil.getHeader;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgPageSize;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.HgSeekAble;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc;
|
||||
|
||||
import com.baidu.hugegraph.store.HgPageSize;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.HgSeekAble;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
import com.baidu.hugegraph.store.grpc.stream.ScanStreamBatchReq;
|
||||
|
||||
|
|
@ -68,9 +68,9 @@ class KvBatchOneShotScanner implements KvCloseableIterator<Kv>, HgPageSize, HgSe
|
|||
|
||||
private ScanStreamBatchReq createReq() {
|
||||
return ScanStreamBatchReq.newBuilder()
|
||||
.setHeader(getHeader(this.nodeSession))
|
||||
.setQueryRequest(createQueryReq(this.scanQuery, Integer.MAX_VALUE))
|
||||
.build();
|
||||
.setHeader(getHeader(this.nodeSession))
|
||||
.setQueryRequest(createQueryReq(this.scanQuery, Integer.MAX_VALUE))
|
||||
.build();
|
||||
}
|
||||
|
||||
private Iterator<Kv> createIterator() {
|
||||
|
|
@ -82,7 +82,7 @@ class KvBatchOneShotScanner implements KvCloseableIterator<Kv>, HgPageSize, HgSe
|
|||
@Override
|
||||
public boolean hasNext() {
|
||||
if (this.iterator == null) {
|
||||
this.iterator =this.createIterator();
|
||||
this.iterator = this.createIterator();
|
||||
}
|
||||
return this.iterator.hasNext();
|
||||
}
|
||||
|
|
@ -90,7 +90,7 @@ class KvBatchOneShotScanner implements KvCloseableIterator<Kv>, HgPageSize, HgSe
|
|||
@Override
|
||||
public Kv next() {
|
||||
if (this.iterator == null) {
|
||||
this.iterator =this.createIterator();
|
||||
this.iterator = this.createIterator();
|
||||
}
|
||||
return this.iterator.next();
|
||||
}
|
||||
|
|
@ -15,9 +15,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package com.baidu.hugegraph.store.client.grpc;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.createQueryReq;
|
||||
import static org.apache.hugegraph.store.client.grpc.KvBatchUtil.createQueryReq;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.nio.ByteBuffer;
|
||||
|
|
@ -29,16 +29,16 @@ import java.util.function.Supplier;
|
|||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvOrderedIterator;
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.buffer.KVByteBuffer;
|
||||
import org.apache.hugegraph.store.client.util.PropertyUtil;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc;
|
||||
import org.apache.hugegraph.store.grpc.stream.KvStream;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvOrderedIterator;
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.buffer.KVByteBuffer;
|
||||
import com.baidu.hugegraph.store.client.util.PropertyUtil;
|
||||
import com.baidu.hugegraph.store.grpc.common.Header;
|
||||
import com.baidu.hugegraph.store.grpc.common.ScanOrderType;
|
||||
import com.baidu.hugegraph.store.grpc.stream.ScanReceiptRequest;
|
||||
|
|
@ -66,20 +66,21 @@ public class KvBatchScanner implements Closeable {
|
|||
private final HgScanQuery scanQuery;
|
||||
static final Supplier<HgKvIterator<HgKvEntry>> NO_DATA = () -> null;
|
||||
private final ScanReceiptRequest.Builder responseBuilder = ScanReceiptRequest.newBuilder();
|
||||
private KvBatchReceiver receiver;
|
||||
private final KvBatchReceiver receiver;
|
||||
|
||||
public KvBatchScanner(
|
||||
HgStoreStreamGrpc.HgStoreStreamStub stub,
|
||||
String graphName,
|
||||
HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
HgStoreStreamGrpc.HgStoreStreamStub stub,
|
||||
String graphName,
|
||||
HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
|
||||
this.graphName = graphName;
|
||||
this.notifier = (KvBatchScannerMerger) iterator;
|
||||
this.notifier.registerScanner(this);
|
||||
this.running = true;
|
||||
this.scanQuery = scanQuery;
|
||||
receiver = new KvBatchReceiver(this, scanQuery.getOrderType() == ScanOrderType.ORDER_STRICT);
|
||||
receiver =
|
||||
new KvBatchReceiver(this, scanQuery.getOrderType() == ScanOrderType.ORDER_STRICT);
|
||||
sender = stub.scanBatch2(receiver);
|
||||
sendQuery(this.scanQuery); // 发送查询请求
|
||||
}
|
||||
|
|
@ -93,10 +94,11 @@ public class KvBatchScanner implements Closeable {
|
|||
* @return data merger iterator
|
||||
*/
|
||||
public static KvCloseableIterator ofMerger(
|
||||
HgScanQuery scanQuery, BiFunction<HgScanQuery, KvCloseableIterator, Boolean> handler) {
|
||||
HgScanQuery scanQuery, BiFunction<HgScanQuery, KvCloseableIterator, Boolean> handler) {
|
||||
KvBatchScannerMerger merger;
|
||||
if (scanQuery.getOrderType() == ScanOrderType.ORDER_STRICT) {
|
||||
merger = new KvBatchScannerMerger.SortedScannerMerger(new TaskSplitter(scanQuery, handler));
|
||||
merger = new KvBatchScannerMerger.SortedScannerMerger(
|
||||
new TaskSplitter(scanQuery, handler));
|
||||
} else {
|
||||
merger = new KvBatchScannerMerger(new TaskSplitter(scanQuery, handler));
|
||||
}
|
||||
|
|
@ -105,10 +107,10 @@ public class KvBatchScanner implements Closeable {
|
|||
}
|
||||
|
||||
public static void scan(
|
||||
HgStoreStreamGrpc.HgStoreStreamStub stub,
|
||||
String graphName,
|
||||
HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
HgStoreStreamGrpc.HgStoreStreamStub stub,
|
||||
String graphName,
|
||||
HgScanQuery scanQuery,
|
||||
KvCloseableIterator iterator) {
|
||||
new KvBatchScanner(stub, graphName, scanQuery, iterator);
|
||||
}
|
||||
|
||||
|
|
@ -121,10 +123,11 @@ public class KvBatchScanner implements Closeable {
|
|||
synchronized (this.sender) {
|
||||
if (running) {
|
||||
this.sender.onNext(
|
||||
ScanStreamBatchReq.newBuilder()
|
||||
.setHeader(Header.newBuilder().setGraph(graphName).build())
|
||||
.setQueryRequest(createQueryReq(query, 0))
|
||||
.build());
|
||||
ScanStreamBatchReq.newBuilder()
|
||||
.setHeader(
|
||||
Header.newBuilder().setGraph(graphName).build())
|
||||
.setQueryRequest(createQueryReq(query, 0))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -145,15 +148,18 @@ public class KvBatchScanner implements Closeable {
|
|||
synchronized (this.sender) {
|
||||
if (running) {
|
||||
this.sender.onNext(
|
||||
ScanStreamBatchReq.newBuilder()
|
||||
.setHeader(Header.newBuilder().setGraph(graphName).build())
|
||||
.setReceiptRequest(responseBuilder.setTimes(seqNo).build())
|
||||
.build());
|
||||
ScanStreamBatchReq.newBuilder()
|
||||
.setHeader(
|
||||
Header.newBuilder().setGraph(graphName).build())
|
||||
.setReceiptRequest(
|
||||
responseBuilder.setTimes(seqNo).build())
|
||||
.build());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void dataArrived(Supplier<HgKvIterator<HgKvEntry>> supplier) throws InterruptedException {
|
||||
public void dataArrived(Supplier<HgKvIterator<HgKvEntry>> supplier) throws
|
||||
InterruptedException {
|
||||
notifier.dataArrived(this, supplier);
|
||||
}
|
||||
|
||||
|
|
@ -194,12 +200,14 @@ public class KvBatchScanner implements Closeable {
|
|||
private KvBatchScannerMerger notifier;
|
||||
private Iterator<HgOwnerKey> prefixItr;
|
||||
private int maxTaskSize = 0; // 最大并行任务数
|
||||
private int maxBatchSize = PropertyUtil.getInt("net.kv.scanner.batch.size", 1000); // 每批次最大点数量
|
||||
private int maxBatchSize = PropertyUtil.getInt("net.kv.scanner.batch.size", 1000);
|
||||
// 每批次最大点数量
|
||||
private volatile boolean finished = false;
|
||||
private volatile boolean splitting = false;
|
||||
private volatile int nextKeySerialNo = 1;
|
||||
|
||||
public TaskSplitter(HgScanQuery scanQuery, BiFunction<HgScanQuery, KvCloseableIterator, Boolean> handler) {
|
||||
public TaskSplitter(HgScanQuery scanQuery,
|
||||
BiFunction<HgScanQuery, KvCloseableIterator, Boolean> handler) {
|
||||
this.scanQuery = scanQuery;
|
||||
this.taskHandler = handler;
|
||||
if (scanQuery.getScanMethod() == HgScanQuery.ScanMethod.PREFIX) {
|
||||
|
|
@ -253,13 +261,15 @@ public class KvBatchScanner implements Closeable {
|
|||
}
|
||||
this.splitting = true;
|
||||
if (scanQuery.getScanMethod() == HgScanQuery.ScanMethod.PREFIX) {
|
||||
if (prefixItr.hasNext() && (maxTaskSize == 0 || notifier.getScannerCount() < maxTaskSize)) {
|
||||
if (prefixItr.hasNext() &&
|
||||
(maxTaskSize == 0 || notifier.getScannerCount() < maxTaskSize)) {
|
||||
List<HgOwnerKey> keys = new ArrayList<>(maxBatchSize);
|
||||
for (int i = 0; i < maxBatchSize && prefixItr.hasNext(); i++) {
|
||||
keys.add(prefixItr.next().setSerialNo(nextKeySerialNo++));
|
||||
}
|
||||
taskHandler.apply(
|
||||
HgScanQuery.prefixOf(scanQuery.getTable(), keys, scanQuery.getOrderType()), this.notifier);
|
||||
HgScanQuery.prefixOf(scanQuery.getTable(), keys,
|
||||
scanQuery.getOrderType()), this.notifier);
|
||||
// 评估最大任务数
|
||||
evaluateMaxTaskSize();
|
||||
if (this.notifier.getScannerCount() < this.maxTaskSize) {
|
||||
|
|
@ -299,13 +309,13 @@ public class KvBatchScanner implements Closeable {
|
|||
int seqNo = value.getSeqNo();
|
||||
boolean isOver = value.getOver();
|
||||
scanner.dataArrived(
|
||||
() -> {
|
||||
scanner.sendResponse(seqNo);
|
||||
if (isOver) {
|
||||
scanner.dataComplete();
|
||||
}
|
||||
return new KVBytesIterator(buffer, sortByVertex, scanner);
|
||||
});
|
||||
() -> {
|
||||
scanner.sendResponse(seqNo);
|
||||
if (isOver) {
|
||||
scanner.dataComplete();
|
||||
}
|
||||
return new KVBytesIterator(buffer, sortByVertex, scanner);
|
||||
});
|
||||
} catch (InterruptedException e) {
|
||||
close();
|
||||
log.error("exception ", e);
|
||||
|
|
@ -15,10 +15,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package com.baidu.hugegraph.store.client.grpc;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.createQueryReq;
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchUtil.getRequestBuilder;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
|
@ -34,14 +31,14 @@ import java.util.function.Supplier;
|
|||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgPageSize;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.client.type.HgStoreClientException;
|
||||
import org.apache.hugegraph.store.client.util.Base58;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import org.apache.hugegraph.store.grpc.stream.HgStoreStreamGrpc;
|
||||
|
||||
import com.baidu.hugegraph.store.HgPageSize;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.type.HgStoreClientException;
|
||||
import com.baidu.hugegraph.store.client.util.Base58;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConfig;
|
||||
import com.baidu.hugegraph.store.grpc.common.Kv;
|
||||
import com.baidu.hugegraph.store.grpc.stream.*;
|
||||
|
||||
|
|
@ -56,7 +53,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||
@NotThreadSafe
|
||||
class KvBatchScanner5 {
|
||||
private final static HgStoreClientConfig storeClientConfig = HgStoreClientConfig.of();
|
||||
//private final static int HAVE_NEXT_TIMEOUT_SECONDS = storeClientConfig.getNetKvScannerHaveNextTimeout();
|
||||
//private final static int HAVE_NEXT_TIMEOUT_SECONDS = storeClientConfig
|
||||
// .getNetKvScannerHaveNextTimeout();
|
||||
private final static int HAVE_NEXT_TIMEOUT_SECONDS = 60;
|
||||
private final static long PAGE_SIZE = storeClientConfig.getNetKvScannerPageSize();
|
||||
|
||||
|
|
@ -87,7 +85,8 @@ class KvBatchScanner5 {
|
|||
private final AtomicBoolean serverFinished = new AtomicBoolean();
|
||||
private final AtomicBoolean clientFinished = new AtomicBoolean();
|
||||
|
||||
private final ScanReceiptRequest.Builder receiptReqBuilder = ScanReceiptRequest.newBuilder();
|
||||
private final ScanReceiptRequest.Builder receiptReqBuilder =
|
||||
ScanReceiptRequest.newBuilder();
|
||||
private final ScanCancelRequest cancelReq = ScanCancelRequest.newBuilder().build();
|
||||
private final HgStoreNodeSession nodeSession;
|
||||
private final OrderAgent agent;
|
||||
|
|
@ -105,20 +104,22 @@ class KvBatchScanner5 {
|
|||
HgScanQuery scanQuery,
|
||||
HgStoreNodeSession nodeSession) {
|
||||
|
||||
if (log.isDebugEnabled())
|
||||
if (log.isDebugEnabled()) {
|
||||
if (scanQuery.getPrefixList() != null && scanQuery.getPrefixList().size() > 0) {
|
||||
brokerId = Base58.encode(scanQuery.getPrefixList().get(0).getKey());
|
||||
|
||||
log.debug("[ANALYSIS START] [{}] firstKey: {}, keyLength: {}, table: {}, node: {}"
|
||||
log.debug(
|
||||
"[ANALYSIS START] [{}] firstKey: {}, keyLength: {}, table: {}, node: {}"
|
||||
, brokerId
|
||||
, scanQuery.getPrefixList().get(0)
|
||||
, scanQuery.getPrefixList().size()
|
||||
, scanQuery.getTable()
|
||||
, nodeSession.getStoreNode().getAddress());
|
||||
}
|
||||
}
|
||||
|
||||
this.scanQuery = scanQuery;
|
||||
this.reqBuilder = getRequestBuilder(nodeSession);
|
||||
this.reqBuilder = KvBatchUtil.getRequestBuilder(nodeSession);
|
||||
this.nodeSession = nodeSession;
|
||||
this.agent = new OrderAgent(brokerId);
|
||||
this.requestObserver = stub.scanBatch(agent);
|
||||
|
|
@ -157,33 +158,39 @@ class KvBatchScanner5 {
|
|||
|
||||
if (!this.clientFinished.get()) {
|
||||
this.send(() ->
|
||||
getReqBuilder().setReceiptRequest(this.receiptReqBuilder.setTimes(timesBuf.get()).build()).build()
|
||||
getReqBuilder().setReceiptRequest(
|
||||
this.receiptReqBuilder.setTimes(timesBuf.get()).build())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void makeADeal() {
|
||||
this.send(() -> getReqBuilder()
|
||||
.setQueryRequest(createQueryReq(scanQuery, PAGE_SIZE)).build()
|
||||
.setQueryRequest(KvBatchUtil.createQueryReq(scanQuery, PAGE_SIZE)).build()
|
||||
);
|
||||
}
|
||||
|
||||
private void finish(long tookAmt) {
|
||||
this.clientFinished.set(true);
|
||||
if (log.isDebugEnabled()) log.debug("[ANALYSIS END] [{}] times: {}, received: {}, took: {}"
|
||||
, this.brokerId
|
||||
, this.receivedLastTimes.get()
|
||||
, this.receivedCount.get()
|
||||
, tookAmt
|
||||
);
|
||||
if (this.receivedCount.get() != tookAmt) {
|
||||
if (log.isDebugEnabled()) log.debug("[ANALYSIS END] [{}] times: {}, received: {}, took: {}"
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("[ANALYSIS END] [{}] times: {}, received: {}, took: {}"
|
||||
, this.brokerId
|
||||
, this.receivedLastTimes.get()
|
||||
, this.receivedCount.get()
|
||||
, tookAmt
|
||||
);
|
||||
}
|
||||
if (this.receivedCount.get() != tookAmt) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("[ANALYSIS END] [{}] times: {}, received: {}, took: {}"
|
||||
, this.brokerId
|
||||
, this.receivedLastTimes.get()
|
||||
, this.receivedCount.get()
|
||||
, tookAmt
|
||||
);
|
||||
}
|
||||
}
|
||||
synchronized (this.state) {
|
||||
if (this.state.value < OrderState.COMPLETED.value) {
|
||||
this.send(() -> getReqBuilder().setCancelRequest(this.cancelReq).build());
|
||||
|
|
@ -199,7 +206,7 @@ class KvBatchScanner5 {
|
|||
private void send(Supplier<ScanStreamBatchReq> supplier) {
|
||||
this.senderLock.lock();
|
||||
try {
|
||||
if (this.serverFinished.get() == false) {
|
||||
if (!this.serverFinished.get()) {
|
||||
this.requestObserver.onNext(supplier.get());
|
||||
}
|
||||
Thread.yield();
|
||||
|
|
@ -210,7 +217,7 @@ class KvBatchScanner5 {
|
|||
|
||||
private class OrderAgent implements StreamObserver<KvPageRes> {
|
||||
private final AtomicInteger count = new AtomicInteger(0);
|
||||
private AtomicBoolean over = new AtomicBoolean(false);
|
||||
private final AtomicBoolean over = new AtomicBoolean(false);
|
||||
private final String agentId;
|
||||
|
||||
OrderAgent(String agentId) {
|
||||
|
|
@ -221,7 +228,8 @@ class KvBatchScanner5 {
|
|||
public void onNext(KvPageRes value) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Scan [ {} ] [ {} ] times, received: [ {} ]"
|
||||
, nodeSession.getStoreNode().getAddress(), value.getTimes(), value.getDataList().size());
|
||||
, nodeSession.getStoreNode().getAddress(), value.getTimes(),
|
||||
value.getDataList().size());
|
||||
}
|
||||
|
||||
serverFinished.set(value.getOver());
|
||||
|
|
@ -298,7 +306,9 @@ class KvBatchScanner5 {
|
|||
if (this.done.get()) {
|
||||
res = () -> null;
|
||||
} else {
|
||||
throw HgStoreClientException.of("Timeout, max time: " + HAVE_NEXT_TIMEOUT_SECONDS + " seconds" +
|
||||
throw HgStoreClientException.of(
|
||||
"Timeout, max time: " + HAVE_NEXT_TIMEOUT_SECONDS +
|
||||
" seconds" +
|
||||
", isOver: " + this.done.get() +
|
||||
", isStop: " + this.stop.get() +
|
||||
", last-times: " + this.lastTimes +
|
||||
|
|
@ -308,12 +318,15 @@ class KvBatchScanner5 {
|
|||
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
log.error("Failed to receive List<Kv> from queue because of interruption of current thread ["
|
||||
log.error(
|
||||
"Failed to receive List<Kv> from queue because of interruption of " +
|
||||
"current thread ["
|
||||
+ Thread.currentThread().getName() + "]");
|
||||
|
||||
Thread.currentThread().interrupt();
|
||||
|
||||
throw HgStoreClientException.of("Failed to receive List<Kv> from queue, cause by:", e);
|
||||
throw HgStoreClientException.of(
|
||||
"Failed to receive List<Kv> from queue, cause by:", e);
|
||||
} finally {
|
||||
pickUpLock.unlock();
|
||||
}
|
||||
|
|
@ -347,7 +360,7 @@ class KvBatchScanner5 {
|
|||
|
||||
/* iterator */
|
||||
private static class OrderConsumer implements KvCloseableIterator<Kv>, HgPageSize {
|
||||
private OrderBroker broker;
|
||||
private final OrderBroker broker;
|
||||
private Iterator<Kv> dataIterator;
|
||||
private long tookCount = 0;
|
||||
private final String consumerId;
|
||||
|
|
@ -398,13 +411,15 @@ class KvBatchScanner5 {
|
|||
|
||||
if (this.dataIterator == null) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("[ANALYSIS NULL -> FALSE] [{}] , tookCount: {}", consumerId, tookCount);
|
||||
log.debug("[ANALYSIS NULL -> FALSE] [{}] , tookCount: {}", consumerId,
|
||||
tookCount);
|
||||
}
|
||||
return false;
|
||||
} else {
|
||||
if (log.isDebugEnabled()) {
|
||||
if (!this.dataIterator.hasNext()) {
|
||||
log.debug("[ANALYSIS hasNext -> FALSE] [{}] , tookCount: {}", consumerId, tookCount);
|
||||
log.debug("[ANALYSIS hasNext -> FALSE] [{}] , tookCount: {}", consumerId,
|
||||
tookCount);
|
||||
}
|
||||
}
|
||||
return this.dataIterator.hasNext();
|
||||
|
|
@ -1,6 +1,21 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import static com.baidu.hugegraph.store.client.grpc.KvBatchScanner.NO_DATA;
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
|
@ -12,11 +27,11 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.baidu.hugegraph.store.HgKvEntry;
|
||||
import com.baidu.hugegraph.store.HgKvIterator;
|
||||
import com.baidu.hugegraph.store.HgKvOrderedIterator;
|
||||
import com.baidu.hugegraph.store.HgPageSize;
|
||||
import com.baidu.hugegraph.store.client.util.PropertyUtil;
|
||||
import org.apache.hugegraph.store.HgKvEntry;
|
||||
import org.apache.hugegraph.store.HgKvIterator;
|
||||
import org.apache.hugegraph.store.HgKvOrderedIterator;
|
||||
import org.apache.hugegraph.store.HgPageSize;
|
||||
import org.apache.hugegraph.store.client.util.PropertyUtil;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
|
|
@ -25,13 +40,15 @@ import lombok.extern.slf4j.Slf4j;
|
|||
* 对请求任务的拆分,创建多个请求队列
|
||||
*/
|
||||
@Slf4j
|
||||
public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<HgKvEntry>>, HgPageSize {
|
||||
public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<HgKvEntry>>,
|
||||
HgPageSize {
|
||||
|
||||
static int maxWaitCount = PropertyUtil.getInt("net.kv.scanner.wait.timeout", 60);
|
||||
protected final BlockingQueue<Supplier<HgKvIterator<HgKvEntry>>> queue = new LinkedBlockingQueue<>();
|
||||
protected final BlockingQueue<Supplier<HgKvIterator<HgKvEntry>>> queue =
|
||||
new LinkedBlockingQueue<>();
|
||||
private Supplier<HgKvIterator<HgKvEntry>> current = null;
|
||||
private final KvBatchScanner.TaskSplitter taskSplitter;
|
||||
private List<KvBatchScanner> scanners = new CopyOnWriteArrayList<>();
|
||||
private final List<KvBatchScanner> scanners = new CopyOnWriteArrayList<>();
|
||||
|
||||
public KvBatchScannerMerger(KvBatchScanner.TaskSplitter splitter) {
|
||||
this.taskSplitter = splitter;
|
||||
|
|
@ -62,8 +79,9 @@ public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<Hg
|
|||
// 超时重试
|
||||
sendTimeout();
|
||||
if (++waitTime > maxWaitCount) {
|
||||
log.error("KvBatchScanner wait data timeout {}, closeables is {}, task is {}",
|
||||
waitTime, scanners.size(), taskSplitter.isFinished());
|
||||
log.error(
|
||||
"KvBatchScanner wait data timeout {}, closeables is {}, task is {}",
|
||||
waitTime, scanners.size(), taskSplitter.isFinished());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -72,7 +90,7 @@ public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<Hg
|
|||
throw new RuntimeException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return current != null && current != NO_DATA;
|
||||
return current != null && current != KvBatchScanner.NO_DATA;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -166,7 +184,7 @@ public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<Hg
|
|||
if (++waitTime > maxWaitCount) {
|
||||
break;
|
||||
}
|
||||
} else if (current == NO_DATA) {
|
||||
} else if (current == KvBatchScanner.NO_DATA) {
|
||||
queue = null;
|
||||
break;
|
||||
} else {
|
||||
|
|
@ -207,7 +225,7 @@ public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<Hg
|
|||
*/
|
||||
static class SortedScannerMerger extends KvBatchScannerMerger {
|
||||
// 每一个流对应一个接收队列
|
||||
private Map<KvBatchScanner, ScannerDataQueue> scannerQueues = new ConcurrentHashMap<>();
|
||||
private final Map<KvBatchScanner, ScannerDataQueue> scannerQueues = new ConcurrentHashMap<>();
|
||||
|
||||
public SortedScannerMerger(KvBatchScanner.TaskSplitter splitter) {
|
||||
super(splitter);
|
||||
|
|
@ -298,11 +316,12 @@ public class KvBatchScannerMerger implements KvCloseableIterator<HgKvIterator<Hg
|
|||
}
|
||||
|
||||
public int unregisterScanner(KvBatchScanner scanner) {
|
||||
dataArrived(scanner, NO_DATA);
|
||||
dataArrived(scanner, KvBatchScanner.NO_DATA);
|
||||
return super.unregisterScanner(scanner);
|
||||
}
|
||||
|
||||
public void dataArrived(KvBatchScanner scanner, Supplier<HgKvIterator<HgKvEntry>> supplier) {
|
||||
public void dataArrived(KvBatchScanner scanner,
|
||||
Supplier<HgKvIterator<HgKvEntry>> supplier) {
|
||||
scannerQueues.putIfAbsent(scanner, new ScannerDataQueue());
|
||||
scannerQueues.get(scanner).add(supplier);
|
||||
}
|
||||
|
|
@ -1,20 +1,38 @@
|
|||
package com.baidu.hugegraph.store.client.grpc;
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
import org.apache.hugegraph.store.HgOwnerKey;
|
||||
import org.apache.hugegraph.store.HgScanQuery;
|
||||
import org.apache.hugegraph.store.client.HgStoreNodeSession;
|
||||
import org.apache.hugegraph.store.client.util.HgStoreClientConst;
|
||||
|
||||
import com.baidu.hugegraph.store.HgOwnerKey;
|
||||
import com.baidu.hugegraph.store.HgScanQuery;
|
||||
import com.baidu.hugegraph.store.client.HgStoreNodeSession;
|
||||
import com.baidu.hugegraph.store.client.util.HgStoreClientConst;
|
||||
import com.baidu.hugegraph.store.grpc.common.Header;
|
||||
import com.baidu.hugegraph.store.grpc.common.ScanMethod;
|
||||
import com.baidu.hugegraph.store.grpc.stream.*;
|
||||
import com.google.protobuf.ByteString;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import javax.annotation.concurrent.NotThreadSafe;
|
||||
import java.util.List;
|
||||
|
||||
import static com.baidu.hugegraph.store.client.util.HgStoreClientConst.EMPTY_BYTES;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com created on 2022/04/23
|
||||
*/
|
||||
|
|
@ -70,34 +88,41 @@ class KvBatchUtil {
|
|||
return Header.newBuilder().setGraph(nodeSession.getGraphName()).build();
|
||||
}
|
||||
|
||||
static void addPrefixCondition(HgScanQuery scanQuery, ScanQueryRequest.Builder qb, ScanCondition.Builder cb) {
|
||||
static void addPrefixCondition(HgScanQuery scanQuery, ScanQueryRequest.Builder qb,
|
||||
ScanCondition.Builder cb) {
|
||||
List<HgOwnerKey> prefixList = scanQuery.getPrefixList();
|
||||
|
||||
if (prefixList == null || prefixList.isEmpty()) {
|
||||
throw new RuntimeException("The start-list of ScanQuery shouldn't to be invalid in ScanMethod.PREFIX mode.");
|
||||
throw new RuntimeException(
|
||||
"The start-list of ScanQuery shouldn't to be invalid in ScanMethod.PREFIX " +
|
||||
"mode.");
|
||||
}
|
||||
|
||||
prefixList.forEach((e) -> {
|
||||
qb.addCondition(cb.clear()
|
||||
.setPrefix(toBs(e.getKey()))
|
||||
.setCode(e.getKeyCode())
|
||||
.setSerialNo(e.getSerialNo())
|
||||
.build()
|
||||
.setPrefix(toBs(e.getKey()))
|
||||
.setCode(e.getKeyCode())
|
||||
.setSerialNo(e.getSerialNo())
|
||||
.build()
|
||||
);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
static void addRangeCondition(HgScanQuery scanQuery, ScanQueryRequest.Builder qb, ScanCondition.Builder cb) {
|
||||
static void addRangeCondition(HgScanQuery scanQuery, ScanQueryRequest.Builder qb,
|
||||
ScanCondition.Builder cb) {
|
||||
List<HgOwnerKey> startList = scanQuery.getStartList();
|
||||
List<HgOwnerKey> endList = scanQuery.getEndList();
|
||||
|
||||
if (startList == null || startList.isEmpty()) {
|
||||
throw new RuntimeException("The start-list of ScanQuery shouldn't to be invalid in ScanMethod.RANGE mode.");
|
||||
throw new RuntimeException(
|
||||
"The start-list of ScanQuery shouldn't to be invalid in ScanMethod.RANGE mode" +
|
||||
".");
|
||||
}
|
||||
|
||||
if (endList == null || endList.isEmpty()) {
|
||||
throw new RuntimeException("The end-list of ScanQuery shouldn't to be invalid in ScanMethod.RANGE mode.");
|
||||
throw new RuntimeException(
|
||||
"The end-list of ScanQuery shouldn't to be invalid in ScanMethod.RANGE mode.");
|
||||
}
|
||||
|
||||
if (startList.size() != endList.size()) {
|
||||
|
|
@ -108,10 +133,10 @@ class KvBatchUtil {
|
|||
HgOwnerKey start = startList.get(i);
|
||||
HgOwnerKey end = endList.get(i);
|
||||
qb.addCondition(cb.clear().setCode(start.getKeyCode())
|
||||
.setStart(toBs(start.getKey()))
|
||||
.setEnd(toBs(end.getKey()))
|
||||
.setSerialNo(start.getSerialNo())
|
||||
.build()
|
||||
.setStart(toBs(start.getKey()))
|
||||
.setEnd(toBs(end.getKey()))
|
||||
.setSerialNo(start.getSerialNo())
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
|
|
@ -122,7 +147,7 @@ class KvBatchUtil {
|
|||
}
|
||||
|
||||
static ByteString toBs(byte[] bytes) {
|
||||
return ByteString.copyFrom((bytes != null) ? bytes : EMPTY_BYTES);
|
||||
return ByteString.copyFrom((bytes != null) ? bytes : HgStoreClientConst.EMPTY_BYTES);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with this
|
||||
* work for additional information regarding copyright ownership. The ASF
|
||||
* licenses this file to You under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.store.client.grpc;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* @author lynn.bond@hotmail.com on 2022/3/16
|
||||
*/
|
||||
public interface KvCloseableIterator<T> extends Iterator<T>, Closeable {
|
||||
void close();
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue