package org.apache.jxtadoop.hdfs.p2p; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Vector; import javax.security.auth.login.LoginException; import org.apache.jxtadoop.security.UserGroupInformation; import net.jxta.discovery.DiscoveryEvent; import net.jxta.discovery.DiscoveryListener; import net.jxta.discovery.DiscoveryService; import net.jxta.document.Advertisement; import net.jxta.document.MimeMediaType; import net.jxta.exception.PeerGroupException; import net.jxta.id.ID; import net.jxta.impl.document.LiteXMLElement; import net.jxta.impl.protocol.PeerAdv; import net.jxta.platform.NetworkManager; import net.jxta.protocol.DiscoveryResponseMsg; import net.jxta.protocol.PeerAdvertisement; public class P2PClientPeer extends Peer implements DiscoveryListener { protected List<PeerAdvertisement> datanodes; protected List<PeerAdvertisement> namenodes; protected List<Advertisement> advertisements; public P2PClientPeer(String s) { super(s,"p2pclient"); datanodes = new ArrayList<PeerAdvertisement>(); namenodes = new ArrayList<PeerAdvertisement>(); advertisements = new ArrayList<Advertisement>(); } @Override public void setupNetworking() throws LoginException, IOException, javax.security.cert.CertificateException, PeerGroupException { Boolean useMulticast = new Boolean(pc.get("hadoop.p2p.use.multicast")); nm = new NetworkManager(NetworkManager.ConfigMode.EDGE, UserGroupInformation.login(pc).getUserName()+"P2P Client Peer",p2pdir.toURI()); nm.setConfigPersistent(false); nc = nm.getConfigurator(); nc.setTcpPort(Integer.parseInt(pc.get("hadoop.p2p.p2pclient.port", P2PConstants.P2PCLIENTPORT))); nc.setTcpEnabled(true); nc.setTcpIncoming(true); nc.setTcpOutgoing(true); nc.setHttpEnabled(false); nc.setHttp2Enabled(false); nc.setTcpStartPort(-1); nc.setTcpEndPort(-1); // nc.setUseMulticast(Boolean.getBoolean(pc.get("hadoop.p2p.use.multicast"))); if(!useMulticast) { nc.setUseMulticast(true); } else { nc.setUseMulticast(true); } nc.setPeerID(pid); nc.setName(P2PConstants.P2PCLIENTTAG+" - "+nc.getName()); nc.setKeyStoreLocation(KeyStoreFile.toURI()); nc.setPassword(p2ppass); nc.clearRendezvousSeeds(); nc.addSeedRendezvous(URI.create(pc.get("hadoop.p2p.rpc.rdv"))); // nc.setUseOnlyRendezvousSeeds(true); if(!useMulticast) { nc.setUseOnlyRendezvousSeeds(true); } else { nc.setUseOnlyRendezvousSeeds(false); } nc.clearRelaySeeds(); nc.addSeedRelay(URI.create(pc.get("hadoop.p2p.rpc.relay"))); // nc.setUseOnlyRelaySeeds(true); if(!useMulticast) { nc.setUseOnlyRelaySeeds(true); } else { nc.setUseOnlyRelaySeeds(false); } } public void startNetworking() throws PeerGroupException, IOException { npg = nm.startNetwork(); npg.getRendezVousService().setAutoStart(false); while(!nm.isStarted()) { try { Thread.sleep(1000); } catch (InterruptedException e) {} } if(!nm.waitForRendezvousConnection(3000)) throw(new IOException("Failed to contact the Rendez-Vous")); ds = npg.getDiscoveryService(); } public void stop() { if(nm!=null) nm.stopNetwork(); } public void discoverNamenodes() { try { ds.getRemoteAdvertisements(null, DiscoveryService.PEER, "Name", "*Namenode Peer*", 1,this); } catch(Exception e) { LOG.error(e.getMessage()); } LOG.debug("Sleeping for "+P2PConstants.DISCOTIME+" seconds for discovery to complete"); try { Thread.sleep(P2PConstants.DISCOTIME); } catch (InterruptedException e) {} if(namenodes!=null) { System.out.println("Found "+namenodes.size()+" namenode(s) in the cloud - Details :"); while(namenodes.size()>0) { System.out.println("\tPID : "+((PeerAdvertisement)namenodes.remove(0)).getPeerID()); } } } public void discoverDatanodes() { try { ds.getRemoteAdvertisements(null, DiscoveryService.PEER, "Name", "*Datanode Peer*", P2PConstants.MAXCLOUDPEERCOUNT,this); } catch(Exception e) { LOG.error(e.getMessage()); } LOG.debug("Sleeping for "+P2PConstants.DISCOTIME+" seconds for discovery to complete"); try { Thread.sleep(P2PConstants.DISCOTIME); } catch (InterruptedException e) {} System.out.print("Found "+datanodes.size()+" datanode(s) in the cloud"); if(datanodes.size() > 0) System.out.print(" - Details :"); System.out.print("\n"); while(datanodes.size()>0) { System.out.println("\tPID : "+((PeerAdvertisement)datanodes.remove(0)).getPeerID()); } } public void discoverAdvertisements() { try { ds.getRemoteAdvertisements(null, DiscoveryService.ADV, null, null, P2PConstants.MAXADVDISCOVERYCOUNT,this); } catch(Exception e) { LOG.error(e.getMessage()); } LOG.debug("Sleeping for "+P2PConstants.DISCOTIME+" seconds for discovery to complete"); try { Thread.sleep(P2PConstants.DISCOTIME); } catch (InterruptedException e) {} System.out.print("Found "+advertisements.size()+" advertisement(s) in the cloud"); if(advertisements.size() > 0) System.out.print(" - Details :"); System.out.print("\n"); while(advertisements.size()>0) { System.out.println("---------------------------------------------------------------"); System.out.println(((Advertisement)advertisements.remove(0)).getDocument(MimeMediaType.TEXTUTF8)); } } public void discoverNode(String peerid) { try { ds.getRemoteAdvertisements(null, DiscoveryService.PEER, "PID", peerid, 1,this); } catch(Exception e) { LOG.error(e.getMessage()); } LOG.debug("Sleeping for "+P2PConstants.DISCOTIME+" seconds for discovery to complete"); try { Thread.sleep(P2PConstants.DISCOTIME); } catch (InterruptedException e) {} if (datanodes.size() == 0) System.err.println("Datanode "+peerid+" not found"); else { PeerAdvertisement peerAdv = (PeerAdvertisement)datanodes.remove(0); String output = "Node Peer ID : " + peerid; output += "\n Name\t: "+peerAdv.getName(); output += "\n Desc\t: "+peerAdv.getDescription(); output += "\n Peer Group ID : " + peerAdv.getPeerGroupID(); try { ID nmcid = ID.create(new URI("urn:jxta:uuid-DEADBEEFDEAFBABAFEEDBABE0000000805")); LiteXMLElement lxel = (LiteXMLElement)peerAdv.getServiceParam(nmcid); Vector<LiteXMLElement> eas = new Vector<LiteXMLElement>(); findDST(lxel,eas); while(eas.size() > 0) { String tcp = ((LiteXMLElement)eas.remove(0)).getValue(); if(tcp.startsWith("tcp://")) output += "\n Endpoint : "+tcp; } } catch (URISyntaxException e) { } System.out.print(output); } } private void findDST(LiteXMLElement l, Vector<LiteXMLElement> v) { Enumeration<LiteXMLElement> d = l.getChildren(); if("Dst".equals(l.getName())) { while(d.hasMoreElements()) { LiteXMLElement i = (LiteXMLElement)d.nextElement(); Enumeration<LiteXMLElement> e = i.getChildren(); while(e.hasMoreElements()) v.add(e.nextElement()); } } while (d.hasMoreElements()) { findDST(d.nextElement(),v); } } @Override public void discoveryEvent(DiscoveryEvent event) { DiscoveryResponseMsg response = event.getResponse(); if (response.getDiscoveryType() == DiscoveryService.PEER) { Enumeration<Advertisement> en = response.getAdvertisements(); PeerAdv adv; while (en.hasMoreElements()) { adv = (PeerAdv) en.nextElement(); if (adv instanceof PeerAdv) { if ((adv.getName()).contains("Datanode Peer")) { datanodes.add(adv); } else if ((adv.getName()).contains("Namenode Peer")) { namenodes.add(adv); } } } } else if (response.getDiscoveryType() == DiscoveryService.ADV) { Enumeration<Advertisement> en = response.getAdvertisements(); Advertisement adv; while (en.hasMoreElements()) { adv = (Advertisement) en.nextElement(); if (adv instanceof Advertisement) { advertisements.add(adv); } } } } }