[ https://issues.apache.org/jira/browse/BOOKKEEPER-964?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sijie Guo resolved BOOKKEEPER-964. ---------------------------------- Resolution: Fixed Issue resolved by merging pull request 72 [https://github.com/apache/bookkeeper/pull/72] {noformat} commit ecbb053e6e873859507e247cae727f4bc8b9f7fa Author: Matteo Merli <mme...@yahoo-inc.com> AuthorDate: Tue Nov 29 15:17:46 2016 -0800 Commit: Sijie Guo <si...@apache.org> CommitDate: Tue Nov 29 15:17:46 2016 -0800 BOOKKEEPER-964: Add concurrent maps and sets for primitive types In BookKeeper there are many instances of maps and sets that use ledger id and entry ids as keys or values. JDK concurrent collections have the overhead of boxing all the primitive values into objects (eg: long --> Long) that would need to be allocated from the heap. In addition to that, JDK map implementations are closed hash tables and they will require at least one more allocation to hold the linked-list/tree node. There are already available libraries that offer primitive collections with zero-allocation, but none of these support concurrent maps/sets. We have added a handful of specializations, all based on the same implementation idea. We have a hash table which is broken down into multiple sections. Each sections, on its own, is an open hash table with linear probing, protected by a stamped lock. All insertions, lookups and iterations on these collections are allocation free. ``` ConcurrentLongHashMap: Map<long, Object> ConcurrentLongHashSet: Set<long> ConcurrentLongLongHashMap: Map<long, long> ConcurrentLongLongPairHashMap: Map< Pair<long, long>, Pair<long, long> > ConcurrentOpenHashMap: Map<Object, Object> ConcurrentOpenHashSet: Set<Object> ``` Author: Matteo Merli <mme...@yahoo-inc.com> Reviewers: Sijie Guo <si...@apache.org>, Enrico Olivelli <enrico.olive...@diennea.com> Closes #72 from merlimat/bk-collections {noformat} > Add concurrent maps and sets for primitive types > ------------------------------------------------ > > Key: BOOKKEEPER-964 > URL: https://issues.apache.org/jira/browse/BOOKKEEPER-964 > Project: Bookkeeper > Issue Type: Improvement > Reporter: Matteo Merli > Assignee: Matteo Merli > Fix For: 4.5.0 > > > In BookKeeper there are many instances of maps and sets that use ledger id > and entry ids as keys or values. JDK concurrent collections have the overhead > of boxing all the primitive values into objects (eg: long --> Long) that would > need to be allocated from the heap. In addition to that, JDK map > implementations > are closed hash tables and they will require at least one more allocation to > hold > the linked-list/tree node. > There are already available libraries that offer primitive collections with > zero-allocation, but none of these support concurrent maps/sets. > We have added a handful of specializations, all based on the same > implementation > idea. We have a hash table which is broken down into multiple sections. Each > sections, on its own, is an open hash table with linear probing, protected by > a stamped lock. > All insertions, lookups and iterations on these collections are allocation > free. > {noformat} > ConcurrentLongHashMap: Map<long, Object> > ConcurrentLongHashSet: Set<long> > ConcurrentLongLongHashMap: Map<long, long> > ConcurrentLongLongPairHashMap: Map< Pair<long, long>, Pair<long, long> > > ConcurrentOpenHashMap: Map<Object, Object> > ConcurrentOpenHashSet: Set<Object> > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)