Search in sources :

Example 1 with Initialize

use of org.apache.accumulo.server.init.Initialize in project accumulo by apache.

the class MiniAccumuloClusterImpl method start.

/**
 * Starts Accumulo and Zookeeper processes. Can only be called once.
 */
@SuppressFBWarnings(value = "UNENCRYPTED_SOCKET", justification = "insecure socket used for reservation")
@Override
public synchronized void start() throws IOException, InterruptedException {
    if (config.useMiniDFS() && miniDFS == null) {
        throw new IllegalStateException("Cannot restart mini when using miniDFS");
    }
    MiniAccumuloClusterControl control = getClusterControl();
    if (config.useExistingInstance()) {
        AccumuloConfiguration acuConf = config.getAccumuloConfiguration();
        Configuration hadoopConf = config.getHadoopConfiguration();
        ServerDirs serverDirs = new ServerDirs(acuConf, hadoopConf);
        ConfigurationCopy cc = new ConfigurationCopy(acuConf);
        Path instanceIdPath;
        try (var fs = getServerContext().getVolumeManager()) {
            instanceIdPath = serverDirs.getInstanceIdLocation(fs.getFirst());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        InstanceId instanceIdFromFile = VolumeManager.getInstanceIDFromHdfs(instanceIdPath, hadoopConf);
        ZooReaderWriter zrw = new ZooReaderWriter(cc.get(Property.INSTANCE_ZK_HOST), (int) cc.getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT), cc.get(Property.INSTANCE_SECRET));
        String rootPath = ZooUtil.getRoot(instanceIdFromFile);
        String instanceName = null;
        try {
            for (String name : zrw.getChildren(Constants.ZROOT + Constants.ZINSTANCES)) {
                String instanceNamePath = Constants.ZROOT + Constants.ZINSTANCES + "/" + name;
                byte[] bytes = zrw.getData(instanceNamePath);
                InstanceId iid = InstanceId.of(new String(bytes, UTF_8));
                if (iid.equals(instanceIdFromFile)) {
                    instanceName = name;
                }
            }
        } catch (KeeperException e) {
            throw new RuntimeException("Unable to read instance name from zookeeper.", e);
        }
        if (instanceName == null) {
            throw new RuntimeException("Unable to read instance name from zookeeper.");
        }
        config.setInstanceName(instanceName);
        if (!AccumuloStatus.isAccumuloOffline(zrw, rootPath)) {
            throw new RuntimeException("The Accumulo instance being used is already running. Aborting.");
        }
    } else {
        if (!initialized) {
            Runtime.getRuntime().addShutdownHook(new Thread(() -> {
                try {
                    MiniAccumuloClusterImpl.this.stop();
                } catch (IOException e) {
                    log.error("IOException while attempting to stop the MiniAccumuloCluster.", e);
                } catch (InterruptedException e) {
                    log.error("The stopping of MiniAccumuloCluster was interrupted.", e);
                }
            }));
        }
        if (!config.useExistingZooKeepers()) {
            control.start(ServerType.ZOOKEEPER);
        }
        if (!initialized) {
            if (!config.useExistingZooKeepers()) {
                // sleep a little bit to let zookeeper come up before calling init, seems to work better
                long startTime = System.currentTimeMillis();
                while (true) {
                    try (Socket s = new Socket("localhost", config.getZooKeeperPort())) {
                        s.setReuseAddress(true);
                        s.getOutputStream().write("ruok\n".getBytes());
                        s.getOutputStream().flush();
                        byte[] buffer = new byte[100];
                        int n = s.getInputStream().read(buffer);
                        if (n >= 4 && new String(buffer, 0, 4).equals("imok")) {
                            break;
                        }
                    } catch (Exception e) {
                        if (System.currentTimeMillis() - startTime >= config.getZooKeeperStartupTime()) {
                            throw new ZooKeeperBindException("Zookeeper did not start within " + (config.getZooKeeperStartupTime() / 1000) + " seconds. Check the logs in " + config.getLogDir() + " for errors.  Last exception: " + e);
                        }
                        // Don't spin absurdly fast
                        sleepUninterruptibly(250, TimeUnit.MILLISECONDS);
                    }
                }
            }
            LinkedList<String> args = new LinkedList<>();
            args.add("--instance-name");
            args.add(config.getInstanceName());
            args.add("--user");
            args.add(config.getRootUserName());
            args.add("--clear-instance-name");
            // If we aren't using SASL, add in the root password
            final String saslEnabled = config.getSiteConfig().get(Property.INSTANCE_RPC_SASL_ENABLED.getKey());
            if (saslEnabled == null || !Boolean.parseBoolean(saslEnabled)) {
                args.add("--password");
                args.add(config.getRootPassword());
            }
            Process initProcess = exec(Initialize.class, args.toArray(new String[0])).getProcess();
            int ret = initProcess.waitFor();
            if (ret != 0) {
                throw new RuntimeException("Initialize process returned " + ret + ". Check the logs in " + config.getLogDir() + " for errors.");
            }
            initialized = true;
        }
    }
    log.info("Starting MAC against instance {} and zookeeper(s) {}.", config.getInstanceName(), config.getZooKeepers());
    control.start(ServerType.TABLET_SERVER);
    int ret = 0;
    for (int i = 0; i < 5; i++) {
        ret = exec(Main.class, SetGoalState.class.getName(), ManagerGoalState.NORMAL.toString()).getProcess().waitFor();
        if (ret == 0) {
            break;
        }
        sleepUninterruptibly(1, TimeUnit.SECONDS);
    }
    if (ret != 0) {
        throw new RuntimeException("Could not set manager goal state, process returned " + ret + ". Check the logs in " + config.getLogDir() + " for errors.");
    }
    control.start(ServerType.MANAGER);
    control.start(ServerType.GARBAGE_COLLECTOR);
    if (executor == null) {
        executor = Executors.newSingleThreadExecutor();
    }
    verifyUp();
}
Also used : Configuration(org.apache.hadoop.conf.Configuration) DefaultConfiguration(org.apache.accumulo.core.conf.DefaultConfiguration) AccumuloConfiguration(org.apache.accumulo.core.conf.AccumuloConfiguration) SiteConfiguration(org.apache.accumulo.core.conf.SiteConfiguration) Initialize(org.apache.accumulo.server.init.Initialize) AccumuloConfiguration(org.apache.accumulo.core.conf.AccumuloConfiguration) Path(org.apache.hadoop.fs.Path) ConfigurationCopy(org.apache.accumulo.core.conf.ConfigurationCopy) InstanceId(org.apache.accumulo.core.data.InstanceId) ZooReaderWriter(org.apache.accumulo.fate.zookeeper.ZooReaderWriter) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) TimeoutException(java.util.concurrent.TimeoutException) ThriftSecurityException(org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException) UncheckedIOException(java.io.UncheckedIOException) ThriftNotActiveServiceException(org.apache.accumulo.core.clientImpl.thrift.ThriftNotActiveServiceException) AccumuloSecurityException(org.apache.accumulo.core.client.AccumuloSecurityException) KeeperException(org.apache.zookeeper.KeeperException) TException(org.apache.thrift.TException) IOException(java.io.IOException) AccumuloException(org.apache.accumulo.core.client.AccumuloException) ExecutionException(java.util.concurrent.ExecutionException) LinkedList(java.util.LinkedList) ServerDirs(org.apache.accumulo.server.ServerDirs) Main(org.apache.accumulo.start.Main) KeeperException(org.apache.zookeeper.KeeperException) Socket(java.net.Socket) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 2 with Initialize

use of org.apache.accumulo.server.init.Initialize in project accumulo by apache.

the class VolumeIT method testNonConfiguredVolumes.

@Test
public void testNonConfiguredVolumes() throws Exception {
    String[] tableNames = getUniqueNames(2);
    try (AccumuloClient client = Accumulo.newClient().from(getClientProperties()).build()) {
        InstanceId uuid = verifyAndShutdownCluster(client, tableNames[0]);
        updateConfig(config -> config.setProperty(Property.INSTANCE_VOLUMES.getKey(), v2 + "," + v3));
        // initialize volume
        assertEquals(0, cluster.exec(Initialize.class, "--add-volumes").getProcess().waitFor());
        checkVolumesInitialized(Arrays.asList(v1, v2, v3), uuid);
        // start cluster and verify that new volume is used
        cluster.start();
        // verify we can still read the tables (tableNames[0] is likely to have a file still on v1)
        verifyData(expected, client.createScanner(tableNames[0], Authorizations.EMPTY));
        // v1 should not have any data for tableNames[1]
        verifyVolumesUsed(client, tableNames[1], false, v2, v3);
    }
}
Also used : AccumuloClient(org.apache.accumulo.core.client.AccumuloClient) InstanceId(org.apache.accumulo.core.data.InstanceId) Initialize(org.apache.accumulo.server.init.Initialize) Test(org.junit.Test)

Example 3 with Initialize

use of org.apache.accumulo.server.init.Initialize in project accumulo by apache.

the class VolumeIT method testAddVolumes.

@Test
public void testAddVolumes() throws Exception {
    try (AccumuloClient client = Accumulo.newClient().from(getClientProperties()).build()) {
        String[] tableNames = getUniqueNames(2);
        InstanceId uuid = verifyAndShutdownCluster(client, tableNames[0]);
        updateConfig(config -> config.setProperty(Property.INSTANCE_VOLUMES.getKey(), v1 + "," + v2 + "," + v3));
        // initialize volume
        assertEquals(0, cluster.exec(Initialize.class, "--add-volumes").getProcess().waitFor());
        checkVolumesInitialized(Arrays.asList(v1, v2, v3), uuid);
        // start cluster and verify that new volume is used
        cluster.start();
        verifyVolumesUsed(client, tableNames[1], false, v1, v2, v3);
    }
}
Also used : AccumuloClient(org.apache.accumulo.core.client.AccumuloClient) InstanceId(org.apache.accumulo.core.data.InstanceId) Initialize(org.apache.accumulo.server.init.Initialize) Test(org.junit.Test)

Aggregations

InstanceId (org.apache.accumulo.core.data.InstanceId)3 Initialize (org.apache.accumulo.server.init.Initialize)3 AccumuloClient (org.apache.accumulo.core.client.AccumuloClient)2 Test (org.junit.Test)2 SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)1 IOException (java.io.IOException)1 UncheckedIOException (java.io.UncheckedIOException)1 Socket (java.net.Socket)1 LinkedList (java.util.LinkedList)1 ExecutionException (java.util.concurrent.ExecutionException)1 TimeoutException (java.util.concurrent.TimeoutException)1 AccumuloException (org.apache.accumulo.core.client.AccumuloException)1 AccumuloSecurityException (org.apache.accumulo.core.client.AccumuloSecurityException)1 ThriftNotActiveServiceException (org.apache.accumulo.core.clientImpl.thrift.ThriftNotActiveServiceException)1 ThriftSecurityException (org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException)1 AccumuloConfiguration (org.apache.accumulo.core.conf.AccumuloConfiguration)1 ConfigurationCopy (org.apache.accumulo.core.conf.ConfigurationCopy)1 DefaultConfiguration (org.apache.accumulo.core.conf.DefaultConfiguration)1 SiteConfiguration (org.apache.accumulo.core.conf.SiteConfiguration)1 ZooReaderWriter (org.apache.accumulo.fate.zookeeper.ZooReaderWriter)1