Murtadha Hubail has submitted this change and it was merged. Change subject: Enable Replication Tests on Multi-NC Setup ......................................................................
Enable Replication Tests on Multi-NC Setup - Move replication IT from vagrant VMs to multi-NC setup. - Add 'node' command to kill specific node process. - Fix file path passing to replication manager. Change-Id: I542b212e04469e2701690f464f821a5189b97f12 Reviewed-on: https://asterix-gerrit.ics.uci.edu/1364 Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Reviewed-by: abdullah alamoudi <bamou...@gmail.com> Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu> --- M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java M asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java M asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java M asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java A asterixdb/asterix-installer/src/main/resources/clusters/local/local_with_replication.xml M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java M asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java A asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql C asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.vscript.aql M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.vscript.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql M asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql C asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.vscript.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.6.txnqar.aql C asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.txnqbc.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql D asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.vscript.aql R asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql M asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm M asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm A asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.aql A asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.aql A asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.aql M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/util/ClusterStateManager.java M asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java M asterixdb/pom.xml 42 files changed, 276 insertions(+), 605 deletions(-) Approvals: abdullah alamoudi: Looks good to me, approved Jenkins: Verified; No violations found; Verified diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java index a8095af..b0b2e36 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/common/AsterixHyracksIntegrationUtil.java @@ -78,9 +78,10 @@ // Starts ncs. List<String> nodes = propertiesAccessor.getNodeNames(); List<NodeControllerService> nodeControllers = new ArrayList<>(); + List<Thread> startupThreads = new ArrayList<>(); for (String ncName : nodes) { - NodeControllerService nodeControllerService = - new NodeControllerService(fixupIODevices(createNCConfig(ncName))); + NodeControllerService nodeControllerService = new NodeControllerService( + fixupIODevices(createNCConfig(ncName))); nodeControllers.add(nodeControllerService); Thread ncStartThread = new Thread("IntegrationUtil-" + ncName) { @Override @@ -93,7 +94,11 @@ } }; ncStartThread.start(); - ncStartThread.join(); + startupThreads.add(ncStartThread); + } + //wait until all NCs complete their startup + for (Thread thread : startupThreads) { + thread.join(); } hcc = new HyracksConnection(cc.getConfig().clientNetIpAddress, cc.getConfig().clientNetPort); ncs = nodeControllers.toArray(new NodeControllerService[nodeControllers.size()]); @@ -156,7 +161,6 @@ } return ncConfig; } - public String[] getNcNames() { return propertiesAccessor.getNodeNames().toArray(new String[propertiesAccessor.getNodeNames().size()]); diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java index 49730a0..158317b 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/servlet/ClusterAPIServlet.java @@ -77,9 +77,11 @@ case "/replication": json = getReplicationJSON(); break; + case "/summary": + json = getClusterStateSummaryJSON(); + break; default: throw new IllegalArgumentException(); - } response.setStatus(HttpServletResponse.SC_OK); responseWriter.write(json.toString(4)); @@ -90,6 +92,10 @@ response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString()); } responseWriter.flush(); + } + + protected JSONObject getClusterStateSummaryJSON() throws JSONException { + return ClusterStateManager.INSTANCE.getClusterStateSummary(); } protected JSONObject getReplicationJSON() throws JSONException { @@ -117,8 +123,7 @@ return AbstractAsterixProperties.getImplementations(); } - protected JSONObject getClusterStateJSON(HttpServletRequest request, String pathToNode) - throws JSONException { + protected JSONObject getClusterStateJSON(HttpServletRequest request, String pathToNode) throws JSONException { JSONObject json; json = ClusterStateManager.INSTANCE.getClusterStateDescription(); Map<String, Object> allProperties = getAllClusterProperties(); diff --git a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java index 4080325..2da57e3 100644 --- a/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java +++ b/asterixdb/asterix-common/src/test/java/org/apache/asterix/test/aql/TestExecutor.java @@ -80,11 +80,11 @@ // see // https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers/417184 private static final long MAX_URL_LENGTH = 2000l; - private static final Pattern JAVA_BLOCK_COMMENT_PATTERN = - Pattern.compile("/\\*.*\\*/", Pattern.MULTILINE | Pattern.DOTALL); + private static final Pattern JAVA_BLOCK_COMMENT_PATTERN = Pattern.compile("/\\*.*\\*/", + Pattern.MULTILINE | Pattern.DOTALL); private static final Pattern REGEX_LINES_PATTERN = Pattern.compile("^(-)?/(.*)/([im]*)$"); - private static final Pattern POLL_TIMEOUT_PATTERN = - Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", Pattern.MULTILINE); + private static final Pattern POLL_TIMEOUT_PATTERN = Pattern.compile("polltimeoutsecs=(\\d+)(\\D|$)", + Pattern.MULTILINE); private static final Pattern POLL_DELAY_PATTERN = Pattern.compile("polldelaysecs=(\\d+)(\\D|$)", Pattern.MULTILINE); public static final int TRUNCATE_THRESHOLD = 16384; @@ -199,9 +199,8 @@ private void throwLineChanged(File scriptFile, String lineExpected, String lineActual, int num) throws ComparisonException { - throw new ComparisonException( - "Result for " + scriptFile + " changed at line " + num + ":\n< " - + truncateIfLong(lineExpected) + "\n> " + truncateIfLong(lineActual)); + throw new ComparisonException("Result for " + scriptFile + " changed at line " + num + ":\n< " + + truncateIfLong(lineExpected) + "\n> " + truncateIfLong(lineActual)); } private String truncateIfLong(String string) { @@ -211,8 +210,7 @@ final StringBuilder truncatedString = new StringBuilder(string); truncatedString.setLength(TRUNCATE_THRESHOLD); truncatedString.append("\n<truncated ") - .append(StorageUtil.toHumanReadableSize(string.length() - TRUNCATE_THRESHOLD)) - .append("...>"); + .append(StorageUtil.toHumanReadableSize(string.length() - TRUNCATE_THRESHOLD)).append("...>"); return truncatedString.toString(); } @@ -327,8 +325,8 @@ } Matcher m = REGEX_LINES_PATTERN.matcher(lineExpected); if (!m.matches()) { - throw new IllegalArgumentException("Each line of regex file must conform to: [-]/regex/[flags]: " - + expectedFile); + throw new IllegalArgumentException( + "Each line of regex file must conform to: [-]/regex/[flags]: " + expectedFile); } String negateStr = m.group(1); String expression = m.group(2); @@ -346,8 +344,8 @@ if (match && !negate || negate && !match) { continue; } - throw new Exception("Result for " + scriptFile + ": expected pattern '" + expression + - "' not found in result."); + throw new Exception( + "Result for " + scriptFile + ": expected pattern '" + expression + "' not found in result."); } } catch (Exception e) { System.err.println("Actual results file: " + actualFile.toString()); @@ -404,14 +402,12 @@ String[] errors = { result.getJSONArray("error-code").getString(0), result.getString("summary"), result.getString("stacktrace") }; GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, errors[2]); - exceptionMsg = "HTTP operation failed: " + errors[0] - + "\nSTATUS LINE: " + httpResponse.getStatusLine() + exceptionMsg = "HTTP operation failed: " + errors[0] + "\nSTATUS LINE: " + httpResponse.getStatusLine() + "\nSUMMARY: " + errors[1] + "\nSTACKTRACE: " + errors[2]; } catch (Exception e) { // whoops, not JSON (e.g. 404) - just include the body GlobalConfig.ASTERIX_LOGGER.log(Level.SEVERE, errorBody); - exceptionMsg = "HTTP operation failed:" - + "\nSTATUS LINE: " + httpResponse.getStatusLine() + exceptionMsg = "HTTP operation failed:" + "\nSTATUS LINE: " + httpResponse.getStatusLine() + "\nERROR_BODY: " + errorBody; } throw new Exception(exceptionMsg); @@ -457,7 +453,7 @@ } private List<CompilationUnit.Parameter> injectStatement(String statement, String stmtParamName, - List<CompilationUnit.Parameter> otherParams) { + List<CompilationUnit.Parameter> otherParams) { CompilationUnit.Parameter stmtParam = new CompilationUnit.Parameter(); stmtParam.setName(stmtParamName); stmtParam.setValue(statement); @@ -488,7 +484,7 @@ } private HttpUriRequest constructGetMethod(String endpoint, OutputFormat fmt, - List<CompilationUnit.Parameter> params) { + List<CompilationUnit.Parameter> params) { HttpUriRequest method = constructGetMethod(endpoint, params); // Set accepted output response type @@ -506,7 +502,7 @@ } private HttpUriRequest constructPostMethod(String endpoint, OutputFormat fmt, - List<CompilationUnit.Parameter> params) { + List<CompilationUnit.Parameter> params) { HttpUriRequest method = constructPostMethod(endpoint, params); // Set accepted output response type @@ -565,8 +561,7 @@ // Insert and Delete statements are executed here public void executeUpdate(String str, String url) throws Exception { // Create a method instance. - HttpUriRequest request = RequestBuilder.post(url) - .setEntity(new StringEntity(str, StandardCharsets.UTF_8)) + HttpUriRequest request = RequestBuilder.post(url).setEntity(new StringEntity(str, StandardCharsets.UTF_8)) .build(); // Execute the method. @@ -593,10 +588,8 @@ final String url = getEndpoint(Servlets.QUERY_RESULT); // Create a method instance. - HttpUriRequest request = RequestBuilder.get(url) - .addParameter("handle", handle) - .setHeader("Accept", fmt.mimeType()) - .build(); + HttpUriRequest request = RequestBuilder.get(url).addParameter("handle", handle) + .setHeader("Accept", fmt.mimeType()).build(); HttpResponse response = executeAndCheckHttpRequest(request); return response.getEntity().getContent(); @@ -610,8 +603,7 @@ // create function statement public void executeDDL(String str, String url) throws Exception { // Create a method instance. - HttpUriRequest request = RequestBuilder.post(url) - .setEntity(new StringEntity(str, StandardCharsets.UTF_8)) + HttpUriRequest request = RequestBuilder.post(url).setEntity(new StringEntity(str, StandardCharsets.UTF_8)) .build(); // Execute the method. @@ -622,8 +614,8 @@ // and returns the contents as a string // This string is later passed to REST API for execution. public String readTestFile(File testFile) throws Exception { - BufferedReader reader = - new BufferedReader(new InputStreamReader(new FileInputStream(testFile), StandardCharsets.UTF_8)); + BufferedReader reader = new BufferedReader( + new InputStreamReader(new FileInputStream(testFile), StandardCharsets.UTF_8)); String line; StringBuilder stringBuilder = new StringBuilder(); String ls = System.getProperty("line.separator"); @@ -746,7 +738,7 @@ long limitTime = startTime + TimeUnit.SECONDS.toMillis(timeoutSecs); ctx.setType(ctx.getType().substring("poll".length())); Exception finalException; - LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay"); + LOGGER.fine("polling for up to " + timeoutSecs + " seconds w/ " + retryDelaySecs + " second(s) delay"); while (true) { try { executeTest(testCaseCtx, ctx, statement, isDmlRecoveryTest, pb, cUnit, queryCount, @@ -901,8 +893,8 @@ case "get": case "post": if (!"http".equals(ctx.extension())) { - throw new IllegalArgumentException("Unexpected format for method " + ctx.getType() + ": " - + ctx.extension()); + throw new IllegalArgumentException( + "Unexpected format for method " + ctx.getType() + ": " + ctx.extension()); } fmt = OutputFormat.forCompilationUnit(cUnit); String endpoint = stripJavaComments(statement).trim(); @@ -924,7 +916,7 @@ queryCount.increment(); break; case "server": // (start <test server name> <port> - // [<arg1>][<arg2>][<arg3>]...|stop (<port>|all)) + // [<arg1>][<arg2>][<arg3>]...|stop (<port>|all)) try { lines = statement.trim().split("\n"); String[] command = lines[lines.length - 1].trim().split(" "); @@ -1001,11 +993,35 @@ throw new Exception("invalid library format"); } break; + case "node": + command = stripJavaComments(statement).trim().split(" "); + String commandType = command[0]; + String nodeId = command[1]; + if (commandType.equals("kill")) { + killNC(nodeId, cUnit); + } + break; default: throw new IllegalArgumentException("No statements of type " + ctx.getType()); } } + private void killNC(String nodeId, CompilationUnit cUnit) throws Exception { + //get node process id + OutputFormat fmt = OutputFormat.forCompilationUnit(cUnit); + String endpoint = "/admin/cluster/node/" + nodeId + "/config"; + InputStream executeJSONGet = executeJSONGet(fmt, "http://" + host + ":" + port + endpoint); + StringWriter actual = new StringWriter(); + IOUtils.copy(executeJSONGet, actual, StandardCharsets.UTF_8); + String config = actual.toString(); + String nodePid = StringUtils.substringBetween(config, "\"pid\": ", ",").trim(); + if (nodePid == null) { + throw new IllegalArgumentException("Coud not find process for node id: " + nodeId); + } + ProcessBuilder pb = new ProcessBuilder("kill", "-9", nodePid); + pb.start().waitFor(); + } + public void executeTest(String actualPath, TestCaseContext testCaseCtx, ProcessBuilder pb, boolean isDmlRecoveryTest, TestGroup failedGroup) throws Exception { File testFile; diff --git a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java index aeb118f..6d2b4b9 100644 --- a/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java +++ b/asterixdb/asterix-installer/src/main/java/org/apache/asterix/installer/command/ConfigureCommand.java @@ -21,6 +21,8 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.nio.file.Files; +import java.nio.file.Paths; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; @@ -42,6 +44,7 @@ @Override protected void execCommand() throws Exception { configureCluster("local", "local.xml"); + configureCluster("local", "local_with_replication.xml"); configureCluster("demo", "demo.xml"); String installerConfPath = InstallerDriver.getManagixHome() + File.separator + InstallerDriver.MANAGIX_CONF_XML; @@ -51,9 +54,8 @@ configuration.setConfigured(true); configuration.getBackup().setBackupDir(InstallerDriver.getManagixHome() + File.separator + "backup"); - configuration.getZookeeper().setHomeDir( - InstallerDriver.getManagixHome() + File.separator + InstallerDriver.MANAGIX_INTERNAL_DIR - + File.separator + "zookeeper_home"); + configuration.getZookeeper().setHomeDir(InstallerDriver.getManagixHome() + File.separator + + InstallerDriver.MANAGIX_INTERNAL_DIR + File.separator + "zookeeper_home"); configuration.getZookeeper().getServers().setJavaHome(System.getProperty("java.home")); Marshaller marshaller = ctx.createMarshaller(); @@ -61,11 +63,14 @@ marshaller.marshal(configuration, new FileOutputStream(installerConfPath)); } - private void configureCluster(String dir, String file) throws JAXBException, PropertyException, - FileNotFoundException { + private void configureCluster(String dir, String file) + throws JAXBException, PropertyException, FileNotFoundException { String clusterDir = InstallerDriver.getManagixHome() + File.separator + "clusters" + File.separator + dir; String localClusterPath = clusterDir + File.separator + file; + if (!Files.exists(Paths.get(localClusterPath))) { + return; + } Cluster cluster = EventUtil.getCluster(localClusterPath); String workingDir = clusterDir + File.separator + "working_dir"; cluster.setWorkingDir(new WorkingDir(workingDir, true)); diff --git a/asterixdb/asterix-installer/src/main/resources/clusters/local/local_with_replication.xml b/asterixdb/asterix-installer/src/main/resources/clusters/local/local_with_replication.xml new file mode 100644 index 0000000..e6a3547 --- /dev/null +++ b/asterixdb/asterix-installer/src/main/resources/clusters/local/local_with_replication.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + ! Licensed to the Apache Software Foundation (ASF) under one + ! or more contributor license agreements. See the NOTICE file + ! distributed with this work for additional information + ! regarding copyright ownership. The ASF licenses this file + ! to you under the Apache License, Version 2.0 (the + ! "License"); you may not use this file except in compliance + ! with the License. You may obtain a copy of the License at + ! + ! http://www.apache.org/licenses/LICENSE-2.0 + ! + ! Unless required by applicable law or agreed to in writing, + ! software distributed under the License is distributed on an + ! "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + ! KIND, either express or implied. See the License for the + ! specific language governing permissions and limitations + ! under the License. + !--> +<cluster xmlns="cluster"> + <java_home>/usr/lib/jvm/jdk-8-oracle-x64/jre</java_home> + <log_dir>/tmp/asterix/logs</log_dir> + <txn_log_dir>/tmp/asterix/txnLogs</txn_log_dir> + <store>storage</store> + <working_dir> + <dir>/tmp/asterix-installer</dir> + <NFS>true</NFS> + </working_dir> + <!-- Sets the time duration between two heartbeats from each node controller in milliseconds (default: 10000) --> + <heartbeat_period>1000</heartbeat_period> + <!-- Sets the maximum number of missed heartbeats before a node is marked as dead (default: 5) --> + <max_heartbeat_lapse_periods>5</max_heartbeat_lapse_periods> + <!-- Sets the time duration between two profile dumps from each node controller in milliseconds. 0 to disable. (default: 0) --> + <profile_dump_period>0</profile_dump_period> + <!-- Sets the default number of job attempts allowed if not specified in the job specification. (default: 5) --> + <default_max_job_attempts>5</default_max_job_attempts> + <!-- Limits the number of historical jobs remembered by the system to the specified value. (default: 10) --> + <job_history_size>10</job_history_size> + <!-- Limits the amount of time results for asynchronous jobs should be retained by the system in milliseconds. (default: 24 hours) --> + <result_time_to_live>86400000</result_time_to_live> + <!-- The duration within which an instance of the result cleanup should be invoked in milliseconds. (default: 1 minute) --> + <result_sweep_threshold>60000</result_sweep_threshold> + + <metadata_node>nc1</metadata_node> + + <data_replication> + <enabled>true</enabled> + <replication_port>2000</replication_port> + <replication_factor>2</replication_factor> + <auto_failover>true</auto_failover> + <replication_time_out>10</replication_time_out> + </data_replication> + + <master_node> + <id>master</id> + <client_ip>127.0.0.1</client_ip> + <cluster_ip>127.0.0.1</cluster_ip> + <client_port>1098</client_port> + <cluster_port>1099</cluster_port> + <http_port>8888</http_port> + </master_node> + <node> + <id>nc1</id> + <cluster_ip>127.0.0.1</cluster_ip> + <txn_log_dir>/tmp/asterix/nc1/txnLogs</txn_log_dir> + <iodevices>/tmp/asterix/nc1/p1,/tmp/asterix/nc1/p2</iodevices> + <replication_port>2000</replication_port> + </node> + <node> + <id>nc2</id> + <cluster_ip>127.0.0.1</cluster_ip> + <txn_log_dir>/tmp/asterix/nc2/txnLogs</txn_log_dir> + <iodevices>/tmp/asterix/nc2/p1,/tmp/asterix/nc2/p2</iodevices> + <replication_port>2001</replication_port> + </node> +</cluster> \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java index ae98d19..5dde951 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixExternalLibraryIT.java @@ -55,7 +55,7 @@ @BeforeClass public static void setUp() throws Exception { try { - AsterixInstallerIntegrationUtil.init(); + AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH); File asterixInstallerProjectDir = new File(System.getProperty("user.dir")); String asterixExternalLibraryPath = asterixInstallerProjectDir.getAbsolutePath() + File.separator + LIBRARY_PATH; diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java index 34a8733..e840796 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixInstallerIntegrationUtil.java @@ -53,19 +53,22 @@ private static final int zookeeperClientPort = 2900; private static final int zookeeperTestClientPort = 3945; private static IHyracksClientConnection hcc; + private static final String CLUSTERS_BASE_PATH = "clusters" + File.separator + "local" + File.separator; + public static final String LOCAL_CLUSTER_PATH = CLUSTERS_BASE_PATH + File.separator + "local.xml"; + public static final String LOCAL_CLUSTER_WITH_REPLICATION_PATH = CLUSTERS_BASE_PATH + File.separator + + "local_with_replication.xml"; public static void deinit() throws Exception { deleteInstance(); stopZookeeper(); } - public static void init() throws Exception { + public static void init(String clusterPath) throws Exception { managixHome = getManagixHome(); System.setProperty("log4j.configuration", managixHome + File.separator + "conf" + File.separator + "log4j.properties"); - clusterConfigurationPath = managixHome + File.separator + "clusters" + File.separator + "local" + File.separator - + "local.xml"; + clusterConfigurationPath = managixHome + File.separator + clusterPath; InstallerDriver.setManagixHome(managixHome); diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java index 04e73ed..4dfc5c5 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixLifecycleIT.java @@ -53,7 +53,7 @@ @BeforeClass public static void setUp() throws Exception { - AsterixInstallerIntegrationUtil.init(); + AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH); TestCaseContext.Builder b = new TestCaseContext.Builder(); testCaseCollection = b.build(new File(PATH_BASE)); File outdir = new File(PATH_ACTUAL); diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java index d567145..96b420b 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/AsterixRestartIT.java @@ -21,17 +21,20 @@ import java.io.File; import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.logging.Logger; -import org.apache.asterix.common.config.AsterixStorageProperties; import org.apache.asterix.event.model.AsterixInstance.State; import org.apache.asterix.test.aql.TestExecutor; import org.apache.asterix.test.base.RetainLogsRule; import org.apache.asterix.testframework.context.TestCaseContext; import org.apache.commons.lang3.StringUtils; -import org.junit.*; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -73,7 +76,7 @@ + "resources" + File.separator + "integrationts" + File.separator + "restart" + File.separator + "scripts"; env.put("SCRIPT_HOME", scriptHomePath); - AsterixInstallerIntegrationUtil.init(); + AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_PATH); } catch (Throwable th) { th.printStackTrace(); throw th; diff --git a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java index 37aa59d..5f47849 100644 --- a/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java +++ b/asterixdb/asterix-installer/src/test/java/org/apache/asterix/installer/test/ReplicationIT.java @@ -19,152 +19,78 @@ package org.apache.asterix.installer.test; import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.logging.Logger; +import org.apache.asterix.event.model.AsterixInstance.State; import org.apache.asterix.test.aql.TestExecutor; +import org.apache.asterix.test.base.RetainLogsRule; import org.apache.asterix.testframework.context.TestCaseContext; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.codehaus.plexus.util.FileUtils; import org.junit.After; -import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class ReplicationIT { - private static final String PATH_BASE = StringUtils - .join(new String[] { "src", "test", "resources", "integrationts", "replication" }, File.separator); - private static final String CLUSTER_BASE = StringUtils - .join(new String[] { "src", "test", "resources", "clusterts" }, File.separator); - private static final String PATH_ACTUAL = "target" + File.separator + "repliationtest" + File.separator; - private static String managixFolderName; + private static final String PATH_BASE = "src/test/resources/integrationts/replication/"; + private static final String PATH_ACTUAL = "target" + File.separator + "ittest" + File.separator; private static final Logger LOGGER = Logger.getLogger(ReplicationIT.class.getName()); - private static File asterixProjectDir = new File(System.getProperty("user.dir")); - private static final String CLUSTER_CC_ADDRESS = "10.10.0.2"; - private static final int CLUSTER_CC_API_PORT = 19002; + private static String reportPath = new File( + StringUtils.join(new String[] { "target", "failsafe-reports" }, File.separator)).getAbsolutePath(); + + private final TestExecutor testExecutor = new TestExecutor(); + private TestCaseContext tcCtx; + private static String scriptHomePath; + private static File asterixInstallerPath; private static ProcessBuilder pb; private static Map<String, String> env; - private final static TestExecutor testExecutor = new TestExecutor(CLUSTER_CC_ADDRESS, CLUSTER_CC_API_PORT); - private static String SCRIPT_HOME = "/vagrant/scripts/"; - private static String MANAGIX_HOME = "/tmp/asterix/bin/managix "; - private static final String INSTANCE_NAME = "asterix"; - protected TestCaseContext tcCtx; public ReplicationIT(TestCaseContext tcCtx) { this.tcCtx = tcCtx; } + @Rule + public TestRule retainLogs = new RetainLogsRule(AsterixInstallerIntegrationUtil.getManagixHome(), reportPath); + @BeforeClass public static void setUp() throws Exception { - File outdir = new File(PATH_ACTUAL); - outdir.mkdirs(); - - // vagrant setup - File installerTargetDir = new File(asterixProjectDir, "target"); - String[] installerFiles = installerTargetDir.list(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return new File(dir, name).isDirectory() && name.startsWith("asterix-installer") - && name.endsWith("binary-assembly"); - } - }); - - if (installerFiles == null || installerFiles.length == 0) { - throw new Exception("Couldn't find installer binaries"); + try { + pb = new ProcessBuilder(); + env = pb.environment(); + asterixInstallerPath = new File(System.getProperty("user.dir")); + scriptHomePath = asterixInstallerPath + File.separator + "src" + File.separator + "test" + File.separator + + "resources" + File.separator + "integrationts" + File.separator + "replication" + File.separator + + "scripts"; + env.put("SCRIPT_HOME", scriptHomePath); + } catch (Throwable th) { + th.printStackTrace(); + throw th; } - - managixFolderName = installerFiles[0]; - - //copy tests data - FileUtils.copyDirectoryStructure( - new File(StringUtils.join( - new String[] { "..", "asterix-replication", "src", "test", "resources", "data" }, - File.separator)), - new File(StringUtils.join(new String[] { "src", "test", "resources", "clusterts", "data" }, - File.separator))); - - //copy tests scripts - FileUtils.copyDirectoryStructure( - new File(StringUtils.join( - new String[] { "..", "asterix-replication", "src", "test", "resources", "scripts" }, - File.separator)), - new File(StringUtils.join(new String[] { "src", "test", "resources", "clusterts", "scripts" }, - File.separator))); - - invoke("cp", "-r", installerTargetDir.toString() + "/" + managixFolderName, - asterixProjectDir + "/" + CLUSTER_BASE); - - remoteInvoke("cp -r /vagrant/" + managixFolderName + " /tmp/asterix"); - - pb = new ProcessBuilder(); - env = pb.environment(); - env.put("SCRIPT_HOME", SCRIPT_HOME); - env.put("MANAGIX_HOME", MANAGIX_HOME); - File cwd = new File(asterixProjectDir.toString() + "/" + CLUSTER_BASE); - pb.directory(cwd); - pb.redirectErrorStream(true); - - //make scripts executable - String chmodScriptsCmd = "chmod -R +x " + SCRIPT_HOME; - remoteInvoke(chmodScriptsCmd, "cc"); - remoteInvoke(chmodScriptsCmd, "nc1"); - remoteInvoke(chmodScriptsCmd, "nc2"); - - //managix configure - logOutput(managixInvoke("configure").getInputStream()); - - //managix validate - String validateOutput = IOUtils.toString(managixInvoke("validate").getInputStream(), - StandardCharsets.UTF_8.name()); - if (validateOutput.contains("ERROR")) { - throw new Exception("Managix validate error: " + validateOutput); - } - } - - @AfterClass - public static void tearDown() throws Exception { - //remove files - remoteInvoke("rm -rf /vagrant/asterix"); } @Before - public void beforeTest() throws Exception { - //create instance - managixInvoke("create -n " + INSTANCE_NAME + " -c /vagrant/cluster_with_replication.xml").getInputStream(); + public void before() throws Exception { + LOGGER.info("Creating new instance..."); + AsterixInstallerIntegrationUtil.init(AsterixInstallerIntegrationUtil.LOCAL_CLUSTER_WITH_REPLICATION_PATH); + LOGGER.info("Instacne created."); + AsterixInstallerIntegrationUtil.transformIntoRequiredState(State.ACTIVE); + LOGGER.info("Instance is in ACTIVE state."); } @After - public void afterTest() throws Exception { - //stop instance - managixInvoke("stop -n " + INSTANCE_NAME); - - //verify that all processes have been stopped - String killProcesses = "kill_cc_and_nc.sh"; - executeVagrantScript("cc", killProcesses); - executeVagrantScript("nc1", killProcesses); - executeVagrantScript("nc2", killProcesses); - - //delete storage - String deleteStorage = "delete_storage.sh"; - executeVagrantScript("cc", deleteStorage); - executeVagrantScript("nc1", deleteStorage); - executeVagrantScript("nc2", deleteStorage); - - //delete instance - managixInvoke("delete -n " + INSTANCE_NAME); + public void after() throws Exception { + LOGGER.info("Destroying instance..."); + AsterixInstallerIntegrationUtil.deinit(); + LOGGER.info("Instance destroyed."); } @Test @@ -172,7 +98,7 @@ testExecutor.executeTest(PATH_ACTUAL, tcCtx, pb, false); } - @Parameters(name = "ReplicationIT {index}: {0}") + @Parameterized.Parameters(name = "ReplicationIT {index}: {0}") public static Collection<Object[]> tests() throws Exception { Collection<Object[]> testArgs = buildTestsInXml(TestCaseContext.DEFAULT_TESTSUITE_XML_NAME); if (testArgs.size() == 0) { @@ -182,78 +108,11 @@ } protected static Collection<Object[]> buildTestsInXml(String xmlfile) throws Exception { - Collection<Object[]> testArgs = new ArrayList<Object[]>(); + Collection<Object[]> testArgs = new ArrayList<>(); TestCaseContext.Builder b = new TestCaseContext.Builder(); for (TestCaseContext ctx : b.build(new File(PATH_BASE), xmlfile)) { testArgs.add(new Object[] { ctx }); } return testArgs; - } - - public static boolean checkOutput(InputStream input, String requiredSubString) { - String candidate; - try { - candidate = IOUtils.toString(input, StandardCharsets.UTF_8.name()); - } catch (IOException e) { - LOGGER.warning("Could not check output of subprocess"); - return false; - } - return candidate.contains(requiredSubString); - } - - public static boolean checkOutput(String candidate, String requiredSubString) { - return candidate.contains(requiredSubString); - } - - public static String processOut(Process p) throws IOException { - InputStream input = p.getInputStream(); - return IOUtils.toString(input, StandardCharsets.UTF_8.name()); - } - - public static void logOutput(InputStream input) { - try { - LOGGER.info(IOUtils.toString(input, StandardCharsets.UTF_8.name())); - } catch (IOException e) { - LOGGER.warning("Could not print output of subprocess"); - } - } - - private static Process invoke(String... args) throws Exception { - ProcessBuilder pb = new ProcessBuilder(args); - pb.redirectErrorStream(true); - Process p = pb.start(); - return p; - } - - private static Process remoteInvoke(String cmd) throws Exception { - ProcessBuilder pb = new ProcessBuilder("vagrant", "ssh", "cc", "-c", "MANAGIX_HOME=/tmp/asterix/ " + cmd); - File cwd = new File(asterixProjectDir.toString() + "/" + CLUSTER_BASE); - pb.directory(cwd); - pb.redirectErrorStream(true); - Process p = pb.start(); - p.waitFor(); - return p; - } - - private static Process remoteInvoke(String cmd, String node) throws Exception { - ProcessBuilder pb = new ProcessBuilder("vagrant", "ssh", node, "--", cmd); - File cwd = new File(asterixProjectDir.toString() + "/" + CLUSTER_BASE); - pb.directory(cwd); - pb.redirectErrorStream(true); - Process p = pb.start(); - p.waitFor(); - return p; - } - - private static Process managixInvoke(String cmd) throws Exception { - return remoteInvoke(MANAGIX_HOME + cmd); - } - - private static String executeVagrantScript(String node, String scriptName) throws Exception { - pb.command("vagrant", "ssh", node, "--", SCRIPT_HOME + scriptName); - Process p = pb.start(); - p.waitFor(); - InputStream input = p.getInputStream(); - return IOUtils.toString(input, StandardCharsets.UTF_8.name()); } } diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm new file mode 100644 index 0000000..7e99ea4 --- /dev/null +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/data/fbu.adm @@ -0,0 +1,10 @@ +{"id":1,"alias":"Margarita","name":"MargaritaStoddard","user-since":datetime("2012-08-20T10:10:00"),"friend-ids":{{2,3,6,10}},"employment":[{"organization-name":"Codetechno","start-date":date("2006-08-06")}]} +{"id":2,"alias":"Isbel","name":"IsbelDull","user-since":datetime("2011-01-22T10:10:00"),"friend-ids":{{1,4}},"employment":[{"organization-name":"Hexviafind","start-date":date("2010-04-27")}]} +{"id":3,"alias":"Emory","name":"EmoryUnk","user-since":datetime("2012-07-10T10:10:00"),"friend-ids":{{1,5,8,9}},"employment":[{"organization-name":"geomedia","start-date":date("2010-06-17"),"end-date":date("2010-01-26")}]} +{"id":4,"alias":"Nicholas","name":"NicholasStroh","user-since":datetime("2010-12-27T10:10:00"),"friend-ids":{{2}},"employment":[{"organization-name":"Zamcorporation","start-date":date("2010-06-08")}]} +{"id":5,"alias":"Von","name":"VonKemble","user-since":datetime("2010-01-05T10:10:00"),"friend-ids":{{3,6,10}},"employment":[{"organization-name":"Kongreen","start-date":date("2010-11-27")}]} +{"id":6,"alias":"Willis","name":"WillisWynne","user-since":datetime("2005-01-17T10:10:00"),"friend-ids":{{1,3,7}},"employment":[{"organization-name":"jaydax","start-date":date("2009-05-15")}]} +{"id":7,"alias":"Suzanna","name":"SuzannaTillson","user-since":datetime("2012-08-07T10:10:00"),"friend-ids":{{6}},"employment":[{"organization-name":"Labzatron","start-date":date("2011-04-19")}]} +{"id":8,"alias":"Nila","name":"NilaMilliron","user-since":datetime("2008-01-01T10:10:00"),"friend-ids":{{3}},"employment":[{"organization-name":"Plexlane","start-date":date("2010-02-28")}]} +{"id":9,"alias":"Woodrow","name":"WoodrowNehling","user-since":datetime("2005-09-20T10:10:00"),"friend-ids":{{3,10}},"employment":[{"organization-name":"Zuncan","start-date":date("2003-04-22"),"end-date":date("2009-12-13")}]} +{"id":10,"alias":"Bram","name":"BramHatch","user-since":datetime("2010-10-16T10:10:00"),"friend-ids":{{1,5,9}},"employment":[{"organization-name":"physcane","start-date":date("2007-06-05"),"end-date":date("2011-11-05")}]} diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http index 2bd5e45..3faa945 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.10.get.http @@ -27,4 +27,4 @@ * Expected Result : Success * Date : February 3 2016 */ -/admin/cluster +/admin/cluster/summary \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql index c0b4919..e10896a 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.2.update.aql @@ -30,7 +30,7 @@ use dataverse TinySocial; load dataset FacebookUsers using localfs -(("path"="asterix_nc1:///vagrant/data/fbu.adm"), +(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"), ("format"="adm")); insert into dataset TinySocial.FacebookUsersInMemory(for $x in dataset TinySocial.FacebookUsers return $x); \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql similarity index 93% copy from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql copy to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql index 9c8cb96..9d5dc9b 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.node.aql @@ -25,7 +25,4 @@ * Expected Result : Success * Date : January 6 2016 */ - -use dataverse TinySocial; - -count (for $x in dataset FacebookUsers return $x); \ No newline at end of file +kill asterix_nc1 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.vscript.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.vscript.aql deleted file mode 100644 index 5eec164..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.3.vscript.aql +++ /dev/null @@ -1 +0,0 @@ -nc1 kill_cc_and_nc.sh \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http index 9d19b69..3faa945 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.5.get.http @@ -27,4 +27,4 @@ * Expected Result : Success * Date : February 3 2016 */ -admin/cluster +/admin/cluster/summary \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.vmgx.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.vmgx.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.8.mgx.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql index 1746da6..d0000aa 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failback/node_failback/node_failback.9.sleep.aql @@ -1 +1 @@ -10000 \ No newline at end of file +20000 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql index 94ecc27..90ef6a7 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.2.update.aql @@ -29,4 +29,5 @@ use dataverse TinySocial; load dataset FacebookUsers using localfs -(("path"="asterix_nc1:///vagrant/data/fbu.adm"),("format"="adm")); \ No newline at end of file +(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"), +("format"="adm")); \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql similarity index 93% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql index 9c8cb96..118b7e8 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.node.aql @@ -25,7 +25,4 @@ * Expected Result : Success * Date : January 6 2016 */ - -use dataverse TinySocial; - -count (for $x in dataset FacebookUsers return $x); \ No newline at end of file +kill asterix_nc2 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.sleep.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.sleep.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.vscript.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.vscript.aql deleted file mode 100644 index 5695ed7..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.4.vscript.aql +++ /dev/null @@ -1 +0,0 @@ -nc2 kill_cc_and_nc.sh \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.3.txnqbc.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.5.query.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql index d97f786..18ce908 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.2.update.aql @@ -29,6 +29,6 @@ use dataverse TinySocial; load dataset FacebookUsers using localfs -(("path"="asterix_nc1:///vagrant/data/fbu.adm"),("format"="adm")); +(("path"="asterix_nc1://../../../../../src/test/resources/integrationts/replication/data/fbu.adm"),("format"="adm")); insert into dataset TinySocial.FacebookUsersInMemory(for $x in dataset TinySocial.FacebookUsers return $x); \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql similarity index 93% copy from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql copy to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql index 9c8cb96..118b7e8 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.node.aql @@ -25,7 +25,4 @@ * Expected Result : Success * Date : January 6 2016 */ - -use dataverse TinySocial; - -count (for $x in dataset FacebookUsers return $x); \ No newline at end of file +kill asterix_nc2 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.sleep.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.sleep.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.vscript.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.vscript.aql deleted file mode 100644 index 5695ed7..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.4.vscript.aql +++ /dev/null @@ -1 +0,0 @@ -nc2 kill_cc_and_nc.sh \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.3.txnqbc.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.5.query.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.6.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.6.txnqar.aql deleted file mode 100644 index e25e409..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/mem_component_recovery/mem_component_recovery.6.txnqar.aql +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * Test case Name : mem_component_recovery.aql - * Description : Check that Memory LSM component are replicated and recovered correclty. - The test goes as follows: - start 2 nodes, bulkload a dataset, copy it to in-memory dataset, query - data from memory, kill one node and wait until the failover complete, - query the data again. - * Expected Result : Success - * Date : January 6 2016 - */ - -use dataverse TinySocial; - -count (for $x in dataset FacebookUsersInMemory return $x); \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql similarity index 93% copy from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql copy to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql index 9c8cb96..9d5dc9b 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/bulkload/bulkload.6.txnqar.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.node.aql @@ -25,7 +25,4 @@ * Expected Result : Success * Date : January 6 2016 */ - -use dataverse TinySocial; - -count (for $x in dataset FacebookUsers return $x); \ No newline at end of file +kill asterix_nc1 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.txnqbc.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.txnqbc.aql deleted file mode 100644 index 76bdcfe..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.2.txnqbc.aql +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -/* - * Test case Name : metadata_node_recovery.aql - * Description : Check that metadata node failover is done correctly. - The test goes as follows: - start 2 nodes, create a dataset, kill metadata node - and wait until the failover complete, verify the - dataset still exists. - * Expected Result : Success - * Date : January 6 2016 - */ - -for $x in dataset Metadata.Dataset where $x.DatasetName ='FacebookUsers' return $x.DatasetName; \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.sleep.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql similarity index 100% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.sleep.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.sleep.aql diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.vscript.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.vscript.aql deleted file mode 100644 index 5eec164..0000000 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.3.vscript.aql +++ /dev/null @@ -1 +0,0 @@ -nc1 kill_cc_and_nc.sh \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.5.txnqar.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql similarity index 92% rename from asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.5.txnqar.aql rename to asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql index ac1c593..3d525f6 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.5.txnqar.aql +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/queries/failover/metadata_node/metadata_node.4.query.aql @@ -29,4 +29,8 @@ use dataverse TinySocial; -for $x in dataset Metadata.Dataset where $x.DatasetName ='FacebookUsers' return $x.DatasetName; \ No newline at end of file +count( +for $x in dataset Metadata.Dataset +where $x.DatasetName ='FacebookUsers' +return $x.DatasetName +); \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm index 2c3c039..b155305 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.10.adm @@ -1,131 +1,10 @@ { - "cc": { - "configUri": "http://10.10.0.2:19002/admin/cluster/cc/config", - "statsUri": "http://10.10.0.2:19002/admin/cluster/cc/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/cc/threaddump" - }, - "config": { - "api.port": 19002, - "cluster.partitions": { - "0": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc1", - "1": "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc1", - "2": "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", - "3": "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" - }, - "compiler.framesize": 131072, - "compiler.groupmemory": 33554432, - "compiler.joinmemory": 33554432, - "compiler.pregelix.home": "~/pregelix", - "compiler.sortmemory": 33554432, - "core.dump.paths": { - "asterix_nc1": "/home/vagrant/asterix/logs//asterix_nc1", - "asterix_nc2": "/home/vagrant/asterix/logs//asterix_nc2" - }, - "feed.central.manager.port": 4500, - "feed.max.threshold.period": 5, - "feed.memory.available.wait.timeout": 10, - "feed.memory.global.budget": 67108864, - "feed.pending.work.threshold": 50, - "feed.port": 19003, - "instance.name": "asterix", - "log.level": "INFO", - "max.wait.active.cluster": 60, - "metadata.callback.port": 0, - "metadata.node": "asterix_nc1", - "metadata.partition": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc1", - "metadata.port": 0, - "metadata.registration.timeout.secs": 60, - "node.partitions": { - "asterix_nc1": [ - "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc1", - "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc1" - ], - "asterix_nc2": [ - "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", - "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" - ] - }, - "node.stores": { - "asterix_nc1": [ - "/home/vagrant/asterix/p1/storage", - "/home/vagrant/asterix/p2/storage" - ], - "asterix_nc2": [ - "/home/vagrant/asterix/p1/storage", - "/home/vagrant/asterix/p2/storage" - ] - }, - "plot.activate": false, - "storage.buffercache.maxopenfiles": 214748364, - "storage.buffercache.pagesize": 131072, - "storage.buffercache.size": 536870912, - "storage.lsm.bloomfilter.falsepositiverate": 0.01, - "storage.memorycomponent.globalbudget": 1073741824, - "storage.memorycomponent.numcomponents": 2, - "storage.memorycomponent.numpages": 256, - "storage.memorycomponent.pagesize": 131072, - "storage.metadata.memorycomponent.numpages": 64, - "transaction.log.dirs": { - "asterix_nc1": "/home/vagrant/asterix/tx_logs", - "asterix_nc2": "/home/vagrant/asterix/tx_logs" - }, - "txn.commitprofiler.reportinterval": 5, - "txn.job.recovery.memorysize": 67108864, - "txn.lock.escalationthreshold": 1000, - "txn.lock.shrinktimer": 5000, - "txn.lock.timeout.sweepthreshold": 10000, - "txn.lock.timeout.waitthreshold": 60000, - "txn.log.buffer.numpages": 8, - "txn.log.buffer.pagesize": 524288, - "txn.log.checkpoint.history": 0, - "txn.log.checkpoint.lsnthreshold": 67108864, - "txn.log.checkpoint.pollfrequency": 120, - "txn.log.partitionsize": 2147483648, - "web.port": 19001, - "web.queryinterface.port": 19006, - "web.secondary.port": 19005 - }, - "diagnosticsUri": "http://10.10.0.2:19002/admin/diagnostics", - "fullShutdownUri": "http://10.10.0.2:19002/admin/shutdown?all=true", "metadata_node": "asterix_nc1", - "ncs": [ - { - "configUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/config", - "node_id": "asterix_nc1", - "partitions": [ - { - "active": true, - "partition_id": "partition_0" - }, - { - "active": true, - "partition_id": "partition_1" - } - ], - "state": "ACTIVE", - "statsUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/threaddump" - }, - { - "configUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/config", - "node_id": "asterix_nc2", - "partitions": [ - { - "active": true, - "partition_id": "partition_2" - }, - { - "active": true, - "partition_id": "partition_3" - } - ], - "state": "ACTIVE", - "statsUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/threaddump" - } - ], - "replicationUri": "http://10.10.0.2:19002/admin/cluster/replication", - "shutdownUri": "http://10.10.0.2:19002/admin/shutdown", - "state": "ACTIVE", - "versionUri": "http://10.10.0.2:19002/admin/version" -} + "partitions": { + "0": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc1", + "1": "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc1", + "2": "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", + "3": "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" + }, + "state": "ACTIVE" +} \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm index 076c05b..6b31475 100644 --- a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failback/node_failback/node_failback.cluster_state.5.adm @@ -1,131 +1,10 @@ { - "cc": { - "configUri": "http://10.10.0.2:19002/admin/cluster/cc/config", - "statsUri": "http://10.10.0.2:19002/admin/cluster/cc/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/cc/threaddump" - }, - "config": { - "api.port": 19002, - "cluster.partitions": { - "0": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc2", - "1": "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc2", - "2": "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", - "3": "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" - }, - "compiler.framesize": 131072, - "compiler.groupmemory": 33554432, - "compiler.joinmemory": 33554432, - "compiler.pregelix.home": "~/pregelix", - "compiler.sortmemory": 33554432, - "core.dump.paths": { - "asterix_nc1": "/home/vagrant/asterix/logs//asterix_nc1", - "asterix_nc2": "/home/vagrant/asterix/logs//asterix_nc2" - }, - "feed.central.manager.port": 4500, - "feed.max.threshold.period": 5, - "feed.memory.available.wait.timeout": 10, - "feed.memory.global.budget": 67108864, - "feed.pending.work.threshold": 50, - "feed.port": 19003, - "instance.name": "asterix", - "log.level": "INFO", - "max.wait.active.cluster": 60, - "metadata.callback.port": 0, - "metadata.node": "asterix_nc1", - "metadata.partition": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc2", - "metadata.port": 0, - "metadata.registration.timeout.secs": 60, - "node.partitions": { - "asterix_nc1": [ - "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc2", - "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc2" - ], - "asterix_nc2": [ - "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", - "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" - ] - }, - "node.stores": { - "asterix_nc1": [ - "/home/vagrant/asterix/p1/storage", - "/home/vagrant/asterix/p2/storage" - ], - "asterix_nc2": [ - "/home/vagrant/asterix/p1/storage", - "/home/vagrant/asterix/p2/storage" - ] - }, - "plot.activate": false, - "storage.buffercache.maxopenfiles": 214748364, - "storage.buffercache.pagesize": 131072, - "storage.buffercache.size": 536870912, - "storage.lsm.bloomfilter.falsepositiverate": 0.01, - "storage.memorycomponent.globalbudget": 1073741824, - "storage.memorycomponent.numcomponents": 2, - "storage.memorycomponent.numpages": 256, - "storage.memorycomponent.pagesize": 131072, - "storage.metadata.memorycomponent.numpages": 64, - "transaction.log.dirs": { - "asterix_nc1": "/home/vagrant/asterix/tx_logs", - "asterix_nc2": "/home/vagrant/asterix/tx_logs" - }, - "txn.commitprofiler.reportinterval": 5, - "txn.job.recovery.memorysize": 67108864, - "txn.lock.escalationthreshold": 1000, - "txn.lock.shrinktimer": 5000, - "txn.lock.timeout.sweepthreshold": 10000, - "txn.lock.timeout.waitthreshold": 60000, - "txn.log.buffer.numpages": 8, - "txn.log.buffer.pagesize": 524288, - "txn.log.checkpoint.history": 0, - "txn.log.checkpoint.lsnthreshold": 67108864, - "txn.log.checkpoint.pollfrequency": 120, - "txn.log.partitionsize": 2147483648, - "web.port": 19001, - "web.queryinterface.port": 19006, - "web.secondary.port": 19005 - }, - "diagnosticsUri": "http://10.10.0.2:19002/admin/diagnostics", - "fullShutdownUri": "http://10.10.0.2:19002/admin/shutdown?all=true", "metadata_node": "asterix_nc2", - "ncs": [ - { - "configUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/config", - "node_id": "asterix_nc1", - "partitions": [ - { - "active": true, - "partition_id": "partition_0" - }, - { - "active": true, - "partition_id": "partition_1" - } - ], - "state": "FAILED", - "statsUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc1/threaddump" - }, - { - "configUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/config", - "node_id": "asterix_nc2", - "partitions": [ - { - "active": true, - "partition_id": "partition_2" - }, - { - "active": true, - "partition_id": "partition_3" - } - ], - "state": "ACTIVE", - "statsUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/stats", - "threadDumpUri": "http://10.10.0.2:19002/admin/cluster/node/asterix_nc2/threaddump" - } - ], - "replicationUri": "http://10.10.0.2:19002/admin/cluster/replication", - "shutdownUri": "http://10.10.0.2:19002/admin/shutdown", - "state": "ACTIVE", - "versionUri": "http://10.10.0.2:19002/admin/version" -} + "partitions": { + "0": "ID:0, Original Node: asterix_nc1, IODevice: 0, Active Node: asterix_nc2", + "1": "ID:1, Original Node: asterix_nc1, IODevice: 1, Active Node: asterix_nc2", + "2": "ID:2, Original Node: asterix_nc2, IODevice: 0, Active Node: asterix_nc2", + "3": "ID:3, Original Node: asterix_nc2, IODevice: 1, Active Node: asterix_nc2" + }, + "state": "ACTIVE" +} \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.aql new file mode 100644 index 0000000..9a03714 --- /dev/null +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/bulkload/bulkload.5.aql @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.aql new file mode 100644 index 0000000..9a03714 --- /dev/null +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/mem_component_recovery/mem_component_recovery.5.aql @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.aql b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.aql new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/asterixdb/asterix-installer/src/test/resources/integrationts/replication/results/failover/metadata_node/metadata_node.4.aql @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/util/ClusterStateManager.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/util/ClusterStateManager.java index 376c82a..9f2612f 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/util/ClusterStateManager.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/util/ClusterStateManager.java @@ -662,4 +662,12 @@ } return stateDescription; } + + public synchronized JSONObject getClusterStateSummary() throws JSONException { + JSONObject stateDescription = new JSONObject(); + stateDescription.put("state", state.name()); + stateDescription.put("metadata_node", currentMetadataNode); + stateDescription.put("partitions", clusterPartitions); + return stateDescription; + } } diff --git a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java index 6ccc6d0..6646defb 100644 --- a/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java +++ b/asterixdb/asterix-transactions/src/main/java/org/apache/asterix/transaction/management/resource/PersistentLocalResourceRepository.java @@ -72,8 +72,8 @@ private static final String STORAGE_METADATA_FILE_NAME_PREFIX = "." + StorageConstants.METADATA_ROOT; private static final long STORAGE_LOCAL_RESOURCE_ID = -4321; private static final int MAX_CACHED_RESOURCES = 1000; - private static final FilenameFilter METADATA_FILES_FILTER = (File dir, String name) -> name.equalsIgnoreCase( - METADATA_FILE_NAME); + private static final FilenameFilter METADATA_FILES_FILTER = (File dir, String name) -> name + .equalsIgnoreCase(METADATA_FILE_NAME); // Finals private final IIOManager ioManager; private final String[] mountPoints; @@ -121,9 +121,9 @@ @Override public String toString() { StringBuilder aString = new StringBuilder().append(PersistentLocalResourceRepository.class.getSimpleName()) - .append(Character.LINE_SEPARATOR).append(ioManager.getClass().getSimpleName()).append(':').append( - Character.LINE_SEPARATOR).append(ioManager.toString()).append(Character.LINE_SEPARATOR).append( - "Cached Resources:").append(Character.LINE_SEPARATOR); + .append(Character.LINE_SEPARATOR).append(ioManager.getClass().getSimpleName()).append(':') + .append(Character.LINE_SEPARATOR).append(ioManager.toString()).append(Character.LINE_SEPARATOR) + .append("Cached Resources:").append(Character.LINE_SEPARATOR); for (Entry<String, LocalResource> pair : resourceCache.asMap().entrySet()) { aString.append(pair.getKey()).append("->").append(pair.getValue()).append(Character.LINE_SEPARATOR); } @@ -158,8 +158,7 @@ String storageRootDirPath; if (storageRootDirName.startsWith(File.separator)) { - storageRootDirPath = mountPoints[i] - + storageRootDirName.substring(File.separator.length()); + storageRootDirPath = mountPoints[i] + storageRootDirName.substring(File.separator.length()); } else { storageRootDirPath = mountPoints[i] + storageRootDirName; } @@ -209,8 +208,7 @@ //if replication enabled, send resource metadata info to remote nodes if (isReplicationEnabled && resource.getId() != STORAGE_LOCAL_RESOURCE_ID) { - String filePath = getFileName(resource.getPath(), resource.getId()); - createReplicationJob(ReplicationOperation.REPLICATE, filePath); + createReplicationJob(ReplicationOperation.REPLICATE, resourceFile); } } @@ -222,9 +220,9 @@ resourceCache.invalidate(relativePath); //if replication enabled, delete resource from remote replicas - if (isReplicationEnabled && !resourceFile.getFile().getName().startsWith( - STORAGE_METADATA_FILE_NAME_PREFIX)) { - createReplicationJob(ReplicationOperation.DELETE, resourceFile.getAbsolutePath()); + if (isReplicationEnabled + && !resourceFile.getFile().getName().startsWith(STORAGE_METADATA_FILE_NAME_PREFIX)) { + createReplicationJob(ReplicationOperation.DELETE, resourceFile); } } else { throw new HyracksDataException("Resource doesn't exist"); @@ -365,19 +363,20 @@ } } - private void createReplicationJob(ReplicationOperation operation, String filePath) throws HyracksDataException { + private void createReplicationJob(ReplicationOperation operation, FileReference fileRef) + throws HyracksDataException { /** * Durable resources path format: * /partition/dataverse/idx/fileName * Temporary resources path format: * /partition/TEMP_DATASETS_STORAGE_FOLDER/dataverse/idx/fileName */ - String[] fileNameTokens = filePath.split(File.separator); + String[] fileNameTokens = fileRef.getAbsolutePath().split(File.separator); String partitionDir = fileNameTokens[fileNameTokens.length - 4]; //exclude temporary datasets resources if (!partitionDir.equals(StoragePathUtil.TEMP_DATASETS_STORAGE_FOLDER)) { filesToBeReplicated.clear(); - filesToBeReplicated.add(filePath); + filesToBeReplicated.add(fileRef.getAbsolutePath()); AsterixReplicationJob job = new AsterixReplicationJob(ReplicationJobType.METADATA, operation, ReplicationExecutionType.SYNC, filesToBeReplicated); try { @@ -421,11 +420,9 @@ * @param ioDeviceId * @return A file reference to the storage metadata file. */ - private static FileReference getStorageMetadataFile(IIOManager ioManager, String nodeId, - int ioDeviceId) { + private static FileReference getStorageMetadataFile(IIOManager ioManager, String nodeId, int ioDeviceId) { String storageMetadataFileName = STORAGE_METADATA_DIRECTORY + File.separator + nodeId + "_" + "iodevice" - + ioDeviceId + File.separator - + STORAGE_METADATA_FILE_NAME_PREFIX; + + ioDeviceId + File.separator + STORAGE_METADATA_FILE_NAME_PREFIX; return new FileReference(ioManager.getIODevices().get(ioDeviceId), storageMetadataFileName); } @@ -436,8 +433,7 @@ * @return A file reference to the storage root directory if exists, otherwise null. * @throws HyracksDataException */ - public static File getStorageRootDirectoryIfExists(IIOManager ioManager, String nodeId, - int ioDeviceId) + public static File getStorageRootDirectoryIfExists(IIOManager ioManager, String nodeId, int ioDeviceId) throws HyracksDataException { File storageRootDir = null; FileReference storageMetadataFile = getStorageMetadataFile(ioManager, nodeId, ioDeviceId); diff --git a/asterixdb/pom.xml b/asterixdb/pom.xml index 8862644..ee5067d 100644 --- a/asterixdb/pom.xml +++ b/asterixdb/pom.xml @@ -60,7 +60,6 @@ <failsafe.test.excludes>**/DmlRecoveryIT.java</failsafe.test.excludes> <cluster.test.excludes>**/AsterixClusterLifeCycleIT.java</cluster.test.excludes> <cluster.extest.excludes>**/ClusterExecutionIT.java</cluster.extest.excludes> - <replication.test.excludes>**/ReplicationIT.java</replication.test.excludes> <!-- Versions under dependencymanagement or used in many projects via properties --> <algebricks.version>0.2.18-SNAPSHOT</algebricks.version> @@ -115,7 +114,6 @@ <exclude>${failsafe.test.excludes}</exclude> <exclude>${cluster.test.excludes}</exclude> <exclude>${cluster.extest.excludes}</exclude> - <exclude>${replication.test.excludes}</exclude> </excludes> </configuration> <executions> -- To view, visit https://asterix-gerrit.ics.uci.edu/1364 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: merged Gerrit-Change-Id: I542b212e04469e2701690f464f821a5189b97f12 Gerrit-PatchSet: 7 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Murtadha Hubail <hubail...@gmail.com> Gerrit-Reviewer: Jenkins <jenk...@fulliautomatix.ics.uci.edu> Gerrit-Reviewer: Murtadha Hubail <hubail...@gmail.com> Gerrit-Reviewer: abdullah alamoudi <bamou...@gmail.com>