peter-lawrey / hugecollections-old Goto Github PK
View Code? Open in Web Editor NEWHuge Collections for Java using efficient off heap storage
Huge Collections for Java using efficient off heap storage
The following code reproduces an issue of the map being full despite having 25% of its capacity still available.
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import net.openhft.collections.SharedHashMap;
import net.openhft.collections.SharedHashMapBuilder;
public class SharedHashMapBug {
public static void main(String[] args)
{
SharedHashMap<String, byte[]> sharedHashMap = null;
Iterator<String> it = null;
int numEntries = 2048;
int entrySize = 32768;
int removeThreshold = (int)(numEntries * 0.75);
SharedHashMapBuilder builder = new SharedHashMapBuilder();
builder.entries(numEntries);
builder.entrySize(entrySize);
String shmPath = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + "SharedHashMap";
File file = new File(shmPath);
file.delete();
try {
sharedHashMap = builder.create(new File(shmPath), String.class, byte[].class);
} catch (IOException e) {
e.printStackTrace();
}
if(sharedHashMap != null)
{
byte[] value = new byte[30000];
int index = 0;
while(index < (numEntries * 1024))
{
String key = String.valueOf(index);
if(sharedHashMap.longSize() > removeThreshold)
{
if((it == null) || (!it.hasNext()))
{
it = sharedHashMap.keySet().iterator();
}
if(it.hasNext())
{
String removalKey = it.next();
byte[] removalValue = sharedHashMap.remove(removalKey);
if(removalValue == null)
{
System.out.println("no entry to remove for " + removalKey);
}
}
}
//System.out.println("put(" + key + ", " + value + " );");
sharedHashMap.put(key, value);
++index;
}
}
}
}
Here is the output when run:
Exception in thread "main" java.lang.IllegalStateException: VanillaShortShortMultiMap is full
at net.openhft.collections.VanillaShortShortMultiMap.nextPos(VanillaShortShortMultiMap.java:199)
at net.openhft.collections.AbstractVanillaSharedHashMap$Segment.put(VanillaSharedHashMap.java:823)
at net.openhft.collections.AbstractVanillaSharedHashMap.put0(VanillaSharedHashMap.java:348)
at net.openhft.collections.AbstractVanillaSharedHashMap.put(VanillaSharedHashMap.java:330)
at SharedHashMapBug.main(SharedHashMapBug.java:62)
Our @testsuite to adapt SHM as an ISPN7 JCACHE operand is currently failing the testKeySet() test .
line 291 at https://github.com/Cotton-Ben/infinispan/blob/master/off-heap/src/test/java/org/infinispan/offheap/test/OffHeapDefaultDataContainerTest.java makes the exact same OpenHFT invoke as was used in the infoQ whitepaper.
BondVOInterface bondV = DataValueClasses.newDirectReference(BondVOInterface.class);
could you guys take a look and provide counsel?
here is the stack trace.
[TestNG] Running:
/root/.IdeaIC13/system/temp-testng-customsuite.xml
ISPN7 JCACHE DataContainer view of OpenHFT SHM is being created
OpenHFT /dev/shmSHM/bondVO.@t=1395590961708 entries=[{}]
initialize
ISPN7 JCACHE DataContainer created jcacheDataContainer=[org.infinispan.offheap.container.OffHeapDefaultDataContainer@50431425]
warning: Supported source version 'RELEASE_6' from annotation processor 'org.sonatype.guice.bean.scanners.index.SisuIndexAPT6' less than -source '1.7'
1 warning
java.lang.AssertionError: java.lang.NullPointerException
at net.openhft.lang.model.DataValueClassCache.newDirectReference(DataValueClassCache.java:39)
at net.openhft.lang.model.DataValueClasses.newDirectReference(DataValueClasses.java:36)
at org.infinispan.offheap.OffHeapDefaultDataContainerTest.testKeySet(OffHeapDefaultDataContainerTest.java:291)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NullPointerException
at net.openhft.lang.model.DataValueGenerator.methodSet(DataValueGenerator.java:691)
at net.openhft.lang.model.DataValueGenerator.generateNativeObject(DataValueGenerator.java:539)
at net.openhft.lang.model.DataValueGenerator.acquireNativeClass(DataValueGenerator.java:482)
at net.openhft.lang.model.DataValueClassCache.directClassFor(DataValueClassCache.java:48)
at net.openhft.lang.model.DataValueClassCache.newDirectReference(DataValueClassCache.java:37)
... 32 more
Process finished with exit code 0
When concurrent threads reading/writing to DIFFERENT map entries through standard DataValueClass generated getter/setters (marshalling to corresponding UNSAFE methods) and if these map entries phyically reside in the SAME SEGMENT then there is possibility of corruption of data.
Problem seems since version 3.0.2 collections i.e. I cannot reliably reproduce on that version..but I can pretty consistantly reproduce on latest 3.2.1 collections and 6.4.6 lang on two completely different platforms i.e. ubuntu 12.04 AMD Athlon(tm) 64 X2 Dual Core Processor 3600+ × 2 and on MacOSX 10.7.5 2.2GHz Core i7 using the same test program below : NOTE : ignore the junit test result .. its the logging that indicates the actual problem.
package com.nimrod.test;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import net.openhft.collections.SharedHashMap;
import net.openhft.collections.SharedHashMapBuilder;
import net.openhft.lang.model.DataValueClasses;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestSharedHashMap {
final static Logger logger = LoggerFactory.getLogger(TestSharedHashMap.class);
SharedHashMap<String, TestDataValue> shm;
TestDataValue data1 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data2 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data3 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data4 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data5 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data6 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data7 = DataValueClasses.newDirectReference(TestDataValue.class);
TestDataValue data8 = DataValueClasses.newDirectReference(TestDataValue.class);
ThreadPoolExecutor threads = (ThreadPoolExecutor)Executors.newFixedThreadPool(2);
final CountDownLatch endGate = new CountDownLatch(2);
@Before
public void setUp() throws Exception {
try {
shm = new SharedHashMapBuilder()
.generatedValueType(true)
.entries(2048)
.entrySize(256)
.file(new File("/run/shm/TestOpenHFT")).kClass(String.class).vClass(TestDataValue.class).create();
//For older versions
// shm = new SharedHashMapBuilder()
// .generatedValueType(true)
// //.entries(2048)
// .entrySize(1024)
// .create(new File("/run/shm/TestOpenHFT"),String.class,TestDataValue.class);
//Map entries are loaded into various segments in mappeddatastore
shm.acquireUsing("1111.2222.A0", data1);
shm.acquireUsing("1111.2222.B0", data2);
shm.acquireUsing("1111.2222.A1", data3);
shm.acquireUsing("1111.2222.B1", data4);
shm.acquireUsing("1111.2222.A2", data5);
shm.acquireUsing("1111.2222.B2", data6);
//data7 typically points to data in same segment as data1 points to i.e. segmentnum=0
//To see segments i added line
//LOG.info("key="+key+" segmentnum="+segmentNum);
//in method : V lookupUsing(K key, V value, boolean create) in class VanillaSharedHashMap
shm.acquireUsing("1111.2222.A3", data7);
shm.acquireUsing("1111.2222.B3", data8);
} catch(Exception e) {
endGate.countDown();
endGate.countDown();
e.printStackTrace();
}
}
@After
public void tearDown() {
try {
endGate.await();
shm.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void test() {
//Simple case just to prove all is OK
data1.setLongString("AAAAAAAAAAAAAAAAAAAA");
assertEquals("AAAAAAAAAAAAAAAAAAAA", data1.getLongString());
data7.setLongString("BBBBBBBBBBBBBBBBBBBB");
assertEquals("BBBBBBBBBBBBBBBBBBBB", data7.getLongString());
logger.info("Start threads to test concurrent read/write in same segment .. this should usually fail");
//..change data7 to another e.g. data2 and should work
threads.execute(new TestTask(data1,"AAAAAAAAAAAAAAAAAAAA"));
threads.execute(new TestTask(data7,"BBBBBBBBBBBBBBBBBBBB"));
}
class TestTask implements Runnable {
TestDataValue data;
String msg;
TestTask(TestDataValue data, String msg) {
this.data = data;
this.msg = msg;
}
public void run() {
for(int i=0;i<100;i++) {
data.setLongString(msg);
logger.info("test "+i+" "+data.getLongString());
try {
assertEquals(msg, data.getLongString());
} catch (AssertionError e) {
logger.error("AssertionError",e);
break;
}
}
endGate.countDown();
}
}
}
Hi Peter,
As we have hundreds of datastructures, we go down the serialization route. I need a way to efficiently plug in a custom serializer.
checking AbstractBytes
public void writeObject(@Nullable Object obj) {
if (obj == null) {
writeByte(NULL);
return;
}
Class<?> clazz = obj.getClass();
final BytesMarshallerFactory bytesMarshallerFactory = bytesMarshallerFactory();
BytesMarshaller em = bytesMarshallerFactory.acquireMarshaller(clazz, false);
if (em == NoMarshaller.INSTANCE && autoGenerateMarshaller(obj))
em = bytesMarshallerFactory.acquireMarshaller(clazz, true);
if (em != NoMarshaller.INSTANCE) {
if (em instanceof CompactBytesMarshaller) {
writeByte(((CompactBytesMarshaller) em).code());
em.write(this, obj);
return;
}
writeByte(ENUMED);
writeEnum(clazz);
em.write(this, obj);
return;
}
writeByte(SERIALIZED);
// TODO this is the lame implementation, but it works.
try {
ObjectOutputStream oos = new ObjectOutputStream(this.outputStream());
oos.writeObject(obj);
} catch (IOException e) {
throw new IllegalStateException(e);
}
checkEndOfBuffer();
}
Is there a way to basically shortcut this routine (e.g. also avoid
Class<?> clazz = obj.getClass();
final BytesMarshallerFactory bytesMarshallerFactory = bytesMarshallerFactory();
BytesMarshaller em = bytesMarshallerFactory.acquireMarshaller(clazz, false);
as this lookup can be like 10% percent in case of smallish objects. If we can agree on some 'pluggable' interface I can do the work and contribute. Or is there another way to customize serialization ?
regards,
Rüdiger
Hi everyone,
i am having an issue with my HugeHashMap and Database persist.
In fact, when i persist my objects from the HugeHashMap i don't get what i was expecting.
I have an Instance that contains an id, a word context as a String, some positions as integers,..
And instead of having the values i got this for each Instance in HugeHashMap:
id="table.Instance[ id=000171fe-15a2-46fd-97eb-957d42940f8a ]"
Auto="0"
Context=""
position1="0"
position2="0"
position3="0"
position4="0"
position5="0"
foreignId=""
Here is the code where i manage the HugeHashMap:
public void generateInstances(String path) throws IOException, ParseException, InvalidTokenOffsetsException{
HugeConfig config = HugeConfig.DEFAULT.clone();
HugeHashMap<String, Instance> instanceArray = new HugeHashMap<String, Instance>(config,String.class,Instance.class);
HugeHashMap<Integer,TermeinstancedocumentPK> tidArray = new HugeHashMap<Integer,TermeinstancedocumentPK>(config,Integer.class,TermeinstancedocumentPK.class);
ArrayList<Context> contexesArray = new ArrayList<>();
Integer idtid=1;
DocumentIndexer lucene = new DocumentIndexer(path);
Project p = this.getProject();
for(Notion n : p.getNotionCollection()){
for (Term t : n.getTermCollection()) {
for (Variable v : t.getVariableCollection()) {
contexesArray = lucene.getContextes(v.getName(),90);
for(Context c : contexesArray){
boolean instanceAlreadyExists=false;
String rightContext = c.getRightContext();
String[] contextRight = rightContext.split("\n");
StringJoiner joiner = new StringJoiner(" | ");
for(String s: contextRight){
joiner.add(s);
}
rightContext = joiner.toString();
String leftContext = c.getLeftContext();
int leftContextSizeBefore=leftContext.length();
String[] contextLeft = leftContext.split("\n");
StringJoiner joiner2 = new StringJoiner(" | ");
for(String s: contextLeft){
joiner2.add(s);
}
leftContext = joiner2.toString();
int leftContextSizeAfter=leftContext.length();
int relativeLeftContextSize = leftContextSizeAfter-leftContextSizeBefore;
String context = leftContext + c.getTerm() + rightContext;
Instance i = new Instance();
if(instanceArray.containsKey(context)){
instanceAlreadyExists=true;
i=instanceArray.get(context);
}
if(!instanceAlreadyExists){
String idinst = UUID.randomUUID().toString();
i.setId(idinst);
i.setContexte(context);
i.setPositionBeginTermeInstance(c.getStartTerm()+relativeLeftContextSize);
i.setPositionEndTermeInstance(c.getEndTerm()+relativeLeftContextSize);
i.setPositionBeginTermeTxtBrut(c.getStartTerm());
i.setPositionEndTermeTxtBrut(c.getEndTerm());
i.setContexteSize(c.getContext().length());
i.setProjectId(p);
if((p.getNbWordMinForAuto()!=-1 &&(this.getNbWord(v.getName())>p.getNbWordMinForAuto()))
| (p.getNbCharMinForAuto()!=-1 && (this.getNbChar(v.getName())>p.getNbCharMinForAuto()))){
i.setAuto(true);
}
TermeinstancedocumentPK tidPK = new TermeinstancedocumentPK(t.getId(),c.getUuid(), idinst,c.getIndexStart());
instanceArray.put(context,i);
tidArray.put(idtid,tidPK);
idtid++;
}
else{
if((p.getNbWordMinForAuto()!=-1 &&(this.getNbWord(v.getName())>p.getNbWordMinForAuto()))
| (p.getNbCharMinForAuto()!=-1 && (this.getNbChar(v.getName())>p.getNbCharMinForAuto()))){
instanceArray.get(context).setAuto(true);
}
TermeinstancedocumentPK tidPK = new TermeinstancedocumentPK(t.getId(),c.getUuid(), i.getId(),c.getIndexStart());
tidArray.put(idtid,tidPK);
idtid++;
}
}
contexesArray.clear();
}
}
}
lucene.close();
this.addInstances(instanceArray);
this.addTIDs(tidArray);
instanceArray.clear();
tidArray.clear();
}
//the method to persist is like that
public void addInstances(HugeHashMap<String,Instance> ints){
this.open();
em.getTransaction().begin();
for(Instance inst : ints.values()){
em.persist(inst);
}
em.getTransaction().commit();
this.close();
}
Do you have any idea to solve this problem?
Thanks
I attached a profiler to my application and I saw that call tree:
I invoked Map.get() 8379 times and also net.openhft.collections.HugeHashMap$Segment.get is invoked same amount but Segment.getKey() is invoked 9.903.392 times.
Why getKey() invocation count is more about 1000 times than Map.get() count?
My get code:
for (Long key : cache.keySet()) {
sr = cache.get(key);
if (sr != null && sr.isDirty() && sr.isInDb()) {
++updateCount;
sr.setClean();
try {
cache.put(key, sr);
} catch (Exception e) {
// discard
}
}
}
looking into using shared or huge hash map within our application and got couple of questions:
We have our binary encoded data and we use flyweight to access it. If we are using huge hash map assuming we only access the data via a single thread, what is the best way to access the binary data without copying it (basically we only need the starting address of the value then we can map the flyweight to it)
Similar question on using shared map on using flyweight to read the information. I assume since we will be using multiple thread reading it we will need to do copy in
For the shared map is there a true locking (all read and write will block each other?)
If used for a long time is there a memory fragmentation we need to worry about?
Is it ok to have multiple shared map backed by multiple memory map files in terms of OS stability?
Thanks very much for such a great work!
Hi,
I fetched/merged into my clone'd workspaces all updates from each of my upstream views of the various OpenHFT parent repo modules.
I then re-ran my Test at https://github.com/Cotton-Ben/HugeCollections/blob/master/collections/src/test/java/net/openhft/collections/fromdocs/com/jpmorgan/pingpong_latency/PingPongPlayerLeft.java
via
java org.junit.runner.JUnitCore net.openhft.collections.fromdocs.com.jpmorgan.pingpong_latency.PingPongPlayerLeft
Since this update, when the following line #18 in my Test is executed:
SharedHashMap<String, BondVOInterface> shmLeft = new SharedHashMapBuilder()
.generatedValueType(true)
.entrySize(320)
.create(
new File("/dev/shm/BondPortfolioSHM"),
String.class,
BondVOInterface.class
);
This test now fails with the following exception:
Time: 0.107
There was 1 failure:
1) bondExample(net.openhft.collections.fromdocs.com.jpmorgan.pingpong_latency.PingPongPlayerLeft)
java.lang.IllegalArgumentException: invalid size: 343048307875968
at net.openhft.lang.io.MappedStore.<init>(MappedStore.java:54)
at net.openhft.lang.io.MappedStore.<init>(MappedStore.java:49)
at net.openhft.collections.AbstractVanillaSharedHashMap.createMappedStoreAndSegments(VanillaSharedHashMap.java:148)
at net.openhft.collections.VanillaSharedHashMap.<init>(VanillaSharedHashMap.java:45)
at net.openhft.collections.SharedHashMapBuilder.create(SharedHashMapBuilder.java:264)
at net.openhft.collections.fromdocs.com.jpmorgan.pingpong_latency.PingPongPlayerLeft.bondExample(PingPongPlayerLeft.java:18)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runners.Suite.runChild(Suite.java:127)
at org.junit.runners.Suite.runChild(Suite.java:26)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at org.junit.runner.JUnitCore.run(JUnitCore.java:138)
at org.junit.runner.JUnitCore.run(JUnitCore.java:117)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:96)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:47)
at org.junit.runner.JUnitCore.main(JUnitCore.java:40)
FAILURES!!!
Tests run: 1, Failures: 1
Should I expect the way that line #18 above is coded in my Test to work as before without exception? Any recommendation for remedy?
Sorry I am abusing you guys with mvn questions but stackOverflow gave me no remedy. Here is what I try
cd /apps/OpenHFT/
mvn -pl HugeCollections \
-Dtest=net.openhft.collections.fromdocs.OpenJDKAndHashMapExampleTest#bondExample \
test
but after hacking at this, I can't get past the message /"[ERROR] failed to execute goal: maven-surefire-plugin .... (default-test) on project: No tests were executed!"/
any ideas? and again sorry to be a bother. I am doing lots of OpenHFT demos and this demo requires I demo the capability from a KornShell cmd line (not IntelliJ)
Thanks.
Hi,
I'm using HugeCollecitons for Product Catalogue purpose. I created a HugeHashMap using:
cache = new HugeHashMap<>(HugeConfig.SMALL.clone(), kClass, vClass);
With this configuration if I put small objects (objects smaller than bucket size), it works fine.
But if I put larger objects (objects larger than bucket size), I face problems at keySet and entrySet functions. Those objects are missing at set results, but I can access object with get method.
CLarifying my question:
How do we account for /proc/$PID/status differences between
[email protected] --->
VmPeak: 35,151,672 kB
VmSize: 35,151,096 kB
vs.
[email protected]@/ext4 -->
VmPeak: 13,761,320 kB
VmSize: 2,432,980 kB
In the SHM.200M test, Does the OpenHFT internals' mmap(2) from On-Heap to Off-Heap to /ext4 somehow also take the SHM data structure off-PID?
I would have suspected that both PIDs (but not both JVM heaps, of course) would have had very similar VmPeak: /proc/$PID/status reported results.
We are experiencing issues when using SharedHashMap (collections-3.2.1) on Windows OS. Under certain circumstances the whole JVM crashes after inserting 10M items into the map. Following code can be used to reproduce the issue:
@Test
public void crashJVMWindowsTest() throws IOException {
final SharedHashMap<CharSequence, CharSequence> map = new SharedHashMapBuilder().entries(15_000_000)
.minSegments(128).file(getPersistenceFile()).kClass(CharSequence.class).vClass(CharSequence.class).create();
for (int i = 0; i < 10_000_000; ++i) {
String s = String.valueOf(i);
map.put(s, s);
}
map.close();
}
It seems there is an issue when a map segment is being locked:
Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j sun.misc.Unsafe.compareAndSwapLong(Ljava/lang/Object;JJJ)Z+0
j net.openhft.lang.io.NativeBytes.compareAndSwapLong(JJJ)Z+13
j net.openhft.lang.io.AbstractBytes.tryLockNanos8a(JJ)Z+12
j net.openhft.lang.io.AbstractBytes.tryLockNanosLong(JJ)Z+41
j net.openhft.collections.AbstractVanillaSharedHashMap$Segment.lock()V+12
j net.openhft.collections.AbstractVanillaSharedHashMap$Segment.put(Lnet/openhft/lang/io/Bytes;Ljava/lang/Object;Ljava/lang/Object;IZ)Ljava/lang/Object;+1
j net.openhft.collections.AbstractVanillaSharedHashMap.put0(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object;+60
j net.openhft.collections.AbstractVanillaSharedHashMap.put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+4
j test.Test.crashTest()V+52
j test.Test.main([Ljava/lang/String;)V+0
v ~StubRoutines::call_stub
Environment:
Windows 8.1 64-bit
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
We were not able to reproduce this issue on Unix-based OS.
Thanks for your help.
After "git clone https://github.com/OpenHFT/OpenHFT" into an empty repo and the checkout (checkout.bat), followed by replacing the Java-Chronicle project with the one from lburgazzoli branch, I got an error in the HugeCollection project when running "mvn install".
-------------------------------------------------------------------------------
Test set: net.openhft.collections.TCPSocketReplication4WayMapTest
-------------------------------------------------------------------------------
Tests run: 3, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 352.679 sec <<< FAILURE! - in net.openhft.collections.TCPSocketReplication4WayMapTest
testBufferOverflow(net.openhft.collections.TCPSocketReplication4WayMapTest) Time elapsed: 348.71 sec <<< FAILURE!
java.lang.AssertionError: map4 expected:<{790=EXAMPLE-1, 527=EXAMPLE-1, 535=EXAMPLE-1, 614=EXAMPLE-1, 390=EXAMPLE-1, 564=EXAMPLE-1, 450=EXAMPLE-1, 684=EXAMPLE-1, 21=EXAMPLE-1, 34=EXAMPLE-1, 53=EXAMPLE-1, 633=EXAMPLE-1, 692=EXAMPLE-1, 835=EXAMPLE-1, 879=EXAMPLE-1, 254=EXAMPLE-1, 103=EXAMPLE-1, 1010=EXAMPLE-1, 585=EXAMPLE-1, 785=EXAMPLE-1, 811=EXAMPLE-1, 911=EXAMPLE-1, 257=EXAMPLE-1, 95=EXAMPLE-1, 134=EXAMPLE-1, 181=EXAMPLE-1, 400=EXAMPLE-1, 507=EXAMPLE-1, 238=EXAMPLE-1, 686=EXAMPLE-1, 762=EXAMPLE-1, 492=EXAMPLE-1, 519=EXAMPLE-1, 459=EXAMPLE-1, 341=EXAMPLE-1, 841=EXAMPLE-1, 76=EXAMPLE-1, 174=EXAMPLE-1, 664=EXAMPLE-1, 974=EXAMPLE-1, 558=EXAMPLE-1, 380=EXAMPLE-1, 435=EXAMPLE-1, 125=EXAMPLE-1, 793=EXAMPLE-1, 114=EXAMPLE-1, 608=EXAMPLE-1, 465=EXAMPLE-1, 117=EXAMPLE-1, 903=EXAMPLE-1, 940=EXAMPLE-1, 288=EXAMPLE-1, 737=EXAMPLE-1, 742=EXAMPLE-1, 120=EXAMPLE-1, 140=EXAMPLE-1, 109=EXAMPLE-1, 869=EXAMPLE-1, 312=EXAMPLE-1, 776=EXAMPLE-1, 920=EXAMPLE-1, 636=EXAMPLE-1, 389=EXAMPLE-1, 538=EXAMPLE-1, 598=EXAMPLE-1, 894=EXAMPLE-1, 765=EXAMPLE-1, 667=EXAMPLE-1, 32=EXAMPLE-1, 756=EXAMPLE-1, 845=EXAMPLE-1, 223=EXAMPLE-1, 698=EXAMPLE-1, 961=EXAMPLE-1, 267=EXAMPLE-1, 736=EXAMPLE-1, 168=EXAMPLE-1, 383=EXAMPLE-1, 628=EXAMPLE-1, 240=EXAMPLE-1, 148=EXAMPLE-1, 914=EXAMPLE-1, 643=EXAMPLE-1, 992=EXAMPLE-1, 934=EXAMPLE-1, 917=EXAMPLE-1, 550=EXAMPLE-1, 78=EXAMPLE-1, 57=EXAMPLE-1, 860=EXAMPLE-1, 469=EXAMPLE-1, 346=EXAMPLE-1, 99=EXAMPLE-1, 375=EXAMPLE-1, 551=EXAMPLE-1, 751=EXAMPLE-1, 352=EXAMPLE-1, 418=EXAMPLE-1, 501=EXAMPLE-1, 226=EXAMPLE-1, 524=EXAMPLE-1, 799=EXAMPLE-1, 484=EXAMPLE-1, 4=EXAMPLE-1, 431=EXAMPLE-1, 386=EXAMPLE-1, 630=EXAMPLE-1, 233=EXAMPLE-1, 218=EXAMPLE-1, 530=EXAMPLE-1, 204=EXAMPLE-1, 702=EXAMPLE-1, 308=EXAMPLE-1, 49=EXAMPLE-1, 968=EXAMPLE-1, 954=EXAMPLE-1, 282=EXAMPLE-1, 154=EXAMPLE-1, 677=EXAMPLE-1, 592=EXAMPLE-1, 703=EXAMPLE-1, 602=EXAMPLE-1, 87=EXAMPLE-1, 937=EXAMPLE-1, 882=EXAMPLE-1, 326=EXAMPLE-1, 995=EXAMPLE-1, 332=EXAMPLE-1, 274=EXAMPLE-1, 65=EXAMPLE-1, 804=EXAMPLE-1, 593=EXAMPLE-1, 983=EXAMPLE-1, 948=EXAMPLE-1, 929=EXAMPLE-1, 878=EXAMPLE-1, 444=EXAMPLE-1, 434=EXAMPLE-1, 584=EXAMPLE-1, 750=EXAMPLE-1, 229=EXAMPLE-1, 433=EXAMPLE-1, 355=EXAMPLE-1, 576=EXAMPLE-1, 1021=EXAMPLE-1, 1022=EXAMPLE-1, 722=EXAMPLE-1, 605=EXAMPLE-1, 928=EXAMPLE-1, 533=EXAMPLE-1, 885=EXAMPLE-1, 335=EXAMPLE-1, 986=EXAMPLE-1, 591=EXAMPLE-1, 191=EXAMPLE-1, 428=EXAMPLE-1, 180=EXAMPLE-1, 957=EXAMPLE-1, 905=EXAMPLE-1, 518=EXAMPLE-1, 441=EXAMPLE-1, 157=EXAMPLE-1, 11=EXAMPLE-1, 83=EXAMPLE-1, 9=EXAMPLE-1, 828=EXAMPLE-1, 172=EXAMPLE-1, 64=EXAMPLE-1, 893=EXAMPLE-1, 366=EXAMPLE-1, 1000=EXAMPLE-1, 829=EXAMPLE-1, 273=EXAMPLE-1, 194=EXAMPLE-1, 725=EXAMPLE-1, 908=EXAMPLE-1, 745=EXAMPLE-1, 642=EXAMPLE-1, 888=EXAMPLE-1, 12=EXAMPLE-1, 567=EXAMPLE-1, 22=EXAMPLE-1, 838=EXAMPLE-1, 784=EXAMPLE-1, 137=EXAMPLE-1, 266=EXAMPLE-1, 361=EXAMPLE-1, 41=EXAMPLE-1, 652=EXAMPLE-1, 108=EXAMPLE-1, 570=EXAMPLE-1, 689=EXAMPLE-1, 116=EXAMPLE-1, 321=EXAMPLE-1, 369=EXAMPLE-1, 844=EXAMPLE-1, 547=EXAMPLE-1, 216=EXAMPLE-1, 923=EXAMPLE-1, 820=EXAMPLE-1, 468=EXAMPLE-1, 217=EXAMPLE-1, 902=EXAMPLE-1, 20=EXAMPLE-1, 128=EXAMPLE-1, 728=EXAMPLE-1, 1004=EXAMPLE-1, 276=EXAMPLE-1, 1019=EXAMPLE-1, 374=EXAMPLE-1, 123=EXAMPLE-1, 209=EXAMPLE-1, 143=EXAMPLE-1, 851=EXAMPLE-1, 994=EXAMPLE-1, 1020=EXAMPLE-1, 639=EXAMPLE-1, 943=EXAMPLE-1, 980=EXAMPLE-1, 801=EXAMPLE-1, 232=EXAMPLE-1, 655=EXAMPLE-1, 779=EXAMPLE-1, 475=EXAMPLE-1, 301=EXAMPLE-1, 66=EXAMPLE-1, 242=EXAMPLE-1, 627=EXAMPLE-1, 936=EXAMPLE-1, 160=EXAMPLE-1, 33=EXAMPLE-1, 483=EXAMPLE-1, 340=EXAMPLE-1, 279=EXAMPLE-1, 731=EXAMPLE-1, 676=EXAMPLE-1, 759=EXAMPLE-1, 513=EXAMPLE-1, 45=EXAMPLE-1, 425=EXAMPLE-1, 952=EXAMPLE-1, 299=EXAMPLE-1, 504=EXAMPLE-1, 711=EXAMPLE-1, 683=EXAMPLE-1, 294=EXAMPLE-1, 854=EXAMPLE-1, 582=EXAMPLE-1, 960=EXAMPLE-1, 810=EXAMPLE-1, 410=EXAMPLE-1, 526=EXAMPLE-1, 619=EXAMPLE-1, 349=EXAMPLE-1, 16=EXAMPLE-1, 318=EXAMPLE-1, 440=EXAMPLE-1, 478=EXAMPLE-1, 207=EXAMPLE-1, 659=EXAMPLE-1, 245=EXAMPLE-1, 1018=EXAMPLE-1, 79=EXAMPLE-1, 826=EXAMPLE-1, 783=EXAMPLE-1, 68=EXAMPLE-1, 7=EXAMPLE-1, 873=EXAMPLE-1, 525=EXAMPLE-1, 990=EXAMPLE-1, 75=EXAMPLE-1, 556=EXAMPLE-1, 8=EXAMPLE-1, 517=EXAMPLE-1, 482=EXAMPLE-1, 693=EXAMPLE-1, 413=EXAMPLE-1, 208=EXAMPLE-1, 791=EXAMPLE-1, 90=EXAMPLE-1, 734=EXAMPLE-1, 463=EXAMPLE-1, 239=EXAMPLE-1, 163=EXAMPLE-1, 286=EXAMPLE-1, 29=EXAMPLE-1, 641=EXAMPLE-1, 112=EXAMPLE-1, 857=EXAMPLE-1, 46=EXAMPLE-1, 625=EXAMPLE-1, 56=EXAMPLE-1, 891=EXAMPLE-1, 809=EXAMPLE-1, 393=EXAMPLE-1, 408=EXAMPLE-1, 265=EXAMPLE-1, 935=EXAMPLE-1, 264=EXAMPLE-1, 330=EXAMPLE-1, 358=EXAMPLE-1, 447=EXAMPLE-1, 310=EXAMPLE-1, 966=EXAMPLE-1, 876=EXAMPLE-1, 640=EXAMPLE-1, 559=EXAMPLE-1, 214=EXAMPLE-1, 741=EXAMPLE-1, 842=EXAMPLE-1, 717=EXAMPLE-1, 696=EXAMPLE-1, 788=EXAMPLE-1, 166=EXAMPLE-1, 466=EXAMPLE-1, 416=EXAMPLE-1, 107=EXAMPLE-1, 249=EXAMPLE-1, 381=EXAMPLE-1, 892=EXAMPLE-1, 365=EXAMPLE-1, 612=EXAMPLE-1, 993=EXAMPLE-1, 132=EXAMPLE-1, 272=EXAMPLE-1, 115=EXAMPLE-1, 472=EXAMPLE-1, 915=EXAMPLE-1, 481=EXAMPLE-1, 457=EXAMPLE-1, 197=EXAMPLE-1, 215=EXAMPLE-1, 719=EXAMPLE-1, 344=EXAMPLE-1, 690=EXAMPLE-1, 373=EXAMPLE-1, 419=EXAMPLE-1, 615=EXAMPLE-1, 797=EXAMPLE-1, 662=EXAMPLE-1, 230=EXAMPLE-1, 511=EXAMPLE-1, 775=EXAMPLE-1, 2=EXAMPLE-1, 768=EXAMPLE-1, 646=EXAMPLE-1, 674=EXAMPLE-1, 423=EXAMPLE-1, 542=EXAMPLE-1, 700=EXAMPLE-1, 307=EXAMPLE-1, 280=EXAMPLE-1, 573=EXAMPLE-1, 497=EXAMPLE-1, 818=EXAMPLE-1, 135=EXAMPLE-1, 315=EXAMPLE-1, 590=EXAMPLE-1, 324=EXAMPLE-1, 754=EXAMPLE-1, 927=EXAMPLE-1, 522=EXAMPLE-1, 298=EXAMPLE-1, 71=EXAMPLE-1, 1017=EXAMPLE-1, 626=EXAMPLE-1, 202=EXAMPLE-1, 823=EXAMPLE-1, 618=EXAMPLE-1, 331=EXAMPLE-1, 399=EXAMPLE-1, 665=EXAMPLE-1, 901=EXAMPLE-1, 843=EXAMPLE-1, 682=EXAMPLE-1, 231=EXAMPLE-1, 631=EXAMPLE-1, 977=EXAMPLE-1, 146=EXAMPLE-1, 101=EXAMPLE-1, 236=EXAMPLE-1, 649=EXAMPLE-1, 946=EXAMPLE-1, 92=EXAMPLE-1, 932=EXAMPLE-1, 720=EXAMPLE-1, 378=EXAMPLE-1, 675=EXAMPLE-1, 327=EXAMPLE-1, 955=EXAMPLE-1, 740=EXAMPLE-1, 141=EXAMPLE-1, 227=EXAMPLE-1, 155=EXAMPLE-1, 757=EXAMPLE-1, 516=EXAMPLE-1, 58=EXAMPLE-1, 760=EXAMPLE-1, 490=EXAMPLE-1, 44=EXAMPLE-1, 668=EXAMPLE-1, 80=EXAMPLE-1, 432=EXAMPLE-1, 63=EXAMPLE-1, 104=EXAMPLE-1, 263=EXAMPLE-1, 14=EXAMPLE-1, 777=EXAMPLE-1, 297=EXAMPLE-1, 505=EXAMPLE-1, 106=EXAMPLE-1, 634=EXAMPLE-1, 866=EXAMPLE-1, 900=EXAMPLE-1, 149=EXAMPLE-1, 763=EXAMPLE-1, 248=EXAMPLE-1, 912=EXAMPLE-1, 258=EXAMPLE-1, 398=EXAMPLE-1, 121=EXAMPLE-1, 867=EXAMPLE-1, 407=EXAMPLE-1, 617=EXAMPLE-1, 213=EXAMPLE-1, 716=EXAMPLE-1, 650=EXAMPLE-1, 921=EXAMPLE-1, 687=EXAMPLE-1, 91=EXAMPLE-1, 579=EXAMPLE-1, 536=EXAMPLE-1, 637=EXAMPLE-1, 350=EXAMPLE-1, 175=EXAMPLE-1, 292=EXAMPLE-1, 188=EXAMPLE-1, 221=EXAMPLE-1, 372=EXAMPLE-1, 508=EXAMPLE-1, 794=EXAMPLE-1, 609=EXAMPLE-1, 1001=EXAMPLE-1, 743=EXAMPLE-1, 456=EXAMPLE-1, 599=EXAMPLE-1, 289=EXAMPLE-1, 766=EXAMPLE-1, 353=EXAMPLE-1, 624=EXAMPLE-1, 600=EXAMPLE-1, 15=EXAMPLE-1, 833=EXAMPLE-1, 473=EXAMPLE-1, 539=EXAMPLE-1, 673=EXAMPLE-1, 969=EXAMPLE-1, 422=EXAMPLE-1, 699=EXAMPLE-1, 367=EXAMPLE-1, 709=EXAMPLE-1, 322=EXAMPLE-1, 37=EXAMPLE-1, 333=EXAMPLE-1, 989=EXAMPLE-1, 224=EXAMPLE-1, 25=EXAMPLE-1, 169=EXAMPLE-1, 271=EXAMPLE-1, 364=EXAMPLE-1, 817=EXAMPLE-1, 941=EXAMPLE-1, 918=EXAMPLE-1, 384=EXAMPLE-1, 306=EXAMPLE-1, 906=EXAMPLE-1, 220=EXAMPLE-1, 926=EXAMPLE-1, 1003=EXAMPLE-1, 30=EXAMPLE-1, 88=EXAMPLE-1, 984=EXAMPLE-1, 580=EXAMPLE-1, 883=EXAMPLE-1, 356=EXAMPLE-1, 681=EXAMPLE-1, 949=EXAMPLE-1, 832=EXAMPLE-1, 975=EXAMPLE-1, 1002=EXAMPLE-1, 565=EXAMPLE-1, 836=EXAMPLE-1, 502=EXAMPLE-1, 309=EXAMPLE-1, 782=EXAMPLE-1, 67=EXAMPLE-1, 387=EXAMPLE-1, 205=EXAMPLE-1, 545=EXAMPLE-1, 126=EXAMPLE-1, 774=EXAMPLE-1, 283=EXAMPLE-1, 658=EXAMPLE-1, 170=EXAMPLE-1, 189=EXAMPLE-1, 583=EXAMPLE-1, 531=EXAMPLE-1, 255=EXAMPLE-1, 603=EXAMPLE-1, 70=EXAMPLE-1, 161=EXAMPLE-1, 479=EXAMPLE-1, 816=EXAMPLE-1, 773=EXAMPLE-1, 442=EXAMPLE-1, 865=EXAMPLE-1, 111=EXAMPLE-1, 262=EXAMPLE-1, 277=EXAMPLE-1, 97=EXAMPLE-1, 568=EXAMPLE-1, 964=EXAMPLE-1, 874=EXAMPLE-1, 247=EXAMPLE-1, 540=EXAMPLE-1, 192=EXAMPLE-1, 534=EXAMPLE-1, 153=EXAMPLE-1, 173=EXAMPLE-1, 723=EXAMPLE-1, 363=EXAMPLE-1, 707=EXAMPLE-1, 712=EXAMPLE-1, 781=EXAMPLE-1, 886=EXAMPLE-1, 732=EXAMPLE-1, 548=EXAMPLE-1, 606=EXAMPLE-1, 362=EXAMPLE-1, 302=EXAMPLE-1, 858=EXAMPLE-1, 51=EXAMPLE-1, 164=EXAMPLE-1, 445=EXAMPLE-1, 981=EXAMPLE-1, 498=EXAMPLE-1, 158=EXAMPLE-1, 571=EXAMPLE-1, 470=EXAMPLE-1, 959=EXAMPLE-1, 708=EXAMPLE-1, 74=EXAMPLE-1, 462=EXAMPLE-1, 370=EXAMPLE-1, 93=EXAMPLE-1, 930=EXAMPLE-1, 411=EXAMPLE-1, 786=EXAMPLE-1, 1006=EXAMPLE-1, 296=EXAMPLE-1, 950=EXAMPLE-1, 27=EXAMPLE-1, 48=EXAMPLE-1, 342=EXAMPLE-1, 563=EXAMPLE-1, 339=EXAMPLE-1, 371=EXAMPLE-1, 195=EXAMPLE-1, 129=EXAMPLE-1, 59=EXAMPLE-1, 726=EXAMPLE-1, 958=EXAMPLE-1, 715=EXAMPLE-1, 808=EXAMPLE-1, 313=EXAMPLE-1, 138=EXAMPLE-1, 889=EXAMPLE-1, 455=EXAMPLE-1, 880=EXAMPLE-1, 13=EXAMPLE-1, 924=EXAMPLE-1, 124=EXAMPLE-1, 421=EXAMPLE-1, 821=EXAMPLE-1, 496=EXAMPLE-1, 973=EXAMPLE-1, 574=EXAMPLE-1, 187=EXAMPLE-1, 448=EXAMPLE-1, 938=EXAMPLE-1, 623=EXAMPLE-1, 653=EXAMPLE-1, 150=EXAMPLE-1, 305=EXAMPLE-1, 1014=EXAMPLE-1, 520=EXAMPLE-1, 953=EXAMPLE-1, 647=EXAMPLE-1, 729=EXAMPLE-1, 746=EXAMPLE-1, 376=EXAMPLE-1, 597=EXAMPLE-1, 0=EXAMPLE-1, 489=EXAMPLE-1, 212=EXAMPLE-1, 391=EXAMPLE-1, 414=EXAMPLE-1, 752=EXAMPLE-1, 852=EXAMPLE-1, 672=EXAMPLE-1, 406=EXAMPLE-1, 680=EXAMPLE-1, 831=EXAMPLE-1, 319=EXAMPLE-1, 1015=EXAMPLE-1, 38=EXAMPLE-1, 577=EXAMPLE-1, 998=EXAMPLE-1, 347=EXAMPLE-1, 780=EXAMPLE-1, 290=EXAMPLE-1, 925=EXAMPLE-1, 476=EXAMPLE-1, 270=EXAMPLE-1, 336=EXAMPLE-1, 397=EXAMPLE-1, 514=EXAMPLE-1, 43=EXAMPLE-1, 657=EXAMPLE-1, 243=EXAMPLE-1, 749=EXAMPLE-1, 824=EXAMPLE-1, 130=EXAMPLE-1, 426=EXAMPLE-1, 72=EXAMPLE-1, 5=EXAMPLE-1, 909=EXAMPLE-1, 987=EXAMPLE-1, 855=EXAMPLE-1, 26=EXAMPLE-1, 802=EXAMPLE-1, 515=EXAMPLE-1, 554=EXAMPLE-1, 978=EXAMPLE-1, 495=EXAMPLE-1, 1005=EXAMPLE-1, 304=EXAMPLE-1, 691=EXAMPLE-1, 110=EXAMPLE-1, 721=EXAMPLE-1, 461=EXAMPLE-1, 102=EXAMPLE-1, 864=EXAMPLE-1, 910=EXAMPLE-1, 420=EXAMPLE-1, 359=EXAMPLE-1, 256=EXAMPLE-1, 133=EXAMPLE-1, 849=EXAMPLE-1, 17=EXAMPLE-1, 211=EXAMPLE-1, 706=EXAMPLE-1, 85=EXAMPLE-1, 714=EXAMPLE-1, 827=EXAMPLE-1, 761=EXAMPLE-1, 557=EXAMPLE-1, 246=EXAMPLE-1, 596=EXAMPLE-1, 287=EXAMPLE-1, 405=EXAMPLE-1, 261=EXAMPLE-1, 18=EXAMPLE-1, 792=EXAMPLE-1, 588=EXAMPLE-1, 807=EXAMPLE-1, 464=EXAMPLE-1, 613=EXAMPLE-1, 913=EXAMPLE-1, 136=EXAMPLE-1, 144=EXAMPLE-1, 830=EXAMPLE-1, 311=EXAMPLE-1, 868=EXAMPLE-1, 47=EXAMPLE-1, 764=EXAMPLE-1, 500=EXAMPLE-1, 113=EXAMPLE-1, 772=EXAMPLE-1, 967=EXAMPLE-1, 621=EXAMPLE-1, 735=EXAMPLE-1, 877=EXAMPLE-1, 237=EXAMPLE-1, 537=EXAMPLE-1, 671=EXAMPLE-1, 454=EXAMPLE-1, 543=EXAMPLE-1, 991=EXAMPLE-1, 815=EXAMPLE-1, 632=EXAMPLE-1, 1013=EXAMPLE-1, 338=EXAMPLE-1, 295=EXAMPLE-1, 701=EXAMPLE-1, 916=EXAMPLE-1, 972=EXAMPLE-1, 382=EXAMPLE-1, 316=EXAMPLE-1, 81=EXAMPLE-1, 467=EXAMPLE-1, 439=EXAMPLE-1, 396=EXAMPLE-1, 178=EXAMPLE-1, 616=EXAMPLE-1, 562=EXAMPLE-1, 748=EXAMPLE-1, 438=EXAMPLE-1, 933=EXAMPLE-1, 167=EXAMPLE-1, 488=EXAMPLE-1, 345=EXAMPLE-1, 798=EXAMPLE-1, 663=EXAMPLE-1, 840=EXAMPLE-1, 769=EXAMPLE-1, 186=EXAMPLE-1, 147=EXAMPLE-1, 222=EXAMPLE-1, 89=EXAMPLE-1, 694=EXAMPLE-1, 198=EXAMPLE-1, 898=EXAMPLE-1, 203=EXAMPLE-1, 947=EXAMPLE-1, 281=EXAMPLE-1, 39=EXAMPLE-1, 755=EXAMPLE-1, 252=EXAMPLE-1, 656=EXAMPLE-1, 666=EXAMPLE-1, 28=EXAMPLE-1, 899=EXAMPLE-1, 325=EXAMPLE-1, 253=EXAMPLE-1, 871=EXAMPLE-1, 770=EXAMPLE-1, 55=EXAMPLE-1, 152=EXAMPLE-1, 388=EXAMPLE-1, 360=EXAMPLE-1, 697=EXAMPLE-1, 394=EXAMPLE-1, 506=EXAMPLE-1, 60=EXAMPLE-1, 523=EXAMPLE-1, 379=EXAMPLE-1, 417=EXAMPLE-1, 944=EXAMPLE-1, 3=EXAMPLE-1, 430=EXAMPLE-1, 622=EXAMPLE-1, 971=EXAMPLE-1, 1011=EXAMPLE-1, 278=EXAMPLE-1, 190=EXAMPLE-1, 171=EXAMPLE-1, 96=EXAMPLE-1, 705=EXAMPLE-1, 710=EXAMPLE-1, 884=EXAMPLE-1, 284=EXAMPLE-1, 409=EXAMPLE-1, 806=EXAMPLE-1, 713=EXAMPLE-1, 293=EXAMPLE-1, 834=EXAMPLE-1, 73=EXAMPLE-1, 487=EXAMPLE-1, 730=EXAMPLE-1, 963=EXAMPLE-1, 956=EXAMPLE-1, 122=EXAMPLE-1, 142=EXAMPLE-1, 862=EXAMPLE-1, 758=EXAMPLE-1, 595=EXAMPLE-1, 424=EXAMPLE-1, 354=EXAMPLE-1, 228=EXAMPLE-1, 491=EXAMPLE-1, 329=EXAMPLE-1, 529=EXAMPLE-1, 813=EXAMPLE-1, 452=EXAMPLE-1, 685=EXAMPLE-1, 404=EXAMPLE-1, 453=EXAMPLE-1, 847=EXAMPLE-1, 23=EXAMPLE-1, 669=EXAMPLE-1, 300=EXAMPLE-1, 509=EXAMPLE-1, 443=EXAMPLE-1, 259=EXAMPLE-1, 193=EXAMPLE-1, 819=EXAMPLE-1, 897=EXAMPLE-1, 887=EXAMPLE-1, 587=EXAMPLE-1, 98=EXAMPLE-1, 269=EXAMPLE-1, 601=EXAMPLE-1, 670=EXAMPLE-1, 437=EXAMPLE-1, 688=EXAMPLE-1, 156=EXAMPLE-1, 303=EXAMPLE-1, 334=EXAMPLE-1, 427=EXAMPLE-1, 24=EXAMPLE-1, 320=EXAMPLE-1, 814=EXAMPLE-1, 651=EXAMPLE-1, 942=EXAMPLE-1, 907=EXAMPLE-1, 486=EXAMPLE-1, 795=EXAMPLE-1, 206=EXAMPLE-1, 185=EXAMPLE-1, 494=EXAMPLE-1, 403=EXAMPLE-1, 177=EXAMPLE-1, 985=EXAMPLE-1, 94=EXAMPLE-1, 896=EXAMPLE-1, 850=EXAMPLE-1, 1009=EXAMPLE-1, 10=EXAMPLE-1, 739=EXAMPLE-1, 744=EXAMPLE-1, 604=EXAMPLE-1, 151=EXAMPLE-1, 922=EXAMPLE-1, 201=EXAMPLE-1, 566=EXAMPLE-1, 368=EXAMPLE-1, 645=EXAMPLE-1, 654=EXAMPLE-1, 337=EXAMPLE-1, 771=EXAMPLE-1, 474=EXAMPLE-1, 52=EXAMPLE-1, 54=EXAMPLE-1, 503=EXAMPLE-1, 800=EXAMPLE-1, 323=EXAMPLE-1, 837=EXAMPLE-1, 581=EXAMPLE-1, 35=EXAMPLE-1, 241=EXAMPLE-1, 635=EXAMPLE-1, 512=EXAMPLE-1, 77=EXAMPLE-1, 546=EXAMPLE-1, 275=EXAMPLE-1, 458=EXAMPLE-1, 789=EXAMPLE-1, 31=EXAMPLE-1, 62=EXAMPLE-1, 607=EXAMPLE-1, 127=EXAMPLE-1, 1012=EXAMPLE-1, 561=EXAMPLE-1, 747=EXAMPLE-1, 848=EXAMPLE-1, 119=EXAMPLE-1, 919=EXAMPLE-1, 870=EXAMPLE-1, 251=EXAMPLE-1, 50=EXAMPLE-1, 881=EXAMPLE-1, 40=EXAMPLE-1, 385=EXAMPLE-1, 553=EXAMPLE-1, 260=EXAMPLE-1, 460=EXAMPLE-1, 853=EXAMPLE-1, 803=EXAMPLE-1, 863=EXAMPLE-1, 225=EXAMPLE-1, 235=EXAMPLE-1, 351=EXAMPLE-1, 532=EXAMPLE-1, 638=EXAMPLE-1, 997=EXAMPLE-1, 778=EXAMPLE-1, 999=EXAMPLE-1, 69=EXAMPLE-1, 661=EXAMPLE-1, 61=EXAMPLE-1, 856=EXAMPLE-1, 610=EXAMPLE-1, 210=EXAMPLE-1, 629=EXAMPLE-1, 343=EXAMPLE-1, 555=EXAMPLE-1, 839=EXAMPLE-1, 412=EXAMPLE-1, 939=EXAMPLE-1, 162=EXAMPLE-1, 890=EXAMPLE-1, 679=EXAMPLE-1, 979=EXAMPLE-1, 328=EXAMPLE-1, 578=EXAMPLE-1, 962=EXAMPLE-1, 846=EXAMPLE-1, 182=EXAMPLE-1, 234=EXAMPLE-1, 429=EXAMPLE-1, 451=EXAMPLE-1, 285=EXAMPLE-1, 904=EXAMPLE-1, 805=EXAMPLE-1, 586=EXAMPLE-1, 695=EXAMPLE-1, 753=EXAMPLE-1, 105=EXAMPLE-1, 859=EXAMPLE-1, 724=EXAMPLE-1, 184=EXAMPLE-1, 415=EXAMPLE-1, 718=EXAMPLE-1, 1007=EXAMPLE-1, 159=EXAMPLE-1, 145=EXAMPLE-1, 589=EXAMPLE-1, 493=EXAMPLE-1, 436=EXAMPLE-1, 165=EXAMPLE-1, 733=EXAMPLE-1, 528=EXAMPLE-1, 965=EXAMPLE-1, 1023=EXAMPLE-1, 822=EXAMPLE-1, 982=EXAMPLE-1, 644=EXAMPLE-1, 19=EXAMPLE-1, 446=EXAMPLE-1, 86=EXAMPLE-1, 594=EXAMPLE-1, 176=EXAMPLE-1, 620=EXAMPLE-1, 485=EXAMPLE-1, 471=EXAMPLE-1, 931=EXAMPLE-1, 544=EXAMPLE-1, 660=EXAMPLE-1, 1008=EXAMPLE-1, 970=EXAMPLE-1, 183=EXAMPLE-1, 36=EXAMPLE-1, 767=EXAMPLE-1, 895=EXAMPLE-1, 521=EXAMPLE-1, 872=EXAMPLE-1, 727=EXAMPLE-1, 250=EXAMPLE-1, 1=EXAMPLE-1, 510=EXAMPLE-1, 200=EXAMPLE-1, 291=EXAMPLE-1, 139=EXAMPLE-1, 392=EXAMPLE-1, 449=EXAMPLE-1, 42=EXAMPLE-1, 796=EXAMPLE-1, 179=EXAMPLE-1, 357=EXAMPLE-1, 314=EXAMPLE-1, 825=EXAMPLE-1, 572=EXAMPLE-1, 268=EXAMPLE-1, 787=EXAMPLE-1, 196=EXAMPLE-1, 118=EXAMPLE-1, 996=EXAMPLE-1, 951=EXAMPLE-1, 945=EXAMPLE-1, 738=EXAMPLE-1, 480=EXAMPLE-1, 611=EXAMPLE-1, 317=EXAMPLE-1, 395=EXAMPLE-1, 541=EXAMPLE-1, 861=EXAMPLE-1, 988=EXAMPLE-1, 976=EXAMPLE-1, 552=EXAMPLE-1, 812=EXAMPLE-1, 219=EXAMPLE-1, 100=EXAMPLE-1, 348=EXAMPLE-1, 575=EXAMPLE-1, 499=EXAMPLE-1, 875=EXAMPLE-1, 131=EXAMPLE-1, 244=EXAMPLE-1, 82=EXAMPLE-1, 377=EXAMPLE-1, 84=EXAMPLE-1, 569=EXAMPLE-1, 477=EXAMPLE-1, 402=EXAMPLE-1, 648=EXAMPLE-1, 6=EXAMPLE-1, 560=EXAMPLE-1, 549=EXAMPLE-1, 704=EXAMPLE-1, 1016=EXAMPLE-1, 199=EXAMPLE-1, 401=EXAMPLE-1, 678=EXAMPLE-1}>
but was:<{790=EXAMPLE-1, 835=EXAMPLE-1, 879=EXAMPLE-1, 1010=EXAMPLE-1, 785=EXAMPLE-1, 811=EXAMPLE-1, 911=EXAMPLE-1, 762=EXAMPLE-1, 841=EXAMPLE-1, 974=EXAMPLE-1, 793=EXAMPLE-1, 903=EXAMPLE-1, 940=EXAMPLE-1, 737=EXAMPLE-1, 742=EXAMPLE-1, 869=EXAMPLE-1, 776=EXAMPLE-1, 920=EXAMPLE-1, 894=EXAMPLE-1, 765=EXAMPLE-1, 756=EXAMPLE-1, 845=EXAMPLE-1, 961=EXAMPLE-1, 736=EXAMPLE-1, 914=EXAMPLE-1, 992=EXAMPLE-1, 934=EXAMPLE-1, 917=EXAMPLE-1, 860=EXAMPLE-1, 751=EXAMPLE-1, 799=EXAMPLE-1, 968=EXAMPLE-1, 954=EXAMPLE-1, 937=EXAMPLE-1, 882=EXAMPLE-1, 995=EXAMPLE-1, 804=EXAMPLE-1, 983=EXAMPLE-1, 948=EXAMPLE-1, 929=EXAMPLE-1, 878=EXAMPLE-1, 750=EXAMPLE-1, 1021=EXAMPLE-1, 1022=EXAMPLE-1, 722=EXAMPLE-1, 928=EXAMPLE-1, 885=EXAMPLE-1, 986=EXAMPLE-1, 957=EXAMPLE-1, 905=EXAMPLE-1, 828=EXAMPLE-1, 893=EXAMPLE-1, 1000=EXAMPLE-1, 829=EXAMPLE-1, 725=EXAMPLE-1, 908=EXAMPLE-1, 745=EXAMPLE-1, 888=EXAMPLE-1, 838=EXAMPLE-1, 784=EXAMPLE-1, 844=EXAMPLE-1, 923=EXAMPLE-1, 820=EXAMPLE-1, 902=EXAMPLE-1, 728=EXAMPLE-1, 1004=EXAMPLE-1, 1019=EXAMPLE-1, 851=EXAMPLE-1, 994=EXAMPLE-1, 1020=EXAMPLE-1, 943=EXAMPLE-1, 980=EXAMPLE-1, 801=EXAMPLE-1, 779=EXAMPLE-1, 936=EXAMPLE-1, 731=EXAMPLE-1, 759=EXAMPLE-1, 952=EXAMPLE-1, 854=EXAMPLE-1, 960=EXAMPLE-1, 810=EXAMPLE-1, 1018=EXAMPLE-1, 826=EXAMPLE-1, 783=EXAMPLE-1, 873=EXAMPLE-1, 990=EXAMPLE-1, 791=EXAMPLE-1, 734=EXAMPLE-1, 857=EXAMPLE-1, 891=EXAMPLE-1, 809=EXAMPLE-1, 935=EXAMPLE-1, 966=EXAMPLE-1, 876=EXAMPLE-1, 741=EXAMPLE-1, 842=EXAMPLE-1, 717=EXAMPLE-1, 788=EXAMPLE-1, 892=EXAMPLE-1, 993=EXAMPLE-1, 915=EXAMPLE-1, 719=EXAMPLE-1, 797=EXAMPLE-1, 775=EXAMPLE-1, 768=EXAMPLE-1, 818=EXAMPLE-1, 754=EXAMPLE-1, 927=EXAMPLE-1, 1017=EXAMPLE-1, 823=EXAMPLE-1, 901=EXAMPLE-1, 843=EXAMPLE-1, 977=EXAMPLE-1, 946=EXAMPLE-1, 932=EXAMPLE-1, 720=EXAMPLE-1, 955=EXAMPLE-1, 740=EXAMPLE-1, 757=EXAMPLE-1, 760=EXAMPLE-1, 777=EXAMPLE-1, 866=EXAMPLE-1, 900=EXAMPLE-1, 763=EXAMPLE-1, 912=EXAMPLE-1, 867=EXAMPLE-1, 716=EXAMPLE-1, 921=EXAMPLE-1, 794=EXAMPLE-1, 1001=EXAMPLE-1, 743=EXAMPLE-1, 766=EXAMPLE-1, 833=EXAMPLE-1, 969=EXAMPLE-1, 989=EXAMPLE-1, 817=EXAMPLE-1, 941=EXAMPLE-1, 918=EXAMPLE-1, 906=EXAMPLE-1, 926=EXAMPLE-1, 1003=EXAMPLE-1, 984=EXAMPLE-1, 883=EXAMPLE-1, 949=EXAMPLE-1, 832=EXAMPLE-1, 975=EXAMPLE-1, 1002=EXAMPLE-1, 836=EXAMPLE-1, 782=EXAMPLE-1, 774=EXAMPLE-1, 816=EXAMPLE-1, 773=EXAMPLE-1, 865=EXAMPLE-1, 964=EXAMPLE-1, 874=EXAMPLE-1, 723=EXAMPLE-1, 781=EXAMPLE-1, 886=EXAMPLE-1, 732=EXAMPLE-1, 858=EXAMPLE-1, 981=EXAMPLE-1, 959=EXAMPLE-1, 930=EXAMPLE-1, 786=EXAMPLE-1, 1006=EXAMPLE-1, 950=EXAMPLE-1, 726=EXAMPLE-1, 958=EXAMPLE-1, 715=EXAMPLE-1, 808=EXAMPLE-1, 889=EXAMPLE-1, 880=EXAMPLE-1, 924=EXAMPLE-1, 821=EXAMPLE-1, 973=EXAMPLE-1, 938=EXAMPLE-1, 1014=EXAMPLE-1, 953=EXAMPLE-1, 729=EXAMPLE-1, 746=EXAMPLE-1, 752=EXAMPLE-1, 852=EXAMPLE-1, 831=EXAMPLE-1, 1015=EXAMPLE-1, 998=EXAMPLE-1, 780=EXAMPLE-1, 925=EXAMPLE-1, 749=EXAMPLE-1, 824=EXAMPLE-1, 909=EXAMPLE-1, 987=EXAMPLE-1, 855=EXAMPLE-1, 802=EXAMPLE-1, 978=EXAMPLE-1, 495=EXAMPLE-1, 1005=EXAMPLE-1, 304=EXAMPLE-1, 110=EXAMPLE-1, 721=EXAMPLE-1, 461=EXAMPLE-1, 102=EXAMPLE-1, 864=EXAMPLE-1, 910=EXAMPLE-1, 420=EXAMPLE-1, 359=EXAMPLE-1, 256=EXAMPLE-1, 133=EXAMPLE-1, 849=EXAMPLE-1, 17=EXAMPLE-1, 211=EXAMPLE-1, 85=EXAMPLE-1, 714=EXAMPLE-1, 827=EXAMPLE-1, 761=EXAMPLE-1, 246=EXAMPLE-1, 287=EXAMPLE-1, 405=EXAMPLE-1, 261=EXAMPLE-1, 18=EXAMPLE-1, 792=EXAMPLE-1, 807=EXAMPLE-1, 464=EXAMPLE-1, 913=EXAMPLE-1, 136=EXAMPLE-1, 144=EXAMPLE-1, 830=EXAMPLE-1, 311=EXAMPLE-1, 868=EXAMPLE-1, 47=EXAMPLE-1, 764=EXAMPLE-1, 500=EXAMPLE-1, 113=EXAMPLE-1, 772=EXAMPLE-1, 967=EXAMPLE-1, 735=EXAMPLE-1, 877=EXAMPLE-1, 237=EXAMPLE-1, 454=EXAMPLE-1, 991=EXAMPLE-1, 815=EXAMPLE-1, 1013=EXAMPLE-1, 338=EXAMPLE-1, 295=EXAMPLE-1, 916=EXAMPLE-1, 972=EXAMPLE-1, 382=EXAMPLE-1, 316=EXAMPLE-1, 81=EXAMPLE-1, 467=EXAMPLE-1, 439=EXAMPLE-1, 396=EXAMPLE-1, 178=EXAMPLE-1, 748=EXAMPLE-1, 438=EXAMPLE-1, 933=EXAMPLE-1, 167=EXAMPLE-1, 488=EXAMPLE-1, 345=EXAMPLE-1, 798=EXAMPLE-1, 840=EXAMPLE-1, 769=EXAMPLE-1, 186=EXAMPLE-1, 147=EXAMPLE-1, 222=EXAMPLE-1, 89=EXAMPLE-1, 198=EXAMPLE-1, 898=EXAMPLE-1, 203=EXAMPLE-1, 947=EXAMPLE-1, 281=EXAMPLE-1, 39=EXAMPLE-1, 755=EXAMPLE-1, 252=EXAMPLE-1, 28=EXAMPLE-1, 899=EXAMPLE-1, 325=EXAMPLE-1, 253=EXAMPLE-1, 871=EXAMPLE-1, 770=EXAMPLE-1, 55=EXAMPLE-1, 152=EXAMPLE-1, 388=EXAMPLE-1, 360=EXAMPLE-1, 394=EXAMPLE-1, 506=EXAMPLE-1, 60=EXAMPLE-1, 523=EXAMPLE-1, 379=EXAMPLE-1, 417=EXAMPLE-1, 944=EXAMPLE-1, 3=EXAMPLE-1, 430=EXAMPLE-1, 971=EXAMPLE-1, 1011=EXAMPLE-1, 278=EXAMPLE-1, 190=EXAMPLE-1, 171=EXAMPLE-1, 96=EXAMPLE-1, 705=EXAMPLE-1, 710=EXAMPLE-1, 884=EXAMPLE-1, 284=EXAMPLE-1, 409=EXAMPLE-1, 806=EXAMPLE-1, 713=EXAMPLE-1, 293=EXAMPLE-1, 834=EXAMPLE-1, 73=EXAMPLE-1, 487=EXAMPLE-1, 730=EXAMPLE-1, 963=EXAMPLE-1, 956=EXAMPLE-1, 122=EXAMPLE-1, 142=EXAMPLE-1, 862=EXAMPLE-1, 758=EXAMPLE-1, 595=EXAMPLE-1, 424=EXAMPLE-1, 354=EXAMPLE-1, 228=EXAMPLE-1, 491=EXAMPLE-1, 329=EXAMPLE-1, 529=EXAMPLE-1, 813=EXAMPLE-1, 452=EXAMPLE-1, 685=EXAMPLE-1, 404=EXAMPLE-1, 453=EXAMPLE-1, 847=EXAMPLE-1, 23=EXAMPLE-1, 669=EXAMPLE-1, 300=EXAMPLE-1, 509=EXAMPLE-1, 443=EXAMPLE-1, 259=EXAMPLE-1, 193=EXAMPLE-1, 819=EXAMPLE-1, 897=EXAMPLE-1, 887=EXAMPLE-1, 587=EXAMPLE-1, 98=EXAMPLE-1, 269=EXAMPLE-1, 601=EXAMPLE-1, 670=EXAMPLE-1, 437=EXAMPLE-1, 688=EXAMPLE-1, 156=EXAMPLE-1, 303=EXAMPLE-1, 334=EXAMPLE-1, 427=EXAMPLE-1, 24=EXAMPLE-1, 320=EXAMPLE-1, 814=EXAMPLE-1, 651=EXAMPLE-1, 942=EXAMPLE-1, 907=EXAMPLE-1, 486=EXAMPLE-1, 795=EXAMPLE-1, 206=EXAMPLE-1, 185=EXAMPLE-1, 494=EXAMPLE-1, 403=EXAMPLE-1, 177=EXAMPLE-1, 985=EXAMPLE-1, 94=EXAMPLE-1, 896=EXAMPLE-1, 850=EXAMPLE-1, 1009=EXAMPLE-1, 10=EXAMPLE-1, 739=EXAMPLE-1, 744=EXAMPLE-1, 604=EXAMPLE-1, 151=EXAMPLE-1, 922=EXAMPLE-1, 201=EXAMPLE-1, 566=EXAMPLE-1, 368=EXAMPLE-1, 645=EXAMPLE-1, 654=EXAMPLE-1, 337=EXAMPLE-1, 771=EXAMPLE-1, 474=EXAMPLE-1, 52=EXAMPLE-1, 54=EXAMPLE-1, 503=EXAMPLE-1, 800=EXAMPLE-1, 323=EXAMPLE-1, 837=EXAMPLE-1, 581=EXAMPLE-1, 35=EXAMPLE-1, 241=EXAMPLE-1, 635=EXAMPLE-1, 512=EXAMPLE-1, 77=EXAMPLE-1, 546=EXAMPLE-1, 275=EXAMPLE-1, 458=EXAMPLE-1, 789=EXAMPLE-1, 31=EXAMPLE-1, 62=EXAMPLE-1, 607=EXAMPLE-1, 127=EXAMPLE-1, 1012=EXAMPLE-1, 561=EXAMPLE-1, 747=EXAMPLE-1, 848=EXAMPLE-1, 119=EXAMPLE-1, 919=EXAMPLE-1, 870=EXAMPLE-1, 251=EXAMPLE-1, 50=EXAMPLE-1, 881=EXAMPLE-1, 40=EXAMPLE-1, 385=EXAMPLE-1, 553=EXAMPLE-1, 260=EXAMPLE-1, 460=EXAMPLE-1, 853=EXAMPLE-1, 803=EXAMPLE-1, 863=EXAMPLE-1, 225=EXAMPLE-1, 235=EXAMPLE-1, 351=EXAMPLE-1, 532=EXAMPLE-1, 638=EXAMPLE-1, 997=EXAMPLE-1, 778=EXAMPLE-1, 999=EXAMPLE-1, 69=EXAMPLE-1, 661=EXAMPLE-1, 61=EXAMPLE-1, 856=EXAMPLE-1, 610=EXAMPLE-1, 210=EXAMPLE-1, 629=EXAMPLE-1, 343=EXAMPLE-1, 555=EXAMPLE-1, 839=EXAMPLE-1, 412=EXAMPLE-1, 939=EXAMPLE-1, 162=EXAMPLE-1, 890=EXAMPLE-1, 679=EXAMPLE-1, 979=EXAMPLE-1, 328=EXAMPLE-1, 578=EXAMPLE-1, 962=EXAMPLE-1, 846=EXAMPLE-1, 182=EXAMPLE-1, 234=EXAMPLE-1, 429=EXAMPLE-1, 451=EXAMPLE-1, 285=EXAMPLE-1, 904=EXAMPLE-1, 805=EXAMPLE-1, 586=EXAMPLE-1, 695=EXAMPLE-1, 753=EXAMPLE-1, 105=EXAMPLE-1, 859=EXAMPLE-1, 724=EXAMPLE-1, 184=EXAMPLE-1, 415=EXAMPLE-1, 718=EXAMPLE-1, 1007=EXAMPLE-1, 159=EXAMPLE-1, 145=EXAMPLE-1, 589=EXAMPLE-1, 493=EXAMPLE-1, 436=EXAMPLE-1, 165=EXAMPLE-1, 733=EXAMPLE-1, 528=EXAMPLE-1, 965=EXAMPLE-1, 1023=EXAMPLE-1, 822=EXAMPLE-1, 982=EXAMPLE-1, 644=EXAMPLE-1, 19=EXAMPLE-1, 446=EXAMPLE-1, 86=EXAMPLE-1, 594=EXAMPLE-1, 176=EXAMPLE-1, 620=EXAMPLE-1, 485=EXAMPLE-1, 471=EXAMPLE-1, 931=EXAMPLE-1, 544=EXAMPLE-1, 660=EXAMPLE-1, 1008=EXAMPLE-1, 970=EXAMPLE-1, 183=EXAMPLE-1, 36=EXAMPLE-1, 767=EXAMPLE-1, 895=EXAMPLE-1, 521=EXAMPLE-1, 872=EXAMPLE-1, 727=EXAMPLE-1, 250=EXAMPLE-1, 1=EXAMPLE-1, 510=EXAMPLE-1, 200=EXAMPLE-1, 291=EXAMPLE-1, 139=EXAMPLE-1, 392=EXAMPLE-1, 449=EXAMPLE-1, 42=EXAMPLE-1, 796=EXAMPLE-1, 179=EXAMPLE-1, 357=EXAMPLE-1, 314=EXAMPLE-1, 825=EXAMPLE-1, 572=EXAMPLE-1, 268=EXAMPLE-1, 787=EXAMPLE-1, 196=EXAMPLE-1, 118=EXAMPLE-1, 996=EXAMPLE-1, 951=EXAMPLE-1, 945=EXAMPLE-1, 738=EXAMPLE-1, 480=EXAMPLE-1, 611=EXAMPLE-1, 317=EXAMPLE-1, 395=EXAMPLE-1, 541=EXAMPLE-1, 861=EXAMPLE-1, 988=EXAMPLE-1, 976=EXAMPLE-1, 552=EXAMPLE-1, 812=EXAMPLE-1, 219=EXAMPLE-1, 100=EXAMPLE-1, 348=EXAMPLE-1, 575=EXAMPLE-1, 499=EXAMPLE-1, 875=EXAMPLE-1, 131=EXAMPLE-1, 244=EXAMPLE-1, 82=EXAMPLE-1, 377=EXAMPLE-1, 84=EXAMPLE-1, 569=EXAMPLE-1, 477=EXAMPLE-1, 402=EXAMPLE-1, 648=EXAMPLE-1, 6=EXAMPLE-1, 560=EXAMPLE-1, 549=EXAMPLE-1, 704=EXAMPLE-1, 1016=EXAMPLE-1, 199=EXAMPLE-1, 401=EXAMPLE-1, 678=EXAMPLE-1}>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:743)
at org.junit.Assert.assertEquals(Assert.java:118)
at net.openhft.collections.TCPSocketReplication4WayMapTest.testBufferOverflow(TCPSocketReplication4WayMapTest.java:135)
I had a look and it seems internally complete temporary copies are built up. Unfortunately my map has 5 million entries.
Is there any way to iterate values or keys of a SharedHashMap in a way next entry is computed only whenever "next" is called on the iterator ?. NP with non-standard API as the JDK collection's idea of requiring a keyset/valueset to offer an iterator is not exactly a good design performance wise.
I would try to add this myself, however I am missing kind of a 20 line overview how the basic mechanics work (segments, entries, entrysize, free mem managements, compaction).
2cnd: I am currently using SharedHasmap from a single thread (so I don't need concurrency control). Is there a way to use HugeMap backed by a memory mapped file ? I am looking for a mmaped Huge Hashmap, don't need sharing 4 now ..
I have a test that involves 2 Java VM PIDs ping-pong'g the put()/get() of a primitive double by K into a /dev/shm/SharedHashMap.
PID 1 represents a ping pong player positoned on the LEFT side of the table.
PID 2 represents a ping pong player positoned on the RIGHT side of the table.
PID 1 only does a shm.put(K, 4.0);
PID 2 only does a shm.put(K,5.0);
After either PID does its .put() it then spins-busy waiting for the player on the other side to "ping-pong" back their put.
PID 1 -- the player on the left -- must always have its JVM started first for the test to work.
I am getting consistently < 10us latency for this ping-pong latency test.
My 2 questions are these -- on line 38 of each .java at
(1) why do I have to do a re-assignment
_bondEntryV = shmLeft.acquireUsing("369604103", bondOffHeap);
instead of just re-using the earlier computed off-Heap reference to '_bondEntryV' in the spin-busy waiting loop?
(2) I see that OpenHFT now has a SharedMapEventListeners API ... is this ready? Are there any existing tests I could inspect to affect my learning how to use this API? This API should provide my relief from having to do these spin-busy waiting loops, correct?
isolating this concern into its own separate issue.
3.0e RELEASE should ideally support
DataValueClasses.newDirectReferece(InterfaceWithNestedInterface.class);
invokes.
the 3.0e-SNAPSHOT fixes the GBP to $$ delimiter issue for long and integer on Mac OSX, and Fedora Linux. However, the 3,0e-SNAPSHOT still does not empower the single test at
https://github.com/Cotton-Ben/infinispan/tree/master/off-heap
to pass for the case = BondVOInterface.class (nested interface on top of inner MarketPx interface).
Here is the current @test result (NOTE: MarketPx$$native not being shown -- inner interface still delimited with GBP symbol):
[TestNG] Running:
C:\Users\ben\.IdeaIC13\system\temp-testng-customsuite.xml
ISPN7 JCACHE DataContainer view of OpenHFT SHM is being created
OpenHFT SHMBuilder starting: /dev/shmSHM/bondVO.@t=1395489757714 entries=[NULL]
OpenHFT SHMBuilder done: /dev/shmSHM/bondVO.@t=1395489757714 entries=[{}]
ISPN7 JCACHE DataContainer created jcacheDataContainer=[org.infinispan.offheap.container.OffHeapDefaultDataContainer@2789eebb]
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:12: error: class MarketPx£native is public, should be declared in a file named MarketPx£native.java
public class MarketPx£native implements MarketPx, BytesMarshallable, Byteable, Copyable<org.infinispan.offheap.BondVOInterface$MarketPx> {
^
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:12: error: cannot find symbol
public class MarketPx£native implements MarketPx, BytesMarshallable, Byteable, Copyable<org.infinispan.offheap.BondVOInterface$MarketPx> {
^
symbol: class MarketPx
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:12: error: cannot find symbol
public class MarketPx£native implements MarketPx, BytesMarshallable, Byteable, Copyable<org.infinispan.offheap.BondVOInterface$MarketPx> {
^
symbol: class BondVOInterface$MarketPx
location: package org.infinispan.offheap
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:63: error: cannot find symbol
public void copyFrom(org.infinispan.offheap.BondVOInterface$MarketPx from) {
^
symbol: class BondVOInterface$MarketPx
location: package org.infinispan.offheap
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:113: error: cannot find symbol
if (!(o instanceof MarketPx)) return false;
^
symbol: class MarketPx
location: class MarketPx£native
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:114: error: cannot find symbol
MarketPx that = (MarketPx) o;
^
symbol: class MarketPx
location: class MarketPx£native
/org/infinispan/offheap/BondVOInterface$MarketPx£native.java:114: error: cannot find symbol
MarketPx that = (MarketPx) o;
^
symbol: class MarketPx
location: class MarketPx£native
java.lang.AssertionError: java.lang.ClassNotFoundException: org.infinispan.offheap.BondVOInterface$MarketPx£native
at net.openhft.lang.model.DataValueGenerator.acquireNativeClass(DataValueGenerator.java:315)
at net.openhft.lang.model.DataValueGenerator.acquireNativeClass(DataValueGenerator.java:302)
at net.openhft.lang.model.DataValueClassCache.directClassFor(DataValueClassCache.java:48)
at net.openhft.lang.model.DataValueClassCache.newDirectReference(DataValueClassCache.java:37)
at net.openhft.lang.model.DataValueClasses.newDirectReference(DataValueClasses.java:36)
at org.infinispan.offheap.test.OffHeapDefaultDataContainerTest.testOpenHFTasOffHeapJcacheOperandProvider(OffHeapDefaultDataContainerTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
at org.testng.TestRunner.privateRun(TestRunner.java:767)
at org.testng.TestRunner.run(TestRunner.java:617)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
at org.testng.SuiteRunner.run(SuiteRunner.java:240)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1123)
at org.testng.TestNG.run(TestNG.java:1031)
at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.ClassNotFoundException: org.infinispan.offheap.BondVOInterface$MarketPx£native
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at net.openhft.compiler.CachedCompiler.loadFromJava(CachedCompiler.java:108)
at net.openhft.lang.model.DataValueGenerator.acquireNativeClass(DataValueGenerator.java:313)
... 35 more
7 errors
Process finished with exit code 0
Peter, first of all thanks for such an amazing work on the high performance development.
I have just started going through your OpenHFT Collections API.
Just wanted to know the difference between couple of methods in net.openhft.collections.HugeConfig
Thank You.
Note : referring to ChronicleMap / ChronicleMapBuilder but I'm actually using SharedHashMap and SharedHashMapBuilder.
So my actual Issue is that setting actualEntriesPerSegment to a value less than 8 (i.e. 1 to 7) results in IllegalArgumentException .. Segment is full...
Is this an intentional restriction?
Seems to occur as a consequence of :
long sizeOfBitSets() {
return align64(entriesPerSegment / 8);
}
I ask because I would like to be able to set actualEntriesPerSegment to 1. My reason for that is because, given the recent change which fixed a previous problem, concurrent reads/writes to different map entries that happen to be in the same segment are effectively queued/blocked behind eachother reducing throughput. So I think a solution would be to have each entry in its own segment.
I appreciate that were I populating the map with millions of entries then a dedicated segment and associated Bytes object would probably not be practical. But in the use case i am exploring I will have 1000's or tens of 1000's of entries and the nature of the accessing and mutating of individual entries tends to be in bursts clustering around 'similar' key values whose hashing value seems to result in a high likelyhood they will have been located in same segment. I understand that I could further randomize keys to reduce this likelyhood...but i would rather not have to and continue using what are the natural keys..and also it will just reduce the likelyhood and not erradicate it.
Hello,
I wrote a unit test which reads a dictionary file (https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt) first into net.openhft.collections.HugeHashMap and then java.util.HashMap, adding each word as the key and value, like so:
map.put(term, term);
After this the test dumps the result into a file.
The dump file of the hash map, looks like e.g:
:: Protorosaurus=Protorosaurus
:: vocular=vocular
:: Kunmiut=Kunmiut
:: repaying=repaying
:: aminolysis=aminolysis
:: impavid=impavid
:: preimpair=preimpair
:: bradyphasia=bradyphasia
:: indignation=indignation
:: subshrubby=subshrubby
...
But the result of the hugeHashMap looks like:
:: elaidinic=divulgater
:: circumlocution=elaidinic
:: batitinan=circumlocution
:: chevalier=batitinan
:: conjunctivitis=chevalier
:: Ettarre=conjunctivitis
:: elative=Ettarre
:: elliptically=elative
:: cubicly=elliptically
:: dermatomyoma=cubicly
...
Any ideas why this is so? Why does the dump generated by HugeHashMap not display in most cases a key equaling the value?
I do not expect the line order to be the same, but the content to have in most cases the key equal to the value.
The code for this test can be found here: https://gist.github.com/gilfernandes/145046a9f0b349c078b4
I am using Windows 7, Java 7 and the pom.xml of my test project contains this dependency:
<dependency>
<groupId>net.openhft</groupId>
<artifactId>collections</artifactId>
<version>3.0.2</version>
</dependency>
Best regards,
Gil
It is my understandng that there will a OpenHFT HC Alpha Release in Maven Central next weekend. At that time, Dmitry and I will take the OpenHFT dependency tag and proceed to build a branch of Red Hat's ISPN 7 that will treat net.openhft.collections.SharedHashMap<K,V> as a Red Hat Infinispan 7 default impl of javax.cache.Cache<K,V>
A diagram of this build effort can be found here: https://raw.github.com/Cotton-Ben/OpenHFT/master/doc/AdaptingOpenHFT-SHM-as-JCACHE-Impl.jpg
Also the Red Hat view of his effort will be tracked here: https://issues.jboss.org/browse/ISPN-871
Peter, thanks again for such an amazing work on the high performance development. Since there is no google group on HugeCollection, want to ask you a few questions on HugeCollection via github issue:
Super thanks in advanced
Hi
There appears to be a bug in the master branch which means that updating an existing entry in HugeHashMap does not work, i.e.
HugeConfig config = HugeConfig.DEFAULT.clone();
HugeHashMap<Long, Long> map1 =
new HugeHashMap<Long, Long>(config, Long.class, Long.class);
long key = 55;
map1.put(key, 10L);
System.out.println(key + " => " + map1.get(key));
map1.put(key, 20L);
System.out.println(key + " => " + map1.get(key));
outputs
55 => 10
55 => 10
cheers
Kilian
Do you think it might be a little clearer if the
V acquireUsing(Object key, V value);
signature was changed to
V getOrCreate(Object key, V value); //makes it more obvious non-NULL will be returned.
or possibly
V getNonNull(Object key, V value); //makes it totally obvious non-NULL will be returned.
?
Keeping the current signature is fine, of course, I'm just saying for ( simple minded ) me the last one makes it easier to remember which signature can't return NULL. ;-)
what is the currently supported scope of SHMEntry filed barrier operations (across both Threads and PIDs)?
E.g. If I supply a JBI entry of
<T> MyField;
and signatures
<T> getMyField();
void setMyField(<T> myField);
boolean compareAndSwapMyField(<T> expected, <T> value);
<T> getVolatileMyField()
void setOrderedMyField(<T> myField);
should we expect that the run-time OpenHFT generated SHMEntry impl class will provide the capability such that the first 2 methods above are non-barrier crossing impls and that last 3 methods are guaranteed to be barrier crossing impls?
is all of this supported currently?
Looks like Maven central does not have the pom for net.openhft:HugeCollections:2.0
> Could not resolve net.openhft:collections:2.0.
Required by:
com.github.lburgazzoli:hazelcast-offheap:1.0.0.SNAPSHOT
> Could not parse POM http://repo1.maven.org/maven2/net/openhft/collections/2.0/collections-2.0.pom
> Could not find any version that matches net.openhft:HugeCollections:2.0.
> Could not parse POM http://repo2.maven.org/maven2/net/openhft/collections/2.0/collections-2.0.pom
> Could not find any version that matches net.openhft:HugeCollections:2.0.
> Could not parse POM https://oss.sonatype.org/content/repositories/releases/net/openhft/collections/2.0/collections-2.0.pom
> Could not find any version that matches net.openhft:HugeCollections:
If you manage to define kind of in/out interfaces for replication messages, I could plug in a multicast based replication, which is favourable over TCP in many setups. (Talking of SharedHashmap)
Modifying the existing testcase in HugeHashMapTest giving different values of count makes it fail.
Sample code given below:
@Test
public void testPut() throws ExecutionException, InterruptedException {
int count = 50;
HugeConfig config = HugeConfig.DEFAULT.clone()
.setSegments(128)
.setSmallEntrySize(72) // TODO 64 corrupts the values !!
.setCapacity(count);
final HugeHashMap<CharSequence, SampleValues> map =
new HugeHashMap<CharSequence, SampleValues>(
config, CharSequence.class, SampleValues.class);
long start = System.nanoTime();
final SampleValues value = new SampleValues();
StringBuilder user = new StringBuilder();
for (int i = 0; i < count; i++) {
value.ee = i;
value.gg = i;
value.ii = i;
map.put(users(user, i), value);
}
for (int i = 0; i < count; i++) {
assertNotNull(map.get(users(user, i), value));
assertEquals(i, value.ee);
assertEquals(i, value.gg, 0.0);
assertEquals(i, value.ii);
}
long time = System.nanoTime() - start;
System.out.printf("Put/get %,d K operations per second%n",
(int) (count * 4 * 1e6 / time));
}
The assertion is
java.lang.AssertionError: expected:<30> but was:<22>
With the count of 100, the assertion is
java.lang.AssertionError: expected:<40> but was:<32>
With count of 2000, the assertion is
java.lang.AssertionError: expected:<1247> but was:<1239>
Seems to work for other counts like 5000, 10000 etc.
Hello,
I was just playing around with the examples and I got surprised by this error message on this code:
package com.onepointltd.file.operations;
...
@Test
public void testHugeMap() {
HugeConfig config = HugeConfig.DEFAULT.clone()
.setSegments(128)
.setSmallEntrySize(128)
.setCapacity(10000);
}
I get these error messages:
setSegments(int) is not public in HugeConfig; cannot be accessed from outside package
setSmallEntrySize(int) is not public in HugeConfig; cannot be accessed from outside package
setCapacity(int) is not public in HugeConfig; cannot be accessed from outside package
My current maven dependency is:
<dependency>
<groupId>net.openhft</groupId>
<artifactId>collections-sandbox</artifactId>
<version>3.0.3-SNAPSHOT</version>
<type>jar</type>
</dependency>
If this is really a stupid question, please bare with me. I am just a beginner using OpenHFT.
Best regards,
Gil
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.