commit | b3867a8a466db8d7812c62bbafc4c668b14ea9fe | [log] [tgz] |
---|---|---|
author | Dale Emery <demery@vmware.com> | Thu Dec 17 11:10:55 2020 -0800 |
committer | GitHub <noreply@github.com> | Thu Dec 17 11:10:55 2020 -0800 |
tree | 51256ca85c66887075ca4c4cdb373d473b71f620 | |
parent | 82f5df25df2603e2f5fefb82ea890edac9a98f15 [diff] |
Make tests use AvailablePortHelper, not AvailablePort (#5861) Make nearly all tests use AvailablePortHelper instead of AvailablePort to obtain ports. See the rationale below. Also: Remove unused methods from AvailablePort. Rationale: AvailablePort is inherently risky as a source of ports for tests. Each "get available port" method obtains candidate port numbers from the desired range by randomly sampling with replacement. This means that multiple calls can return the same port number if the port is not put into use between calls. Some tests failed intermittently because they made multiple calls to AvailablePort, received the same port on multiple calls, and unknowingly attempted bind multiple sockets to the same port number, resulting in a BindException. See GEODE-6622 for examples. AvailablePortHelper does not have this problem. It obtains candidate port numbers round robin. After returning an available port, AvailablePortHelper will not return that port again in that JVM until it has tested every other port in the range for availability. To reduce the chance of different JVMs selecting each other's ports, AvailablePortHelper selects a random starting point for its round robin search in each JVM. For distributed tests, DUnit further arranges for the AvailablePortHelper in each JVM to start its round robin search in a distinct place, maximally distant from the starting points of all other JVMs. Because AvailablePort selects randomly from the full port range, it cannot benefit from this techique. The problems caused by AvailablePort are rare, but inevitable, with a frequency determined by the total size of the port range. An upcoming change will make the available port range much smaller (~400 ports instead of the current ~10000 ports), which will greatly increase the frequency of this problem. But the problem exists now, and results in intermittent BindExceptions.
Apache Geode is a data management platform that provides real-time, consistent access to data-intensive applications throughout widely distributed cloud architectures.
Apache Geode pools memory, CPU, network resources, and optionally local disk across multiple processes to manage application objects and behavior. It uses dynamic replication and data partitioning techniques to implement high availability, improved performance, scalability, and fault tolerance. In addition to being a distributed data container, Apache Geode is an in-memory data management system that provides reliable asynchronous event notifications and guaranteed message delivery.
Apache Geode is a mature, robust technology originally developed by GemStone Systems. Commercially available as GemFireâ„¢, it was first deployed in the financial sector as the transactional, low-latency data engine used in Wall Street trading platforms. Today Apache Geode technology is used by hundreds of enterprise customers for high-scale business applications that must meet low latency and 24x7 availability requirements.
You can download Apache Geode from the website, run a Docker image, or install with homebrew on OSX. Application developers can load dependencies from Maven Central.
Maven
<dependencies> <dependency> <groupId>org.apache.geode</groupId> <artifactId>geode-core</artifactId> <version>$VERSION</version> </dependency> </dependencies>
Gradle
dependencies { compile "org.apache.geode:geode-core:$VERSION" }
Caches are an abstraction that describe a node in an Apache Geode distributed system.
Within each cache, you define data regions. Data regions are analogous to tables in a relational database and manage data in a distributed fashion as name/value pairs. A replicated region stores identical copies of the data on each cache member of a distributed system. A partitioned region spreads the data among cache members. After the system is configured, client applications can access the distributed data in regions without knowledge of the underlying system architecture. You can define listeners to receive notifications when data has changed, and you can define expiration criteria to delete obsolete data in a region.
Locators provide clients with both discovery and server load balancing services. Clients are configured with locator information, and the locators maintain a dynamic list of member servers. The locators provide clients with connection information to a server.
Apache Geode includes the following features:
See BUILDING.md for instructions on how to build the project.
See TESTING.md for instructions on how to run tests.
Geode requires installation of JDK version 1.8. After installing Apache Geode, start a locator and server:
$ gfsh gfsh> start locator gfsh> start server
Create a region:
gfsh> create region --name=hello --type=REPLICATE
Write a client application (this example uses a Gradle build script):
build.gradle
apply plugin: 'java' apply plugin: 'application' mainClassName = 'HelloWorld' repositories { mavenCentral() } dependencies { compile 'org.apache.geode:geode-core:1.4.0' runtime 'org.slf4j:slf4j-log4j12:1.7.24' }
src/main/java/HelloWorld.java
import java.util.Map; import org.apache.geode.cache.Region; import org.apache.geode.cache.client.*; public class HelloWorld { public static void main(String[] args) throws Exception { ClientCache cache = new ClientCacheFactory() .addPoolLocator("localhost", 10334) .create(); Region<String, String> region = cache .<String, String>createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY) .create("hello"); region.put("1", "Hello"); region.put("2", "World"); for (Map.Entry<String, String> entry : region.entrySet()) { System.out.format("key = %s, value = %s\n", entry.getKey(), entry.getValue()); } cache.close(); } }
Build and run the HelloWorld
example:
$ gradle run
The application will connect to the running cluster, create a local cache, put some data in the cache, and print the cached data to the console:
key = 1, value = Hello key = 2, value = World
Finally, shutdown the Geode server and locator:
gfsh> shutdown --include-locators=true
For more information see the Geode Examples repository or the documentation.
Apache Geode applications can be written in these client technologies:
The following libraries are available external to the Apache Geode project:
This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information.
The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms. The form and manner of this Apache Software Foundation distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.
The following provides more details on the included cryptographic software: