Search code examples
javachroniclechronicle-map

Setting max entries on OpenHTF ChronicleMap


I'm playing around with ChronicleSet, which is backed by ChronicleMap. I've done some initial testing, and it's pretty good for our needs. Much more efficient in RAM usage than other solutions, with access time a bit slower, but still pretty fast.

However, one thing I'm testing is setting the maximum number of entries, and it doesn't seem to be working as expected.

I'm using the following code:

    ChronicleSetBuilder<Long> postalSetBuilder =
            ChronicleSetBuilder.of(Long.class)
                    .name("long-map")
                    .entries(2_000_000L)
                    .maxBloatFactor(1.0);

According to the documentation, this means that the maximum number of entries allowed in this case would be 2M. However, when testing, I can reliably go up to 2x the maximum specified, and a little bit mor,e until I get an exception like this:

Error: ChronicleMap{name=city-postal-codes-map, file=null, identityHashCode=3213500}: Attempt to allocate #129 extra segment tier, 128 is maximum.
Possible reasons include:
    - you have forgotten to configure (or configured wrong) builder.entries() number
    - same regarding other sizing Chronicle Hash configurations, most likely maxBloatFactor(), averageKeySize(), or averageValueSize()
    - keys, inserted into the ChronicleHash, are distributed suspiciously bad. This might be a DOS attack

In this case, the ChronicleMap object call to size() spit out 4,079,238. So I'm wondering how I can set an explicit limit (like the 2M specified above), and have Chronicle reliably reject any requests to add additional elements after that.


Solution

  • It's not possible to configure exact specific limit of entries, because of shared-nothing segmented storage, there is no single counter of entries. To make Chronicle Map to fail close to the configured entries() limit, you should configure allowSegmentTiering(false).