RFR(L) 8195099: Low latency hashtable for read-mostly scenarios

David Holmes david.holmes at oracle.com
Wed May 2 12:40:52 UTC 2018


Not a review, one comment ...

On 2/05/2018 6:31 PM, Robbin Ehn wrote:
> On 2018-04-30 21:23, Gerard Ziemski wrote:
>> #3 How come "_first" doesn't need to be volatile to be used in 
>> Atomic::cmpxchg ?
>>
>> Node* _first;
>> ...
>>   if (Atomic::cmpxchg(node, &_first, expect) == expect) {
> 
> An implicit cast to the same compatible type which is volatile-qualified 
> is okey.

Any variable used in a lock-free manner should be declared volatile as 
general good practice IMHO.

David
-----

>>
>>
>> #4 Inconsistent parameter names - in:
>>
>>   template <typename LOOKUP_FUNC, typename VALUE_FUNC>
>>   bool get_insert_lazy(Thread* thread, LOOKUP_FUNC& lookup, 
>> VALUE_FUNC& val_f,
>>                        bool* grow_hint = NULL) {
>>     return get_insert_lazy(thread, lookup, val_f, noOp, grow_hint);
>>   }
>>
>> We use "val_f" with "_f” suffix, so we should have "lookup_f", not 
>> "lookup" (many other instances) and "found_f", not "foundf" in
>>
>>   template <typename LOOKUP_FUNC, typename FOUND_FUNC>
>>   bool get(Thread* thread, LOOKUP_FUNC& lookup, FOUND_FUNC& foundf,
>>            bool* grow_hint = NULL);
>>
> 
> Fixed.
> 
>>
>> #5 I wasn't familiar with CRTP, so I read up on it, but I still don't 
>> see the CRTP in BaseConfig - which is the base class and which is 
>> derived? In particular I don't see "class Derived : public 
>> Base<Derived>" pattern here?
> 
> It's the supplied config that extends the BaseConfig which is the derived.
> 
> In gtest (test_concurrentHashtable.cpp) you will see this:
> 
> // Simplest working CRPT implementation for the hash-table.
> struct Pointer : public SimpleTestTable::BaseConfig {
> 
>>
>> More to come…
>>
>>
>> btw. I edited the subject of the email slightly by adding the bug 
>> number to it, so it’s easy to search for.
>>
> 
> Thanks, I'll send the update to the original mail.
> 
> /Robbin
> 
> 
> 
>>
>> cheers
>>
>>
>>> On Apr 26, 2018, at 2:38 AM, Robbin Ehn <robbin.ehn at oracle.com> wrote:
>>>
>>>
>>> Hi all, please review.
>>>
>>> The lower latency of the new gcs have higher demands on runtime 
>>> data-structure
>>> in terms of latency. This is a concurrent hashtable using the 
>>> global-counter
>>> (8195099).
>>>
>>> Webrev:
>>> http://cr.openjdk.java.net/~rehn/8195098/v0/webrev/
>>>
>>> Bug:
>>> https://bugs.openjdk.java.net/browse/JDK-8195098
>>>
>>> * Readers never blocks or spins.
>>> * Inserts do CAS from a read-side, need to re-CAS during 
>>> re-size/deletion in targeted bucket or insert collision. (inserts are 
>>> conceptually a reader)
>>> * Deletes locks the targeted bucket, all other buckets are free for 
>>> operations.
>>> * Re-size locks one bucket at the time, all other buckets are free 
>>> for operations.
>>>
>>> It does concurrent re-size by doubling size and use one more bit from 
>>> hash.
>>> That means a bucket in the old table contains nodes to either one of 
>>> two buckets
>>> in the new table. Each node in the chain is sorted into one of the 
>>> two buckets
>>> with concurrent readers. Shrinking just take two node chains and put 
>>> them
>>> together in the corresponding bucket. To keep track of what is 
>>> visible to the
>>> concurrent readers it's uses a global-counter, needed during re-size 
>>> and for
>>> deletes.
>>>
>>> A gtest is provided which passes on our platforms, we also have a 
>>> prototype of the stringtable using this which passes tier 1-5 on our 
>>> platforms.
>>>
>>> Various people have pre-reviewed various parts, thanks! And a special 
>>> thanks to
>>> Coleen for a lot of reviewing!
>>>
>>> Thanks, Robbin
>>


More information about the hotspot-dev mailing list