Skip to content

Commit

Permalink
Integreted storage client with meta client
Browse files Browse the repository at this point in the history
  • Loading branch information
freddie committed Nov 18, 2019
1 parent c3066f8 commit 2d02694
Show file tree
Hide file tree
Showing 6 changed files with 473 additions and 77 deletions.
64 changes: 64 additions & 0 deletions client/src/main/java/com/vesoft/nebula/IPv4IntTransformer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.vesoft.nebula;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class IPv4IntTransformer {

/**
* Transform Int to IP String
*
* @param ip
* @return
*/
public static String intToIPv4(int ip) {
StringBuilder sb = new StringBuilder();
int num = 0;
boolean needPoint = false;
for (int i = 0; i < 4; i++) {
if (needPoint) {
sb.append('.');
}
needPoint = true;
int offset = 8 * (3 - i);
num = (ip >> offset) & 0xff;
sb.append(num);
}
return sb.toString();
}

/**
* Transform IP String to int
*
* @param ipv4Addr
* @return
*/
public static int ip2Integer(String ipv4Addr) {
if (!isIPv4Address(ipv4Addr))
throw new RuntimeException("Invalid ip address");

Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(ipv4Addr);
int result = 0;
int counter = 0;
while (matcher.find()) {
int value = Integer.parseInt(matcher.group());
result = (value << 8 * (3 - counter++)) | result;
}
return result;
}

/**
* Check is the IP String valid or not
*
* @param ipv4Addr
* @return
*/
private static boolean isIPv4Address(String ipv4Addr) {
String lower = "(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])";
String regex = lower + "(\\." + lower + "){3}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(ipv4Addr);
return matcher.matches();
}
}
177 changes: 177 additions & 0 deletions client/src/main/java/com/vesoft/nebula/MurmurHash2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
package com.vesoft.nebula;

public class MurmurHash2 {
private MurmurHash2() {
}

/**
* Generates 32 bit hash from byte array of the given length and seed.
*
* @param data byte array to hash
* @param length length of the array to hash
* @param seed initial seed value
* @return 32 bit hash of the given array
*/
public static int hash32(final byte[] data, final int length, final int seed) {
// 'm' and 'r' are mixing constants generated offline.
// They're not really 'magic', they just happen to work well.
final int m = 0x5bd1e995;
final int r = 24;

// Initialize the hash to a random value
int h = seed ^ length;
final int length4 = length / 4;

for (int i = 0; i < length4; i++) {
final int i4 = i * 4;
int k = (data[i4 + 0] & 0xff) + ((data[i4 + 1] & 0xff) << 8) + ((data[i4 + 2] & 0xff) << 16)
+ ((data[i4 + 3] & 0xff) << 24);
k *= m;
k ^= k >>> r;
k *= m;
h *= m;
h ^= k;
}

// Handle the last few bytes of the input array
switch (length % 4) {
case 3:
h ^= (data[(length & ~3) + 2] & 0xff) << 16;
case 2:
h ^= (data[(length & ~3) + 1] & 0xff) << 8;
case 1:
h ^= (data[length & ~3] & 0xff);
h *= m;
}

h ^= h >>> 13;
h *= m;
h ^= h >>> 15;

return h;
}

/**
* Generates 32 bit hash from byte array with default seed value.
*
* @param data byte array to hash
* @param length length of the array to hash
* @return 32 bit hash of the given array
*/
public static int hash32(final byte[] data, final int length) {
return hash32(data, length, 0x9747b28c);
}

/**
* Generates 32 bit hash from a string.
*
* @param text string to hash
* @return 32 bit hash of the given string
*/
public static int hash32(final String text) {
final byte[] bytes = text.getBytes();
return hash32(bytes, bytes.length);
}

/**
* Generates 32 bit hash from a substring.
*
* @param text string to hash
* @param from starting index
* @param length length of the substring to hash
* @return 32 bit hash of the given string
*/
public static int hash32(final String text, final int from, final int length) {
return hash32(text.substring(from, from + length));
}

/**
* Generates 64 bit hash from byte array of the given length and seed.
*
* @param data byte array to hash
* @param length length of the array to hash
* @param seed initial seed value
* @return 64 bit hash of the given array
*/
public static long hash64(final byte[] data, final int length, final int seed) {
final long m = 0xc6a4a7935bd1e995L;
final int r = 47;

long h = (seed & 0xffffffffl) ^ (length * m);

final int length8 = length / 8;

for (int i = 0; i < length8; i++) {
final int i8 = i * 8;
long k = ((long) data[i8 + 0] & 0xff) + (((long) data[i8 + 1] & 0xff) << 8)
+ (((long) data[i8 + 2] & 0xff) << 16) + (((long) data[i8 + 3] & 0xff) << 24)
+ (((long) data[i8 + 4] & 0xff) << 32) + (((long) data[i8 + 5] & 0xff) << 40)
+ (((long) data[i8 + 6] & 0xff) << 48) + (((long) data[i8 + 7] & 0xff) << 56);

k *= m;
k ^= k >>> r;
k *= m;

h ^= k;
h *= m;
}

switch (length % 8) {
case 7:
h ^= (long) (data[(length & ~7) + 6] & 0xff) << 48;
case 6:
h ^= (long) (data[(length & ~7) + 5] & 0xff) << 40;
case 5:
h ^= (long) (data[(length & ~7) + 4] & 0xff) << 32;
case 4:
h ^= (long) (data[(length & ~7) + 3] & 0xff) << 24;
case 3:
h ^= (long) (data[(length & ~7) + 2] & 0xff) << 16;
case 2:
h ^= (long) (data[(length & ~7) + 1] & 0xff) << 8;
case 1:
h ^= data[length & ~7] & 0xff;
h *= m;
}

h ^= h >>> r;
h *= m;
h ^= h >>> r;

return h;
}

/**
* Generates 64 bit hash from byte array with default seed value.
*
* @param data byte array to hash
* @param length length of the array to hash
* @return 64 bit hash of the given string
*/
public static long hash64(final byte[] data, final int length) {
return hash64(data, length, 0xe17a1465);
}

/**
* Generates 64 bit hash from a string.
*
* @param text string to hash
* @return 64 bit hash of the given string
*/
public static long hash64(final String text) {
final byte[] bytes = text.getBytes();
return hash64(bytes, bytes.length);
}

/**
* Generates 64 bit hash from a substring.
*
* @param text string to hash
* @param from starting index
* @param length length of the substring to hash
* @return 64 bit hash of the given array
*/
public static long hash64(final String text, final int from, final int length) {
return hash64(text.substring(from, from + length));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
import com.vesoft.nebula.Client;

import java.util.List;
import java.util.Map;

public interface MetaClient extends Client {

public List<HostAddr> getPart(int spaceId, int partId);
public List<HostAddr> getPart(String spaceName, int partId);
public Map<Integer, Map<Integer, List<HostAddr>>> getParts();

public Integer getTagId(int spaceId, String tagName);
public Integer getTagId(String spaceName, String tagName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ public MetaClientImpl(List<HostAndPort> addresses, int timeout, int connectionRe
host, port));
}
});
this.spaces = Lists.newArrayList();
this.spaceNames = Maps.newHashMap();
this.parts = Maps.newHashMap();
this.tagItems = Maps.newHashMap();
this.edgeItems = Maps.newHashMap();
Expand Down Expand Up @@ -91,9 +93,11 @@ public List<HostAddr> getPart(int spaceId, int partId) {
getParts(spaceId);
}
Map<Integer, List<HostAddr>> map = parts.get(spaceId);
if (map.isEmpty()) return null;
if (map == null){
return null;
}
List<HostAddr> addrs = map.get(partId);
return addrs.isEmpty() ? null : addrs;
return addrs;
}

@Override
Expand Down Expand Up @@ -206,13 +210,13 @@ private boolean listSpaces() {
try {
response = client.listSpaces(request);
} catch (TException e) {
LOGGER.error("List Spaces Error: %s", e.getMessage());
LOGGER.error("List Spaces Error: " + e.getMessage());
return false;
}
if (response.getCode() == ErrorCode.SUCCEEDED) {
this.spaces = response.getSpaces();
} else {
LOGGER.error("Init Error: %d", response.getCode());
LOGGER.error("Init Error: " + response.getCode());
return false;
}
return true;
Expand All @@ -232,15 +236,15 @@ private boolean getParts(int spaceId) {
GetPartsAllocResp response;
try {
response = client.getPartsAlloc(request);
} catch (TException e) {
LOGGER.error("Get parts failed: %s", e.getMessage());
} catch (Exception e) {
LOGGER.error("Get Parts failed: " + e.getMessage());
return false;
}
if (response.getCode() == ErrorCode.SUCCEEDED) {
Map<Integer, List<HostAddr>> part = response.getParts();
this.parts.put(spaceId, part);
} else {
LOGGER.error("Get Parts Error: %s", response.getCode());
LOGGER.error("Get Parts Error: " + response.getCode());
return false;
}
return true;
Expand All @@ -260,18 +264,20 @@ private boolean getTagItems(int spaceId) {
try {
response = client.listTags(request);
} catch (TException e) {
LOGGER.error("Get Tag Error: %s", e.getMessage());
LOGGER.error("Get Tag Error: " + e.getMessage());
return false;
}
if (response.getCode() == ErrorCode.SUCCEEDED) {
List<TagItem> tagItem = response.getTags();
Map<String, TagItem> tmp = new HashMap<>();
for (TagItem ti : tagItem) {
tmp.put(ti.getTag_name(), ti);
if (tagItem != null) {
for (TagItem ti : tagItem) {
tmp.put(ti.getTag_name(), ti);
}
this.tagItems.put(spaceId, tmp);
}
this.tagItems.put(spaceId, tmp);
} else {
LOGGER.error("Get tags Error: %s", response.getCode());
LOGGER.error("Get tags Error: " + response.getCode());
return false;
}
return true;
Expand All @@ -291,18 +297,20 @@ private boolean getEdgeTypes(int spaceId) {
try {
response = client.listEdges(request);
} catch (TException e) {
LOGGER.error("Get Edge Error: %s", e.getMessage());
LOGGER.error("Get Edge Error: " + e.getMessage());
return false;
}
if (response.getCode() == ErrorCode.SUCCEEDED) {
List<EdgeItem> edgeItem = response.getEdges();
Map<String, EdgeItem> tmp = new HashMap<>();
for (EdgeItem ei : edgeItem) {
tmp.put(ei.getEdge_name(), ei);
if (edgeItem != null) {
for (EdgeItem ei : edgeItem) {
tmp.put(ei.getEdge_name(), ei);
}
this.edgeItems.put(spaceId, tmp);
}
this.edgeItems.put(spaceId, tmp);
} else {
LOGGER.error("Get tags Error: %s", response.getCode());
LOGGER.error("Get tags Error: " + response.getCode());
return false;
}
return true;
Expand All @@ -316,6 +324,11 @@ public List<IdName> getSpaces() {
return spaces;
}

@Override
public Map<Integer, Map<Integer, List<HostAddr>>> getParts() {
return this.parts;
}

public void close() throws Exception {

}
Expand Down
Loading

0 comments on commit 2d02694

Please sign in to comment.