use of herddb.proto.Pdu in project herddb by diennea.
the class NetworkChannelTest method test.
@Test
public void test() throws Exception {
try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
acceptor.setEnableJVMNetwork(false);
acceptor.setAcceptor((Channel channel) -> {
channel.setMessagesReceiver(new ChannelEventListener() {
@Override
public void requestReceived(Pdu message, Channel channel) {
ByteBuf msg = buildAckResponse(message);
channel.sendReplyMessage(message.messageId, msg);
message.close();
}
@Override
public void channelClosed(Channel channel) {
}
});
return (ServerSideConnection) () -> new Random().nextLong();
});
acceptor.start();
ExecutorService executor = Executors.newCachedThreadPool();
try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {
@Override
public void channelClosed(Channel channel) {
System.out.println("client channelClosed");
}
}, executor, new NioEventLoopGroup(10, executor))) {
for (int i = 0; i < 100; i++) {
ByteBuf buffer = buildAckRequest(i);
try (Pdu result = client.sendMessageWithPduReply(i, Unpooled.wrappedBuffer(buffer), 10000)) {
assertEquals(Pdu.TYPE_ACK, result.type);
}
}
} finally {
executor.shutdown();
}
}
if (NetworkUtils.isEnableEpoolNative()) {
try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
acceptor.setEnableJVMNetwork(false);
acceptor.setAcceptor((Channel channel) -> {
channel.setMessagesReceiver(new ChannelEventListener() {
@Override
public void requestReceived(Pdu message, Channel channel) {
ByteBuf msg = buildAckResponse(message);
channel.sendReplyMessage(message.messageId, msg);
message.close();
}
@Override
public void channelClosed(Channel channel) {
}
});
return (ServerSideConnection) () -> new Random().nextLong();
});
acceptor.start();
ExecutorService executor = Executors.newCachedThreadPool();
try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {
@Override
public void channelClosed(Channel channel) {
System.out.println("client channelClosed");
}
}, executor, new EpollEventLoopGroup(10, executor))) {
for (int i = 0; i < 100; i++) {
ByteBuf buffer = buildAckRequest(i);
try (Pdu result = client.sendMessageWithPduReply(i, Unpooled.wrappedBuffer(buffer), 10000)) {
assertEquals(Pdu.TYPE_ACK, result.type);
}
}
} finally {
executor.shutdown();
}
}
}
}
use of herddb.proto.Pdu in project herddb by diennea.
the class NetworkChannelTest method testServerPushesData.
@Test
public void testServerPushesData() throws Exception {
try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor("localhost", NetworkUtils.assignFirstFreePort(), true)) {
acceptor.setEnableJVMNetwork(false);
acceptor.setEnableRealNetwork(true);
acceptor.setAcceptor((Channel channel) -> {
channel.setMessagesReceiver(new ChannelEventListener() {
@Override
public void requestReceived(Pdu message, Channel channel) {
try {
ByteBuf msg = buildAckResponse(message);
// send a message to the client
ByteBuf buffer = buildAckRequest(900);
Pdu response = channel.sendMessageWithPduReply(900, buffer, 10000);
assertEquals(Pdu.TYPE_ACK, response.type);
// send the response to the client
channel.sendReplyMessage(message.messageId, msg);
message.close();
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (TimeoutException ex) {
ex.printStackTrace();
}
}
@Override
public void channelClosed(Channel channel) {
}
});
return (ServerSideConnection) () -> new Random().nextLong();
});
acceptor.start();
ExecutorService executor = Executors.newCachedThreadPool();
CopyOnWriteArrayList<Long> pushedMessagesFromServer = new CopyOnWriteArrayList<>();
try (Channel client = NettyConnector.connect(acceptor.getHost(), acceptor.getPort(), true, 0, 0, new ChannelEventListener() {
@Override
public void requestReceived(Pdu pdu, Channel channel) {
pushedMessagesFromServer.add(pdu.messageId);
assertTrue(pdu.isRequest());
ByteBuf msg = buildAckResponse(pdu);
// send the response to the server
channel.sendReplyMessage(pdu.messageId, msg);
pdu.close();
}
@Override
public void channelClosed(Channel channel) {
System.out.println("client channelClosed");
}
}, executor, new NioEventLoopGroup(10, executor))) {
ByteBuf buffer = buildAckRequest(134);
try (Pdu result = client.sendMessageWithPduReply(134, buffer, 10000)) {
assertEquals(Pdu.TYPE_ACK, result.type);
}
assertEquals(1, pushedMessagesFromServer.size());
} finally {
executor.shutdown();
}
}
}
use of herddb.proto.Pdu in project herddb by diennea.
the class RetryOnLeaderChangedTest method testSwitchLeaderAndAuthTimeout.
@Test
public void testSwitchLeaderAndAuthTimeout() throws Exception {
TestStatsProvider statsProvider = new TestStatsProvider();
ServerConfiguration serverconfig_1 = newServerConfigurationWithAutoPort(folder.newFolder().toPath());
serverconfig_1.set(ServerConfiguration.PROPERTY_NODEID, "server1");
serverconfig_1.set(ServerConfiguration.PROPERTY_MODE, ServerConfiguration.PROPERTY_MODE_CLUSTER);
serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_ADDRESS, testEnv.getAddress());
serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_PATH, testEnv.getPath());
serverconfig_1.set(ServerConfiguration.PROPERTY_ZOOKEEPER_SESSIONTIMEOUT, testEnv.getTimeout());
ServerConfiguration serverconfig_2 = serverconfig_1.copy().set(ServerConfiguration.PROPERTY_NODEID, "server2").set(ServerConfiguration.PROPERTY_BASEDIR, folder.newFolder().toPath().toAbsolutePath());
final AtomicBoolean suspendProcessing = new AtomicBoolean(false);
try (Server server_1 = new Server(serverconfig_1)) {
server_1.start();
server_1.waitForStandaloneBoot();
try (Server server_2 = new Server(serverconfig_2) {
@Override
protected ServerSideConnectionPeer buildPeer(Channel channel) {
return new ServerSideConnectionPeer(channel, this) {
@Override
public void requestReceived(Pdu message, Channel channel) {
if (suspendProcessing.get()) {
LOG.log(Level.INFO, "dropping message type " + message.type + " id " + message.messageId);
message.close();
return;
}
super.requestReceived(message, channel);
}
};
}
}) {
server_2.start();
TestUtils.execute(server_1.getManager(), "CREATE TABLESPACE 'ttt','leader:" + server_2.getNodeId() + "','expectedreplicacount:2'", Collections.emptyList());
// wait for server_2 to wake up
for (int i = 0; i < 40; i++) {
TableSpaceManager tableSpaceManager2 = server_2.getManager().getTableSpaceManager("ttt");
if (tableSpaceManager2 != null && tableSpaceManager2.isLeader()) {
break;
}
Thread.sleep(500);
}
assertTrue(server_2.getManager().getTableSpaceManager("ttt") != null && server_2.getManager().getTableSpaceManager("ttt").isLeader());
// wait for server_1 to announce as follower
waitClusterStatus(server_1.getManager(), server_1.getNodeId(), "follower");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.set(ClientConfiguration.PROPERTY_MODE, ClientConfiguration.PROPERTY_MODE_CLUSTER);
clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_ADDRESS, testEnv.getAddress());
clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_PATH, testEnv.getPath());
clientConfiguration.set(ClientConfiguration.PROPERTY_ZOOKEEPER_SESSIONTIMEOUT, testEnv.getTimeout());
clientConfiguration.set(ClientConfiguration.PROPERTY_MAX_CONNECTIONS_PER_SERVER, 2);
clientConfiguration.set(ClientConfiguration.PROPERTY_TIMEOUT, 2000);
StatsLogger logger = statsProvider.getStatsLogger("ds");
try (HDBClient client1 = new HDBClient(clientConfiguration, logger) {
@Override
public HDBConnection openConnection() {
HDBConnection con = new VisibleRouteHDBConnection(this);
registerConnection(con);
return con;
}
}) {
try (VisibleRouteHDBConnection connection = (VisibleRouteHDBConnection) client1.openConnection()) {
// create table and insert data
connection.executeUpdate(TableSpace.DEFAULT, "CREATE TABLE ttt.t1(k1 int primary key, n1 int)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList());
connection.executeUpdate(TableSpace.DEFAULT, "INSERT INTO ttt.t1(k1,n1) values(1,1)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList());
assertEquals("server2", connection.getRouteToTableSpace("ttt").getNodeId());
// change leader
switchLeader(server_1.getNodeId(), server_2.getNodeId(), server_1.getManager());
try (VisibleRouteHDBConnection connection2 = (VisibleRouteHDBConnection) client1.openConnection()) {
// connection routing still point to old leader (now follower)
assertEquals("server2", connection2.getRouteToTableSpace("ttt").getNodeId());
// suspend server_2 authentication
suspendProcessing.set(true);
// attempt an insert with old routing. Suspended autentication generates a timeout
// and routing will be reevaluated
assertEquals(1, connection2.executeUpdate(TableSpace.DEFAULT, "INSERT INTO ttt.t1(k1,n1) values(2,2)", TransactionContext.NOTRANSACTION_ID, false, false, Collections.emptyList()).updateCount);
// right routing to current master
assertEquals("server1", connection2.getRouteToTableSpace("ttt").getNodeId());
suspendProcessing.set(false);
}
}
}
}
}
}
use of herddb.proto.Pdu in project herddb by diennea.
the class LocalVMChannel method sendOneWayMessage.
@Override
public void sendOneWayMessage(ByteBuf message, SendResultCallback callback) {
if (isClosed()) {
ReferenceCountUtil.safeRelease(message);
callback.messageSent(new IOException("channel closed"));
return;
}
try {
Pdu pdu = PduCodec.decodePdu(message);
// execute server side code in this thread
serverSideChannel.directProcessPdu(pdu);
} catch (IOException ex) {
ReferenceCountUtil.safeRelease(message);
callback.messageSent(ex);
}
}
use of herddb.proto.Pdu in project herddb by diennea.
the class LocalChannelTest method testServerPushesData.
@Test
public void testServerPushesData() throws Exception {
InetSocketAddress addr = new InetSocketAddress("localhost", NetworkUtils.assignFirstFreePort());
try (NettyChannelAcceptor acceptor = new NettyChannelAcceptor(addr.getHostName(), addr.getPort(), true)) {
acceptor.setEnableRealNetwork(false);
acceptor.setAcceptor((Channel channel) -> {
channel.setMessagesReceiver(new ChannelEventListener() {
@Override
public void requestReceived(Pdu message, Channel channel) {
try {
ByteBuf msg = buildAckResponse(message);
// send a message to the client
ByteBuf buffer = buildAckRequest(900);
Pdu response = channel.sendMessageWithPduReply(900, buffer, 10000);
assertEquals(Pdu.TYPE_ACK, response.type);
// send the response to the client
channel.sendReplyMessage(message.messageId, msg);
message.close();
} catch (InterruptedException ex) {
ex.printStackTrace();
} catch (TimeoutException ex) {
ex.printStackTrace();
}
}
@Override
public void channelClosed(Channel channel) {
}
});
return (ServerSideConnection) () -> new Random().nextLong();
});
acceptor.start();
assertNotNull(LocalServerRegistry.getLocalServer(NetworkUtils.getAddress(addr), addr.getPort()));
ExecutorService executor = Executors.newCachedThreadPool();
CopyOnWriteArrayList<Long> pushedMessagesFromServer = new CopyOnWriteArrayList<>();
try (Channel client = NettyConnector.connect(addr.getHostName(), addr.getPort(), true, 0, 0, new ChannelEventListener() {
@Override
public void requestReceived(Pdu pdu, Channel channel) {
pushedMessagesFromServer.add(pdu.messageId);
assertTrue(pdu.isRequest());
ByteBuf msg = buildAckResponse(pdu);
// send the response to the server
channel.sendReplyMessage(pdu.messageId, msg);
pdu.close();
}
@Override
public void channelClosed(Channel channel) {
System.out.println("client channelClosed");
}
}, executor, null)) {
ByteBuf buffer = buildAckRequest(134);
try (Pdu result = client.sendMessageWithPduReply(134, buffer, 10000)) {
assertEquals(Pdu.TYPE_ACK, result.type);
}
assertEquals(1, pushedMessagesFromServer.size());
} finally {
executor.shutdown();
}
}
assertNull(LocalServerRegistry.getLocalServer(NetworkUtils.getAddress(addr), addr.getPort()));
}
Aggregations