Skip to content

Commit

Permalink
implements status, hashkv, defrag command (#91)
Browse files Browse the repository at this point in the history
Signed-off-by: Yukihiko Sohda <yukihiko.sohda@gmail.com>
  • Loading branch information
ysohda committed Mar 22, 2024
1 parent 2800fe3 commit ff9ef77
Show file tree
Hide file tree
Showing 7 changed files with 143 additions and 4 deletions.
5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ etcd-java requires Java 8 or higher.

## Usage

Create the client. Methods are grouped into separate `KvClient`, `LeaseClient` and `LockClient` interfaces.

Create the client. Methods are grouped into separate `KvClient`, `LeaseClient`, `LockClient`, and `MaintenanceClient` interfaces.

```java
KvStoreClient client = EtcdClient.forEndpoint("localhost", 2379).withPlainText().build();
Expand All @@ -29,7 +28,7 @@ KvStoreClient client = EtcdClient.forEndpoint("localhost", 2379).withPlainText()
KvClient kvClient = client.getKvClient();
LeaseClient leaseClient = client.getLeaseClient();
LockClient lockClient = client.getLockClient();

MaintenanceClient maintenanceClient = client.getMaintenanceClient();
```

Put a key-value synchronously
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/com/ibm/etcd/client/EtcdClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
import com.ibm.etcd.client.lease.PersistentLease;
import com.ibm.etcd.client.lock.EtcdLockClient;
import com.ibm.etcd.client.lock.LockClient;
import com.ibm.etcd.client.maintenance.EtcdMaintenanceClient;
import com.ibm.etcd.client.maintenance.MaintenanceClient;

import io.grpc.CallCredentials;
import io.grpc.CallOptions;
Expand Down Expand Up @@ -129,6 +131,7 @@ public class EtcdClient implements KvStoreClient {
private final EtcdKvClient kvClient;
private volatile LeaseClient leaseClient; // lazy-instantiated
private volatile LockClient lockClient; // lazy-instantiated
private volatile MaintenanceClient maintenanceClient; // lazy-instantiated
private volatile PersistentLease sessionLease; // lazy-instantiated

public static class Builder {
Expand Down Expand Up @@ -740,6 +743,17 @@ public LockClient getLockClient() {
return lc;
}

@Override
public MaintenanceClient getMaintenanceClient() {
MaintenanceClient mc = maintenanceClient;
if (mc == null) synchronized (this) {
if ((mc = maintenanceClient) == null) {
maintenanceClient = mc = new EtcdMaintenanceClient(grpc);
}
}
return mc;
}

@Override
public PersistentLease getSessionLease() {
PersistentLease sl = sessionLease;
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/ibm/etcd/client/KvStoreClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.ibm.etcd.client.lease.LeaseClient;
import com.ibm.etcd.client.lease.PersistentLease;
import com.ibm.etcd.client.lock.LockClient;
import com.ibm.etcd.client.maintenance.MaintenanceClient;

public interface KvStoreClient extends Closeable {

Expand All @@ -30,6 +31,8 @@ public interface KvStoreClient extends Closeable {

LockClient getLockClient();

MaintenanceClient getMaintenanceClient();

/**
* Returns a singular {@link PersistentLease} bound
* to the life of this client instance. May be lazily
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.ibm.etcd.client.maintenance;

import com.google.common.util.concurrent.ListenableFuture;
import com.ibm.etcd.api.*;
import com.ibm.etcd.client.GrpcClient;
import io.grpc.MethodDescriptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EtcdMaintenanceClient implements MaintenanceClient {
private static final Logger logger = LoggerFactory.getLogger(EtcdMaintenanceClient.class);

private static final MethodDescriptor<StatusRequest,StatusResponse> METHOD_ENDPOINT_STATUS =
MaintenanceGrpc.getStatusMethod();
private static final MethodDescriptor<HashKVRequest,HashKVResponse> METHOD_ENDPOINT_HASHKV =
MaintenanceGrpc.getHashKVMethod();
private static final MethodDescriptor<DefragmentRequest,DefragmentResponse> METHOD_ENDPOINT_DEFRAG =
MaintenanceGrpc.getDefragmentMethod();

private final GrpcClient client;

public EtcdMaintenanceClient(GrpcClient client) {
this.client = client;
}

@Override
public ListenableFuture<StatusResponse> status() {
return client.call(METHOD_ENDPOINT_STATUS, StatusRequest.newBuilder().build(), false);
}

@Override
public ListenableFuture<HashKVResponse> hashkv() {
return client.call(METHOD_ENDPOINT_HASHKV, HashKVRequest.newBuilder().build(), false);
}

@Override
public ListenableFuture<DefragmentResponse> defrag() {
return client.call(METHOD_ENDPOINT_DEFRAG, DefragmentRequest.newBuilder().build(), false);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.ibm.etcd.client.maintenance;

import com.google.common.util.concurrent.ListenableFuture;
import com.ibm.etcd.api.HashKVResponse;
import com.ibm.etcd.api.StatusResponse;
import com.ibm.etcd.api.DefragmentResponse;

public interface MaintenanceClient {
/**
*
* @return future for {@link StatusResponse}
*/
ListenableFuture<StatusResponse> status();

/**
*
* @return future for {@link HashKVResponse}
*/
ListenableFuture<HashKVResponse> hashkv();

/**
*
* @return future for {@link DefragmentResponse}
*/
ListenableFuture<DefragmentResponse> defrag();
}
3 changes: 2 additions & 1 deletion src/test/java/com/ibm/etcd/client/EtcdTestSuite.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@
LeaseTest.class,
LockTest.class,
PersistentLeaseKeyTest.class,
RangeCacheTest.class
RangeCacheTest.class,
MaintenanceTest.class
})
public class EtcdTestSuite {

Expand Down
55 changes: 55 additions & 0 deletions src/test/java/com/ibm/etcd/client/MaintenanceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.ibm.etcd.client;

import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import com.ibm.etcd.api.*;
import com.ibm.etcd.client.maintenance.MaintenanceClient;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class MaintenanceTest {
static KvStoreClient client;

static MaintenanceClient maintenanceClient;

@BeforeClass
public static void setup() {
client = EtcdClient.forEndpoint("localhost", 2379)
.withPlainText().build();
maintenanceClient = client.getMaintenanceClient();
}
@AfterClass
public static void teardown() throws Exception {
if (client != null) {
client.close();
}
}

@Test
public void testStatus() throws Exception {
StatusResponse resp = maintenanceClient.status().get(1, SECONDS);
assertNotNull(resp.getVersion());
assertTrue(resp.getDbSize() > 0L);
assertTrue(resp.getDbSizeInUse() > 0L);
assertTrue(resp.hasHeader());
assertTrue(resp.getHeader().getRevision() > 0L);
}

@Test
public void testHashkv() throws Exception {
HashKVResponse resp = maintenanceClient.hashkv().get(1, SECONDS);
assertNotNull(resp);
assertTrue(resp.getHash() != 0L);
assertTrue(resp.hasHeader());
assertTrue(resp.getHeader().getRevision() > 0L);
}

@Test
public void testDefrag() throws Exception {
DefragmentResponse resp = maintenanceClient.defrag().get(5, SECONDS);
assertNotNull(resp);
}
}

0 comments on commit ff9ef77

Please sign in to comment.