You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by st...@apache.org on 2020/11/24 06:59:25 UTC
[phoenix-tephra] branch master updated: TEPHRA-315 tephra-example
maven setup is broken
This is an automated email from the ASF dual-hosted git repository.
stoty pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/phoenix-tephra.git
The following commit(s) were added to refs/heads/master by this push:
new 1520af3 TEPHRA-315 tephra-example maven setup is broken
1520af3 is described below
commit 1520af3d7c91b5a6292e5a37b516b85d66ddb115
Author: Istvan Toth <st...@apache.org>
AuthorDate: Mon Nov 16 09:50:26 2020 +0100
TEPHRA-315 tephra-example maven setup is broken
fix examples maven structure
update some maven plugin versions
---
pom.xml | 70 +----
tephra-core-shaded/pom.xml | 41 +--
tephra-core/pom.xml | 1 -
.../tephra-examples-post-1.3/hbase-1.3/pom.xml | 1 -
.../tephra-examples-post-1.3/hbase-1.4/pom.xml | 8 +-
.../org/apache/tephra/examples/BalanceBooks.java | 341 ---------------------
.../org/apache/tephra/examples/package-info.java | 40 ---
.../apache/tephra/examples/BalanceBooksTest.java | 137 ---------
.../tephra-examples-post-1.3/hbase-1.5/pom.xml | 8 +-
.../tephra-examples-post-1.3/hbase-1.6/pom.xml | 8 +-
.../tephra-examples-post-1.3/hbase-2.0/pom.xml | 29 +-
.../org/apache/tephra/examples/BalanceBooks.java | 341 ---------------------
.../org/apache/tephra/examples/package-info.java | 40 ---
.../apache/tephra/examples/BalanceBooksTest.java | 137 ---------
.../tephra-examples-post-1.3/hbase-2.1/pom.xml | 29 +-
.../tephra-examples-post-1.3/hbase-2.2/pom.xml | 29 +-
.../tephra-examples-post-1.3/hbase-2.3/pom.xml | 29 +-
tephra-examples/tephra-examples-post-1.3/pom.xml | 1 -
tephra-examples/tephra-examples-pre-1.3/pom.xml | 1 -
tephra-hbase-compat-1.1-base/pom.xml | 1 -
tephra-hbase-compat-1.4-base/pom.xml | 1 -
tephra-hbase-compat-2.0-base/pom.xml | 1 -
22 files changed, 99 insertions(+), 1195 deletions(-)
diff --git a/pom.xml b/pom.xml
index 7dddd1d..33741bd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -407,7 +407,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
@@ -418,7 +417,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.14.1</version>
<configuration>
<argLine>-Xmx4096m -Djava.awt.headless=true -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true</argLine>
<redirectTestOutputToFile>${surefire.redirectTestOutputToFile}</redirectTestOutputToFile>
@@ -441,11 +439,16 @@
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <version>3.2.0</version>
+ </plugin>
+
<!-- License check -->
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
- <version>0.10</version>
<executions>
<execution>
<id>rat-check</id>
@@ -516,7 +519,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
- <version>2.5</version>
<configuration>
<tagNameFormat>v@{project.version}</tagNameFormat>
<allowTimestampedSnapshots>true</allowTimestampedSnapshots>
@@ -538,22 +540,18 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
- <version>2.14.1</version>
</plugin>
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
- <version>0.10</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
- <version>2.12.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -652,62 +650,6 @@
</plugins>
</build>
</profile>
-
- <!-- Profile to generate apache release -->
- <profile>
- <id>apache-release</id>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-assembly-plugin</artifactId>
- <configuration>
- <finalName>apache-tephra-${project.version}</finalName>
- <formats>
- <format>tar.gz</format>
- </formats>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-remote-resources-plugin</artifactId>
- <configuration>
- <!-- Disable this plugin so that it won't generate a DEPENDENCIES file in the source tar -->
- <skip>true</skip>
- </configuration>
- </plugin>
-
- <!-- Compute checksum of release artifact -->
- <plugin>
- <inherited>false</inherited>
- <groupId>net.ju-n.maven.plugins</groupId>
- <artifactId>checksum-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>files</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <algorithms>
- <algorithm>MD5</algorithm>
- <algorithm>SHA-512</algorithm>
- </algorithms>
- <fileSets>
- <fileSet>
- <directory>${project.build.directory}</directory>
- <includes>
- <include>apache-tephra-${project.version}-${sourceReleaseAssemblyDescriptor}.tar.gz</include>
- </includes>
- </fileSet>
- </fileSets>
- </configuration>
- </plugin>
- </plugins>
- </build>
- </profile>
-
</profiles>
</project>
diff --git a/tephra-core-shaded/pom.xml b/tephra-core-shaded/pom.xml
index 20c3ffb..5475cce 100644
--- a/tephra-core-shaded/pom.xml
+++ b/tephra-core-shaded/pom.xml
@@ -45,6 +45,21 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
+ <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
+ <dependencyReducedPomLocation>${basedir}/target/dependency-reduced-pom.xml</dependencyReducedPomLocation>
+ <createSourcesJar>true</createSourcesJar>
+ <artifactSet>
+ <includes>
+ <include>org.apache.tephra:tephra-core</include>
+ <include>org.apache.twill:twill-api</include>
+ <include>org.apache.twill:twill-common</include>
+ <include>org.apache.twill:twill-core</include>
+ <include>org.apache.twill:twill-discovery-api</include>
+ <include>org.apache.twill:twill-discovery-core</include>
+ <include>org.apache.twill:twill-zookeeper</include>
+ <include>com.google.guava:guava</include>
+ </includes>
+ </artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
@@ -74,32 +89,6 @@
</transformer>
</transformers>
</configuration>
- <executions>
- <execution>
- <id>default-shaded</id>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <promoteTransitiveDependencies>true</promoteTransitiveDependencies>
- <dependencyReducedPomLocation>${basedir}/target/dependency-reduced-pom.xml</dependencyReducedPomLocation>
- <createSourcesJar>true</createSourcesJar>
- <artifactSet>
- <includes>
- <include>org.apache.tephra:tephra-core</include>
- <include>org.apache.twill:twill-api</include>
- <include>org.apache.twill:twill-common</include>
- <include>org.apache.twill:twill-core</include>
- <include>org.apache.twill:twill-discovery-api</include>
- <include>org.apache.twill:twill-discovery-core</include>
- <include>org.apache.twill:twill-zookeeper</include>
- <include>com.google.guava:guava</include>
- </includes>
- </artifactSet>
- </configuration>
- </execution>
- </executions>
</plugin>
</plugins>
</build>
diff --git a/tephra-core/pom.xml b/tephra-core/pom.xml
index 26c0d21..7d50afb 100644
--- a/tephra-core/pom.xml
+++ b/tephra-core/pom.xml
@@ -128,7 +128,6 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
<executions>
<execution>
<id>test-jar</id>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
index a2c283a..3f75814 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.3/pom.xml
@@ -31,7 +31,6 @@
<properties>
<hadoop.version>2.5.1</hadoop.version>
<hbase13.version>1.3.1</hbase13.version>
- <hbase.scrdir>src-1.3</hbase.scrdir>
</properties>
<build>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
index 0eefc61..edfefa1 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/pom.xml
@@ -34,8 +34,12 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java
deleted file mode 100644
index b970598..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/BalanceBooks.java
+++ /dev/null
@@ -1,341 +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.
- */
-
-package org.apache.tephra.examples;
-
-import com.google.common.io.Closeables;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.tephra.TransactionConflictException;
-import org.apache.tephra.TransactionContext;
-import org.apache.tephra.TransactionFailureException;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.distributed.TransactionServiceClient;
-import org.apache.tephra.hbase.TransactionAwareHTable;
-import org.apache.tephra.hbase.coprocessor.TransactionProcessor;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.ConfigurationFactory;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Simple example application that launches a number of concurrent clients, one per "account". Each client attempts to
- * make withdrawals from other clients, and deposit the same amount to its own account in a single transaction.
- * Since this means the client will be updating both its own row and the withdrawee's row, this will naturally lead to
- * transaction conflicts. All clients will run for a specified number of iterations. When the processing is complete,
- * the total sum of all rows should be zero, if transactional integrity was maintained.
- *
- * <p>
- * You can run the BalanceBooks application with the following command:
- * <pre>
- * ./bin/tephra run org.apache.tephra.examples.BalanceBooks [num clients] [num iterations]
- * </pre>
- * where <code>[num clients]</code> is the number of concurrent client threads to use, and
- * <code>[num iterations]</code> is the number of "transfer" operations to perform per client thread.
- * </p>
- */
-public class BalanceBooks implements Closeable {
- private static final Logger LOG = LoggerFactory.getLogger(BalanceBooks.class);
-
- private static final int MAX_AMOUNT = 100;
- private static final byte[] TABLE = Bytes.toBytes("testbalances");
- private static final byte[] FAMILY = Bytes.toBytes("f");
- private static final byte[] COL = Bytes.toBytes("b");
-
- private final int totalClients;
- private final int iterations;
-
- private Configuration conf;
- private ZKClientService zkClient;
- private TransactionServiceClient txClient;
- private Connection conn;
-
- public BalanceBooks(int totalClients, int iterations) {
- this(totalClients, iterations, new ConfigurationFactory().get());
- }
-
- public BalanceBooks(int totalClients, int iterations, Configuration conf) {
- this.totalClients = totalClients;
- this.iterations = iterations;
- this.conf = conf;
- }
-
- /**
- * Sets up common resources required by all clients.
- */
- public void init() throws IOException {
- Injector injector = Guice.createInjector(
- new ConfigModule(conf),
- new ZKModule(),
- new DiscoveryModules().getDistributedModules(),
- new TransactionModules().getDistributedModules(),
- new TransactionClientModule()
- );
-
- zkClient = injector.getInstance(ZKClientService.class);
- zkClient.startAndWait();
- txClient = injector.getInstance(TransactionServiceClient.class);
- conn = ConnectionFactory.createConnection(conf);
- createTableIfNotExists(conf, TABLE, new byte[][]{ FAMILY });
- }
-
- /**
- * Runs all clients and waits for them to complete.
- */
- public void run() throws IOException, InterruptedException {
- List<Client> clients = new ArrayList<>(totalClients);
- for (int i = 0; i < totalClients; i++) {
- Client c = new Client(i, totalClients, iterations);
- c.init(txClient, conn.getTable(TableName.valueOf(TABLE)));
- c.start();
- clients.add(c);
- }
-
- for (Client c : clients) {
- c.join();
- Closeables.closeQuietly(c);
- }
- }
-
- /**
- * Validates the current state of the data stored at the end of the test. Each update by a client consists of two
- * parts: a withdrawal of a random amount from a randomly select other account, and a corresponding to deposit to
- * the client's own account. So, if all the updates were performed consistently (no partial updates or partial
- * rollbacks), then the total sum of all balances at the end should be 0.
- */
- public boolean verify() {
- boolean success = false;
- try {
- TransactionAwareHTable table = new TransactionAwareHTable(conn.getTable(TableName.valueOf(TABLE)));
- TransactionContext context = new TransactionContext(txClient, table);
-
- LOG.info("VERIFYING BALANCES");
- context.start();
- long totalBalance = 0;
-
- try (ResultScanner scanner = table.getScanner(new Scan())) {
- for (Result r : scanner) {
- if (!r.isEmpty()) {
- int rowId = Bytes.toInt(r.getRow());
- long balance = Bytes.toLong(r.getValue(FAMILY, COL));
- totalBalance += balance;
- LOG.info("Client #{}: balance = ${}", rowId, balance);
- }
- }
- }
- if (totalBalance == 0) {
- LOG.info("PASSED!");
- success = true;
- } else {
- LOG.info("FAILED! Total balance should be 0 but was {}", totalBalance);
- }
- context.finish();
- } catch (Exception e) {
- LOG.error("Failed verification check", e);
- }
- return success;
- }
-
- /**
- * Frees up the underlying resources common to all clients.
- */
- public void close() {
- try {
- if (conn != null) {
- conn.close();
- }
- } catch (IOException ignored) { }
-
- if (zkClient != null) {
- zkClient.stopAndWait();
- }
- }
-
- protected void createTableIfNotExists(Configuration conf, byte[] tableName, byte[][] columnFamilies)
- throws IOException {
- try (Admin admin = this.conn.getAdmin()) {
- HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
- for (byte[] family : columnFamilies) {
- HColumnDescriptor columnDesc = new HColumnDescriptor(family);
- columnDesc.setMaxVersions(Integer.MAX_VALUE);
- desc.addFamily(columnDesc);
- }
- desc.addCoprocessor(TransactionProcessor.class.getName());
- admin.createTable(desc);
- }
- }
-
- public static void main(String[] args) {
- if (args.length != 2) {
- System.err.println("Usage: java " + BalanceBooks.class.getName() + " <num clients> <iterations>");
- System.err.println("\twhere <num clients> >= 2");
- System.exit(1);
- }
-
- try (BalanceBooks bb = new BalanceBooks(Integer.parseInt(args[0]), Integer.parseInt(args[1]))) {
- bb.init();
- bb.run();
- bb.verify();
- } catch (Exception e) {
- LOG.error("Failed during BalanceBooks run", e);
- }
- }
-
- /**
- * Represents a single client actor in the test. Each client runs as a separate thread.
- *
- * For the given number of iterations, the client will:
- * <ol>
- * <li>select a random other client from which to withdraw</li>
- * <li>select a random amount from 0 to MAX_AMOUNT</li>
- * <li>start a new transaction and: deduct the amount from the other client's acccount, and deposit
- * the same amount to its own account.</li>
- * </ol>
- *
- * Since multiple clients operate concurrently and contend over a set of constrained resources
- * (the client accounts), it is expected that a portion of the attempted transactions will encounter
- * conflicts, due to a simultaneous deduction from or deposit to one the same accounts which has successfully
- * committed first. In this case, the updates from the transaction encountering the conflict should be completely
- * rolled back, leaving the data in a consistent state.
- */
- private static class Client extends Thread implements Closeable {
- private final int id;
- private final int totalClients;
- private final int iterations;
-
- private final Random random = new Random();
-
- private TransactionContext txContext;
- private TransactionAwareHTable txTable;
-
-
- public Client(int id, int totalClients, int iterations) {
- this.id = id;
- this.totalClients = totalClients;
- this.iterations = iterations;
- }
-
- /**
- * Sets up any resources needed by the individual client.
- *
- * @param txClient the transaction client to use in accessing the transaciton service
- * @param table the HBase table instance to use for accessing storage
- */
- public void init(TransactionSystemClient txClient, Table table) {
- txTable = new TransactionAwareHTable(table);
- txContext = new TransactionContext(txClient, txTable);
- }
-
- public void run() {
- try {
- for (int i = 0; i < iterations; i++) {
- runOnce();
- }
- } catch (TransactionFailureException e) {
- LOG.error("Client #{}: Failed on exception", id, e);
- }
- }
-
- /**
- * Runs a single iteration of the client logic.
- */
- private void runOnce() throws TransactionFailureException {
- int withdrawee = getNextWithdrawee();
- int amount = getAmount();
-
- try {
- txContext.start();
- long withdraweeBalance = getCurrentBalance(withdrawee);
- long ownBalance = getCurrentBalance(id);
- long withdraweeNew = withdraweeBalance - amount;
- long ownNew = ownBalance + amount;
-
- setBalance(withdrawee, withdraweeNew);
- setBalance(id, ownNew);
- LOG.debug("Client #{}: Withdrew ${} from #{}; withdrawee old={}, new={}; own old={}, new={}",
- id, amount, withdrawee, withdraweeBalance, withdraweeNew, ownBalance, ownNew);
- txContext.finish();
-
- } catch (IOException ioe) {
- LOG.error("Client #{}: Unhandled client failure", id, ioe);
- txContext.abort();
- } catch (TransactionConflictException tce) {
- LOG.debug("CONFLICT: client #{} attempting to withdraw from #{}", id, withdrawee);
- txContext.abort(tce);
- } catch (TransactionFailureException tfe) {
- LOG.error("Client #{}: Unhandled transaction failure", id, tfe);
- txContext.abort(tfe);
- }
- }
-
- private long getCurrentBalance(int id) throws IOException {
- Result r = txTable.get(new Get(Bytes.toBytes(id)));
- byte[] balanceBytes = r.getValue(FAMILY, COL);
- if (balanceBytes == null) {
- return 0;
- }
- return Bytes.toLong(balanceBytes);
- }
-
- private void setBalance(int id, long balance) throws IOException {
- txTable.put(new Put(Bytes.toBytes(id)).addColumn(FAMILY, COL, Bytes.toBytes(balance)));
- }
-
- private int getNextWithdrawee() {
- int next;
- do {
- next = random.nextInt(totalClients);
- } while (next == id);
- return next;
- }
-
- private int getAmount() {
- return random.nextInt(MAX_AMOUNT);
- }
-
- public void close() throws IOException {
- txTable.close();
- }
- }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java
deleted file mode 100644
index a0e67d5..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/main/java/org/apache/tephra/examples/package-info.java
+++ /dev/null
@@ -1,40 +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.
- */
-
-/**
- * This package contains example applications for Tephra designed to illustrate sample Tephra usage
- * and provide out-of-the-box sample applications which can be run to test cluster functionality.
- *
- * <p>Currently the following applications are provided:
- *
- * <ul>
- * <li><strong>BalanceBooks</strong> - this application runs a specified number of concurrent clients in separate
- * threads, which perform transactions to make withdrawals from each other's accounts and deposits to their own
- * accounts. At the end of the test, the total value of all account balances is verified to be equal to zero,
- * which confirms that transactional integrity was not violated.
- * </li>
- * </ul>
- * </p>
- *
- * <p>
- * Note that, for simplicity, the examples package is currently hardcoded to compile against a specific HBase
- * version (currently 2.0). In the future, we should provide Maven profiles to allow compiling the examples
- * against each of the supported HBase versions.
- * </p>
- */
-package org.apache.tephra.examples;
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java b/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
deleted file mode 100644
index 4dfe107..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.4/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
+++ /dev/null
@@ -1,137 +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.
- */
-
-package org.apache.tephra.examples;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Scopes;
-import com.google.inject.util.Modules;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.TxConstants;
-import org.apache.tephra.distributed.TransactionService;
-import org.apache.tephra.persist.InMemoryTransactionStateStorage;
-import org.apache.tephra.persist.TransactionStateStorage;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.Tests;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests the {@link BalanceBooks} program.
- */
-public class BalanceBooksTest {
- private static final Logger LOG = LoggerFactory.getLogger(BalanceBooksTest.class);
- private static HBaseTestingUtility testUtil;
- private static TransactionService txService;
- private static ZKClientService zkClientService;
-
- @ClassRule
- public static TemporaryFolder tmpFolder = new TemporaryFolder();
-
- @BeforeClass
- public static void setup() throws Exception {
- testUtil = new HBaseTestingUtility();
- Configuration conf = testUtil.getConfiguration();
- conf.setBoolean(TxConstants.Manager.CFG_DO_PERSIST, false);
- conf.set(TxConstants.Manager.CFG_TX_SNAPSHOT_DIR, tmpFolder.newFolder().getAbsolutePath());
-
- // Tune down the connection thread pool size
- conf.setInt("hbase.hconnection.threads.core", 5);
- conf.setInt("hbase.hconnection.threads.max", 10);
- // Tunn down handler threads in regionserver
- conf.setInt("hbase.regionserver.handler.count", 10);
-
- // Set to random port
- conf.setInt("hbase.master.port", 0);
- conf.setInt("hbase.master.info.port", 0);
- conf.setInt("hbase.regionserver.port", 0);
- conf.setInt("hbase.regionserver.info.port", 0);
-
- testUtil.startMiniCluster();
-
- String zkClusterKey = testUtil.getClusterKey(); // hostname:clientPort:parentZnode
- String zkQuorum = zkClusterKey.substring(0, zkClusterKey.lastIndexOf(':'));
- LOG.info("Zookeeper Quorum is running at {}", zkQuorum);
- conf.set(TxConstants.Service.CFG_DATA_TX_ZOOKEEPER_QUORUM, zkQuorum);
-
- Injector injector = Guice.createInjector(
- new ConfigModule(conf),
- new ZKModule(),
- new DiscoveryModules().getDistributedModules(),
- Modules.override(new TransactionModules().getDistributedModules())
- .with(new AbstractModule() {
- @Override
- protected void configure() {
- bind(TransactionStateStorage.class).to(InMemoryTransactionStateStorage.class).in(Scopes.SINGLETON);
- }
- }),
- new TransactionClientModule()
- );
-
- zkClientService = injector.getInstance(ZKClientService.class);
- zkClientService.startAndWait();
-
- // start a tx server
- txService = injector.getInstance(TransactionService.class);
- try {
- LOG.info("Starting transaction service");
- txService.startAndWait();
- } catch (Exception e) {
- LOG.error("Failed to start service: ", e);
- throw e;
- }
-
- Tests.waitForTxReady(injector.getInstance(TransactionSystemClient.class));
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- if (txService != null) {
- txService.stopAndWait();
- }
- if (zkClientService != null) {
- zkClientService.stopAndWait();
- }
- testUtil.shutdownMiniCluster();
- }
-
- @Test
- public void testBalanceBooks() throws Exception {
- try (BalanceBooks bb = new BalanceBooks(5, 100, testUtil.getConfiguration())) {
- bb.init();
- bb.run();
- assertTrue(bb.verify());
- }
- }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
index 04c7eba..ee32376 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.5/pom.xml
@@ -34,8 +34,12 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
index 0300ffe..440778c 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-1.6/pom.xml
@@ -34,8 +34,12 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
index 727fd7c..832b82e 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/pom.xml
@@ -33,20 +33,21 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
- <plugins>
- <!-- Compiler -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ <!-- Compiler -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java
deleted file mode 100644
index b970598..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/BalanceBooks.java
+++ /dev/null
@@ -1,341 +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.
- */
-
-package org.apache.tephra.examples;
-
-import com.google.common.io.Closeables;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
-import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.client.Admin;
-import org.apache.hadoop.hbase.client.Connection;
-import org.apache.hadoop.hbase.client.ConnectionFactory;
-import org.apache.hadoop.hbase.client.Get;
-import org.apache.hadoop.hbase.client.Put;
-import org.apache.hadoop.hbase.client.Result;
-import org.apache.hadoop.hbase.client.ResultScanner;
-import org.apache.hadoop.hbase.client.Scan;
-import org.apache.hadoop.hbase.client.Table;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.tephra.TransactionConflictException;
-import org.apache.tephra.TransactionContext;
-import org.apache.tephra.TransactionFailureException;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.distributed.TransactionServiceClient;
-import org.apache.tephra.hbase.TransactionAwareHTable;
-import org.apache.tephra.hbase.coprocessor.TransactionProcessor;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.ConfigurationFactory;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.Closeable;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-/**
- * Simple example application that launches a number of concurrent clients, one per "account". Each client attempts to
- * make withdrawals from other clients, and deposit the same amount to its own account in a single transaction.
- * Since this means the client will be updating both its own row and the withdrawee's row, this will naturally lead to
- * transaction conflicts. All clients will run for a specified number of iterations. When the processing is complete,
- * the total sum of all rows should be zero, if transactional integrity was maintained.
- *
- * <p>
- * You can run the BalanceBooks application with the following command:
- * <pre>
- * ./bin/tephra run org.apache.tephra.examples.BalanceBooks [num clients] [num iterations]
- * </pre>
- * where <code>[num clients]</code> is the number of concurrent client threads to use, and
- * <code>[num iterations]</code> is the number of "transfer" operations to perform per client thread.
- * </p>
- */
-public class BalanceBooks implements Closeable {
- private static final Logger LOG = LoggerFactory.getLogger(BalanceBooks.class);
-
- private static final int MAX_AMOUNT = 100;
- private static final byte[] TABLE = Bytes.toBytes("testbalances");
- private static final byte[] FAMILY = Bytes.toBytes("f");
- private static final byte[] COL = Bytes.toBytes("b");
-
- private final int totalClients;
- private final int iterations;
-
- private Configuration conf;
- private ZKClientService zkClient;
- private TransactionServiceClient txClient;
- private Connection conn;
-
- public BalanceBooks(int totalClients, int iterations) {
- this(totalClients, iterations, new ConfigurationFactory().get());
- }
-
- public BalanceBooks(int totalClients, int iterations, Configuration conf) {
- this.totalClients = totalClients;
- this.iterations = iterations;
- this.conf = conf;
- }
-
- /**
- * Sets up common resources required by all clients.
- */
- public void init() throws IOException {
- Injector injector = Guice.createInjector(
- new ConfigModule(conf),
- new ZKModule(),
- new DiscoveryModules().getDistributedModules(),
- new TransactionModules().getDistributedModules(),
- new TransactionClientModule()
- );
-
- zkClient = injector.getInstance(ZKClientService.class);
- zkClient.startAndWait();
- txClient = injector.getInstance(TransactionServiceClient.class);
- conn = ConnectionFactory.createConnection(conf);
- createTableIfNotExists(conf, TABLE, new byte[][]{ FAMILY });
- }
-
- /**
- * Runs all clients and waits for them to complete.
- */
- public void run() throws IOException, InterruptedException {
- List<Client> clients = new ArrayList<>(totalClients);
- for (int i = 0; i < totalClients; i++) {
- Client c = new Client(i, totalClients, iterations);
- c.init(txClient, conn.getTable(TableName.valueOf(TABLE)));
- c.start();
- clients.add(c);
- }
-
- for (Client c : clients) {
- c.join();
- Closeables.closeQuietly(c);
- }
- }
-
- /**
- * Validates the current state of the data stored at the end of the test. Each update by a client consists of two
- * parts: a withdrawal of a random amount from a randomly select other account, and a corresponding to deposit to
- * the client's own account. So, if all the updates were performed consistently (no partial updates or partial
- * rollbacks), then the total sum of all balances at the end should be 0.
- */
- public boolean verify() {
- boolean success = false;
- try {
- TransactionAwareHTable table = new TransactionAwareHTable(conn.getTable(TableName.valueOf(TABLE)));
- TransactionContext context = new TransactionContext(txClient, table);
-
- LOG.info("VERIFYING BALANCES");
- context.start();
- long totalBalance = 0;
-
- try (ResultScanner scanner = table.getScanner(new Scan())) {
- for (Result r : scanner) {
- if (!r.isEmpty()) {
- int rowId = Bytes.toInt(r.getRow());
- long balance = Bytes.toLong(r.getValue(FAMILY, COL));
- totalBalance += balance;
- LOG.info("Client #{}: balance = ${}", rowId, balance);
- }
- }
- }
- if (totalBalance == 0) {
- LOG.info("PASSED!");
- success = true;
- } else {
- LOG.info("FAILED! Total balance should be 0 but was {}", totalBalance);
- }
- context.finish();
- } catch (Exception e) {
- LOG.error("Failed verification check", e);
- }
- return success;
- }
-
- /**
- * Frees up the underlying resources common to all clients.
- */
- public void close() {
- try {
- if (conn != null) {
- conn.close();
- }
- } catch (IOException ignored) { }
-
- if (zkClient != null) {
- zkClient.stopAndWait();
- }
- }
-
- protected void createTableIfNotExists(Configuration conf, byte[] tableName, byte[][] columnFamilies)
- throws IOException {
- try (Admin admin = this.conn.getAdmin()) {
- HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(tableName));
- for (byte[] family : columnFamilies) {
- HColumnDescriptor columnDesc = new HColumnDescriptor(family);
- columnDesc.setMaxVersions(Integer.MAX_VALUE);
- desc.addFamily(columnDesc);
- }
- desc.addCoprocessor(TransactionProcessor.class.getName());
- admin.createTable(desc);
- }
- }
-
- public static void main(String[] args) {
- if (args.length != 2) {
- System.err.println("Usage: java " + BalanceBooks.class.getName() + " <num clients> <iterations>");
- System.err.println("\twhere <num clients> >= 2");
- System.exit(1);
- }
-
- try (BalanceBooks bb = new BalanceBooks(Integer.parseInt(args[0]), Integer.parseInt(args[1]))) {
- bb.init();
- bb.run();
- bb.verify();
- } catch (Exception e) {
- LOG.error("Failed during BalanceBooks run", e);
- }
- }
-
- /**
- * Represents a single client actor in the test. Each client runs as a separate thread.
- *
- * For the given number of iterations, the client will:
- * <ol>
- * <li>select a random other client from which to withdraw</li>
- * <li>select a random amount from 0 to MAX_AMOUNT</li>
- * <li>start a new transaction and: deduct the amount from the other client's acccount, and deposit
- * the same amount to its own account.</li>
- * </ol>
- *
- * Since multiple clients operate concurrently and contend over a set of constrained resources
- * (the client accounts), it is expected that a portion of the attempted transactions will encounter
- * conflicts, due to a simultaneous deduction from or deposit to one the same accounts which has successfully
- * committed first. In this case, the updates from the transaction encountering the conflict should be completely
- * rolled back, leaving the data in a consistent state.
- */
- private static class Client extends Thread implements Closeable {
- private final int id;
- private final int totalClients;
- private final int iterations;
-
- private final Random random = new Random();
-
- private TransactionContext txContext;
- private TransactionAwareHTable txTable;
-
-
- public Client(int id, int totalClients, int iterations) {
- this.id = id;
- this.totalClients = totalClients;
- this.iterations = iterations;
- }
-
- /**
- * Sets up any resources needed by the individual client.
- *
- * @param txClient the transaction client to use in accessing the transaciton service
- * @param table the HBase table instance to use for accessing storage
- */
- public void init(TransactionSystemClient txClient, Table table) {
- txTable = new TransactionAwareHTable(table);
- txContext = new TransactionContext(txClient, txTable);
- }
-
- public void run() {
- try {
- for (int i = 0; i < iterations; i++) {
- runOnce();
- }
- } catch (TransactionFailureException e) {
- LOG.error("Client #{}: Failed on exception", id, e);
- }
- }
-
- /**
- * Runs a single iteration of the client logic.
- */
- private void runOnce() throws TransactionFailureException {
- int withdrawee = getNextWithdrawee();
- int amount = getAmount();
-
- try {
- txContext.start();
- long withdraweeBalance = getCurrentBalance(withdrawee);
- long ownBalance = getCurrentBalance(id);
- long withdraweeNew = withdraweeBalance - amount;
- long ownNew = ownBalance + amount;
-
- setBalance(withdrawee, withdraweeNew);
- setBalance(id, ownNew);
- LOG.debug("Client #{}: Withdrew ${} from #{}; withdrawee old={}, new={}; own old={}, new={}",
- id, amount, withdrawee, withdraweeBalance, withdraweeNew, ownBalance, ownNew);
- txContext.finish();
-
- } catch (IOException ioe) {
- LOG.error("Client #{}: Unhandled client failure", id, ioe);
- txContext.abort();
- } catch (TransactionConflictException tce) {
- LOG.debug("CONFLICT: client #{} attempting to withdraw from #{}", id, withdrawee);
- txContext.abort(tce);
- } catch (TransactionFailureException tfe) {
- LOG.error("Client #{}: Unhandled transaction failure", id, tfe);
- txContext.abort(tfe);
- }
- }
-
- private long getCurrentBalance(int id) throws IOException {
- Result r = txTable.get(new Get(Bytes.toBytes(id)));
- byte[] balanceBytes = r.getValue(FAMILY, COL);
- if (balanceBytes == null) {
- return 0;
- }
- return Bytes.toLong(balanceBytes);
- }
-
- private void setBalance(int id, long balance) throws IOException {
- txTable.put(new Put(Bytes.toBytes(id)).addColumn(FAMILY, COL, Bytes.toBytes(balance)));
- }
-
- private int getNextWithdrawee() {
- int next;
- do {
- next = random.nextInt(totalClients);
- } while (next == id);
- return next;
- }
-
- private int getAmount() {
- return random.nextInt(MAX_AMOUNT);
- }
-
- public void close() throws IOException {
- txTable.close();
- }
- }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java
deleted file mode 100644
index a0e67d5..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/main/java/org/apache/tephra/examples/package-info.java
+++ /dev/null
@@ -1,40 +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.
- */
-
-/**
- * This package contains example applications for Tephra designed to illustrate sample Tephra usage
- * and provide out-of-the-box sample applications which can be run to test cluster functionality.
- *
- * <p>Currently the following applications are provided:
- *
- * <ul>
- * <li><strong>BalanceBooks</strong> - this application runs a specified number of concurrent clients in separate
- * threads, which perform transactions to make withdrawals from each other's accounts and deposits to their own
- * accounts. At the end of the test, the total value of all account balances is verified to be equal to zero,
- * which confirms that transactional integrity was not violated.
- * </li>
- * </ul>
- * </p>
- *
- * <p>
- * Note that, for simplicity, the examples package is currently hardcoded to compile against a specific HBase
- * version (currently 2.0). In the future, we should provide Maven profiles to allow compiling the examples
- * against each of the supported HBase versions.
- * </p>
- */
-package org.apache.tephra.examples;
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java b/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
deleted file mode 100644
index 4dfe107..0000000
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.0/src/test/java/org/apache/tephra/examples/BalanceBooksTest.java
+++ /dev/null
@@ -1,137 +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.
- */
-
-package org.apache.tephra.examples;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Scopes;
-import com.google.inject.util.Modules;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.HBaseTestingUtility;
-import org.apache.tephra.TransactionSystemClient;
-import org.apache.tephra.TxConstants;
-import org.apache.tephra.distributed.TransactionService;
-import org.apache.tephra.persist.InMemoryTransactionStateStorage;
-import org.apache.tephra.persist.TransactionStateStorage;
-import org.apache.tephra.runtime.ConfigModule;
-import org.apache.tephra.runtime.DiscoveryModules;
-import org.apache.tephra.runtime.TransactionClientModule;
-import org.apache.tephra.runtime.TransactionModules;
-import org.apache.tephra.runtime.ZKModule;
-import org.apache.tephra.util.Tests;
-import org.apache.twill.zookeeper.ZKClientService;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static org.junit.Assert.assertTrue;
-
-/**
- * Tests the {@link BalanceBooks} program.
- */
-public class BalanceBooksTest {
- private static final Logger LOG = LoggerFactory.getLogger(BalanceBooksTest.class);
- private static HBaseTestingUtility testUtil;
- private static TransactionService txService;
- private static ZKClientService zkClientService;
-
- @ClassRule
- public static TemporaryFolder tmpFolder = new TemporaryFolder();
-
- @BeforeClass
- public static void setup() throws Exception {
- testUtil = new HBaseTestingUtility();
- Configuration conf = testUtil.getConfiguration();
- conf.setBoolean(TxConstants.Manager.CFG_DO_PERSIST, false);
- conf.set(TxConstants.Manager.CFG_TX_SNAPSHOT_DIR, tmpFolder.newFolder().getAbsolutePath());
-
- // Tune down the connection thread pool size
- conf.setInt("hbase.hconnection.threads.core", 5);
- conf.setInt("hbase.hconnection.threads.max", 10);
- // Tunn down handler threads in regionserver
- conf.setInt("hbase.regionserver.handler.count", 10);
-
- // Set to random port
- conf.setInt("hbase.master.port", 0);
- conf.setInt("hbase.master.info.port", 0);
- conf.setInt("hbase.regionserver.port", 0);
- conf.setInt("hbase.regionserver.info.port", 0);
-
- testUtil.startMiniCluster();
-
- String zkClusterKey = testUtil.getClusterKey(); // hostname:clientPort:parentZnode
- String zkQuorum = zkClusterKey.substring(0, zkClusterKey.lastIndexOf(':'));
- LOG.info("Zookeeper Quorum is running at {}", zkQuorum);
- conf.set(TxConstants.Service.CFG_DATA_TX_ZOOKEEPER_QUORUM, zkQuorum);
-
- Injector injector = Guice.createInjector(
- new ConfigModule(conf),
- new ZKModule(),
- new DiscoveryModules().getDistributedModules(),
- Modules.override(new TransactionModules().getDistributedModules())
- .with(new AbstractModule() {
- @Override
- protected void configure() {
- bind(TransactionStateStorage.class).to(InMemoryTransactionStateStorage.class).in(Scopes.SINGLETON);
- }
- }),
- new TransactionClientModule()
- );
-
- zkClientService = injector.getInstance(ZKClientService.class);
- zkClientService.startAndWait();
-
- // start a tx server
- txService = injector.getInstance(TransactionService.class);
- try {
- LOG.info("Starting transaction service");
- txService.startAndWait();
- } catch (Exception e) {
- LOG.error("Failed to start service: ", e);
- throw e;
- }
-
- Tests.waitForTxReady(injector.getInstance(TransactionSystemClient.class));
- }
-
- @AfterClass
- public static void tearDown() throws Exception {
- if (txService != null) {
- txService.stopAndWait();
- }
- if (zkClientService != null) {
- zkClientService.stopAndWait();
- }
- testUtil.shutdownMiniCluster();
- }
-
- @Test
- public void testBalanceBooks() throws Exception {
- try (BalanceBooks bb = new BalanceBooks(5, 100, testUtil.getConfiguration())) {
- bb.init();
- bb.run();
- assertTrue(bb.verify());
- }
- }
-}
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
index dbaaf35..2140fb6 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.1/pom.xml
@@ -33,20 +33,21 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
- <plugins>
- <!-- Compiler -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ <!-- Compiler -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
index 12b131d..e2b71ed 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.2/pom.xml
@@ -33,20 +33,21 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
- <plugins>
- <!-- Compiler -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ <!-- Compiler -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
index 37ed038..d809e2d 100644
--- a/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/hbase-2.3/pom.xml
@@ -33,20 +33,21 @@
</properties>
<build>
- <sourceDirectory>src/main/java</sourceDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
- <plugins>
- <!-- Compiler -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- </configuration>
- </plugin>
- </plugins>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ </plugin>
+ <!-- Compiler -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
</build>
<dependencies>
diff --git a/tephra-examples/tephra-examples-post-1.3/pom.xml b/tephra-examples/tephra-examples-post-1.3/pom.xml
index aaaff10..b0ae913 100644
--- a/tephra-examples/tephra-examples-post-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-post-1.3/pom.xml
@@ -46,7 +46,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>
diff --git a/tephra-examples/tephra-examples-pre-1.3/pom.xml b/tephra-examples/tephra-examples-pre-1.3/pom.xml
index 4f39d8a..4ff2d5e 100644
--- a/tephra-examples/tephra-examples-pre-1.3/pom.xml
+++ b/tephra-examples/tephra-examples-pre-1.3/pom.xml
@@ -42,7 +42,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>
diff --git a/tephra-hbase-compat-1.1-base/pom.xml b/tephra-hbase-compat-1.1-base/pom.xml
index 471c147..8384b1b 100644
--- a/tephra-hbase-compat-1.1-base/pom.xml
+++ b/tephra-hbase-compat-1.1-base/pom.xml
@@ -157,7 +157,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>
diff --git a/tephra-hbase-compat-1.4-base/pom.xml b/tephra-hbase-compat-1.4-base/pom.xml
index 48e6c72..fd360fc 100644
--- a/tephra-hbase-compat-1.4-base/pom.xml
+++ b/tephra-hbase-compat-1.4-base/pom.xml
@@ -180,7 +180,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>
diff --git a/tephra-hbase-compat-2.0-base/pom.xml b/tephra-hbase-compat-2.0-base/pom.xml
index b84ecdf..e1f6002 100644
--- a/tephra-hbase-compat-2.0-base/pom.xml
+++ b/tephra-hbase-compat-2.0-base/pom.xml
@@ -167,7 +167,6 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
- <version>3.0.0</version>
<executions>
<execution>
<id>add-source</id>