 ------
 Apache DirectMemory Release Notes 0.1-incubating
 ------
 Olivier Lamy
 ------
 2012-06-18
 ------

~~ 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.

~~ NOTE: For help with the syntax of this file, see:
~~ http://maven.apache.org/doxia/references/apt-format.html

Apache DirectMemory 0.1-incubating

  The Apache DirectMemory Team would like to announce the 0.1-incubating release.

  Apache DirectMemory is a multi layered cache implementation featuring off-heap memory management to enable efficient handling of a large number of java objects without affecting jvm garbage collection performance

  It's a technology preview release. So some APIs can be change in the future.

  We hope you enjoy using Apache DirectMemory! If you have any questions, please consult:

  * the web site: {{{http://incubator.apache.org/directmemory/}http://incubator.apache.org/directmemory/}}

  * the directmemory-user mailing list: {{{http://incubator.apache.org/directmemory/mail-lists.html}http://incubator.apache.org/directmemory/mail-lists.html}}

* Apache DirectMemory 0.1-incubating release notes

** New Feature

    * [DIRECTMEMORY-37] - Update the MemoryManager API so it can be used in conjunction with NIO to provide efficient buffer management

    * [DIRECTMEMORY-61] - Create Server module to receive data to cache and a client api to send datas to cache

    * [DIRECTMEMORY-62] - Adopt fluent APIs for bootstrapping the Cache (and optionally manage stored objects)


** Improvement

    * [DIRECTMEMORY-12] - package DirectMemory as a OSGI bundle

    * [DIRECTMEMORY-16] - Create a non Singleton MemoryStorage alternative

    * [DIRECTMEMORY-19] - Remove deprecated MethodRule from unit tests (use @Rule)

    * [DIRECTMEMORY-20] - Remove @SuppressWarnings({"rawtypes","unchecked"} from serializers and fix style

    * [DIRECTMEMORY-27] - Upgrade to protostuff 1.0.4 and switch again to off-heap buffer

    * [DIRECTMEMORY-39] - Create an 'example' module

    * [DIRECTMEMORY-40] - Pointers merging with adjacent free pointers when freeing.

    * [DIRECTMEMORY-42] - OffHeapMemoryBuffer store, allocate and free function's parameters consistency

    * [DIRECTMEMORY-43] - Cache should allow key objects instead of plain string

    * [DIRECTMEMORY-48] - Add OffHeapMemoryBuffer interface and abstraction

    * [DIRECTMEMORY-53] - MemoryManagerService buffers allocation policy

    * [DIRECTMEMORY-56] - Moving unused class from org.apache.directmemory.serialization to test

    * [DIRECTMEMORY-58] - OffHeapMemoryBuffer.allocate should return a ByteBuffer with capacity = limit = allocatedSize to avoid overwriting

    * [DIRECTMEMORY-67] - Serializer Factory should be able to load specific serializers

    * [DIRECTMEMORY-71] - SerializerFactory#createNewSerializer( Class<S>|String ) should throw appropriate exceptions instead of returning null

    * [DIRECTMEMORY-72] - Pointer should be an interface

    * [DIRECTMEMORY-75] - Create a CacheService builder to simplify the bootstrap process

    * [DIRECTMEMORY-77] - Make MemoryManagerServiceWithAllocationPolicyImpl the default MemoryManagerService implementation

    * [DIRECTMEMORY-78] - Completely remove the deprecated OffHeapMemoryBuffer

    * [DIRECTMEMORY-80] - Build fails on Windows

    * [DIRECTMEMORY-89] - Update DM-Solr integration to user Solr 3.6

    * [DIRECTMEMORY-90] - Add OSGi support for directmemory-ehcache integration.

    * [DIRECTMEMORY-91] - Add OSGi support for directmemory-solr

** Bug

    * [DIRECTMEMORY-17] - Element Eviction/Expiry issue

    * [DIRECTMEMORY-18] - The expiry value is not passed to the underlying store to check the expiry of the element.

    * [DIRECTMEMORY-46] - OffHeapMemoryBuffer.free do an unnecessary pointers.add

    * [DIRECTMEMORY-47] - OffHeapMemoryBuffer.allocate need to be synchronized

    * [DIRECTMEMORY-54] - OffHeapMemoryBuffer.clear should set to free all pointers to avoid misusage

    * [DIRECTMEMORY-55] - OffHeapMemoryBuffer leaks 1 byte at every allocation

    * [DIRECTMEMORY-59] - Fix statistics code for SolrOffHeapCache in examples module

    * [DIRECTMEMORY-68] - Standard Serializer is broken under OSGi

    * [DIRECTMEMORY-73] - NPE on put method in CacheServiceImpl when cache is full.

    * [DIRECTMEMORY-81] - Disposal process run only once

    * [DIRECTMEMORY-85] - Method to format in Gb has a typo

    * [DIRECTMEMORY-86] - Tomcat is never stopped during the server tests

    * [DIRECTMEMORY-87] - collectExpired frees not expired items instead of expired ones

    * [DIRECTMEMORY-88] - Unable to retrieve JDK types (Integer, byte, ..) with the StandardSerializer

    * [DIRECTMEMORY-93] - There is a typo in the ehcache feature of directmemory

    * [DIRECTMEMORY-94] - directmemory-solr fails to resolve in some cases

** Task

    * [DIRECTMEMORY-1] - Import the codebase

    * [DIRECTMEMORY-2] - Create Website for URL http://incubator.apache.org/directmemory/

    * [DIRECTMEMORY-3] - Remove Dependencies from SVN

    * [DIRECTMEMORY-4] - Remove eclipse project files

    * [DIRECTMEMORY-5] - Remove Generated Classes from SVN

    * [DIRECTMEMORY-6] - Change Package Names to get adopted

    * [DIRECTMEMORY-38] - Add "TM" to project logos

    * [DIRECTMEMORY-45] - Add (TM) symbol to the project logo

** Test

    * [DIRECTMEMORY-29] - Fix a payload size assertion in MemoryManagerTests.smokeTest()

** Wish

    * [DIRECTMEMORY-65] - put vs update - not consistent

** Sub-task

    * [DIRECTMEMORY-22] - Add OSGi integration test for directmemory

    * [DIRECTMEMORY-23] - Provide a feature descriptor for Karaf


