| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| concourse-server-0.12.0.1771074107.bin | 2026-02-14 | 96.6 MB | |
| README.md | 2026-02-14 | 19.6 kB | |
| Version 0.12.0 source code.tar.gz | 2026-02-14 | 165.5 MB | |
| Version 0.12.0 source code.zip | 2026-02-14 | 166.8 MB | |
| Totals: 4 Items | 428.9 MB | 0 | |
Distributed Concourse (ALPHA)
- Added support for running Concourse as a distributed cluster. This ALPHA release allows Concourse to operate across multiple nodes while maintaining strong consistency guarantees.
- Distributed Concourse operates as a CP system with optimistic availability, meaning it prioritizes data consistency while maximizing availability when possible.
- Each node in the cluster operates as a peer - there is no single leader, allowing clients to connect to any node to perform operations.
- Distributed deployment can be enabled by configuring the new
clustersettings in your configuration file: cluster.nodes: A list ofhost:portentries for each node in the clustercluster.replication_factor: Specifies the minimum number of nodes that should receive a copy of each piece of data (defaults to n/2 + 1, where n is the number of nodes)- IMPORTANT: This is an ALPHA release with several limitations:
- Cannot convert an existing single-node deployment with data into a distributed cluster
- Cannot have nodes with different configurations within the same cluster
- Cannot have nodes running different Concourse versions
- Cannot add or remove nodes from an existing cluster dynamically
- Not recommended for production systems or mission-critical data
- The focus of this initial implementation is on core correctness of the distributed system protocol, data routing, and consistency - consider it a proof of concept at this stage.
Batch Transporter for Improved Automatic Indexing
We've introduced a new mechanism to control how Concourse Server transports data from the Buffer to the Database, significantly improving system throughput and responsiveness:
-
New Transporter Configuration: Added the
transporterconfiguration option inconcourse.yamlthat allows you to specify how Concourse moves data from the write-optimized Buffer to the read-optimized Database, where it becomes fully indexed. -
Two Transport Strategies:
- Streaming Transporter (legacy): Processes writes incrementally in small batches, with transport operations competing with reads and writes for system resources. While this provides consistent throughput by amortizing indexing costs across operations, it can lead to "stop-the-world" situations during high load when transport operations block all reads (and implicitly writes, which perform verification reads).
-
Batch Transporter (default/new): Performs indexing entirely in the background, allowing reads and writes to continue uninterrupted during the indexing phase. Only a brief critical section is required when merging the fully-indexed data into the Database. This approach dramatically improves overall system throughput by eliminating the resource contention between transport operations and normal read/write operations.
-
Configuration Options:
Simple configuration
transporter: batch # or "streaming"
Advanced configuration
transporter: type: batch # or "streaming" num_threads: 2 # default: 1
-
Performance Benefits: The Batch Transporter significantly improves system throughput by:
- Moving the time-consuming indexing work to background threads
- Minimizing the duration of critical sections where locks block concurrent operations
- Reducing "stop-the-world" situations during high load
-
Making system performance more predictable and responsive
-
Use Case Recommendation: The Batch Transporter is particularly beneficial for workloads with high concurrent activity or large data volumes that require extensive indexing.
This enhancement represents a fundamental improvement to Concourse's architecture, addressing a key bottleneck in the storage engine by separating the indexing process from the critical path of normal operations.
Search
We made several changes to improve search performance and accuracy:
- Fulltext Search in Queries: Fulltext search is now supported directly in query operations via the new operators
CONTAINSandNOT_CONTAINS. This enhancement eliminates the need to separately invoke the search method and manually intersect query result sets, allowing you to filter results using search logic inline with your queries. - Preservation of Stopwords in Indexing and Search: Stopwords are no longer removed. As a result, searches that contain stopwords may return different, yet more accurate and contextually relevant results.
- Previous Configuration: In earlier versions, Concourse Server could be configured using the
conf/stopwords.txtfile to exclude common stopwords from indexing and search operations. This approach was designed to reduce storage requirements and improve search performance by removing frequently occurring, but generally less significant words. - Rationale for Change: Preserving stopwords is crucial for maintaining context, which can significantly enhance the accuracy of search results and the effectiveness of ranking algorithms. Since affordable storage and computational resources are more abundant, resource usage is no longer a concern and it makes more sense to prioritze better search accuracy and system robustness. Lastly, preserving stopwords eliminates corner case bugs that are inherent to the way Concourse's search algorithm interacts with the buffered storage system.
- Upgrade Implications: Upon upgrading to this version, an automatic reindexing task will be initiated to ensure that all previously indexed data conforms to the new no-stopword-removal policy. It's important to allocate downtime for this reindexing to occur. And, it is wise to anticipate more storage spaced being used due to stopwords being included in the search corpus.
- Changed the default value of the
max_search_substring_lengthconfiguration option to40. The previous default allowed unlimited substring lengths, which increased search index size and hurt performance. Existing explicit configurations for this option remain unchanged. - Compiled Search Queries: Since query-based searches consult indexed data instead of the full corpus (as direct searches do), we added logic to compile search queries when they must be compared against multiple stored values (e.g. in the Buffer, or within atomic operations or Transactions). This compilation allows the search algorithm to optimize over simple substring matching—especially when the search term is a single token/word—by leveraging efficient algorithms like Boyer-Moore.
Locking Optimizations
We made several changes to improve the safety, scalability and operational efficiency of the Just-in-Time (JIT) locking protocol:
- Eliminated redundant logic and localized the determination of when an Atomic Operation or Transaction becomes preempted by another commit. Previously that determination was managed globally in the Engine and relied on the JVM garbage collector (GC) to remove terminated operations from listening for data conflicts. Under contention, If many terminated operations accumulated between GC cycles, write performance could become degraded for hot data topics. As a result of this change, JIT locking is generally more memory efficient.
- Reduced lock metadata by consolidating the provisioning for all locks to a single broker. Previously, range locks and granular locks were issued and managed independently by different services.
- Improved the CPU efficiency of range locks by scheduling range blocked operations to park instead of busy waiting.
- Eliminated a known race condition that made it possible for two different conflicting commits to violate ACID semantics by concurrently acquiring different locks for the same resource.
- Switched the basis for all storage engine locks from
java.util.concurrent.locks.ReenteantReadWriteLockto eitherjava.util.concurrent.locks.StampedLockor other synchronization primitives that are generally shown to have better throughput.
YAML Configuration
- Concourse now supports YAML configuration files. Going forward, YAML files are preferred over preferences files for configuration.
- Concourse Server can be configured with
concourse.yamlandconcourse.yaml.devfiles. - Concourse Shell and other Java Driver based clients can be configured with a
concourse_client.yamlfile. - Usage of
concourse.prefs,concourse.prefs.devandconcourse_client.prefsis now deprecated.
- Concourse Server can be configured with
- Existing configuration defined in
.prefsfiles is still recognized and backwards compatability is fully preserved. - Configuration that is defined in
.yamlfiles take precedence over configuration defined in.prefsfiles, with the exception thatconcourse.prefs.devtakes precedence overconcourse.yamlto honor the convention of prioritizing dev configuration. - The stock
concourse.prefsfile will no longer be updated when new configuration options are available. All new configuration templates will be defined in the stockconcourse.yamlfile. - Concourse Server will not automatically migrate custom configuration from
.prefsfiles to the corresponding.yamlfiles. While.prefsfiles are still functional, users are encouraged to manually copy custom configuration to the new format in case support for.prefsfiles goes away at a future date. concourse.yamlsupports an option to specify custom credentials for the root administrator account under theinit.rootobject. If eitherinit.root.usernameorinit.root.passwordis provided, it takes precedence over any value provided forinit_root_usernameorinit_root_password, respectively.
Plugin Framework Improvements
We've enhanced the plugin framework to support plugins that are compiled against different Java versions than the server, enabling greater flexibility in plugin development and deployment:
- Cross-Version Plugin Compatibility: Plugins compiled with newer Java versions (e.g., Java 21) can now run on servers using older Java versions (e.g., Java 8). This is achieved through a new external bootstrapping mechanism that discovers plugin classes by scanning bytecode directly, rather than loading classes into the server's JVM, which would cause
UnsupportedClassVersionErrorwhen version incompatibilities exist. - Plugin Bootstrapper Configuration: Added the
plugins.bootstrapperconfiguration option inconcourse.yamlto control how plugins are bootstrapped during activation: - external (default): Bootstraps plugins by scanning class file bytecode externally, which avoids loading plugin classes into the server's JVM. This enables cross-version compatibility and automatically falls back to internal bootstrapping if external processing fails.
- internal: Bootstraps plugins within the server's JVM using Reflections-based class loading. This is the legacy approach that requires compatible Java versions between the server and plugin.
- Custom Java Runtime for Plugins: Added the
java_homeandjava_binaryconfiguration options for plugins. Both options allow each plugin to respectively specify the path to a custom JDK orjavabinary that should be used to launch its JVM. If neither is configured, plugins use the same Java runtime as the server. - Improved Java 9+ Compatibility: Fixed an issue where the server could not correctly determine the system classpath on Java 9 and later versions. The server now uses the
java.class.pathsystem property as a fallback when the systemClassLoaderis not aURLClassLoader. - Improved Plugin IPC Reliability: Refactored inter-process communication between the server and plugins to use
CompletableFuturefor response handling, replacing a custom spin-wait synchronization mechanism. Also hardened message framing to correctly handle partial socket reads and added write serialization to prevent message interleaving under concurrent load.
Concourse Automation Framework
- Added the
concourse-automationframework to provide a central set of tools to programatically interact with the Concourse codebase and release artifacts in automated tests and devops workflows. For the most part, theconcourse-automationframework is comprised of tools that were previously available in theconcourse-ete-test-coreframework.ConcourseCodebase- Provides programmatic interaction with a local copy of the Concourse source code. Can be used to build installer artifacts.ConcourseArtifacts- Provides factory methods to retrieve local copies of Concourse artifacts for any version. Can be used to download the installer for a released version.ManagedConcourseServer- Provdes the ability to control an external Concourse Server process within another application.
New Functionality and Enhancements
- Reduced the amount of heap space required for essential storage metadata.
- Efficient Metadata: Added the
enable_efficient_metadataconfiguration option to further reduce the amount of heap space required for essential storage metadata. When this option is set totrue, metadata will occupy approximately one-third less heap space and likely improve overall system performance due to a decrease in garbage collection pauses (although per-operation performance may be slightly affected by additional overhead). - Asynchronous Data Reads: Added the
enable_async_data_readsconfiguration option to allow Concourse Server to potentially use multiple threads to read data from disk. When data records are either no longer cached or not eligible to ever be cached (due to space limitations), Concourse Server streams the relevant information from disk on-demand. By default, this is a synchronous process and the performance is linear based on the number of Segment files in the database. With this new configuration option, Concourse Server can now stream the data using multiple threads. Even under high contention, the read performance should be no worse than the default synchronous performance, but there may be additional overhead that reduces peak performance on a per-operation basis. - Improved write performance of the
setmethod in large transactions by creating normalized views of existing data, which are consulted during the method's implicitselectread operation. - Improved the performance of the
verifyOrSetmethod by removing redundant internal verification that occurred while finalizing the write.
Bug Fixes
- GH-454: Fixed an issue that caused JVM startup options overriden in a ".dev" configuration file to be ignored (e.g.,
heap_size). - GH-535: Fixed an issue that caused JVM startup options overriden in an environment variable to be ignored (e.g.,
CONCOURSE_HEAP_SIZE). - GH-491 Fixed a race condition that made it possible for a range bloked operation to spurriously be allowed to proceed if it was waiting to acquire a range lock whose intended scope of protection intersected the scope of a range lock that was concurrently released.
- Fixed a bug that caused range locks to protect an inadequate scope of data once acquired.
- GH-490: Fixed a bug that made it possible for a write to a key within a record (e.g., key
Ain record1) to erroneously block a concurrent write to a different key in the same record (e.g., keyBin record1). The practial consquence of this bug was that more Atomic Operations and Transactions failed than actually necessary. - Fixed an issue that occurred when using a navigation key in a Criteria/Condition that was passed as a parameter to a Concourse Server command. Previously, the individual stops of navigation keys were not individually registered as condition keys. As a result, the
Strategyframework didn't have all the relevant information to accurately determine all the ideal lookup sources when traversing the document graph to retrieve the values along the path. Now, in addition to the entire navigation key, each individual stop is registered as a condition key, which means that theStrategyframework will have enough information to determine if more efficient to use any index data (as opposed to table data) for lookups.
API Breaks and Deprecations
- Concourse CLIs have been updated to leverage the
lib-cliframework. There are no changes in functionality, however, in theconcourse-cliframework, the following classes have been deprecated:CommandLineInterfacein favor ofConcourseCommandLineInterfaceCommandLineInterfaceRunnerin favor ofcom.cinchapi.lib.cli.CommandLineInterfaceRunnerfrom thelib-cliframework.NoOptionsin favor of creating a newOptionsobject.Optionsin favor ofcom.cinchapi.lib.cli.Optionsfrom thelib-cliframework.
- As a result of Concourse's new support for YAML configuration:
- Usage of
concourse.prefs,concourse.prefs.devandconcourse_client.prefsis deprecated in favor ofconcourse.yaml,concourse.yaml.devandconcourse_client.yamlrespectively. - The
ConcourseServerPreferenceshandler is deprecated in favor of usingConcourseServerConfiguration, which provides the same functionality. - The
ConcourseClientPreferenceshandler is deprecated in favor of usingConcourseClientConfiguration, which provides the same functionality. ManagedConcourseServer#prefs()is deprecated in favor ofManagedConcourseServer#config().- The
Concourse#connectWithPrefsmethods have been deprecated in favor ofConcourse#connectmethods that take one or more configuration filePaths or aConcourseClientConfigurationhandler, respectively.
- Usage of
- With the introduction of the
concourse-automationframework, duplicate classes in theconcourse-ete-test-coreframework have been deprecated:com.cinchapi.concourse.util.ConcourseCodebasehas been deprecated in favor of usingcom.cinchapi.concourse.automation.developer.ConcourseCodebasewhich provides the same functionality, but some methods have been renamed for clarity.ConcourseServerDownloaderhas been deprecated in favor of usingConcourseArtifactswhich provides the same functionality, but some methods have been renamed for clarity.com.cinchapi.concourse.server.ManagedConcourseServerhas been deprecated in favor of usingcom.cinchapi.concourse.automation.server.ManagedConcourseServerwhich provides the same functionality, but some methods have been renamed for clarity.
- The
com.cinchapi.concourse.util.Processesutility class has been removed in favor of usingcom.cinchapi.common.processfromaccent4j.- This was removed without deprecation because the utility provided by the
accent4jversion is nearly identical to the one that was provided in Concourse andaccent4jis naturally available to users of Concourse frameworks by virtue of being a transitive dependency. - The
waitForandwaitForSuccessfulCompletionmethods ofaccent4j'sProcessesutility return aProcessResult, which provides access to the process's exit code, output stream and error stream (in the Concourse version, these methods had avoidreturn type). This means that an Exception will be thrown if an attempt is made to use thegetStdErrorgetStdOutmethod on a process that was submitted towaitFororwaitForSuccessfulCompletion.
- This was removed without deprecation because the utility provided by the