Skip to content

Commit

Permalink
WFLY-5449 Custom socket factory for JGroups subsystem not set correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
pferraro committed Oct 20, 2015
1 parent 1cb1076 commit ab5b435
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 146 deletions.
Expand Up @@ -59,7 +59,6 @@
import org.jgroups.stack.Configurator;
import org.jgroups.stack.Protocol;
import org.jgroups.stack.ProtocolStack;
import org.jgroups.util.SocketFactory;
import org.wildfly.clustering.jgroups.spi.ChannelFactory;
import org.wildfly.clustering.jgroups.spi.ProtocolConfiguration;
import org.wildfly.clustering.jgroups.spi.ProtocolStackConfiguration;
Expand Down Expand Up @@ -100,15 +99,10 @@ public JChannel run() throws Exception {
final JChannel channel = WildFlySecurityManager.doChecked(action);
ProtocolStack stack = channel.getProtocolStack();

// We need to synchronize on shared transport,
// so we don't attempt to init a shared transport multiple times
TP transport = stack.getTransport();
if (transport.isSingleton()) {
synchronized (transport) {
this.init(transport);
}
} else {
this.init(transport);
TransportConfiguration transportConfig = this.configuration.getTransport();
SocketBinding binding = transportConfig.getSocketBinding();
if (binding != null) {
channel.setSocketFactory(new ManagedSocketFactory(binding.getSocketBindings()));
}

// Relay protocol is added to stack programmatically, not via ProtocolStackConfigurator
Expand Down Expand Up @@ -201,17 +195,6 @@ public boolean isUnknownForkResponse(ByteBuffer buffer) {
return UNKNOWN_FORK_RESPONSE.equals(buffer);
}

private void init(TP transport) {
TransportConfiguration transportConfig = this.configuration.getTransport();
SocketBinding binding = transportConfig.getSocketBinding();
if (binding != null) {
SocketFactory factory = transport.getSocketFactory();
if (!(factory instanceof ManagedSocketFactory)) {
transport.setSocketFactory(new ManagedSocketFactory(factory, binding.getSocketBindings()));
}
}
}

/**
* {@inheritDoc}
* @see org.jgroups.conf.ProtocolStackConfigurator#getProtocolStackString()
Expand Down
Expand Up @@ -24,6 +24,7 @@
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.net.Socket;
Expand All @@ -40,140 +41,115 @@
*/
public class ManagedSocketFactory implements SocketFactory {

private final SocketFactory factory;
private final SocketBindingManager manager;

public ManagedSocketFactory(SocketFactory factory, SocketBindingManager manager) {
this.factory = factory;
public ManagedSocketFactory(SocketBindingManager manager) {
this.manager = manager;
}

@Override
public Socket createSocket(String name) throws IOException {
return this.register(this.factory.createSocket(name));
return this.manager.getSocketFactory().createSocket(name);
}

@Override
public Socket createSocket(String name, String host, int port) throws IOException {
return this.register(this.factory.createSocket(name, host, port));
return this.manager.getSocketFactory().createSocket(name, host, port);
}

@Override
public Socket createSocket(String name, InetAddress address, int port) throws IOException {
return this.register(this.factory.createSocket(name, address, port));
return this.manager.getSocketFactory().createSocket(name, address, port);
}

@Override
public Socket createSocket(String name, String host, int port, InetAddress localAddress, int localPort) throws IOException {
return this.register(this.factory.createSocket(name, host, port, localAddress, localPort));
public Socket createSocket(String name, String host, int port, InetAddress localHost, int localPort) throws IOException {
return this.manager.getSocketFactory().createSocket(name, host, port, localHost, localPort);
}

@Override
public Socket createSocket(String name, InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return this.register(this.factory.createSocket(name, address, port, localAddress, localPort));
}

private Socket register(final Socket socket) {
this.manager.getUnnamedRegistry().registerSocket(socket);
return socket;
return this.manager.getSocketFactory().createSocket(name, address, port, localAddress, localPort);
}

@Override
public ServerSocket createServerSocket(String name) throws IOException {
return this.register(this.factory.createServerSocket(name));
return this.manager.getServerSocketFactory().createServerSocket(name);
}

@Override
public ServerSocket createServerSocket(String name, int port) throws IOException {
return this.register(this.factory.createServerSocket(name, port));
return this.manager.getServerSocketFactory().createServerSocket(name, port);
}

@Override
public ServerSocket createServerSocket(String name, int port, int backlog) throws IOException {
return this.register(this.factory.createServerSocket(name, port, backlog));
return this.manager.getServerSocketFactory().createServerSocket(name, port, backlog);
}

@Override
public ServerSocket createServerSocket(String name, int port, int backlog, InetAddress bindAddr) throws IOException {
return this.register(this.factory.createServerSocket(name, port, backlog, bindAddr));
}

private ServerSocket register(final ServerSocket socket) {
this.manager.getUnnamedRegistry().registerSocket(socket);
return socket;
public ServerSocket createServerSocket(String name, int port, int backlog, InetAddress ifAddress) throws IOException {
return this.manager.getServerSocketFactory().createServerSocket(name, port, backlog, ifAddress);
}

@Override
public DatagramSocket createDatagramSocket(String name) throws SocketException {
return this.register(this.factory.createDatagramSocket(name));
return this.createDatagramSocket(name, 0);
}

@Override
public DatagramSocket createDatagramSocket(String name, SocketAddress bindAddress) throws SocketException {
return this.register(this.factory.createDatagramSocket(name, bindAddress));
public DatagramSocket createDatagramSocket(String name, SocketAddress address) throws SocketException {
return this.manager.createDatagramSocket(name, address);
}

@Override
public DatagramSocket createDatagramSocket(String name, int port) throws SocketException {
return this.register(this.factory.createDatagramSocket(name, port));
return this.createDatagramSocket(name, new InetSocketAddress(port));
}

@Override
public DatagramSocket createDatagramSocket(String name, int port, InetAddress localAddress) throws SocketException {
return this.register(this.factory.createDatagramSocket(name, port, localAddress));
}

private DatagramSocket register(final DatagramSocket socket) {
this.manager.getUnnamedRegistry().registerSocket(socket);
return socket;
public DatagramSocket createDatagramSocket(String name, int port, InetAddress address) throws SocketException {
return this.createDatagramSocket(name, new InetSocketAddress(address, port));
}

@Override
public MulticastSocket createMulticastSocket(String name) throws IOException {
return this.register(this.factory.createMulticastSocket(name));
return this.createMulticastSocket(name, 0);
}

@Override
public MulticastSocket createMulticastSocket(String name, int port) throws IOException {
return this.register(this.factory.createMulticastSocket(name, port));
return this.createMulticastSocket(name, new InetSocketAddress(port));
}

@Override
public MulticastSocket createMulticastSocket(String name, SocketAddress bindAddress) throws IOException {
return this.register(this.factory.createMulticastSocket(name, bindAddress));
}

private MulticastSocket register(final MulticastSocket socket) {
this.manager.getUnnamedRegistry().registerSocket(socket);
return socket;
public MulticastSocket createMulticastSocket(String name, SocketAddress address) throws IOException {
return this.manager.createMulticastSocket(name, address);
}

@Override
public void close(Socket socket) throws IOException {
if (socket != null) {
this.manager.getUnnamedRegistry().unregisterSocket(socket);
this.factory.close(socket);
socket.close();
}
}

@Override
public void close(ServerSocket socket) throws IOException {
if (socket != null) {
this.manager.getUnnamedRegistry().unregisterSocket(socket);
this.factory.close(socket);
socket.close();
}
}

@Override
public void close(DatagramSocket socket) {
if (socket != null) {
this.manager.getUnnamedRegistry().unregisterSocket(socket);
this.factory.close(socket);
socket.close();
}
}

@Override
public Map<Object, String> getSockets() {
return this.factory.getSockets();
return null;
}
}

0 comments on commit ab5b435

Please sign in to comment.