mirror of https://github.com/tikv/client-java.git
Add gradle build documents (#59)
This commit is contained in:
parent
67112a9eca
commit
daca5d23f2
153
README.md
153
README.md
|
@ -9,28 +9,59 @@ It is supposed to:
|
|||
|
||||
## How to build
|
||||
|
||||
### Gradle
|
||||
|
||||
Alternatively, you can build `tikv-client-java` with gradle.
|
||||
|
||||
The following command will build the project.
|
||||
|
||||
```
|
||||
gradle init
|
||||
gradle clean build -x test
|
||||
```
|
||||
|
||||
To make a jar with dependencies
|
||||
|
||||
```
|
||||
gradle clean fatJar -x test
|
||||
```
|
||||
|
||||
The jar can be found in `./build/libs/`
|
||||
|
||||
### Maven
|
||||
|
||||
The alternative way to build a usable jar for testing will be
|
||||
|
||||
```
|
||||
mvn clean install -Dmaven.test.skip=true
|
||||
```
|
||||
|
||||
The following command can install dependencies for you.
|
||||
|
||||
```
|
||||
mvn package
|
||||
```
|
||||
|
||||
The jar can be found in `./target/`
|
||||
|
||||
### Bazel
|
||||
|
||||
Alternatively, you can use `bazel` for much faster build. When you try this approach, you should run `git submodule update --init --recursive` before you build project.
|
||||
|
||||
Making a uber jar:
|
||||
|
||||
```
|
||||
make uber_jar
|
||||
```
|
||||
|
||||
run Main class:
|
||||
|
||||
```
|
||||
make run
|
||||
```
|
||||
|
||||
run test cases:
|
||||
|
||||
```
|
||||
make test
|
||||
```
|
||||
|
@ -39,8 +70,9 @@ this project is designed to hook with `pd` and `tikv` which you can find in `Pin
|
|||
|
||||
When you work with this project, you have to communicate with `pd` and `tikv`. Please run TiKV and PD in advance.
|
||||
|
||||
## Raw TiKV-Client in Java
|
||||
Java Implementation of Raw TiKV-Client
|
||||
## Component: Raw Ti-Client in Java
|
||||
|
||||
Java Implementation of Raw TiKV-Client to support RawKVClient commands.
|
||||
|
||||
Demo is avaliable in [KVRawClientTest](https://github.com/birdstorm/KVRawClientTest/)
|
||||
|
||||
|
@ -49,79 +81,94 @@ Demo is avaliable in [KVRawClientTest](https://github.com/birdstorm/KVRawClientT
|
|||
mvn clean install -Dmaven.test.skip=true
|
||||
```
|
||||
|
||||
### Use as maven dependency
|
||||
After building, add following lines into your `pom.xml`
|
||||
### Add to dependency
|
||||
|
||||
#### Use jar for binary
|
||||
|
||||
Add your jar built with all dependencies into you project's library to use `tikv-client-java` as dependency
|
||||
|
||||
#### Use as maven dependency
|
||||
|
||||
After building, add following lines into your `pom.xml` if you are using Maven
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.tikv</groupId>
|
||||
<artifactId>tikv-client-java</artifactId>
|
||||
<version>2.0-SNAPSHOT</version>
|
||||
<groupId>org.tikv</groupId>
|
||||
<artifactId>tikv-client-java</artifactId>
|
||||
<version>2.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### Entrance
|
||||
`com.pingcap.tikv.RawKVClient`
|
||||
`org.tikv.raw.RawKVClient`
|
||||
|
||||
### Create a RawKVClient
|
||||
|
||||
```java
|
||||
import org.tikv.common.TiSession;
|
||||
import org.tikv.raw.RawKVClient;
|
||||
|
||||
public class Main {
|
||||
public static void main() {
|
||||
// You MUST create a raw configuration if you are using RawKVClient.
|
||||
TiConfiguration conf = TiConfiguration.createRawDefault(YOUR_PD_ADDRESSES);
|
||||
TiSession session = TiSession.create(conf);
|
||||
RawKVClient = session.createRawKVClient();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### API
|
||||
|
||||
```java
|
||||
/**
|
||||
* create a RawKVClient using specific pd addresses
|
||||
*
|
||||
* @param address pd addresses(comma seperated)
|
||||
*/
|
||||
static RawKVClient create(String address)
|
||||
/**
|
||||
* Put a raw key-value pair to TiKV
|
||||
*
|
||||
* @param key raw key
|
||||
* @param value raw value
|
||||
*/
|
||||
void put(ByteString key, ByteString value)
|
||||
```
|
||||
|
||||
```java
|
||||
/**
|
||||
* Put a raw key-value pair to TiKV
|
||||
*
|
||||
* @param key raw key
|
||||
* @param value raw value
|
||||
*/
|
||||
void put(ByteString key, ByteString value)
|
||||
/**
|
||||
* Get a raw key-value pair from TiKV if key exists
|
||||
*
|
||||
* @param key raw key
|
||||
* @return a ByteString value if key exists, ByteString.EMPTY if key does not exist
|
||||
*/
|
||||
ByteString get(ByteString key)
|
||||
```
|
||||
|
||||
```java
|
||||
/**
|
||||
* Get a raw key-value pair from TiKV if key exists
|
||||
*
|
||||
* @param key raw key
|
||||
* @return a ByteString value if key exists, ByteString.EMPTY if key does not exist
|
||||
*/
|
||||
ByteString get(ByteString key)
|
||||
/**
|
||||
* Scan raw key-value pairs from TiKV in range [startKey, endKey)
|
||||
*
|
||||
* @param startKey raw start key, inclusive
|
||||
* @param endKey raw end key, exclusive
|
||||
* @return list of key-value pairs in range
|
||||
*/
|
||||
List<Kvrpcpb.KvPair> scan(ByteString startKey, ByteString endKey)
|
||||
```
|
||||
|
||||
```java
|
||||
/**
|
||||
* Scan raw key-value pairs from TiKV in range [startKey, endKey)
|
||||
*
|
||||
* @param startKey raw start key, inclusive
|
||||
* @param endKey raw end key, exclusive
|
||||
* @return list of key-value pairs in range
|
||||
*/
|
||||
List<Kvrpcpb.KvPair> scan(ByteString startKey, ByteString endKey)
|
||||
/**
|
||||
* Scan raw key-value pairs from TiKV in range [startKey, endKey)
|
||||
*
|
||||
* @param startKey raw start key, inclusive
|
||||
* @param limit limit of key-value pairs
|
||||
* @return list of key-value pairs in range
|
||||
*/
|
||||
List<Kvrpcpb.KvPair> scan(ByteString startKey, int limit)
|
||||
```
|
||||
|
||||
```java
|
||||
/**
|
||||
* Scan raw key-value pairs from TiKV in range [startKey, endKey)
|
||||
*
|
||||
* @param startKey raw start key, inclusive
|
||||
* @param limit limit of key-value pairs
|
||||
* @return list of key-value pairs in range
|
||||
*/
|
||||
List<Kvrpcpb.KvPair> scan(ByteString startKey, int limit)
|
||||
```
|
||||
|
||||
```java
|
||||
/**
|
||||
* Delete a raw key-value pair from TiKV if key exists
|
||||
*
|
||||
* @param key raw key to be deleted
|
||||
*/
|
||||
void delete(ByteString key)
|
||||
/**
|
||||
* Delete a raw key-value pair from TiKV if key exists
|
||||
*
|
||||
* @param key raw key to be deleted
|
||||
*/
|
||||
void delete(ByteString key)
|
||||
```
|
||||
|
||||
|
||||
|
|
162
build.gradle
162
build.gradle
|
@ -15,47 +15,47 @@ tasks.withType(JavaCompile) {
|
|||
}
|
||||
|
||||
idea {
|
||||
module {
|
||||
// Marks the already(!) added srcDir as "generated"
|
||||
generatedSourceDirs += file('target/generated-sources/protobuf/java')
|
||||
generatedSourceDirs += file('target/generated-sources/protobuf/grpc-java')
|
||||
}
|
||||
module {
|
||||
// Marks the already(!) added srcDir as "generated"
|
||||
generatedSourceDirs += file('target/generated-sources/main/java')
|
||||
generatedSourceDirs += file('target/generated-sources/main/grpc-java')
|
||||
}
|
||||
}
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
maven { url "http://repo.maven.apache.org/maven2" }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.7'
|
||||
}
|
||||
repositories {
|
||||
maven { url "http://repo.maven.apache.org/maven2" }
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.7'
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
proto {
|
||||
srcDir {'proto'}
|
||||
include {'**/*.proto'}
|
||||
}
|
||||
java {
|
||||
// include self written and generated code
|
||||
srcDirs 'src/main/java', 'target/generated-sources/protobuf/java' , 'target/generated-sources/protobuf/grpc-java'
|
||||
}
|
||||
}
|
||||
test {
|
||||
main {
|
||||
proto {
|
||||
srcDir {'proto'}
|
||||
include {'**/*.proto'}
|
||||
}
|
||||
java {
|
||||
srcDirs 'src/test/java', 'target/generated-sources/protobuf/java' , 'target/generated-sources/protobuf/grpc-java'
|
||||
// include self written and generated code
|
||||
srcDirs 'src/main/java', 'target/generated-sources/main/java' , 'target/generated-sources/main/grpc-java'
|
||||
}
|
||||
}
|
||||
// remove the test configuration - at least in your example you don't have a special test proto file
|
||||
test {
|
||||
java {
|
||||
srcDirs 'src/test/java', 'target/generated-sources/main/java' , 'target/generated-sources/main/grpc-java'
|
||||
}
|
||||
}
|
||||
// remove the test configuration - at least in your example you don't have a special test proto file
|
||||
}
|
||||
|
||||
protobuf {
|
||||
// Configure the protoc executable
|
||||
protoc {
|
||||
// Download from repositories
|
||||
artifact = 'com.google.protobuf:protoc:3.1.0'
|
||||
}
|
||||
// Configure the protoc executable
|
||||
protoc {
|
||||
// Download from repositories
|
||||
artifact = 'com.google.protobuf:protoc:3.1.0'
|
||||
}
|
||||
|
||||
// Locate the codegen plugins
|
||||
plugins {
|
||||
|
@ -67,82 +67,83 @@ protobuf {
|
|||
// or
|
||||
// path = 'tools/protoc-gen-grpc-java'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
generateProtoTasks.generatedFilesBaseDir = 'target/generated-sources'
|
||||
generateProtoTasks.generatedFilesBaseDir = 'target/generated-sources'
|
||||
|
||||
generateProtoTasks {
|
||||
// all() returns the collection of all protoc tasks
|
||||
all().each { task ->
|
||||
generateProtoTasks {
|
||||
// all() returns the collection of all protoc tasks
|
||||
all().each { task ->
|
||||
task.plugins {
|
||||
grpc {
|
||||
outputSubDir = 'grpc-java'
|
||||
}
|
||||
}
|
||||
// Here you can configure the task
|
||||
}
|
||||
// Here you can configure the task
|
||||
}
|
||||
|
||||
// In addition to all(), you may get the task collection by various
|
||||
// criteria:
|
||||
// In addition to all(), you may get the task collection by various
|
||||
// criteria:
|
||||
|
||||
// (Java only) returns tasks for a sourceSet
|
||||
ofSourceSet('main')
|
||||
}
|
||||
// (Java only) returns tasks for a sourceSet
|
||||
ofSourceSet('main')
|
||||
}
|
||||
}
|
||||
|
||||
clean {
|
||||
delete protobuf.generatedFilesBaseDir
|
||||
delete project.buildDir
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven { url "http://repo.maven.apache.org/maven2" }
|
||||
maven { url "http://repo.maven.apache.org/maven2" }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile group: 'log4j', name: 'log4j', version:'1.2.17'
|
||||
compile group: 'net.sf.trove4j', name: 'trove4j', version:'3.0.1'
|
||||
compile group: 'com.sangupta', name: 'murmur', version:'1.0.0'
|
||||
compile group: 'io.grpc', name: 'grpc-netty', version:'1.7.0'
|
||||
compile group: 'io.grpc', name: 'grpc-protobuf', version:'1.7.0'
|
||||
compile group: 'io.grpc', name: 'grpc-stub', version:'1.7.0'
|
||||
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:'2.8.11'
|
||||
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.8.11.1'
|
||||
compile(group: 'com.fasterxml.jackson.module', name: 'jackson-module-scala_2.11', version:'2.8.11') {
|
||||
compile group: 'log4j', name: 'log4j', version:'1.2.17'
|
||||
compile group: 'net.sf.trove4j', name: 'trove4j', version:'3.0.1'
|
||||
compile group: 'com.sangupta', name: 'murmur', version:'1.0.0'
|
||||
compile group: 'io.grpc', name: 'grpc-netty', version:'1.7.0'
|
||||
compile group: 'io.grpc', name: 'grpc-protobuf', version:'1.7.0'
|
||||
compile group: 'io.grpc', name: 'grpc-stub', version:'1.7.0'
|
||||
compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:'2.8.11'
|
||||
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:'2.8.11.1'
|
||||
compile(group: 'com.fasterxml.jackson.module', name: 'jackson-module-scala_2.11', version:'2.8.11') {
|
||||
exclude(module: 'guava')
|
||||
}
|
||||
compile group: 'joda-time', name: 'joda-time', version:'2.9.9'
|
||||
compile group: 'org.joda', name: 'joda-convert', version:'1.9.2'
|
||||
testCompile group: 'io.grpc', name: 'grpc-testing', version:'1.7.0'
|
||||
//remove unused hadoop dependencies
|
||||
/*compile group: 'org.apache.logging.log4j', name: 'log4j-api', version:'2.8.1'
|
||||
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version:'2.8.1'
|
||||
compile group: 'org.apache.spark', name: 'spark-core_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-catalyst_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-sql_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-hive_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-hive-thriftserver_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-unsafe_2.11', version:'2.3.2'*/
|
||||
compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.5'
|
||||
compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'jul-to-slf4j', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version:'1.7.16'
|
||||
}
|
||||
compile group: 'joda-time', name: 'joda-time', version:'2.9.9'
|
||||
compile group: 'org.joda', name: 'joda-convert', version:'1.9.2'
|
||||
testCompile group: 'io.grpc', name: 'grpc-testing', version:'1.7.0'
|
||||
//remove unused hadoop dependencies
|
||||
/*compile group: 'org.apache.logging.log4j', name: 'log4j-api', version:'2.8.1'
|
||||
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version:'2.8.1'
|
||||
compile group: 'org.apache.spark', name: 'spark-core_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-catalyst_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-sql_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-hive_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-hive-thriftserver_2.11', version:'2.3.2'
|
||||
compile group: 'org.apache.spark', name: 'spark-unsafe_2.11', version:'2.3.2'*/
|
||||
compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.5'
|
||||
compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'slf4j-log4j12', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'jul-to-slf4j', version:'1.7.16'
|
||||
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version:'1.7.16'
|
||||
compile 'com.google.protobuf:protobuf-java:3.1.0'
|
||||
}
|
||||
|
||||
task updateProtoModule(type: Exec) {
|
||||
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
|
||||
commandLine 'cmd', './scripts/proto.sh'
|
||||
} else {
|
||||
commandLine 'sh', '-c', './scripts/proto.sh'
|
||||
}
|
||||
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
|
||||
commandLine 'cmd', './scripts/proto.sh'
|
||||
} else {
|
||||
commandLine 'sh', '-c', './scripts/proto.sh'
|
||||
}
|
||||
}
|
||||
|
||||
task copyResources(type: Copy) {
|
||||
includeEmptyDirs = false
|
||||
copy {
|
||||
from "./kvproto/include/"
|
||||
include "**/gogoproto/**"
|
||||
include "**/gogoproto/**"
|
||||
into "proto"
|
||||
}
|
||||
copy {
|
||||
|
@ -151,5 +152,16 @@ task copyResources(type: Copy) {
|
|||
}
|
||||
}
|
||||
|
||||
//create a single Jar with all dependencies
|
||||
task fatJar(type: Jar) {
|
||||
manifest {
|
||||
attributes 'Title': project.name,
|
||||
'Version': version
|
||||
}
|
||||
baseName = project.name + '-all'
|
||||
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
|
||||
with jar
|
||||
}
|
||||
|
||||
compileJava.dependsOn copyResources
|
||||
copyResources.dependsOn updateProtoModule
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
package org.tikv.common;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.net.URI;
|
||||
import java.util.ArrayList;
|
||||
|
|
|
@ -17,7 +17,6 @@ package org.tikv.common.util;
|
|||
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
|
|
@ -86,7 +86,7 @@ public class ConcreteBackOffer implements BackOffer {
|
|||
BackOffFunction backOffFunction = null;
|
||||
switch (funcType) {
|
||||
case BoUpdateLeader:
|
||||
//fix: reference from go client
|
||||
// fix: reference from go client
|
||||
backOffFunction = BackOffFunction.create(1, 10, BackOffStrategy.NoJitter);
|
||||
break;
|
||||
case BoTxnLockFast:
|
||||
|
@ -96,7 +96,7 @@ public class ConcreteBackOffer implements BackOffer {
|
|||
backOffFunction = BackOffFunction.create(2000, 10000, BackOffStrategy.EqualJitter);
|
||||
break;
|
||||
case BoRegionMiss:
|
||||
//fix: reference from go client
|
||||
// fix: reference from go client
|
||||
// change base time to 2ms, because it may recover soon.
|
||||
backOffFunction = BackOffFunction.create(2, 500, BackOffStrategy.NoJitter);
|
||||
break;
|
||||
|
@ -108,7 +108,7 @@ public class ConcreteBackOffer implements BackOffer {
|
|||
backOffFunction = BackOffFunction.create(500, 3000, BackOffStrategy.EqualJitter);
|
||||
break;
|
||||
case BoTiKVRPC:
|
||||
//fix: reference from go client
|
||||
// fix: reference from go client
|
||||
backOffFunction = BackOffFunction.create(100, 2000, BackOffStrategy.EqualJitter);
|
||||
break;
|
||||
case BoStoreNotMatch:
|
||||
|
|
|
@ -33,10 +33,10 @@ import org.tikv.common.key.Key;
|
|||
import org.tikv.common.region.TiRegion;
|
||||
import org.tikv.kvproto.Coprocessor;
|
||||
import org.tikv.kvproto.Errorpb;
|
||||
import org.tikv.kvproto.Errorpb.EpochNotMatch;
|
||||
import org.tikv.kvproto.Errorpb.Error;
|
||||
import org.tikv.kvproto.Errorpb.NotLeader;
|
||||
import org.tikv.kvproto.Errorpb.ServerIsBusy;
|
||||
import org.tikv.kvproto.Errorpb.EpochNotMatch;
|
||||
import org.tikv.kvproto.Kvrpcpb;
|
||||
import org.tikv.kvproto.Kvrpcpb.Context;
|
||||
import org.tikv.kvproto.TikvGrpc;
|
||||
|
|
|
@ -89,7 +89,8 @@ public class PDClientTest {
|
|||
session = TiSession.create(conf);
|
||||
try (PDClient client = session.getPDClient()) {
|
||||
client.switchLeader(ImmutableList.of("http://" + LOCAL_ADDR_IPV6 + ":" + (server.port + 2)));
|
||||
assertEquals(client.getLeaderWrapper().getLeaderInfo(), LOCAL_ADDR_IPV6 + ":" + (server.port + 2));
|
||||
assertEquals(
|
||||
client.getLeaderWrapper().getLeaderInfo(), LOCAL_ADDR_IPV6 + ":" + (server.port + 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue