Added Documentation for Berkeley DB (Java Edition) Entity Store. Changed names to support the Polygene Generator Tool.
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/78dbe60c Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/78dbe60c Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/78dbe60c Branch: refs/heads/develop Commit: 78dbe60c4227e41a8a8f70f18d06224088001e2e Parents: 879580c Author: niclas <[email protected]> Authored: Mon Oct 30 08:38:58 2017 +0800 Committer: niclas <[email protected]> Committed: Mon Oct 30 08:38:58 2017 +0800 ---------------------------------------------------------------------- NOTICE.txt | 3 + extensions/entitystore-bdbje/build.gradle | 41 -- extensions/entitystore-bdbje/dev-status.xml | 38 -- .../bdbje/BdbJeEntityStoreActivation.java | 59 --- .../bdbje/BdbJeEntityStoreConfiguration.java | 383 ------------------ .../bdbje/BdbJeEntityStoreMixin.java | 342 ---------------- .../bdbje/BdbJeEntityStoreService.java | 52 --- .../assembly/BdbJeEntityStoreAssembler.java | 45 --- .../entitystore/bdbje/assembly/package.html | 24 -- .../polygene/entitystore/bdbje/package.html | 24 -- .../entitystore/bdbje/BdbJeEntityStoreTest.java | 60 --- .../bdbje/BdbJeEntityStoreTestSuite.java | 47 --- extensions/entitystore-berkeleydb/build.gradle | 41 ++ .../entitystore-berkeleydb/dev-status.xml | 38 ++ .../src/docs/es-bdbje.txt | 65 +++ .../BerkeleyDBEntityStoreActivation.java | 59 +++ .../BerkeleyDBEntityStoreConfiguration.java | 392 +++++++++++++++++++ .../berkeleydb/BerkeleyDBEntityStoreMixin.java | 349 +++++++++++++++++ .../BerkeleyDBEntityStoreService.java | 51 +++ .../BerkeleyDBEntityStoreAssembler.java | 45 +++ .../berkeleydb/assembly/package.html | 24 ++ .../entitystore/berkeleydb/package.html | 24 ++ .../berkeleydb/BdbJeEntityStoreTest.java | 60 +++ .../berkeleydb/BdbJeEntityStoreTestSuite.java | 47 +++ settings.gradle | 2 +- tools/generator-polygene/app/index.js | 2 +- .../RestAPIApplication/bootstrap-test.tmpl | 6 + .../app/templates/buildtool/gradle-root.tmpl | 2 + tools/generator-polygene/test/generator_test.js | 1 + 29 files changed, 1209 insertions(+), 1117 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/NOTICE.txt ---------------------------------------------------------------------- diff --git a/NOTICE.txt b/NOTICE.txt index de8a58e..585d2f7 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -4,6 +4,9 @@ Copyright 2015-2016 The Apache Software Foundation. This product includes software developed at The Apache Software Foundation (http://www.apache.org/). +This product includes Berkeley DB (Java Edition) from +Oracle Corp (http://www.oracle.com/), licensed under Apache License 2.0 + IMPORTANT: This distribution may include cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/build.gradle ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/build.gradle b/extensions/entitystore-bdbje/build.gradle deleted file mode 100644 index ea14aef..0000000 --- a/extensions/entitystore-bdbje/build.gradle +++ /dev/null @@ -1,41 +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. - * - * - */ - -apply plugin: 'polygene-extension' - -description = "Apache Polygene⢠Berkeley DB (Java Edition) EntityStore Extension" - -jar { manifest { name = "Apache Polygene⢠Extension - EntityStore - BDB/JE" } } - -dependencies { - api polygene.core.bootstrap - api libraries.bdb_je - api polygene.library( 'constraints' ) - api polygene.library( 'fileconfig' ) - - implementation polygene.library( 'locking' ) - implementation libraries.jackson_mapper - - runtimeOnly polygene.core.runtime - - testImplementation polygene.internals.testsupport - - testRuntimeOnly libraries.logback -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/dev-status.xml ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/dev-status.xml b/extensions/entitystore-bdbje/dev-status.xml deleted file mode 100644 index fcc2930..0000000 --- a/extensions/entitystore-bdbje/dev-status.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!-- - ~ 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. - ~ - ~ - --> -<module xmlns="http://polygene.apache.org/schemas/2008/dev-status/1" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://polygene.apache.org/schemas/2008/dev-status/1 - http://polygene.apache.org/schemas/2008/dev-status/1/dev-status.xsd"> - <status> - <!--none,early,beta,stable,mature--> - <codebase>beta</codebase> - - <!-- none, brief, good, complete --> - <documentation>none</documentation> - - <!-- none, some, good, complete --> - <unittests>good</unittests> - </status> - <licenses> - <license>ALv2</license> - </licenses> -</module> http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreActivation.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreActivation.java b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreActivation.java deleted file mode 100644 index 92b829a..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreActivation.java +++ /dev/null @@ -1,59 +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.polygene.entitystore.bdbje; - -import org.apache.polygene.api.activation.ActivatorAdapter; -import org.apache.polygene.api.activation.Activators; -import org.apache.polygene.api.service.ServiceReference; - -/** - * Activation for BdbJeEntityStoreMixin. - */ -@Activators( { BdbJeEntityStoreActivation.Activator.class } ) -public interface BdbJeEntityStoreActivation -{ - - void setUpBdbJe() - throws Exception; - - void tearDownBdbJe() - throws Exception; - - class Activator - extends ActivatorAdapter<ServiceReference<BdbJeEntityStoreActivation>> - { - - @Override - public void afterActivation( ServiceReference<BdbJeEntityStoreActivation> activated ) - throws Exception - { - activated.get().setUpBdbJe(); - } - - @Override - public void beforePassivation( ServiceReference<BdbJeEntityStoreActivation> passivating ) - throws Exception - { - passivating.get().tearDownBdbJe(); - } - - } - -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreConfiguration.java b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreConfiguration.java deleted file mode 100644 index 82fb682..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreConfiguration.java +++ /dev/null @@ -1,383 +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.polygene.entitystore.bdbje; - -import com.sleepycat.je.CacheMode; -import com.sleepycat.je.Durability; -import org.apache.polygene.api.common.Optional; -import org.apache.polygene.api.common.UseDefaults; -import org.apache.polygene.api.property.Property; - -/** - * Configuration for the BdbJeEntityStoreService. - */ -// START SNIPPET: config -public interface BdbJeEntityStoreConfiguration -{ - /** - * Name of the database containing the Polygene entities. - */ - @UseDefaults("polygene") - Property<String> databaseName(); - - /** - * The file where the BDB JE data will be stored - * <p> - * Default: System.getProperty( "user.dir" ) + "/polygene/bdbjestore.data"; - * </p> - * - * @return path to data file relative to current path - */ - @Optional - Property<String> homeDirectory(); - - /** - * If true, creates the database environment if it doesn't already exist. - */ - @UseDefaults("true") - Property<Boolean> allowCreate(); - - /** - * Configures the database environment for no locking. - * <p> - * If true, create the environment with record locking. This property should be set to false only in special - * circumstances when it is safe to run without record locking. - * </p> - * <p> - * This configuration option should be used when locking guarantees such as consistency and isolation are not - * important. If locking mode is disabled (it is enabled by default), the cleaner is automatically disabled. - * The user is responsible for invoking the cleaner and ensuring that there are no concurrent operations while - * the cleaner is running. - * </p> - */ - @UseDefaults("true") - Property<Boolean> locking(); - - /** - * Configures the default lock timeout. - * <p> - * A value of zero disables lock timeouts. This is not recommended, even when the application expects that - * deadlocks will not occur or will be easily resolved. A lock timeout is a fall-back that guards against - * unexpected "live lock", unresponsive threads, or application failure to close a cursor or to commit or - * abort a transaction. - * </p> - * <p> - * Expressed in milliseconds. Default: 500ms - * </p> - */ - @UseDefaults("500") - Property<Long> lockTimeout(); - - /** - * Sets the user defined nodeName for the Environment. - * <p> - * If set, exception messages, logging messages, and thread names will have this nodeName included in them. - * If a user has multiple Environments in a single JVM, setting this to a string unique to each Environment - * may make it easier to diagnose certain exception conditions as well as thread dumps. - * </p> - */ - @Optional - Property<String> nodeName(); - - /** - * Configures the database environment to be read-only, and any attempt to modify a database will fail. - * <p> - * A read-only environment has several limitations and is recommended only in special circumstances. Note that - * there is no performance advantage to opening an environment read-only. - * </p> - * <p> - * The primary reason for opening an environment read-only is to open a single environment in multiple JVM - * processes. Only one JVM process at a time may open the environment read-write. See EnvironmentLockedException. - * </p> - * <p> - * When the environment is open read-only, the following limitations apply. - * </p> - * <p> - * In the read-only environment no writes may be performed, as expected, and databases must be opened read-only - * using DatabaseConfig.setReadOnly. - * </p> - * <p> - * The read-only environment receives a snapshot of the data that is effectively frozen at the time the environment - * is opened. If the application has the environment open read-write in another JVM process and modifies the - * environment's databases in any way, the read-only version of the data will not be updated until the read-only - * JVM process closes and reopens the environment (and by extension all databases in that environment). - * </p> - * <p> - * If the read-only environment is opened while the environment is in use by another JVM process in read-write mode, - * opening the environment read-only (recovery) is likely to take longer than it does after a clean shutdown. This - * is due to the fact that the read-write JVM process is writing and checkpoints are occurring that are not - * coordinated with the read-only JVM process. The effect is similar to opening an environment after a crash. - * </p> - * <p> - * In a read-only environment, the JE cache will contain information that cannot be evicted because it was - * reconstructed by recovery and cannot be flushed to disk. This means that the read-only environment may not be - * suitable for operations that use large amounts of memory, and poor performance may result if this is attempted. - * </p> - * <p> - * In a read-write environment, the log cleaner will be prohibited from deleting log files for as long as the - * environment is open read-only in another JVM process. This may cause disk usage to rise, and for this reason - * it is not recommended that an environment is kept open read-only in this manner for long periods. - * </p> - * <p> - * For these reasons, it is recommended that a read-only environment be used only for short periods and for - * operations that are not performance critical or memory intensive. With few exceptions, all application functions - * that require access to a JE environment should be built into a single application so that they can be performed - * in the JVM process where the environment is open read-write. - * </p> - * <p> - * In most applications, opening an environment read-only can and should be avoided. - * </p> - */ - @UseDefaults - Property<Boolean> readOnly(); - - /** - * If true, the shared cache is used by this environment. - * <p> - * By default this parameter is false and this environment uses a private cache. If this parameter is set to true, - * this environment will use a cache that is shared with all other open environments in this process that also set - * this parameter to true. There is a single shared cache per process. - * </p> - * <p> - * By using the shared cache, multiple open environments will make better use of memory because the cache LRU - * algorithm is applied across all information in all environments sharing the cache. For example, if one - * environment is open but not recently used, then it will only use a small portion of the cache, leaving the rest - * of the cache for environments that have been recently used. - * </p> - */ - @UseDefaults - Property<Boolean> sharedCache(); - - /** - * Configures the use of transactions. - * <p> - * This should be set to true when transactional guarantees such as atomicity of multiple operations and durability - * are important. - * </p> - * <p> - * If true, create an environment that is capable of performing transactions. If true is not passed, transactions - * may not be used. For licensing purposes, the use of this method distinguishes the use of the Transactional - * product. Note that if transactions are not used, specifying true does not create additional overhead in the - * environment. - * </p> - */ - @UseDefaults("true") - Property<Boolean> transactional(); - - /** - * The transaction timeout. - * <p> - * A value of 0 turns off transaction timeouts. - * </p> - * <p> - * Expressed in milliseconds. - * </p> - */ - @UseDefaults - Property<Long> txnTimeout(); - - /** - * Configures all transactions for this environment to have Serializable (Degree 3) isolation. - * <p> - * By setting Serializable isolation, phantoms will be prevented. By default transactions provide Repeatable Read - * isolation. The default is false for the database environment. - * </p> - */ - @UseDefaults - Property<Boolean> txnSerializableIsolation(); - - /** - * The default CacheMode used for operations performed in this environment. - * <p> - * The default cache mode may be overridden on a per-database basis using DatabaseConfig.setCacheMode, and on a - * per-record or per-operation basis using Cursor.setCacheMode, ReadOptions.setCacheMode(CacheMode) or - * WriteOptions.setCacheMode(CacheMode). - * </p> - */ - @UseDefaults("DEFAULT") - Property<CacheMode> cacheMode(); - - /** - * Configures the memory available to the database system, as a percentage of the JVM maximum memory. - * <p> - * The system will evict database objects when it comes within a prescribed margin of the limit. - * </p> - * <p> - * By default, JE sets the cache size to: - * </p> - * <p> - * <code>(MAX_MEMORY_PERCENT * JVM maximum memory) / 100</code> - * </p> - * <p> - * where JVM maximum memory is specified by the JVM -Xmx flag. However, setting MAX_MEMORY to a non-zero value - * overrides the percentage based calculation and sets the cache size explicitly. - * </p> - * <p> - * The following details apply to setting the cache size to a percentage of the JVM heap size byte size (this - * parameter) as well as to a byte size (MAX_MEMORY - * </p> - * <p> - * Note that the log buffer cache may be cleared if the cache size is changed after the environment has been opened. - * </p> - * <p> - * If SHARED_CACHE is set to true, MAX_MEMORY and MAX_MEMORY_PERCENT specify the total size of the shared cache, - * and changing these parameters will change the size of the shared cache. - * </p> - * <p> - * When using the shared cache feature, new environments that join the cache may alter the cache percent setting - * if their configuration is set to a different value. - * </p> - * <p> - * To take full advantage of JE cache memory, it is strongly recommended that compressed oops - * (-XX:+UseCompressedOops) is specified when a 64-bit JVM is used and the maximum heap size is less than 32 GB. - * As described in the referenced documentation, compressed oops is sometimes the default JVM mode even when it is - * not explicitly specified in the Java command. However, if compressed oops is desired then it must be explicitly - * specified in the Java command when running DbCacheSize or a JE application. If it is not explicitly specified - * then JE will not aware of it, even if it is the JVM default setting, and will not take it into account when - * calculating cache memory sizes. - * </p> - */ - @UseDefaults("60") - Property<Integer> cachePercent(); - - /** - * Configures the memory available to the database system, in bytes. - * <p> - * See MAX_MEMORY_PERCENT for more information. - * </p> - */ - @UseDefaults - Property<Long> cacheSize(); - - /** - * Configures the number of bytes to be used as a secondary, off-heap cache. - * <p> - * The off-heap cache is used to hold record data and Btree nodes when these are evicted from the "main cache" - * because it overflows. Eviction occurs according to an LRU algorithm and takes into account the user- specified - * CacheMode. When the off-heap cache overflows, eviction occurs there also according to the same algorithm. - * </p> - * <p> - * The main cache is in the Java heap and consists primarily of the Java objects making up the in-memory Btree - * data structure. Btree objects are not serialized the main cache, so no object materialization is needed to - * access the Btree there. Access to records in the main cache is therefore very fast, but the main cache has - * drawbacks as well: - * <ol> - * <li> - * The larger the main cache, the more likely it is to have Java GC performance problems. - * </li> - * <li> - * When the Java heap exceeds 32GB, the "compressed OOPs" setting no longer applies and less data will fit in the - * same amount of memory. For these reasons, JE applications often configure a heap of 32GB or less, and a main - * cache that is significantly less than 32GB, leaving any additional machine memory for use by the file system - * cache. - * </li> - * </ol> - * </p> - * <p> - * The use of the file system cache has performance benefits, but also has its own drawbacks: - * <ol> - * <li> - * There is a significant redundancy between the main cache and the file system cache because all data and Btree - * information that is logged (written) by JE appears in the file system and may also appear in the main cache. - * </li> - * <li> - * It is not possible for dirty Btree information to be placed in the file system cache without logging it, this - * logging may be otherwise unnecessary, and the logging creates additional work for the JE cleaner; in other - * words, the size of the main cache alone determines the maximum size of the in-memory "dirty set". - * </li> - * </ol> - * </p> - * <p> - * The off-heap cache is stored outside the Java heap using a native platform memory allocator. The current - * implementation relies on internals that are specific to the Oracle and IBM JDKs; however, a memory allocator - * interface that can be implemented for other situations is being considered for a future release. Records and - * Btree objects are serialized when they are placed in the off-heap cache, and they must be materialized when - * they are moved back to the main cache in order to access them. This serialization and materialization adds - * some CPU overhead and thread contention, as compared to accessing data directly in the main cache. The off-heap - * cache can contain dirty Btree information, so it can be used to increase the maximum size of the in-memory - * "dirty set". - * </p> - * <p> - * NOTE: If an off-heap cache is configured but cannot be used because that native allocator is not available in - * the JDK that is used, an IllegalStateException will be thrown by the Environment or - * com.sleepycat.je.rep.ReplicatedEnvironment constructor. In the current release, this means that the - * sun.misc.Unsafe class must contain the allocateMemory method and related methods, as defined in the Oracle JDK. - * </p> - * <p> - * When configuring an off-heap cache you can think of the performance trade-offs in two ways. First, if the - * off-heap cache is considered to be a replacement for the file system cache, the serialization and - * materialization overhead is not increased. In this case, the use of the off-heap cache is clearly beneficial, - * and using the off-heap cache "instead of" the file system cache is normally recommended. Second, the off-heap - * cache can be used along with a main cache that is reduced in size in order to compensate for Java GC problems. - * In this case, the trade-off is between the additional serialization, materialization and contention overheads - * of the off-heap cache, as compared to the Java GC overhead. - * </p> - * <p> - * When dividing up available memory for the JVM heap, the off-heap cache, and for other uses, please be aware - * that the file system cache and the off-heap cache are different in one important respect. The file system cache - * automatically shrinks when memory is needed by the OS or other processes, while the off-heap cache does not. - * Therefore, it is best to be conservative about leaving memory free for other uses, and it is not a good idea to - * size the off-heap cache such that all machine memory will be allocated. If off-heap allocations or other - * allocations fail because there is no available memory, the process is likely to die without any exception - * being thrown. In one test on Linux, for example, the process was killed abruptly by the OS and the only - * indication of the problem was the following shown by dmesg. - * </p> - * <pre><code> - * Out of memory: Kill process 28768 (java) score 974 or sacrifice child - * Killed process 28768 (java) - * total-vm:278255336kB, anon-rss:257274420kB, file-rss:0kB - * </code></pre> - * WARNING: Although this configuration property is mutable, it cannot be changed from zero to non-zero, or - * non-zero to zero. In other words, the size of the off-heap cache can be changed after initially configuring - * a non-zero size, but the off-heap cache cannot be turned on and off dynamically. An attempt to do so will - * cause an IllegalArgumentException to be thrown by the Environment or com.sleepycat.je.rep.ReplicatedEnvironment - * constructor. - */ - @UseDefaults - Property<Long> cacheHeapCacheSize(); - - /** - * Configures the default durability associated with transactions. - * <p> - * The string must have the following format: - * </p> - * <pre><code> - * SyncPolicy[,SyncPolicy[,ReplicaAckPolicy]] - * </code></pre> - * <p> - * The first SyncPolicy in the above format applies to the Master, and the optional second SyncPolicy to the - * replica. Specific SyncPolicy or ReplicaAckPolicy values are denoted by the name of the enumeration value. - * </p> - * <p> - * For example, the string:sync,sync,quorum describes a durability policy where the master and replica both use - * Durability.SyncPolicy.SYNC to commit transactions and Durability.ReplicaAckPolicy.SIMPLE_MAJORITY to acknowledge - * a transaction commit. - * </p> - * <p> - * Durability.SyncPolicy.NO_SYNC, is the default value for a node's SyncPolicy. - * </p> - * <p> - * Durability.ReplicaAckPolicy.SIMPLE_MAJORITY is the default for the ReplicaAckPolicy. - * </p> - */ - @Optional - Property<String> durability(); -} -// END SNIPPET: config http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreMixin.java b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreMixin.java deleted file mode 100644 index 8459161..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreMixin.java +++ /dev/null @@ -1,342 +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.polygene.entitystore.bdbje; - -import com.sleepycat.je.Cursor; -import com.sleepycat.je.Database; -import com.sleepycat.je.DatabaseConfig; -import com.sleepycat.je.DatabaseEntry; -import com.sleepycat.je.DatabaseException; -import com.sleepycat.je.Durability; -import com.sleepycat.je.Environment; -import com.sleepycat.je.EnvironmentConfig; -import com.sleepycat.je.LockMode; -import com.sleepycat.je.OperationStatus; -import com.sleepycat.je.Transaction; -import com.sleepycat.je.TransactionConfig; -import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.io.StringWriter; -import java.io.UnsupportedEncodingException; -import java.io.Writer; -import java.util.Iterator; -import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; -import org.apache.polygene.api.common.Optional; -import org.apache.polygene.api.configuration.Configuration; -import org.apache.polygene.api.entity.EntityDescriptor; -import org.apache.polygene.api.entity.EntityReference; -import org.apache.polygene.api.injection.scope.Service; -import org.apache.polygene.api.injection.scope.This; -import org.apache.polygene.api.injection.scope.Uses; -import org.apache.polygene.api.service.ServiceDescriptor; -import org.apache.polygene.library.fileconfig.FileConfiguration; -import org.apache.polygene.library.locking.ReadLock; -import org.apache.polygene.library.locking.WriteLock; -import org.apache.polygene.spi.entitystore.EntityNotFoundException; -import org.apache.polygene.spi.entitystore.EntityStoreException; -import org.apache.polygene.spi.entitystore.helpers.MapEntityStore; - -/** - * BDB JE implementation of MapEntityStore. - */ -public class BdbJeEntityStoreMixin - implements BdbJeEntityStoreActivation, MapEntityStore -{ - @Optional - @Service - private FileConfiguration fileConfiguration; - - @This - private Configuration<BdbJeEntityStoreConfiguration> config; - - @Uses - private ServiceDescriptor descriptor; - - private Database database; - private Environment envHandle; - - @Override - public void setUpBdbJe() - throws Exception - { - initialize(); - } - - @Override - public void tearDownBdbJe() - throws Exception - { - closeDown(); - } - - @ReadLock - @Override - public Reader get( EntityReference entityReference ) - throws EntityStoreException - { - try - { - String indexKey = entityReference.toString(); - DatabaseEntry key = new DatabaseEntry( indexKey.getBytes( "UTF-8" ) ); - DatabaseEntry result = new DatabaseEntry(); - OperationStatus operationStatus = database.get( null, key, result, LockMode.DEFAULT ); - if( operationStatus == OperationStatus.NOTFOUND ) - { - throw new EntityNotFoundException( entityReference ); - } - return new StringReader( new String( result.getData(), "UTF-8" ) ); - } - catch( IOException e ) - { - throw new EntityStoreException( e ); - } - } - - @WriteLock - @Override - public void applyChanges( MapChanges changes ) - throws IOException - { - Transaction transaction = envHandle.beginTransaction( null, TransactionConfig.DEFAULT ); - try - { - changes.visitMap( new MapChanger() - { - @Override - public Writer newEntity( EntityReference ref, EntityDescriptor descriptor ) - throws IOException - { - return new StringWriter( 1000 ) - { - @Override - public void close() - throws IOException - { - super.close(); - String indexKey = ref.toString(); - DatabaseEntry theKey = new DatabaseEntry( indexKey.getBytes( "UTF-8" ) ); - DatabaseEntry theData = new DatabaseEntry( toString().getBytes( "UTF-8" ) ); - database.put( transaction, theKey, theData ); - } - }; - } - - @Override - public Writer updateEntity( MapChange mapChange ) - throws IOException - { - return new StringWriter( 1000 ) - { - @Override - public void close() - throws IOException - { - super.close(); - String indexKey = mapChange.reference().identity().toString(); - DatabaseEntry theKey = new DatabaseEntry( indexKey.getBytes( "UTF-8" ) ); - DatabaseEntry theData = new DatabaseEntry( toString().getBytes( "UTF-8" ) ); - database.put( transaction, theKey, theData ); - } - }; - } - - @Override - public void removeEntity( EntityReference ref, EntityDescriptor descriptor ) - throws EntityNotFoundException - { - try - { - String indexKey = ref.toString(); - DatabaseEntry theKey = new DatabaseEntry( indexKey.getBytes( "UTF-8" ) ); - database.delete( transaction, theKey ); - } - catch( IOException e ) - { - throw new EntityStoreException( e ); - } - } - } ); - transaction.commit(); - } - catch( Exception e ) - { - e.printStackTrace(); - transaction.abort(); - if( ( e instanceof IOException ) ) - { - throw (IOException) e; - } - else if( !( e instanceof EntityStoreException ) ) - { - throw new IOException( e ); - } - else - { - throw (EntityStoreException) e; - } - } - } - - @Override - public Stream<Reader> entityStates() - throws IOException - { - return StreamSupport.stream( new RecordIterable( database ).spliterator(), false ); - } - - private File getDatabaseHome() - { - String pathname = config.get().homeDirectory().get(); - if( pathname == null ) - { - if( fileConfiguration != null ) - { - File dataDir = fileConfiguration.dataDirectory(); - File bdbJeDir = new File( dataDir, descriptor.identity() + "/bdbje_data" ); - pathname = bdbJeDir.getAbsolutePath(); - } - else - { - pathname = System.getProperty( "user.dir" ) + "/polygene/bdbje_data"; - } - } - - File directory = new File( pathname ).getAbsoluteFile(); - //noinspection ResultOfMethodCallIgnored - directory.mkdirs(); - return directory; - } - - private void closeDown() - { - if( database != null ) - { - database.close(); - } - if( envHandle != null ) - { - envHandle.close(); - } - } - - private void initialize() - throws IOException - { - File homeDir = getDatabaseHome(); - EnvironmentConfig configuration = createConfiguration(); - - envHandle = new Environment( homeDir, configuration ); - DatabaseConfig dbConfig = new DatabaseConfig(); - dbConfig.setAllowCreate( configuration.getAllowCreate() ); - dbConfig.setTransactional( configuration.getTransactional() ); - database = envHandle.openDatabase( null, config.get().databaseName().get(), dbConfig ); - } - - private EnvironmentConfig createConfiguration() - { - EnvironmentConfig environmentConfig = new EnvironmentConfig(); - BdbJeEntityStoreConfiguration storeConfiguration = config.get(); - Boolean allowCreate = storeConfiguration.allowCreate().get(); - environmentConfig.setAllowCreate( allowCreate ); - environmentConfig.setLocking( storeConfiguration.locking().get() ); - environmentConfig.setLockTimeout( storeConfiguration.lockTimeout().get(), TimeUnit.MILLISECONDS ); - environmentConfig.setNodeName( storeConfiguration.nodeName().get() ); - environmentConfig.setReadOnly( storeConfiguration.readOnly().get() ); - environmentConfig.setSharedCache( storeConfiguration.sharedCache().get() ); - environmentConfig.setTransactional( storeConfiguration.transactional().get() ); - environmentConfig.setTxnTimeout( storeConfiguration.txnTimeout().get(), TimeUnit.MILLISECONDS ); - environmentConfig.setTxnSerializableIsolation( storeConfiguration.txnSerializableIsolation().get() ); - environmentConfig.setCacheMode( storeConfiguration.cacheMode().get() ); - environmentConfig.setCachePercent( storeConfiguration.cachePercent().get() ); - environmentConfig.setCacheSize( storeConfiguration.cacheSize().get() ); - environmentConfig.setOffHeapCacheSize( storeConfiguration.cacheHeapCacheSize().get() ); - environmentConfig.setDurability( Durability.parse( storeConfiguration.durability().get() ) ); - return environmentConfig; - } - - private static class RecordIterable - implements Iterable<Reader>, Iterator<Reader> - { - private Cursor cursor; - private DatabaseEntry foundKey; - private DatabaseEntry foundData; - private boolean success; - - private RecordIterable( Database db ) - throws IOException - { - try - { - cursor = db.openCursor( null, null ); - foundKey = new DatabaseEntry(); - foundData = new DatabaseEntry(); - } - catch( DatabaseException e ) - { - throw new IOException( "Unknown problem in Berkeley DB", e ); - } - } - - @Override - @SuppressWarnings( "NullableProblems" ) - public Iterator<Reader> iterator() - { - forward(); - return this; - } - - @Override - public boolean hasNext() - { - return success; - } - - @Override - public Reader next() - { - byte[] data = foundData.getData(); - forward(); - try - { - return new StringReader( new String( data, "UTF-8" ) ); - } - catch( UnsupportedEncodingException e ) - { - // can not happen. - return new StringReader( "" ); - } - } - - private void forward() - { - OperationStatus status = cursor.getNext( foundKey, foundData, LockMode.DEFAULT ); - if( status == OperationStatus.NOTFOUND ) - { - // End of Cursor, and need to close. - cursor.close(); - } - success = status == OperationStatus.SUCCESS; - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreService.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreService.java b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreService.java deleted file mode 100644 index a45994f..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreService.java +++ /dev/null @@ -1,52 +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.polygene.entitystore.bdbje; - -import org.apache.polygene.api.concern.Concerns; -import org.apache.polygene.api.configuration.Configuration; -import org.apache.polygene.api.mixin.Mixins; -import org.apache.polygene.library.locking.LockingAbstractComposite; -import org.apache.polygene.library.locking.ReadLockConcern; -import org.apache.polygene.library.locking.WriteLockConcern; -import org.apache.polygene.spi.entitystore.BackupRestore; -import org.apache.polygene.spi.entitystore.ConcurrentModificationCheckConcern; -import org.apache.polygene.spi.entitystore.EntityStateVersions; -import org.apache.polygene.spi.entitystore.EntityStore; -import org.apache.polygene.spi.entitystore.StateChangeNotificationConcern; -import org.apache.polygene.spi.entitystore.helpers.JSONMapEntityStoreActivation; -import org.apache.polygene.spi.entitystore.helpers.JSONMapEntityStoreMixin; -import org.apache.polygene.spi.entitystore.helpers.StateStore; - -/** - * EntityStore service backed by BDB JE store. - * <p>Based on @{@link JSONMapEntityStoreMixin}.</p> - */ -@Concerns( { StateChangeNotificationConcern.class, ConcurrentModificationCheckConcern.class, ReadLockConcern.class, WriteLockConcern.class } ) -@Mixins( { JSONMapEntityStoreMixin.class, BdbJeEntityStoreMixin.class } ) -public interface BdbJeEntityStoreService - extends BdbJeEntityStoreActivation, - JSONMapEntityStoreActivation, - EntityStore, - EntityStateVersions, - StateStore, - LockingAbstractComposite, - Configuration<BdbJeEntityStoreConfiguration> -{ -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/BdbJeEntityStoreAssembler.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/BdbJeEntityStoreAssembler.java b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/BdbJeEntityStoreAssembler.java deleted file mode 100644 index db029a3..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/BdbJeEntityStoreAssembler.java +++ /dev/null @@ -1,45 +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.polygene.entitystore.bdbje.assembly; - -import org.apache.polygene.bootstrap.Assemblers; -import org.apache.polygene.bootstrap.ModuleAssembly; -import org.apache.polygene.bootstrap.ServiceDeclaration; -import org.apache.polygene.entitystore.bdbje.BdbJeEntityStoreConfiguration; -import org.apache.polygene.entitystore.bdbje.BdbJeEntityStoreService; - -public class BdbJeEntityStoreAssembler - extends Assemblers.VisibilityIdentityConfig<BdbJeEntityStoreAssembler> -{ - @Override - public void assemble( ModuleAssembly module ) - { - super.assemble( module ); - ServiceDeclaration service = module.services( BdbJeEntityStoreService.class ).visibleIn( visibility() ); - if( hasIdentity() ) - { - service.identifiedBy( identity() ); - } - if( hasConfig() ) - { - configModule().entities( BdbJeEntityStoreConfiguration.class ).visibleIn( configVisibility() ); - } - } -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/package.html ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/package.html b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/package.html deleted file mode 100644 index 298493f..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/assembly/package.html +++ /dev/null @@ -1,24 +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. - ~ - ~ - --> -<html> - <body> - <h2>Berkeley DB (Java Edition) EntityStore Assembly.</h2> - </body> -</html> http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/package.html ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/package.html b/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/package.html deleted file mode 100644 index 17b4142..0000000 --- a/extensions/entitystore-bdbje/src/main/java/org/apache/polygene/entitystore/bdbje/package.html +++ /dev/null @@ -1,24 +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. - ~ - ~ - --> -<html> - <body> - <h2>Berkley DB (Java Edition) EntityStore.</h2> - </body> -</html> http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTest.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTest.java b/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTest.java deleted file mode 100644 index c2a590f..0000000 --- a/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTest.java +++ /dev/null @@ -1,60 +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.polygene.entitystore.bdbje; - -import org.apache.polygene.api.common.Visibility; -import org.apache.polygene.bootstrap.AssemblyException; -import org.apache.polygene.bootstrap.ModuleAssembly; -import org.apache.polygene.entitystore.bdbje.assembly.BdbJeEntityStoreAssembler; -import org.apache.polygene.library.fileconfig.FileConfigurationAssembler; -import org.apache.polygene.library.fileconfig.FileConfigurationOverride; -import org.apache.polygene.test.EntityTestAssembler; -import org.apache.polygene.test.entity.AbstractEntityStoreTest; -import org.junit.After; -import org.junit.Rule; -import org.junit.rules.TemporaryFolder; - -public class BdbJeEntityStoreTest - extends AbstractEntityStoreTest -{ - @Rule - public final TemporaryFolder tmpDir = new TemporaryFolder(); - - @Override - public void assemble( ModuleAssembly module ) - throws AssemblyException - { - super.assemble( module ); - - ModuleAssembly config = module.layer().module( "config" ); - new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config ); - - new FileConfigurationAssembler() - .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) ) - .assemble( module ); - new BdbJeEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module ); - } - - @After - public void cleanup() - { - - } -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTestSuite.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTestSuite.java b/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTestSuite.java deleted file mode 100644 index 6fb54bd..0000000 --- a/extensions/entitystore-bdbje/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTestSuite.java +++ /dev/null @@ -1,47 +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.polygene.entitystore.bdbje; - -import org.apache.polygene.api.common.Visibility; -import org.apache.polygene.bootstrap.ModuleAssembly; -import org.apache.polygene.entitystore.bdbje.assembly.BdbJeEntityStoreAssembler; -import org.apache.polygene.library.fileconfig.FileConfigurationAssembler; -import org.apache.polygene.library.fileconfig.FileConfigurationOverride; -import org.apache.polygene.test.entity.model.EntityStoreTestSuite; -import org.junit.Rule; -import org.junit.rules.TemporaryFolder; - -public class BdbJeEntityStoreTestSuite extends EntityStoreTestSuite -{ - @Rule - public final TemporaryFolder tmpDir = new TemporaryFolder(); - - @Override - protected void defineStorageModule( ModuleAssembly module ) - { - module.defaultServices(); - new FileConfigurationAssembler() - .withOverride( new FileConfigurationOverride().withConventionalRoot( tmpDir.getRoot() ) ) - .assemble( module ); - new BdbJeEntityStoreAssembler().visibleIn( Visibility.application ) - .withConfig( configModule, Visibility.application ) - .assemble( module ); - } -} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-berkeleydb/build.gradle ---------------------------------------------------------------------- diff --git a/extensions/entitystore-berkeleydb/build.gradle b/extensions/entitystore-berkeleydb/build.gradle new file mode 100644 index 0000000..ea14aef --- /dev/null +++ b/extensions/entitystore-berkeleydb/build.gradle @@ -0,0 +1,41 @@ +/* + * 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. + * + * + */ + +apply plugin: 'polygene-extension' + +description = "Apache Polygene⢠Berkeley DB (Java Edition) EntityStore Extension" + +jar { manifest { name = "Apache Polygene⢠Extension - EntityStore - BDB/JE" } } + +dependencies { + api polygene.core.bootstrap + api libraries.bdb_je + api polygene.library( 'constraints' ) + api polygene.library( 'fileconfig' ) + + implementation polygene.library( 'locking' ) + implementation libraries.jackson_mapper + + runtimeOnly polygene.core.runtime + + testImplementation polygene.internals.testsupport + + testRuntimeOnly libraries.logback +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-berkeleydb/dev-status.xml ---------------------------------------------------------------------- diff --git a/extensions/entitystore-berkeleydb/dev-status.xml b/extensions/entitystore-berkeleydb/dev-status.xml new file mode 100644 index 0000000..762e250 --- /dev/null +++ b/extensions/entitystore-berkeleydb/dev-status.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- + ~ 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. + ~ + ~ + --> +<module xmlns="http://polygene.apache.org/schemas/2008/dev-status/1" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://polygene.apache.org/schemas/2008/dev-status/1 + http://polygene.apache.org/schemas/2008/dev-status/1/dev-status.xsd"> + <status> + <!--none,early,beta,stable,mature--> + <codebase>stable</codebase> + + <!-- none, brief, good, complete --> + <documentation>brief</documentation> + + <!-- none, some, good, complete --> + <unittests>good</unittests> + </status> + <licenses> + <license>ALv2</license> + </licenses> +</module> http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-berkeleydb/src/docs/es-bdbje.txt ---------------------------------------------------------------------- diff --git a/extensions/entitystore-berkeleydb/src/docs/es-bdbje.txt b/extensions/entitystore-berkeleydb/src/docs/es-bdbje.txt new file mode 100644 index 0000000..8e9d631 --- /dev/null +++ b/extensions/entitystore-berkeleydb/src/docs/es-bdbje.txt @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////// + * 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. +/////////////////////////////////////////////////////////////// + +[[extension-es-bdbje,Berkeley DB (Java Edition) EntityStore]] += Berkeley DB EntityStore = + +[devstatus] +-------------- +source=extensions/entitystore-bdbje/dev-status.xml +-------------- + +EntityStore service backed by Berkeley DB (Java Edition) embedded database from Oracle. + +The Berkeley DB is a classic among the embedded key-value databases, and for many years was not acceptable to the +Apache community and downstream users due to a restrictive license (Sleepycat license). Oracle has re-license this +to the Apache License 2.0, and enabled many projects around the world to leverage this technology. + +include::../../build/docs/buildinfo/artifact.txt[] + +== Assembly == + +Assembly is done using the provided Assembler: + +[snippet,java] +---- +source=extensions/entitystore-leveldb/src/test/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreTest.java +tag=assembly +---- + +== Configuration == + +Here are the configuration properties for the Berkeley DB (Java Edition) EntityStore: + +[snippet,java] +---- +source=extensions/entitystore-leveldb/src/main/java/org/apache/polygene/entitystore/bdbje/BdbJeEntityStoreConfiguration.java +tag=config +---- + +All configuration properties are defaulted to the implementation defaults meaning that you can use this EntityStore +service without configuration. + +The data directory is determined as follows + +1. if +dataDirectory()+ in configuration is specified, use that by passig the string to +new File(dataDir).getAbsoluteFile()+, +2. if the <<library-fileconfig>> is present, use the DATA directory of the operating system, followed by the +Application.name()+ and the identity of this entity store followed by +/data+, +3. otherwise, use current working directory, followed by +/data+ + + http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreActivation.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreActivation.java b/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreActivation.java new file mode 100644 index 0000000..72992c4 --- /dev/null +++ b/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreActivation.java @@ -0,0 +1,59 @@ +/* + * 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.polygene.entitystore.berkeleydb; + +import org.apache.polygene.api.activation.ActivatorAdapter; +import org.apache.polygene.api.activation.Activators; +import org.apache.polygene.api.service.ServiceReference; + +/** + * Activation for BerkeleyDBEntityStoreMixin. + */ +@Activators( { BerkeleyDBEntityStoreActivation.Activator.class } ) +public interface BerkeleyDBEntityStoreActivation +{ + + void setUpBdbJe() + throws Exception; + + void tearDownBdbJe() + throws Exception; + + class Activator + extends ActivatorAdapter<ServiceReference<BerkeleyDBEntityStoreActivation>> + { + + @Override + public void afterActivation( ServiceReference<BerkeleyDBEntityStoreActivation> activated ) + throws Exception + { + activated.get().setUpBdbJe(); + } + + @Override + public void beforePassivation( ServiceReference<BerkeleyDBEntityStoreActivation> passivating ) + throws Exception + { + passivating.get().tearDownBdbJe(); + } + + } + +} http://git-wip-us.apache.org/repos/asf/polygene-java/blob/78dbe60c/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreConfiguration.java ---------------------------------------------------------------------- diff --git a/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreConfiguration.java b/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreConfiguration.java new file mode 100644 index 0000000..0701e5c --- /dev/null +++ b/extensions/entitystore-berkeleydb/src/main/java/org/apache/polygene/entitystore/berkeleydb/BerkeleyDBEntityStoreConfiguration.java @@ -0,0 +1,392 @@ +/* + * 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.polygene.entitystore.berkeleydb; + +import com.sleepycat.je.CacheMode; +import org.apache.polygene.api.common.Optional; +import org.apache.polygene.api.common.UseDefaults; +import org.apache.polygene.api.property.Property; + +/** + * Configuration for the BerkeleyDBEntityStoreService. + * <p> + * <strong>NOTE:</strong> Most of the documentation for all the properties are copied from the Berkeley DB javadocs. + * </p> + */ +// START SNIPPET: config +public interface BerkeleyDBEntityStoreConfiguration +{ + /** + * Name of the database containing the Polygene entities. + */ + @UseDefaults( "polygene" ) + Property<String> databaseName(); + + /** + * The directory where the BDB JE data (files) will be stored + * <p> + * Default: + * </p> + * <pre><code> + * if( fileConfiguration != null ) + * dataDir = new File( fileConfiguration.dataDirectory(), application.name() + "/" + descriptor.identity() ); + * else + * dataDir = new File( System.getProperty( "user.dir" ) ); + * dataDir = new File( dataDir, "data" ); + * </code></pre> + * + * @return path to data directory, by passing the string to {@code new File(dataDirectory()).getAbsoluteFile() } + */ + @Optional + Property<String> dataDirectory(); + + /** + * If true, creates the database environment if it doesn't already exist. + */ + @UseDefaults( "true" ) + Property<Boolean> allowCreate(); + + /** + * Configures the database environment for no locking. + * <p> + * If true, create the environment with record locking. This property should be set to false only in special + * circumstances when it is safe to run without record locking. + * </p> + * <p> + * This configuration option should be used when locking guarantees such as consistency and isolation are not + * important. If locking mode is disabled (it is enabled by default), the cleaner is automatically disabled. + * The user is responsible for invoking the cleaner and ensuring that there are no concurrent operations while + * the cleaner is running. + * </p> + */ + @UseDefaults( "true" ) + Property<Boolean> locking(); + + /** + * Configures the default lock timeout. + * <p> + * A value of zero disables lock timeouts. This is not recommended, even when the application expects that + * deadlocks will not occur or will be easily resolved. A lock timeout is a fall-back that guards against + * unexpected "live lock", unresponsive threads, or application failure to close a cursor or to commit or + * abort a transaction. + * </p> + * <p> + * Expressed in milliseconds. Default: 500ms + * </p> + */ + @UseDefaults( "500" ) + Property<Long> lockTimeout(); + + /** + * Sets the user defined nodeName for the Environment. + * <p> + * If set, exception messages, logging messages, and thread names will have this nodeName included in them. + * If a user has multiple Environments in a single JVM, setting this to a string unique to each Environment + * may make it easier to diagnose certain exception conditions as well as thread dumps. + * </p> + */ + @Optional + Property<String> nodeName(); + + /** + * Configures the database environment to be read-only, and any attempt to modify a database will fail. + * <p> + * A read-only environment has several limitations and is recommended only in special circumstances. Note that + * there is no performance advantage to opening an environment read-only. + * </p> + * <p> + * The primary reason for opening an environment read-only is to open a single environment in multiple JVM + * processes. Only one JVM process at a time may open the environment read-write. See EnvironmentLockedException. + * </p> + * <p> + * When the environment is open read-only, the following limitations apply. + * </p> + * <p> + * In the read-only environment no writes may be performed, as expected, and databases must be opened read-only + * using DatabaseConfig.setReadOnly. + * </p> + * <p> + * The read-only environment receives a snapshot of the data that is effectively frozen at the time the environment + * is opened. If the application has the environment open read-write in another JVM process and modifies the + * environment's databases in any way, the read-only version of the data will not be updated until the read-only + * JVM process closes and reopens the environment (and by extension all databases in that environment). + * </p> + * <p> + * If the read-only environment is opened while the environment is in use by another JVM process in read-write mode, + * opening the environment read-only (recovery) is likely to take longer than it does after a clean shutdown. This + * is due to the fact that the read-write JVM process is writing and checkpoints are occurring that are not + * coordinated with the read-only JVM process. The effect is similar to opening an environment after a crash. + * </p> + * <p> + * In a read-only environment, the JE cache will contain information that cannot be evicted because it was + * reconstructed by recovery and cannot be flushed to disk. This means that the read-only environment may not be + * suitable for operations that use large amounts of memory, and poor performance may result if this is attempted. + * </p> + * <p> + * In a read-write environment, the log cleaner will be prohibited from deleting log files for as long as the + * environment is open read-only in another JVM process. This may cause disk usage to rise, and for this reason + * it is not recommended that an environment is kept open read-only in this manner for long periods. + * </p> + * <p> + * For these reasons, it is recommended that a read-only environment be used only for short periods and for + * operations that are not performance critical or memory intensive. With few exceptions, all application functions + * that require access to a JE environment should be built into a single application so that they can be performed + * in the JVM process where the environment is open read-write. + * </p> + * <p> + * In most applications, opening an environment read-only can and should be avoided. + * </p> + */ + @UseDefaults + Property<Boolean> readOnly(); + + /** + * If true, the shared cache is used by this environment. + * <p> + * By default this parameter is false and this environment uses a private cache. If this parameter is set to true, + * this environment will use a cache that is shared with all other open environments in this process that also set + * this parameter to true. There is a single shared cache per process. + * </p> + * <p> + * By using the shared cache, multiple open environments will make better use of memory because the cache LRU + * algorithm is applied across all information in all environments sharing the cache. For example, if one + * environment is open but not recently used, then it will only use a small portion of the cache, leaving the rest + * of the cache for environments that have been recently used. + * </p> + */ + @UseDefaults + Property<Boolean> sharedCache(); + + /** + * Configures the use of transactions. + * <p> + * This should be set to true when transactional guarantees such as atomicity of multiple operations and durability + * are important. + * </p> + * <p> + * If true, create an environment that is capable of performing transactions. If true is not passed, transactions + * may not be used. For licensing purposes, the use of this method distinguishes the use of the Transactional + * product. Note that if transactions are not used, specifying true does not create additional overhead in the + * environment. + * </p> + */ + @UseDefaults( "true" ) + Property<Boolean> transactional(); + + /** + * The transaction timeout. + * <p> + * A value of 0 turns off transaction timeouts. + * </p> + * <p> + * Expressed in milliseconds. + * </p> + */ + @UseDefaults + Property<Long> txnTimeout(); + + /** + * Configures all transactions for this environment to have Serializable (Degree 3) isolation. + * <p> + * By setting Serializable isolation, phantoms will be prevented. By default transactions provide Repeatable Read + * isolation. The default is false for the database environment. + * </p> + */ + @UseDefaults + Property<Boolean> txnSerializableIsolation(); + + /** + * The default CacheMode used for operations performed in this environment. + * <p> + * The default cache mode may be overridden on a per-database basis using DatabaseConfig.setCacheMode, and on a + * per-record or per-operation basis using Cursor.setCacheMode, ReadOptions.setCacheMode(CacheMode) or + * WriteOptions.setCacheMode(CacheMode). + * </p> + */ + @UseDefaults( "DEFAULT" ) + Property<CacheMode> cacheMode(); + + /** + * Configures the memory available to the database system, as a percentage of the JVM maximum memory. + * <p> + * The system will evict database objects when it comes within a prescribed margin of the limit. + * </p> + * <p> + * By default, JE sets the cache size to: + * </p> + * <p> + * <code>(MAX_MEMORY_PERCENT * JVM maximum memory) / 100</code> + * </p> + * <p> + * where JVM maximum memory is specified by the JVM -Xmx flag. However, setting MAX_MEMORY to a non-zero value + * overrides the percentage based calculation and sets the cache size explicitly. + * </p> + * <p> + * The following details apply to setting the cache size to a percentage of the JVM heap size byte size (this + * parameter) as well as to a byte size (MAX_MEMORY + * </p> + * <p> + * Note that the log buffer cache may be cleared if the cache size is changed after the environment has been opened. + * </p> + * <p> + * If SHARED_CACHE is set to true, MAX_MEMORY and MAX_MEMORY_PERCENT specify the total size of the shared cache, + * and changing these parameters will change the size of the shared cache. + * </p> + * <p> + * When using the shared cache feature, new environments that join the cache may alter the cache percent setting + * if their configuration is set to a different value. + * </p> + * <p> + * To take full advantage of JE cache memory, it is strongly recommended that compressed oops + * (-XX:+UseCompressedOops) is specified when a 64-bit JVM is used and the maximum heap size is less than 32 GB. + * As described in the referenced documentation, compressed oops is sometimes the default JVM mode even when it is + * not explicitly specified in the Java command. However, if compressed oops is desired then it must be explicitly + * specified in the Java command when running DbCacheSize or a JE application. If it is not explicitly specified + * then JE will not aware of it, even if it is the JVM default setting, and will not take it into account when + * calculating cache memory sizes. + * </p> + */ + @UseDefaults( "60" ) + Property<Integer> cachePercent(); + + /** + * Configures the memory available to the database system, in bytes. + * <p> + * See MAX_MEMORY_PERCENT for more information. + * </p> + */ + @UseDefaults + Property<Long> cacheSize(); + + /** + * Configures the number of bytes to be used as a secondary, off-heap cache. + * <p> + * The off-heap cache is used to hold record data and Btree nodes when these are evicted from the "main cache" + * because it overflows. Eviction occurs according to an LRU algorithm and takes into account the user- specified + * CacheMode. When the off-heap cache overflows, eviction occurs there also according to the same algorithm. + * </p> + * <p> + * The main cache is in the Java heap and consists primarily of the Java objects making up the in-memory Btree + * data structure. Btree objects are not serialized the main cache, so no object materialization is needed to + * access the Btree there. Access to records in the main cache is therefore very fast, but the main cache has + * drawbacks as well: + * <ol> + * <li> + * The larger the main cache, the more likely it is to have Java GC performance problems. + * </li> + * <li> + * When the Java heap exceeds 32GB, the "compressed OOPs" setting no longer applies and less data will fit in the + * same amount of memory. For these reasons, JE applications often configure a heap of 32GB or less, and a main + * cache that is significantly less than 32GB, leaving any additional machine memory for use by the file system + * cache. + * </li> + * </ol> + * </p> + * <p> + * The use of the file system cache has performance benefits, but also has its own drawbacks: + * <ol> + * <li> + * There is a significant redundancy between the main cache and the file system cache because all data and Btree + * information that is logged (written) by JE appears in the file system and may also appear in the main cache. + * </li> + * <li> + * It is not possible for dirty Btree information to be placed in the file system cache without logging it, this + * logging may be otherwise unnecessary, and the logging creates additional work for the JE cleaner; in other + * words, the size of the main cache alone determines the maximum size of the in-memory "dirty set". + * </li> + * </ol> + * </p> + * <p> + * The off-heap cache is stored outside the Java heap using a native platform memory allocator. The current + * implementation relies on internals that are specific to the Oracle and IBM JDKs; however, a memory allocator + * interface that can be implemented for other situations is being considered for a future release. Records and + * Btree objects are serialized when they are placed in the off-heap cache, and they must be materialized when + * they are moved back to the main cache in order to access them. This serialization and materialization adds + * some CPU overhead and thread contention, as compared to accessing data directly in the main cache. The off-heap + * cache can contain dirty Btree information, so it can be used to increase the maximum size of the in-memory + * "dirty set". + * </p> + * <p> + * NOTE: If an off-heap cache is configured but cannot be used because that native allocator is not available in + * the JDK that is used, an IllegalStateException will be thrown by the Environment or + * com.sleepycat.je.rep.ReplicatedEnvironment constructor. In the current release, this means that the + * sun.misc.Unsafe class must contain the allocateMemory method and related methods, as defined in the Oracle JDK. + * </p> + * <p> + * When configuring an off-heap cache you can think of the performance trade-offs in two ways. First, if the + * off-heap cache is considered to be a replacement for the file system cache, the serialization and + * materialization overhead is not increased. In this case, the use of the off-heap cache is clearly beneficial, + * and using the off-heap cache "instead of" the file system cache is normally recommended. Second, the off-heap + * cache can be used along with a main cache that is reduced in size in order to compensate for Java GC problems. + * In this case, the trade-off is between the additional serialization, materialization and contention overheads + * of the off-heap cache, as compared to the Java GC overhead. + * </p> + * <p> + * When dividing up available memory for the JVM heap, the off-heap cache, and for other uses, please be aware + * that the file system cache and the off-heap cache are different in one important respect. The file system cache + * automatically shrinks when memory is needed by the OS or other processes, while the off-heap cache does not. + * Therefore, it is best to be conservative about leaving memory free for other uses, and it is not a good idea to + * size the off-heap cache such that all machine memory will be allocated. If off-heap allocations or other + * allocations fail because there is no available memory, the process is likely to die without any exception + * being thrown. In one test on Linux, for example, the process was killed abruptly by the OS and the only + * indication of the problem was the following shown by dmesg. + * </p> + * <pre><code> + * Out of memory: Kill process 28768 (java) score 974 or sacrifice child + * Killed process 28768 (java) + * total-vm:278255336kB, anon-rss:257274420kB, file-rss:0kB + * </code></pre> + * WARNING: Although this configuration property is mutable, it cannot be changed from zero to non-zero, or + * non-zero to zero. In other words, the size of the off-heap cache can be changed after initially configuring + * a non-zero size, but the off-heap cache cannot be turned on and off dynamically. An attempt to do so will + * cause an IllegalArgumentException to be thrown by the Environment or com.sleepycat.je.rep.ReplicatedEnvironment + * constructor. + */ + @UseDefaults + Property<Long> cacheHeapCacheSize(); + + /** + * Configures the default durability associated with transactions. + * <p> + * The string must have the following format: + * </p> + * <pre><code> + * SyncPolicy[,SyncPolicy[,ReplicaAckPolicy]] + * </code></pre> + * <p> + * The first SyncPolicy in the above format applies to the Master, and the optional second SyncPolicy to the + * replica. Specific SyncPolicy or ReplicaAckPolicy values are denoted by the name of the enumeration value. + * </p> + * <p> + * For example, the string:sync,sync,quorum describes a durability policy where the master and replica both use + * Durability.SyncPolicy.SYNC to commit transactions and Durability.ReplicaAckPolicy.SIMPLE_MAJORITY to acknowledge + * a transaction commit. + * </p> + * <p> + * Durability.SyncPolicy.NO_SYNC, is the default value for a node's SyncPolicy. + * </p> + * <p> + * Durability.ReplicaAckPolicy.SIMPLE_MAJORITY is the default for the ReplicaAckPolicy. + * </p> + */ + @Optional + Property<String> durability(); +} +// END SNIPPET: config
