Search in sources :

Example 1 with ZooKeeperBindException

use of org.apache.accumulo.minicluster.impl.ZooKeeperBindException in project accumulo by apache.

the class ConfigurableMacBase method setUp.

@Before
public void setUp() throws Exception {
    createMiniAccumulo();
    Exception lastException = null;
    for (int i = 0; i < 3; i++) {
        try {
            cluster.start();
            return;
        } catch (ZooKeeperBindException e) {
            lastException = e;
            log.warn("Failed to start MiniAccumuloCluster, assumably due to ZooKeeper issues", lastException);
            Thread.sleep(3000);
            createMiniAccumulo();
        }
    }
    throw new RuntimeException("Failed to start MiniAccumuloCluster after three attempts", lastException);
}
Also used : ZooKeeperBindException(org.apache.accumulo.minicluster.impl.ZooKeeperBindException) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) KeeperException(org.apache.zookeeper.KeeperException) IOException(java.io.IOException) AccumuloException(org.apache.accumulo.core.client.AccumuloException) ZooKeeperBindException(org.apache.accumulo.minicluster.impl.ZooKeeperBindException) Before(org.junit.Before)

Example 2 with ZooKeeperBindException

use of org.apache.accumulo.minicluster.impl.ZooKeeperBindException in project accumulo by apache.

the class CyclicReplicationIT method dataIsNotOverReplicated.

@Test
public void dataIsNotOverReplicated() throws Exception {
    File master1Dir = createTestDir("master1"), master2Dir = createTestDir("master2");
    String password = "password";
    MiniAccumuloConfigImpl master1Cfg;
    MiniAccumuloClusterImpl master1Cluster;
    while (true) {
        master1Cfg = new MiniAccumuloConfigImpl(master1Dir, password);
        master1Cfg.setNumTservers(1);
        master1Cfg.setInstanceName("master1");
        // Set up SSL if needed
        ConfigurableMacBase.configureForEnvironment(master1Cfg, this.getClass(), ConfigurableMacBase.getSslDir(master1Dir));
        master1Cfg.setProperty(Property.REPLICATION_NAME, master1Cfg.getInstanceName());
        master1Cfg.setProperty(Property.TSERV_WALOG_MAX_SIZE, "5M");
        master1Cfg.setProperty(Property.REPLICATION_THREADCHECK, "5m");
        master1Cfg.setProperty(Property.REPLICATION_WORK_ASSIGNMENT_SLEEP, "1s");
        master1Cfg.setProperty(Property.MASTER_REPLICATION_SCAN_INTERVAL, "1s");
        master1Cluster = new MiniAccumuloClusterImpl(master1Cfg);
        setCoreSite(master1Cluster);
        try {
            master1Cluster.start();
            break;
        } catch (ZooKeeperBindException e) {
            log.warn("Failed to start ZooKeeper on {}, will retry", master1Cfg.getZooKeeperPort());
        }
    }
    MiniAccumuloConfigImpl master2Cfg;
    MiniAccumuloClusterImpl master2Cluster;
    while (true) {
        master2Cfg = new MiniAccumuloConfigImpl(master2Dir, password);
        master2Cfg.setNumTservers(1);
        master2Cfg.setInstanceName("master2");
        // Set up SSL if needed. Need to share the same SSL truststore as master1
        this.updatePeerConfigFromPrimary(master1Cfg, master2Cfg);
        master2Cfg.setProperty(Property.REPLICATION_NAME, master2Cfg.getInstanceName());
        master2Cfg.setProperty(Property.TSERV_WALOG_MAX_SIZE, "5M");
        master2Cfg.setProperty(Property.REPLICATION_THREADCHECK, "5m");
        master2Cfg.setProperty(Property.REPLICATION_WORK_ASSIGNMENT_SLEEP, "1s");
        master2Cfg.setProperty(Property.MASTER_REPLICATION_SCAN_INTERVAL, "1s");
        master2Cluster = new MiniAccumuloClusterImpl(master2Cfg);
        setCoreSite(master2Cluster);
        try {
            master2Cluster.start();
            break;
        } catch (ZooKeeperBindException e) {
            log.warn("Failed to start ZooKeeper on {}, will retry", master2Cfg.getZooKeeperPort());
        }
    }
    try {
        Connector connMaster1 = master1Cluster.getConnector("root", new PasswordToken(password)), connMaster2 = master2Cluster.getConnector("root", new PasswordToken(password));
        String master1UserName = "master1", master1Password = "foo";
        String master2UserName = "master2", master2Password = "bar";
        String master1Table = master1Cluster.getInstanceName(), master2Table = master2Cluster.getInstanceName();
        connMaster1.securityOperations().createLocalUser(master1UserName, new PasswordToken(master1Password));
        connMaster2.securityOperations().createLocalUser(master2UserName, new PasswordToken(master2Password));
        // Configure the credentials we should use to authenticate ourselves to the peer for replication
        connMaster1.instanceOperations().setProperty(Property.REPLICATION_PEER_USER.getKey() + master2Cluster.getInstanceName(), master2UserName);
        connMaster1.instanceOperations().setProperty(Property.REPLICATION_PEER_PASSWORD.getKey() + master2Cluster.getInstanceName(), master2Password);
        connMaster2.instanceOperations().setProperty(Property.REPLICATION_PEER_USER.getKey() + master1Cluster.getInstanceName(), master1UserName);
        connMaster2.instanceOperations().setProperty(Property.REPLICATION_PEER_PASSWORD.getKey() + master1Cluster.getInstanceName(), master1Password);
        connMaster1.instanceOperations().setProperty(Property.REPLICATION_PEERS.getKey() + master2Cluster.getInstanceName(), ReplicaSystemFactory.getPeerConfigurationValue(AccumuloReplicaSystem.class, AccumuloReplicaSystem.buildConfiguration(master2Cluster.getInstanceName(), master2Cluster.getZooKeepers())));
        connMaster2.instanceOperations().setProperty(Property.REPLICATION_PEERS.getKey() + master1Cluster.getInstanceName(), ReplicaSystemFactory.getPeerConfigurationValue(AccumuloReplicaSystem.class, AccumuloReplicaSystem.buildConfiguration(master1Cluster.getInstanceName(), master1Cluster.getZooKeepers())));
        connMaster1.tableOperations().create(master1Table, new NewTableConfiguration().withoutDefaultIterators());
        String master1TableId = connMaster1.tableOperations().tableIdMap().get(master1Table);
        Assert.assertNotNull(master1TableId);
        connMaster2.tableOperations().create(master2Table, new NewTableConfiguration().withoutDefaultIterators());
        String master2TableId = connMaster2.tableOperations().tableIdMap().get(master2Table);
        Assert.assertNotNull(master2TableId);
        // Replicate master1 in the master1 cluster to master2 in the master2 cluster
        connMaster1.tableOperations().setProperty(master1Table, Property.TABLE_REPLICATION.getKey(), "true");
        connMaster1.tableOperations().setProperty(master1Table, Property.TABLE_REPLICATION_TARGET.getKey() + master2Cluster.getInstanceName(), master2TableId);
        // Replicate master2 in the master2 cluster to master1 in the master2 cluster
        connMaster2.tableOperations().setProperty(master2Table, Property.TABLE_REPLICATION.getKey(), "true");
        connMaster2.tableOperations().setProperty(master2Table, Property.TABLE_REPLICATION_TARGET.getKey() + master1Cluster.getInstanceName(), master1TableId);
        // Give our replication user the ability to write to the respective table
        connMaster1.securityOperations().grantTablePermission(master1UserName, master1Table, TablePermission.WRITE);
        connMaster2.securityOperations().grantTablePermission(master2UserName, master2Table, TablePermission.WRITE);
        IteratorSetting summingCombiner = new IteratorSetting(50, SummingCombiner.class);
        SummingCombiner.setEncodingType(summingCombiner, Type.STRING);
        SummingCombiner.setCombineAllColumns(summingCombiner, true);
        // Set a combiner on both instances that will sum multiple values
        // We can use this to verify that the mutation was not sent multiple times
        connMaster1.tableOperations().attachIterator(master1Table, summingCombiner);
        connMaster2.tableOperations().attachIterator(master2Table, summingCombiner);
        // Write a single entry
        BatchWriter bw = connMaster1.createBatchWriter(master1Table, new BatchWriterConfig());
        Mutation m = new Mutation("row");
        m.put("count", "", "1");
        bw.addMutation(m);
        bw.close();
        Set<String> files = connMaster1.replicationOperations().referencedFiles(master1Table);
        log.info("Found {} that need replication from master1", files);
        // Kill and restart the tserver to close the WAL on master1
        for (ProcessReference proc : master1Cluster.getProcesses().get(ServerType.TABLET_SERVER)) {
            master1Cluster.killProcess(ServerType.TABLET_SERVER, proc);
        }
        master1Cluster.exec(TabletServer.class);
        log.info("Restarted tserver on master1");
        // Try to avoid ACCUMULO-2964
        Thread.sleep(1000);
        // Sanity check that the element is there on master1
        Entry<Key, Value> entry;
        try (Scanner s = connMaster1.createScanner(master1Table, Authorizations.EMPTY)) {
            entry = Iterables.getOnlyElement(s);
            Assert.assertEquals("1", entry.getValue().toString());
            // Wait for this table to replicate
            connMaster1.replicationOperations().drain(master1Table, files);
            Thread.sleep(5000);
        }
        // Check that the element made it to master2 only once
        try (Scanner s = connMaster2.createScanner(master2Table, Authorizations.EMPTY)) {
            entry = Iterables.getOnlyElement(s);
            Assert.assertEquals("1", entry.getValue().toString());
            // Wait for master2 to finish replicating it back
            files = connMaster2.replicationOperations().referencedFiles(master2Table);
            // Kill and restart the tserver to close the WAL on master2
            for (ProcessReference proc : master2Cluster.getProcesses().get(ServerType.TABLET_SERVER)) {
                master2Cluster.killProcess(ServerType.TABLET_SERVER, proc);
            }
            master2Cluster.exec(TabletServer.class);
            // Try to avoid ACCUMULO-2964
            Thread.sleep(1000);
        }
        // Check that the element made it to master2 only once
        try (Scanner s = connMaster2.createScanner(master2Table, Authorizations.EMPTY)) {
            entry = Iterables.getOnlyElement(s);
            Assert.assertEquals("1", entry.getValue().toString());
            connMaster2.replicationOperations().drain(master2Table, files);
            Thread.sleep(5000);
        }
        // Verify that the entry wasn't sent back to master1
        try (Scanner s = connMaster1.createScanner(master1Table, Authorizations.EMPTY)) {
            entry = Iterables.getOnlyElement(s);
            Assert.assertEquals("1", entry.getValue().toString());
        }
    } finally {
        master1Cluster.stop();
        master2Cluster.stop();
    }
}
Also used : Connector(org.apache.accumulo.core.client.Connector) Scanner(org.apache.accumulo.core.client.Scanner) ProcessReference(org.apache.accumulo.minicluster.impl.ProcessReference) ZooKeeperBindException(org.apache.accumulo.minicluster.impl.ZooKeeperBindException) MiniAccumuloConfigImpl(org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl) PasswordToken(org.apache.accumulo.core.client.security.tokens.PasswordToken) IteratorSetting(org.apache.accumulo.core.client.IteratorSetting) NewTableConfiguration(org.apache.accumulo.core.client.admin.NewTableConfiguration) Value(org.apache.accumulo.core.data.Value) AccumuloReplicaSystem(org.apache.accumulo.tserver.replication.AccumuloReplicaSystem) BatchWriterConfig(org.apache.accumulo.core.client.BatchWriterConfig) BatchWriter(org.apache.accumulo.core.client.BatchWriter) Mutation(org.apache.accumulo.core.data.Mutation) MiniAccumuloClusterImpl(org.apache.accumulo.minicluster.impl.MiniAccumuloClusterImpl) File(java.io.File) Key(org.apache.accumulo.core.data.Key) Test(org.junit.Test)

Aggregations

ZooKeeperBindException (org.apache.accumulo.minicluster.impl.ZooKeeperBindException)2 File (java.io.File)1 IOException (java.io.IOException)1 AccumuloException (org.apache.accumulo.core.client.AccumuloException)1 AccumuloSecurityException (org.apache.accumulo.core.client.AccumuloSecurityException)1 BatchWriter (org.apache.accumulo.core.client.BatchWriter)1 BatchWriterConfig (org.apache.accumulo.core.client.BatchWriterConfig)1 Connector (org.apache.accumulo.core.client.Connector)1 IteratorSetting (org.apache.accumulo.core.client.IteratorSetting)1 Scanner (org.apache.accumulo.core.client.Scanner)1 NewTableConfiguration (org.apache.accumulo.core.client.admin.NewTableConfiguration)1 PasswordToken (org.apache.accumulo.core.client.security.tokens.PasswordToken)1 Key (org.apache.accumulo.core.data.Key)1 Mutation (org.apache.accumulo.core.data.Mutation)1 Value (org.apache.accumulo.core.data.Value)1 MiniAccumuloClusterImpl (org.apache.accumulo.minicluster.impl.MiniAccumuloClusterImpl)1 MiniAccumuloConfigImpl (org.apache.accumulo.minicluster.impl.MiniAccumuloConfigImpl)1 ProcessReference (org.apache.accumulo.minicluster.impl.ProcessReference)1 AccumuloReplicaSystem (org.apache.accumulo.tserver.replication.AccumuloReplicaSystem)1 KeeperException (org.apache.zookeeper.KeeperException)1