Releases: cinchapi/concourse
Version 0.9.0
Vulnerabilities
- Fixed a vulnerability that made it possible for a malicious plugin archive that contained entry names with path traversal elements to execute arbitrary code on the filesystem, if installed. This vulnerability, which was first disclosed by the Snyk Security Research Team, existed because Concourse did not verify that an entry, potentially extracted from a zipfile, would exist within the target directory if actually extracted. We've fixed this vulnerability by switching to the zt-zip library for internal zip handling. In addition to having protections against this vulnerability,
zt-zip
is battle-tested and well maintained by ZeroTurnaround. Thanks again to the Snyk Security Research Team for disclosing this vulnerability.
Security Model
- Added a notion of user roles. Each user account can either have the
ADMIN
orUSER
role.ADMIN
users are permitted to invoke management functions whereas accounts with theUSER
role are not.- All previously existing users are assigned the
ADMIN
role on upgrade. You can change a user's role using theusers
CLI. - The
users create
command now requires a role to be provided interactively when prompted or non-interactively using the--set-role
parameter.
- All previously existing users are assigned the
- Added an
edit
option to theusers
CLI that allows for setting a user's role and/or changing the password. The password can also still be changed using thepassword
option of theusers
CLI. - Removed a constraint the prevented the default
admin
user account from being deleted. - Added additional logging around the upgrade process.
- Fixed a bug that prevented upgrade tasks from being run when upgrading a Concourse Server instance that was never started prior to the upgrade.
- Upgraded some internal libraries to help make server startup time faster.
- Fixed a bug in
concourse-driver-java
that caused thenavigate
functions to report errors incorrectly. - Added user permissions. Each non-admin user account can be granted permission to
READ
orWRITE
data within a specific environment:- Permissions can be granted and revoked for a non-admin role user by a user who has the admin role.
- Permissions are granted on a per environment basis.
- A user with
READ
permission can read data from an environment but cannot write data. - A user with
WRITE
permission can read and write data in an environment. - Users with the admin role implicitly have
WRITE
permission to every environment. - If a user's role is downgraded from admin to user, she will have the permissions she has before being assigned the admin role.
- If a user attempts to invoke a function for which she doesn't have permission, a
PermissionException
will be thrown, but the user's session will not terminate. - A user with the admin role cannot have any of her permissions revoked.
- Plugins automatically inherit a user's access (based on role and permission).
- Service users that operate on behalf of plugins have
WRITE
access to every environment.
Data Types
- Added a
Criteria#at(Timestamp)
method to transform anyCriteria
object into one that has all clauses pinned to a specificTimestamp
. - Added a static
Criteria#parse(String)
method to parse a CCL statement and produce an analogousCriteria
object. - Streamlined the logic for server-side atomic operations to unlock higher performance potential.
- Added short-circuit evaluation logic to the query parsing pipeline to improve performance.
- Added a
TIMESTAMP
data type which makes it possible to store temporal values in Concourse.- The
concourse-driver-java
API uses theTimestamp
class to representTIMESTAMP
values. Please note that hallowTimestamps
(e.g. those created using theTimestamp#fromString
method cannot be stored as values). An attempt to do so will throw anUnsupportedOperationException
. - The
concourse-driver-php
uses theDateTime
class to representTIMESTAMP
values. - The
concourse-driver-python
uses thedatetime
class to representTIMESTAMP
values. - The
concourse-driver-ruby
uses theDateTime
class to representTIMESTAMP
values. - The Concourse REST API allows specifying
TIMESTAMP
values as strings by prepending and appending a|
to the value (e.g.|December 30, 1987|
). It is also possible to specify a formatting pattern after the value like|December 30, 1987|MMM dd, yyyy|
.
- The
- Added a
Timestamp#isDateOnly
method that returnstrue
if aTimestamp
does not contain a relevant temporal component (e.g. theTimestamp
was created from a date string instead of a datetime string or a timestring).
Performance
- Upgraded the CCL parser to a newer and more efficient version. This change will yield general performance improvements in methods that parse CCL statements during evaluation.
Developer Experience
- The test Concourse instance used in a
ClientServerTest
will no longer be automatically deleted when the test fails. This will allow for manual inspection of the instance when debugging the test failure. - Added additional logging for plugin errors.
- Added a
manage
interface to the driver APIs. This interface exposes a limited number of management methods that can be invoked programatically.
Bug Fixes
- Fixed a bug that caused the server to fail to start if the
conf/stopwords.txt
configuration file did not exist. - Fixed a bug that caused
PrettyLinkedHashMap#toString
to render improperly if data was added using theputAll
method. - Fixed a bug in the
ConcourseImportDryRun#dump
method that caused the method to return an invalid JSON string. - Fixed a bug where a users whose access had been
disabled
was automatically re-enabled if her password was changed.
Miscellaneous
- Added the ability for the storage engine to track stats and metadata about database structures.
Version 0.8.2
- Fixed a bug in the
ManagedConcourseServer#install
method that caused the server installation to randomly fail due to race conditions. This caused unit tests that extended theconcourse-ete-test-core
framework to intermittently fail.
Version 0.8.1
- Fixed a bug that caused local CCL resolution to not work in the
findOrInsert
methods. - Fixed an issue that caused conversion from string to
Operator
to be case sensitive. - Fixed a bug that caused the
putAll
method in the map returned fromTrackingMultimap#invert
to store data inconsistently. - Added better error handling for cases when an attempt is made to read with a value with a type that is not available in the client's version.
- Fixed a bug that caused Concourse Server to unreliably stream data when multiple real-time plugins were installed.
- Fixed a bug that caused Concourse Server to frequently cause high CPU usage when multiple real-time plugins were installed.
- Added an isolation feature to the
ImportDryRunConcourse
client (from theconcourse-import
framework). This feature allows the client to import data into an isolated store instead of one shared among all instances. This functionality is not exposed to theimport
CLI (because it isn't necessary), but can be benefical to applications that use the dry-run client to programmatically preview how data will be imported into Concourse. - Added an implementation for the
ImportDryRunConcourse#describe
method.
Version 0.8.0
- Added a
count
aggregation function that returns the number of values stored- across a key,
- for a key in a record, or
- for a key in multiple records.
- Added a
max
aggregation function that returns the largest numeric value stored- across a key,
- for a key in a record, or
- for a key in multiple records.
- Added a
min
aggregation function that returns the smallest numeric value stored- across a key,
- for a key in a record, or
- for a key in multiple records.
- Moved the
ccl
parsing logic into a separate library to make the process portable to plugins and other applications. - Fixed some bugs that could have caused incorrect evaluation of
select(criteria)
,find(criteria)
and related methods in some cases. - Added a
TObject#is(operator, values...)
method so plugins can perform local operator based comparisons for values returned from the server.
Version 0.7.3
- Fixed a bug that caused the temporal
average
andsum
calculations to fail if thetimestamp
parameter was generated from aString
instead oflong
. - Fixed a couple of bugs that made it possible for Concourse Server to pass blank or unsanitized environment names to plugins during method invocations.
- Fixed a bug that caused
Criteria
objects to be improperly serialized/deserialized when passed to plugin methods as arguments or used as return values.
Version 0.7.2
- Added more detailed information to the server and plugin log files about plugin errors.
- Fixed a bug where
TrackingMultimap#percentKeyDataType
returnedNaN
instead of0
when the map was empty. - Added a
memoryStorage
option to thePluginStateContainer
class.
Version 0.7.1
- Fixed a bug that caused an error in some cases of importing or inserting data that contained a value of
-
. - Added better error message for TApplicationException in CaSH.
Version 0.7.0
-
Added
navigate
methods that allow selecting data based on link traversal. For example, it is possible to select the names of the friends of record 1's friends by doingnavigate "friends.friends.name", 1
-
Re-implemented the
users
CLI to provide extensible commands. Now theusers
CLI will respond to:create
- create a new userdelete
- delete an existing userenable
- restore access to a suspended userpassword
- change a user's passwordsessions
- list the current user sessionssuspend
- revoke access for a user
-
Changed the
envtool
CLI to theenvironments
CLI with extensible commands. Theenvironments
CLI will respond:list
- list the Concourse Server environments
-
Changed the
dumptool
CLI to thedata
CLI with extensible commands. Thedata
CLI will respond to:dump
- dump the contents of a Concourse Server data filelist
- list the Concourse Server data files
-
Added a
CompositeTransformer
to theconcourse-import
framework that invokes multiple transformers in declaration order. -
Added a
Transformers
utility class to theconcourse-import
framework API. -
Fixed a bug that caused the loss of order in plugin results that contained a sorted map.
-
Added a
--dry-run
flag to theimport
CLI that will perform a test import of data in-memory and print a JSON dump of what data would be inserted into Concourse. -
Added support for installing multiple plugins in the same directory using the
concourse plugin install </path/to/directory>
command. -
Implemented
describe()
anddescribe(time)
methods to return all the keys across all records in the database. -
Fixed a bug where the
browse(keys, timestamp)
functionality would return data from the present state instead of the historical snapshot. -
Fixed an issue that caused plugins to use excessive CPU resources when watching the liveliness of the host Concourse Server process.
-
Added a bug fix that prevents service tokens from auto-expiring.
-
Added a
ps
command to theplugins
CLI to display information about the running plugins. -
Fixed a bug that caused the
average(key)
method to return the incorrect result. -
Fixed a bug that caused calculations that internally performed division to prematurely round and produce in-precise results.
-
Fixed a bug that caused the editing and deleting an existing user with the
users
CLI to always fail. -
Added support for defining custom importers in
.jar
files. -
Detect when the service is installed in an invalid directory and fail appropriately.
-
Fixed a security bug that allowed the
invokePlugin
method to not enforce access controls properly. -
Fixed a bug that caused management CLIs to appear to fail when they actually succeeded.
-
Improved the performance of the
ResultDataSet#put
method. -
Fixed a bug in the implementation of
ObjectResultDataset#count
. -
Deprecated
Numbers#isEqual
andNumbers#isEqualCastSafe
in favor of better namesNumbers#areEqual
andNumbers#areEqualCastSafe
. -
Added support for getting the min and max keys from a
TrackingMultimap
. -
Added an
ImmutableTrackingMultimap
class. -
Fixed a bug in the
TrackingMultimap#delete
method. -
Fixed the CPU efficiency of the JavaApp host termination watcher.
-
Fix bug that caused JavaApp processes to hang if they ended before the host was terminated.
-
Added database-wide
describe
method.
Version 0.6.0
- Added
calculate
interface to thejava
driver to perform aggregations. - Added a
sum
aggregation function. - Added an
average
aggregation function. - Switched to socket-based (instead of shared memory based) interprocess communication between Concourse Server and plugins.
- Assigned meaningful process names to plugins.
- Added a System-Id for each Concourse Server instance.
- Fixed bugs in the
ObjectResultDataset
implementation. - Added an end-to-end testing framework for the plugin framework.
- Fixed a bug that caused some query results to be case-sensitive.
- Fixed a bug that caused some query results to have inconsistent ordering.
- Upgraded support for parsing natural language timestamps.
- Updated the usage method of the
concourse
init.d script. - Fixed a bug that caused
PluginContext
andPluginRuntime
to return different directories for a plugin's data store. - Added a progress bar for the
plugin install
command. - Fixed a bug that caused
ConcourseRuntime
to mishandle plugin results. - Clarified the proper way to use plugin hooks.
- Refactored the
plugin
management CLI. - Fixed a bug that allowed plugins to invoke server-side transaction methods (CON-518).
- Refactored the implementation of the
version
CLI. - Improved process forking framework.
- Enabled console logging for plugins (CON-514).
- Made the
Transformer
interface inconcourse-import
framework aFunctionalInterface
. - Added logic to plugins to signal to Concourse Server when initialization has completed.
- Added functionality to get the host Concourse Server directory from the
import
CLI and server-side management CLIs. - Added support for defining custom importers in an
importers
directory within the Concourse Server instance directory. - Added a
--annotate-data-source
option to theimport
CLI that will cause imported records to have the name of the source file added to the__datasource
key. - Added support for specifying the id of the record into which data should be inserted within the JSON blob that is passed to the
insert
method. - Added method to
TrackingMultimap
that measures the spread/dispersion of the contained data. - Fixed a race condition bug in the
concourse-ete-test
framework. - Fixed bug that caused a preference for using random ports outside the ephemeral range.
- Changed the plugin configuration to no longer require setting
remote_debugger = on
to enable remote debugging; now it is sufficient to just specify theremote_debugger_port
preference.
Version 0.4.4
- Fixed an issue where transactions and atomic operations unnecessarily performed pre-commit locking during read operations, which negatively impacted performance and violated the just-in-time locking protocol (CON-198/CON-199).
- Added logic to prevent the Buffer from attempting a scan for historical data that is older than any data that is currently within the Buffer (CON-197).
- Added group sync: an optimization that improves Transaction performance by durably fsyncing committed writes to the Buffer in bulk. Transactions still honor the durability guarantee by taking a full backup prior to acknowledging a successful commit (CON-125).
- Improved the performance of releasing locks by moving garbage collection of unused locks to a background thread.
- Improved the performance for upgrading range locks and checking for range conflicts by using collections that shard and sort range tokens.
- Improved Transaction write performance by using local bloom filters to speed up
verifies
. - Fixed a bug where storage engine methods that touched an entire record (e.g.
browse(record)
andaudit(record)
) or an entire key (browse(key)
) were not properly locked which potentially made reads inconsistent (CON-239). - Fixed an issue where transactions unnecessarily performed double write validation which hurt performance (CON-246).
- Fixed a major memory leak that occurred when transactions were aborted or failed prior to committing (CON-248).
- Added logging to indicate if the background indexing job terminates because of an uncaught error (CON-238).
- Fixed an issue where the background indexing job could be wrongfully terminated because it appeared to be stalled when doing a large amount of work.
- Fixed a memory-leak issue where Concourse Server did not release resources for abandoned transactions if the client started a transaction and eventually started another one without explicitly committing or aborting the previous one (CON-217).
- Fixed various issues and performance bottlenecks with syncing storage blocks to disk.
- Improved the names of several Concourse Server threads.