Return-Path: Delivered-To: apmail-lucene-hadoop-commits-archive@locus.apache.org Received: (qmail 12990 invoked from network); 4 Mar 2006 20:47:26 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 4 Mar 2006 20:47:26 -0000 Received: (qmail 73580 invoked by uid 500); 4 Mar 2006 20:48:12 -0000 Delivered-To: apmail-lucene-hadoop-commits-archive@lucene.apache.org Received: (qmail 73544 invoked by uid 500); 4 Mar 2006 20:48:12 -0000 Mailing-List: contact hadoop-commits-help@lucene.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: hadoop-dev@lucene.apache.org Delivered-To: mailing list hadoop-commits@lucene.apache.org Received: (qmail 73535 invoked by uid 99); 4 Mar 2006 20:48:12 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 04 Mar 2006 12:48:12 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 04 Mar 2006 12:48:11 -0800 Received: (qmail 12937 invoked by uid 65534); 4 Mar 2006 20:47:04 -0000 Message-ID: <20060304204704.12935.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r383197 - /lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java Date: Sat, 04 Mar 2006 20:47:03 -0000 To: hadoop-commits@lucene.apache.org From: mc@apache.org X-Mailer: svnmailer-1.0.7 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: mc Date: Sat Mar 4 12:47:01 2006 New Revision: 383197 URL: http://svn.apache.org/viewcvs?rev=383197&view=rev Log: This code makes sure we read from a local block, if available. I thought this code had already been committed some time ago, but the workspace doesn't have it. Modified: lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java Modified: lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java URL: http://svn.apache.org/viewcvs/lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java?rev=383197&r1=383196&r2=383197&view=diff ============================================================================== --- lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java (original) +++ lucene/hadoop/trunk/src/java/org/apache/hadoop/dfs/DFSClient.java Sat Mar 4 12:47:01 2006 @@ -42,6 +42,7 @@ public static final Logger LOG = LogFormatter.getLogger("org.apache.hadoop.fs.DFSClient"); static int MAX_BLOCK_ACQUIRE_FAILURES = 10; ClientProtocol namenode; + String localName; boolean running = true; Random r = new Random(); String clientName; @@ -53,6 +54,11 @@ */ public DFSClient(InetSocketAddress nameNodeAddr, Configuration conf) { this.namenode = (ClientProtocol) RPC.getProxy(ClientProtocol.class, nameNodeAddr, conf); + try { + this.localName = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException uhe) { + this.localName = ""; + } this.clientName = "DFSClient_" + r.nextInt(); this.leaseChecker = new Daemon(new LeaseChecker()); this.leaseChecker.start(); @@ -188,8 +194,8 @@ } /** - * Pick the best/closest node which to stream the data. - * For now, just pick the first on the list. + * Pick the best node from which to stream the data. + * That's the local one, if available. */ private DatanodeInfo bestNode(DatanodeInfo nodes[], TreeSet deadNodes) throws IOException { if ((nodes == null) || @@ -197,9 +203,25 @@ throw new IOException("No live nodes contain current block"); } DatanodeInfo chosenNode = null; - do { - chosenNode = nodes[Math.abs(r.nextInt()) % nodes.length]; - } while (deadNodes.contains(chosenNode)); + for (int i = 0; i < nodes.length; i++) { + if (deadNodes.contains(nodes[i])) { + continue; + } + String nodename = nodes[i].getName().toString(); + int colon = nodename.indexOf(':'); + if (colon >= 0) { + nodename = nodename.substring(0, colon); + } + if (localName.equals(nodename)) { + chosenNode = nodes[i]; + break; + } + } + if (chosenNode == null) { + do { + chosenNode = nodes[Math.abs(r.nextInt()) % nodes.length]; + } while (deadNodes.contains(chosenNode)); + } return chosenNode; }