You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ec...@apache.org on 2013/06/20 16:31:09 UTC

svn commit: r1495020 - in /accumulo/trunk: minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java server/src/main/java/org/apache/accumulo/server/ServerConstants.java test/src/main/java/org/apache/accumulo/test/VolumeTest.java

Author: ecn
Date: Thu Jun 20 14:31:09 2013
New Revision: 1495020

URL: http://svn.apache.org/r1495020
Log:
ACCUMULO-118 add unit test for multiple volumes

Added:
    accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java   (with props)
Modified:
    accumulo/trunk/minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java
    accumulo/trunk/server/src/main/java/org/apache/accumulo/server/ServerConstants.java

Modified: accumulo/trunk/minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java?rev=1495020&r1=1495019&r2=1495020&view=diff
==============================================================================
--- accumulo/trunk/minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java (original)
+++ accumulo/trunk/minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java Thu Jun 20 14:31:09 2013
@@ -32,6 +32,12 @@ import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.ZooKeeperInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.accumulo.core.util.Pair;
 import org.apache.accumulo.core.util.UtilWaitThread;
 import org.apache.accumulo.server.master.Master;
@@ -258,7 +264,7 @@ public class MiniAccumuloCluster {
 
     // sleep a little bit to let zookeeper come up before calling init, seems to work better
     UtilWaitThread.sleep(250);
-
+    
     Process initProcess = exec(Initialize.class, "--instance-name", config.getInstanceName(), "--password", config.getRootPassword(), "--username", "root");
     int ret = initProcess.waitFor();
     if (ret != 0) {
@@ -328,4 +334,9 @@ public class MiniAccumuloCluster {
   public MiniAccumuloConfig getConfig() {
     return config;
   }
+
+  public Connector getConnector(String user, String passwd) throws AccumuloException, AccumuloSecurityException {
+    Instance instance = new ZooKeeperInstance(this.getInstanceName(), this.getZooKeepers());
+    return instance.getConnector(user, new PasswordToken(passwd));
+  }
 }

Modified: accumulo/trunk/server/src/main/java/org/apache/accumulo/server/ServerConstants.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/server/src/main/java/org/apache/accumulo/server/ServerConstants.java?rev=1495020&r1=1495019&r2=1495020&view=diff
==============================================================================
--- accumulo/trunk/server/src/main/java/org/apache/accumulo/server/ServerConstants.java (original)
+++ accumulo/trunk/server/src/main/java/org/apache/accumulo/server/ServerConstants.java Thu Jun 20 14:31:09 2013
@@ -50,6 +50,8 @@ public class ServerConstants {
   }
   
   public static String[] prefix(String bases[], String suffix) {
+    if (suffix.startsWith("/"))
+      suffix = suffix.substring(1);
     String result[] = new String[bases.length];
     for (int i = 0; i < bases.length; i++) {
       result[i] = bases[i] + "/" + suffix;
@@ -74,11 +76,11 @@ public class ServerConstants {
   }
   
   public static Path getInstanceIdLocation() {
-    return new Path(getBaseDirs()[0] + "/instance_id");
+    return new Path(getBaseDirs()[0], "instance_id");
   }
   
   public static Path getDataVersionLocation() {
-    return new Path(getBaseDirs()[0] + "/version");
+    return new Path(getBaseDirs()[0], "version");
   }
   
   public static String[] getMetadataTableDirs() {

Added: accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java
URL: http://svn.apache.org/viewvc/accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java?rev=1495020&view=auto
==============================================================================
--- accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java (added)
+++ accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java Thu Jun 20 14:31:09 2013
@@ -0,0 +1,102 @@
+package org.apache.accumulo.test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import org.apache.accumulo.core.client.BatchWriter;
+import org.apache.accumulo.core.client.BatchWriterConfig;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Mutation;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.accumulo.core.util.MetadataTable;
+import org.apache.accumulo.minicluster.MiniAccumuloCluster;
+import org.apache.accumulo.minicluster.MiniAccumuloConfig;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.Text;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class VolumeTest {
+  
+  private static final Text EMPTY = new Text();
+  private static final Value EMPTY_VALUE = new Value(new byte[]{});
+  private static String secret = "superSecret";
+  public static TemporaryFolder folder = new TemporaryFolder();
+  public static MiniAccumuloCluster cluster;
+  public static Path v1;
+  public static Path v2;
+  
+  @BeforeClass
+  public static void setUpBeforeClass() throws Exception {
+    folder.create();
+    // Run MAC on two locations in the local file system
+    MiniAccumuloConfig cfg = new MiniAccumuloConfig(folder.newFolder("miniAccumulo"), secret);
+    Map<String,String> siteConfig = cfg.getSiteConfig();
+    v1 = new Path("file://" + folder.newFolder("v1").getAbsolutePath().toString());
+    v2 = new Path("file://" + folder.newFolder("v2").getAbsolutePath().toString());
+    siteConfig.put(Property.INSTANCE_VOLUMES.getKey(), v1.toString() + "," + v2.toString());
+    cfg.setSiteConfig(siteConfig);
+    cluster = new MiniAccumuloCluster(cfg);
+    cluster.start();
+  }
+  
+  @AfterClass
+  public static void tearDownAfterClass() throws Exception {
+    cluster.stop();
+    folder.delete();
+  }
+  
+  @Test
+  public void test() throws Exception {
+    // create a table
+    Connector connector = cluster.getConnector("root", secret);
+    String tableName = "test";
+    connector.tableOperations().create(tableName);
+    SortedSet<Text> partitions = new TreeSet<Text>();
+    // with some splits
+    for (String s : "d,m,t".split(","))
+      partitions.add(new Text(s));
+    connector.tableOperations().addSplits(tableName, partitions);
+    // scribble over the splits
+    BatchWriter bw = connector.createBatchWriter(tableName, new BatchWriterConfig());
+    String[] rows = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z".split(",");
+    for (String s : rows) {
+      Mutation m = new Mutation(new Text(s));
+      m.put(EMPTY, EMPTY, EMPTY_VALUE);
+      bw.addMutation(m);
+    }
+    bw.close();
+    // write the data to disk, read it back
+    connector.tableOperations().flush(tableName, null, null, true);
+    Scanner scanner = connector.createScanner(tableName, Authorizations.EMPTY);
+    int i = 0;
+    for (Entry<Key,Value> entry : scanner) {
+      assertEquals(rows[i++], entry.getKey().getRow().toString());
+    }
+    // verify the new files are written to the different volumes
+    scanner = connector.createScanner("!METADATA", Authorizations.EMPTY);
+    scanner.setRange(new Range("1", "1<"));
+    scanner.fetchColumnFamily(MetadataTable.DATAFILE_COLUMN_FAMILY);
+    int fileCount = 0;
+    for (Entry<Key,Value> entry : scanner) {
+      boolean inV1 = entry.getKey().getColumnQualifier().toString().contains(v1.toString());
+      boolean inV2 = entry.getKey().getColumnQualifier().toString().contains(v2.toString()); 
+      assertTrue(inV1 || inV2);
+      fileCount++;
+    }
+    assertEquals(4, fileCount);
+  }
+  
+}

Propchange: accumulo/trunk/test/src/main/java/org/apache/accumulo/test/VolumeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native