use of com.bonree.brfs.common.net.tcp.file.client.FileContentPart in project BRFS by zhangnianli.
the class TcpDiskNodeClient method readData.
@Override
public void readData(String path, long offset, int size, ByteConsumer consumer) throws IOException {
if (readClient == null) {
throw new UnsupportedOperationException("no read client is set");
}
ReadObject object = new ReadObject();
object.setFilePath(path);
object.setOffset(offset);
object.setLength(size);
try {
readClient.sendMessage(object, new ResponseHandler<FileContentPart>() {
@Override
public void handle(FileContentPart response) {
consumer.consume(response.content(), response.endOfContent());
}
@Override
public void error(Throwable t) {
consumer.error(t);
}
});
} catch (Exception e) {
throw new IOException("can not send read message", e);
}
}
use of com.bonree.brfs.common.net.tcp.file.client.FileContentPart in project BRFS by zhangnianli.
the class FileRecoveryMessageHandler method handleMessage.
@Override
public void handleMessage(BaseMessage baseMessage, ResponseWriter<BaseResponse> writer) {
FileRecoveryMessage message = ProtoStuffUtils.deserialize(baseMessage.getBody(), FileRecoveryMessage.class);
if (message == null) {
LOG.error("decode recover message error");
writer.write(new BaseResponse(ResponseCode.ERROR_PROTOCOL));
return;
}
String filePath = null;
try {
filePath = context.getConcreteFilePath(message.getFilePath());
LOG.info("starting recover file[{}]", filePath);
Pair<RecordFileWriter, WriteWorker> binding = writerManager.getBinding(filePath, false);
if (binding == null) {
writer.write(new BaseResponse(ResponseCode.ERROR));
return;
}
binding.first().position(fileFormater.absoluteOffset(message.getOffset()));
byte[] bytes = null;
for (String stateString : message.getSources()) {
FileObjectSyncState state = SyncStateCodec.fromString(stateString);
Service service = serviceManager.getServiceById(state.getServiceGroup(), state.getServiceId());
if (service == null) {
LOG.error("can not get service with[{}:{}]", state.getServiceGroup(), state.getServiceId());
continue;
}
DiskNodeClient client = null;
try {
LOG.info("get data from{} to recover...", service);
TcpClient<ReadObject, FileContentPart> readClient = clientGroup.createClient(new AsyncFileReaderCreateConfig() {
@Override
public SocketAddress remoteAddress() {
return new InetSocketAddress(service.getHost(), service.getExtraPort());
}
@Override
public int connectTimeoutMillis() {
return 3000;
}
@Override
public int maxPendingRead() {
return 0;
}
}, ForkJoinPool.commonPool());
client = new TcpDiskNodeClient(null, readClient);
long lackBytes = state.getFileLength() - message.getOffset();
CompletableFuture<byte[]> byteFuture = new CompletableFuture<byte[]>();
ByteArrayOutputStream output = new ByteArrayOutputStream();
client.readData(state.getFilePath(), message.getOffset(), (int) lackBytes, new ByteConsumer() {
@Override
public void error(Throwable e) {
byteFuture.completeExceptionally(e);
}
@Override
public void consume(byte[] bytes, boolean endOfConsume) {
try {
output.write(bytes);
if (endOfConsume) {
byteFuture.complete(output.toByteArray());
output.close();
}
} catch (Exception e) {
byteFuture.completeExceptionally(e);
}
}
});
bytes = byteFuture.get();
if (bytes != null) {
LOG.info("read bytes length[{}], require[{}]", bytes.length, lackBytes);
break;
}
} catch (Exception e) {
LOG.error("recover file[{}] error", filePath, e);
} finally {
CloseUtils.closeQuietly(client);
}
}
if (bytes == null) {
writer.write(new BaseResponse(ResponseCode.ERROR));
return;
}
int offset = 0;
int size = 0;
while ((size = FileDecoder.getOffsets(offset, bytes)) > 0) {
LOG.info("rewrite data[offset={}, size={}] to file[{}]", offset, size, filePath);
binding.first().write(bytes, offset, size);
offset += size;
size = 0;
}
if (offset != bytes.length) {
LOG.error("perhaps datas that being recoverd is not correct! get [{}], but recoverd[{}]", bytes.length, offset);
}
writer.write(new BaseResponse(ResponseCode.OK));
} catch (Exception e) {
LOG.error("recover file[{}] error", filePath, e);
writer.write(new BaseResponse(ResponseCode.ERROR));
}
}
use of com.bonree.brfs.common.net.tcp.file.client.FileContentPart in project BRFS by zhangnianli.
the class TcpDiskNodeClient method readFile.
@Override
public void readFile(String path, ByteConsumer consumer) throws IOException {
if (readClient == null) {
throw new UnsupportedOperationException("no read client is set");
}
ReadObject object = new ReadObject();
object.setFilePath(path);
object.setOffset(0);
object.setLength(Integer.MAX_VALUE);
object.setRaw(ReadObject.RAW_OFFSET);
try {
readClient.sendMessage(object, new ResponseHandler<FileContentPart>() {
@Override
public void handle(FileContentPart response) {
consumer.consume(response.content(), response.endOfContent());
}
@Override
public void error(Throwable t) {
consumer.error(t);
}
});
} catch (Exception e) {
throw new IOException("can not send read message", e);
}
}
use of com.bonree.brfs.common.net.tcp.file.client.FileContentPart in project BRFS by zhangnianli.
the class ConnectionPool method getConnection.
@SuppressWarnings("unchecked")
public TcpClient<ReadObject, FileContentPart> getConnection(Service service) {
TcpClient<ReadObject, FileContentPart>[] clients = clientCache.get(service.getServiceId());
TcpClient<ReadObject, FileContentPart> client = null;
int index = random.nextInt(connectionPerRoute);
if (clients == null) {
clientCache.putIfAbsent(service.getServiceId(), (TcpClient<ReadObject, FileContentPart>[]) Array.newInstance(TcpClient.class, connectionPerRoute));
clients = clientCache.get(service.getServiceId());
}
client = clients[index];
if (client != null) {
return client;
}
synchronized (clients) {
if (clients[index] != null) {
return clients[index];
}
try {
client = group.createClient(new AsyncFileReaderCreateConfig() {
@Override
public SocketAddress remoteAddress() {
return new InetSocketAddress(service.getHost(), service.getExtraPort());
}
@Override
public int connectTimeoutMillis() {
return 3000;
}
@Override
public int maxPendingRead() {
return 1000 * 100;
}
});
if (client == null) {
return null;
}
client.setClientCloseListener(new TcpClientCloseListener() {
@Override
public void clientClosed() {
TcpClient<ReadObject, FileContentPart>[] clientArray = clientCache.get(service.getServiceId());
synchronized (clientArray) {
clientArray[index] = null;
}
}
});
clients[index] = client;
return client;
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
use of com.bonree.brfs.common.net.tcp.file.client.FileContentPart in project BRFS by zhangnianli.
the class TcpClientUtils method getClient.
public static TcpDiskNodeClient getClient(String host, int port, int export, int timeout) throws InterruptedException, IOException {
TcpClient<BaseMessage, BaseResponse> tcpClient = group.createClient(new TcpClientConfig() {
@Override
public SocketAddress remoteAddress() {
return new InetSocketAddress(host, port);
}
@Override
public int connectTimeoutMillis() {
return timeout;
}
});
TcpClient<ReadObject, FileContentPart> readerClient = group2.createClient(new AsyncFileReaderCreateConfig() {
@Override
public SocketAddress remoteAddress() {
return new InetSocketAddress(host, export);
}
@Override
public int connectTimeoutMillis() {
return timeout;
}
@Override
public int maxPendingRead() {
return 0;
}
});
return new TcpDiskNodeClient(tcpClient, readerClient);
}
Aggregations