Skip to content

Commit bfef4a7

Browse files
committed
Merge pull request #114 from lloydwatkin/dns-disco
DNS lookup of channel server
2 parents e8e4d62 + c758373 commit bfef4a7

File tree

4 files changed

+56
-14
lines changed

4 files changed

+56
-14
lines changed

pom.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
<groupId>org.buddycloud</groupId>
55
<artifactId>channelserver</artifactId>
66
<packaging>jar</packaging>
7-
<version>0.13.3-SNAPSHOT</version>
7+
<version>0.14.0</version>
88
<name>Buddycloud Java Server</name>
99
<scm>
1010
<url>https://github.com/buddycloud/buddycloud-server-java</url>
1111
</scm>
1212
<dependencies>
13+
<dependency>
14+
<groupId>org.xbill</groupId>
15+
<artifactId>dnsjava</artifactId>
16+
<version>2.1.6</version>
17+
</dependency>
1318
<dependency>
1419
<groupId>junit</groupId>
1520
<artifactId>junit</artifactId>
@@ -70,7 +75,7 @@
7075
<groupId>xmlunit</groupId>
7176
<artifactId>xmlunit</artifactId>
7277
<version>1.3</version>
73-
</dependency>
78+
</dependency>
7479
<dependency>
7580
<groupId>xpp3</groupId>
7681
<artifactId>xpp3</artifactId>
298 KB
Binary file not shown.

src/main/java/org/buddycloud/channelserver/packetprocessor/iq/IQProcessor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void process(IQ packet) throws Exception {
6060
try {
6161
processPacket(packet);
6262
} catch (Exception e) {
63-
if (true == packet.getType().toString().equals("result")) return;
63+
if (packet.getType().equals(IQ.Type.result) || packet.getType().equals(IQ.Type.error)) return;
6464
IQ reply = IQ.createResultIQ(packet);
6565
reply.setChildElement(packet.getChildElement().createCopy());
6666
reply.setType(Type.error);
@@ -101,7 +101,7 @@ private void processPacket(IQ packet) throws Exception,
101101
}
102102
logger.debug("Couldn't find processor for packet");
103103

104-
if (packet.getType() == IQ.Type.set || packet.getType() == IQ.Type.get) {
104+
if (packet.getType().equals(IQ.Type.set) || packet.getType().equals(IQ.Type.get)) {
105105

106106
IQ reply = IQ.createResultIQ(packet);
107107
reply.setChildElement(packet.getChildElement().createCopy());

src/main/java/org/buddycloud/channelserver/queue/FederatedQueueManager.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
import org.xmpp.packet.JID;
2020
import org.xmpp.packet.Packet;
2121
import org.xmpp.packet.PacketError;
22+
import org.xbill.DNS.SRVRecord;
23+
import org.xbill.DNS.Record;
24+
import org.xbill.DNS.Type;
25+
import org.xbill.DNS.Lookup;
26+
import org.xbill.DNS.TextParseException;
2227

2328
public class FederatedQueueManager {
2429
private static final Logger logger = Logger
@@ -32,6 +37,8 @@ public class FederatedQueueManager {
3237
public static final String IDENTITY_TYPE_CHANNELS = "channels";
3338
public static final String BUDDYCLOUD_SERVER = "buddycloud-server";
3439

40+
public static final String SRV_PREFIX = "_buddycloud-server._tcp.";
41+
3542
private int id = 1;
3643

3744
private final ChannelsEngine component;
@@ -51,7 +58,7 @@ public class FederatedQueueManager {
5158
public FederatedQueueManager(ChannelsEngine component, String localServer) {
5259
this.component = component;
5360
this.localServer = localServer;
54-
61+
5562
nodeMap.start();
5663
sentRemotePackets.start();
5764
}
@@ -63,9 +70,9 @@ private int getId() {
6370
}
6471

6572
public void process(Packet packet) throws ComponentException {
66-
73+
6774
logger.debug("Packet payload " + packet.toXML() + " going to federation.");
68-
75+
6976
String to = packet.getTo().toString();
7077

7178
String uniqueId = generateUniqueId(packet);
@@ -101,6 +108,7 @@ public void process(Packet packet) throws ComponentException {
101108
waitingStanzas.get(to).add(packet);
102109
logger.debug("Adding packet to waiting stanza list for " + to
103110
+ " (size " + waitingStanzas.get(to).size() + ")");
111+
attemptDnsDiscovery(to);
104112
} catch (Exception e) {
105113
logger.error(e);
106114
}
@@ -175,7 +183,7 @@ public void processDiscoItemsResponse(JID from, List<Element> items)
175183
public boolean isFederatedDiscoInfoRequest(String packetId) {
176184
return remoteServerInfoRequestIds.containsKey(packetId);
177185
}
178-
186+
179187
private void setDiscoveredServer(String server, String handler) {
180188
discoveredServers.put(server, handler);
181189
}
@@ -199,28 +207,53 @@ public void processDiscoInfoResponse(JID from, String id,
199207
sendFederatedRequests(originatingServer);
200208
}
201209
}
202-
210+
203211
if (remoteServerItemsToProcess.get(originatingServer) < 1) {
204212
if (!discoveredServers.containsKey(originatingServer)) {
205-
sendRemoteChannelServerNotFoundErrorResponses(originatingServer);
206-
remoteChannelDiscoveryStatus.put(originatingServer,
207-
NO_CHANNEL_SERVER);
208-
waitingStanzas.remove(originatingServer);
213+
sendRemoteChannelServerNotFoundErrorResponses(originatingServer);
214+
remoteChannelDiscoveryStatus.put(originatingServer,
215+
NO_CHANNEL_SERVER);
216+
waitingStanzas.remove(originatingServer);
209217
} else {
210218
remoteChannelDiscoveryStatus.put(originatingServer, DISCOVERED);
211219
}
212220
}
213221
}
214222

223+
private boolean attemptDnsDiscovery(String originatingServer) throws ComponentException {
224+
try {
225+
String query = SRV_PREFIX + originatingServer;
226+
Record[] records = new Lookup(query, Type.SRV).run();
227+
if ((null == records) || (0 == records.length)) {
228+
logger.debug("No appropriate DNS entry found for " + originatingServer);
229+
return false;
230+
}
231+
SRVRecord record = (SRVRecord) records[0];
232+
String targetServer = record.getTarget().toString(true);
233+
setDiscoveredServer(originatingServer, targetServer);
234+
logger.info("DNS discovery complete for buddycloud server @ "
235+
+ originatingServer + " (" + targetServer + ")");
236+
remoteChannelDiscoveryStatus.put(originatingServer, DISCOVERED);
237+
sendFederatedRequests(originatingServer);
238+
return true;
239+
} catch (TextParseException e) {
240+
logger.error(e);
241+
return false;
242+
}
243+
}
244+
215245
private void sendFederatedRequests(String originatingServer)
216246
throws ComponentException {
217247
String remoteServer = discoveredServers.get(originatingServer);
218248
List<Packet> packetsToSend = waitingStanzas.get(originatingServer);
219249
if (packetsToSend == null) {
250+
logger.trace("No queued federated packets to send to " + originatingServer);
220251
return;
221252
}
253+
logger.trace("Catching up on federated packet sending to " + originatingServer);
222254
for (Packet packet : packetsToSend) {
223255
packet.setTo(remoteServer);
256+
logger.trace(packet.toString());
224257
sendPacket(packet.createCopy());
225258
}
226259
waitingStanzas.remove(originatingServer);
@@ -261,6 +294,10 @@ public void passResponseToRequester(IQ packet) throws Exception {
261294
+ packet.getID() + ")");
262295
}
263296

297+
if (packet.getType().equals(IQ.Type.error) && !remoteChannelDiscoveryStatus.get(packet.getFrom()).equals(DISCOVERED)) {
298+
return;
299+
}
300+
264301
String uniqueId = packet.getID();
265302
packet.setID(idMap.get(uniqueId));
266303
packet.setTo((JID) sentRemotePackets.get(uniqueId));
@@ -270,7 +307,7 @@ public void passResponseToRequester(IQ packet) throws Exception {
270307

271308
component.sendPacket(packet);
272309
}
273-
310+
274311
public String getRelatedNodeForRemotePacket(IQ packet) {
275312
String id = null;
276313
if (nodeMap.containsKey(packet.getID())) {

0 commit comments

Comments
 (0)