diff --git a/com.minres.scviewer.database.test/.settings/org.eclipse.core.resources.prefs b/com.minres.scviewer.database.test/.settings/org.eclipse.core.resources.prefs index e84a201..1f08727 100644 --- a/com.minres.scviewer.database.test/.settings/org.eclipse.core.resources.prefs +++ b/com.minres.scviewer.database.test/.settings/org.eclipse.core.resources.prefs @@ -1,3 +1,4 @@ eclipse.preferences.version=1 +encoding//src/com/minres/scviewer/database/test/DatabaseServicesPerformanceTest.java=UTF-8 encoding//src/com/minres/scviewer/database/test/DatabaseServicesTest.java=UTF-8 encoding/=UTF-8 diff --git a/com.minres.scviewer.database.test/DatabaseServicesTest.launch b/com.minres.scviewer.database.test/DatabaseServicesTest.launch index 289c012..b1f43a6 100644 --- a/com.minres.scviewer.database.test/DatabaseServicesTest.launch +++ b/com.minres.scviewer.database.test/DatabaseServicesTest.launch @@ -16,18 +16,18 @@ - + - + - + - + diff --git a/com.minres.scviewer.database.test/OSGI-INF/component.xml b/com.minres.scviewer.database.test/OSGI-INF/component.xml index 7ebc679..dd3e71a 100644 --- a/com.minres.scviewer.database.test/OSGI-INF/component.xml +++ b/com.minres.scviewer.database.test/OSGI-INF/component.xml @@ -1,5 +1,5 @@ - + diff --git a/com.minres.scviewer.database.test/inputs/.gitignore b/com.minres.scviewer.database.test/inputs/.gitignore index e89429b..53362f4 100644 --- a/com.minres.scviewer.database.test/inputs/.gitignore +++ b/com.minres.scviewer.database.test/inputs/.gitignore @@ -1,2 +1,3 @@ /.scviewer.* -/.my_db.txlog* \ No newline at end of file +/.my_db.txlog* +/.simple_system.txlog_bdb.* diff --git a/com.minres.scviewer.database.test/inputs/simple_system.txlog b/com.minres.scviewer.database.test/inputs/simple_system.txlog new file mode 100644 index 0000000..d9dc432 Binary files /dev/null and b/com.minres.scviewer.database.test/inputs/simple_system.txlog differ diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseFactory.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseFactory.java new file mode 100644 index 0000000..e7592ae --- /dev/null +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseFactory.java @@ -0,0 +1,24 @@ +package com.minres.scviewer.database.test; + +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformDbFactory; + +public class DatabaseFactory { + private static IWaveformDbFactory waveformDbFactory; + + public synchronized void setFactory(IWaveformDbFactory service) { + waveformDbFactory = service; + } + + public synchronized void unsetFactory(IWaveformDbFactory service) { + if (waveformDbFactory == service) { + waveformDbFactory = null; + } + } + + public IWaveformDb getDatabase() { + return waveformDbFactory.getDatabase(); + } + + +} diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesPerformanceTest.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesPerformanceTest.java new file mode 100644 index 0000000..bdcea42 --- /dev/null +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesPerformanceTest.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2015 MINRES Technologies GmbH and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * MINRES Technologies GmbH - initial API and implementation + *******************************************************************************/ +package com.minres.scviewer.database.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.File; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.minres.scviewer.database.IWaveformDb; +import com.minres.scviewer.database.IWaveformDbFactory; + +public class DatabaseServicesPerformanceTest { + + private DatabaseFactory databaseFactory; + + private IWaveformDb waveformDb; + + @Before + public void setUp() throws Exception { + databaseFactory = new DatabaseFactory(); + waveformDb=databaseFactory.getDatabase(); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testVCD() throws Exception { + File f = new File("inputs/my_db.vcd").getAbsoluteFile(); + assertTrue(f.exists()); + waveformDb.load(f); + assertNotNull(waveformDb); + assertEquals(14, waveformDb.getAllWaves().size()); + assertEquals(2, waveformDb.getChildNodes().size()); + } + + @Test + public void testTxText() throws Exception { + File f = new File("inputs/simple_system.txlog").getAbsoluteFile(); + assertTrue(f.exists()); + long timeBefore = System.currentTimeMillis(); + waveformDb.load(f); + long timeAfter = System.currentTimeMillis(); + long elapsed = timeAfter - timeBefore; + assertNotNull(waveformDb); + System.out.println("elapsed:" + elapsed); + } + + +} diff --git a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java index 30b2219..118b6b1 100644 --- a/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java +++ b/com.minres.scviewer.database.test/src/com/minres/scviewer/database/test/DatabaseServicesTest.java @@ -26,23 +26,13 @@ import com.minres.scviewer.database.IWaveformDbFactory; public class DatabaseServicesTest { - private static IWaveformDbFactory waveformDbFactory; + private DatabaseFactory databaseFactory; private IWaveformDb waveformDb; - public synchronized void setFactory(IWaveformDbFactory service) { - waveformDbFactory = service; - } - - public synchronized void unsetFactory(IWaveformDbFactory service) { - if (waveformDbFactory == service) { - waveformDbFactory = null; - } - } - @Before public void setUp() throws Exception { - waveformDb=waveformDbFactory.getDatabase(); + waveformDb=new DatabaseFactory().getDatabase(); // Wait for OSGi dependencies // for (int i = 0; i < 10; i++) { // if (waveformDb.size() == 3) // Dependencies fulfilled diff --git a/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs b/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs index a7f72ec..54bc0c1 100644 --- a/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs +++ b/com.minres.scviewer.database.text/.settings/org.eclipse.jdt.groovy.core.prefs @@ -1,2 +1,3 @@ eclipse.preferences.version=1 -groovy.compiler.level=23 +groovy.compiler.level=24 +groovy.script.filters=**/*.dsld,y,**/*.gradle,n diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy index 2cc5045..4a54488 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TextDbLoader.groovy @@ -26,17 +26,21 @@ import com.minres.scviewer.database.IWaveformDb import com.minres.scviewer.database.IWaveformDbLoader import com.minres.scviewer.database.RelationType -public class TextDbLoader implements IWaveformDbLoader{ +public class TextDbLoader implements IWaveformDbLoader, Serializable{ private Long maxTime; - IWaveformDb db; + transient IWaveformDb db; - DB backingDb; + transient DB backingDb; - def streams = [] + transient def streamsById = [:] + + transient def generatorsById = [:] + + transient def transactionsById = [:] - def relationTypes=[:] + transient def relationTypes=[:] public TextDbLoader() { } @@ -48,37 +52,39 @@ public class TextDbLoader implements IWaveformDbLoader{ @Override public List getAllWaves() { - return new LinkedList(streams); + return new LinkedList(streamsById.values()); } - public Map getGeneratorsById() { - TreeMap res = new TreeMap(); - streams.each{TxStream stream -> stream.generators.each{res.put(it.id, id)} } - return res; - } +// public Map getGeneratorsById() { +// TreeMap res = new TreeMap(); +// streamsById.values().each{TxStream stream -> +// stream.generators.each{res.put(it.id, id)} } +// return res; +// } static final byte[] x = "scv_tr_stream".bytes @Override boolean load(IWaveformDb db, File file) throws Exception { this.db=db - this.streams=[] def gzipped = isGzipped(file) if(isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file))){ - if(true) { - def parentDir=file.absoluteFile.parent - def filename=file.name - new File(parentDir).eachFileRecurse (FileType.FILES) { f -> if(f.name=~/^\.${filename}/) f.delete() } - this.backingDb = DBMaker.openFile(parentDir+File.separator+"."+filename+"_bdb") - .deleteFilesAfterClose() - .useRandomAccessFile() - .setMRUCacheSize(4096) - //.disableTransactions() - .disableLocking() - .make(); - } else { - this.backingDb = DBMaker.openMemory().disableLocking().make() - } + def parentDir=file.absoluteFile.parent + def filename=file.name + new File(parentDir).eachFileRecurse (FileType.FILES) { f -> if(f.name=~/^\.${filename}/) f.delete() } + this.backingDb = DBMaker.openFile(parentDir+File.separator+"."+filename+"_bdb") + .deleteFilesAfterClose() + .useRandomAccessFile() + //.enableHardCache() + .enableMRUCache() + .setMRUCacheSize(1024*4096) + .disableTransactions() + .disableLocking() + .make(); + streamsById = backingDb.createHashMap("streamsById") + generatorsById = backingDb.createHashMap("generatorsById") + transactionsById = backingDb.createHashMap("transactionsById") + relationTypes=backingDb.createHashMap("relationTypes") parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)) calculateConcurrencyIndicees() return true @@ -122,9 +128,7 @@ public class TextDbLoader implements IWaveformDbLoader{ } } private def parseInput(InputStream inputStream){ - def streamsById = [:] - def generatorsById = [:] - def transactionsById = [:] + //def transactionsById = backingDb.createHashMap("transactionsById") TxGenerator generator Tx transaction boolean endTransaction=false @@ -139,15 +143,14 @@ public class TextDbLoader implements IWaveformDbLoader{ case "begin_attribute": case "end_attribute": if ((matcher = line =~ /^scv_tr_stream\s+\(ID (\d+),\s+name\s+"([^"]+)",\s+kind\s+"([^"]+)"\)$/)) { - def id = Integer.parseInt(matcher[0][1]) - def stream = new TxStream(db, id, matcher[0][2], matcher[0][3], backingDb) - streams<transaction.endTime?maxTime:transaction.endTime endTransaction=true break case "tx_record_attribute"://matcher = line =~ /^tx_record_attribute\s+(\d+)\s+"([^"]+)"\s+(\S+)\s*=\s*(.+)$/ - def id = Integer.parseInt(tokens[1]) + def id = Long.parseLong(tokens[1]) transactionsById[id].attributes< stream.getMaxConcurrency() } + streamsById.values().each{ TxStream stream -> + stream.getMaxConcurrency() + } } diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy index 4442146..f0d7d64 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/Tx.groovy @@ -12,13 +12,13 @@ package com.minres.scviewer.database.text import com.minres.scviewer.database.* -class Tx implements ITx { +class Tx implements ITx, Serializable { + + TextDbLoader loader Long id - TxGenerator generator - - TxStream stream + Long generator_id int concurrencyIndex @@ -32,10 +32,10 @@ class Tx implements ITx { def outgoingRelations =[] - Tx(int id, TxStream stream, TxGenerator generator, Long begin){ + Tx(TextDbLoader loader, Long id, Long generator_id, Long begin){ + this.loader=loader this.id=id - this.stream=stream - this.generator=generator + this.generator_id=generator_id this.beginTime=begin this.endTime=begin } @@ -64,4 +64,14 @@ class Tx implements ITx { return "tx#"+getId()+"["+getBeginTime()/1000000+"ns - "+getEndTime()/1000000+"ns]"; } + @Override + public ITxStream getStream() { + return generator.stream; + } + + @Override + public ITxGenerator getGenerator() { + return loader.generatorsById[generator_id]; + } + } diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.groovy index 0ec90b7..17cda5b 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttribute.groovy @@ -15,7 +15,7 @@ import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.ITxAttributeType; import com.minres.scviewer.database.ITxAttribute -class TxAttribute implements ITxAttribute{ +class TxAttribute implements ITxAttribute, Serializable { TxAttributeType attributeType diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttributeType.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttributeType.groovy index 7bc8388..d3c67d0 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttributeType.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxAttributeType.groovy @@ -14,7 +14,7 @@ import com.minres.scviewer.database.AssociationType; import com.minres.scviewer.database.DataType; import com.minres.scviewer.database.ITxAttributeType; -class TxAttributeType implements ITxAttributeType { +class TxAttributeType implements ITxAttributeType, Serializable { String name DataType dataType AssociationType type diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy index ae8158b..8955e51 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxEvent.groovy @@ -4,7 +4,7 @@ import com.minres.scviewer.database.ITx import com.minres.scviewer.database.ITxEvent import com.minres.scviewer.database.IWaveformEvent -class TxEvent implements ITxEvent { +class TxEvent implements ITxEvent, Serializable { final ITxEvent.Type type; diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.groovy index d67d8d8..035f945 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxGenerator.groovy @@ -12,7 +12,7 @@ package com.minres.scviewer.database.text import java.util.ArrayList; import java.util.List; - +import org.apache.jdbm.DB import com.minres.scviewer.database.ITxAttributeType import com.minres.scviewer.database.ITxAttribute; import com.minres.scviewer.database.ITxEvent; @@ -21,10 +21,11 @@ import com.minres.scviewer.database.ITxStream; import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.IWaveformEvent; -class TxGenerator implements ITxGenerator{ +class TxGenerator implements ITxGenerator, Serializable{ Long id - TxStream stream + Long stream_id String name + TextDbLoader loader; Boolean active = false ArrayList transactions=[] @@ -33,14 +34,15 @@ class TxGenerator implements ITxGenerator{ ArrayList end_attrs= [] int end_attrs_idx = 0 - TxGenerator(int id, TxStream stream, name){ + TxGenerator(TextDbLoader loader, Long id, Long stream_id, name){ this.id=id - this.stream=stream + this.stream_id=stream_id this.name=name + this.loader=loader } ITxStream getStream(){ - return stream; + return loader.streamsById[stream_id]; } List getTransactions(){ diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy index 4bd9f98..4148cd5 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxRelation.groovy @@ -4,7 +4,7 @@ import com.minres.scviewer.database.ITxRelation import com.minres.scviewer.database.ITx; import com.minres.scviewer.database.RelationType; -class TxRelation implements ITxRelation { +class TxRelation implements ITxRelation, Serializable { Tx source Tx target diff --git a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy index c7d9728..9e23e9f 100644 --- a/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy +++ b/com.minres.scviewer.database.text/src/com/minres/scviewer/database/text/TxStream.groovy @@ -27,11 +27,11 @@ import com.minres.scviewer.database.IHierNode import com.minres.scviewer.database.ITxStream import com.minres.scviewer.database.ITx -class TxStream extends HierNode implements ITxStream { +class TxStream extends HierNode implements ITxStream, Serializable { Long id - IWaveformDb database + transient TextDbLoader loader String fullName @@ -43,24 +43,24 @@ class TxStream extends HierNode implements ITxStream { private TreeMap> events - TxStream(IWaveformDb db, int id, String name, String kind, DB backingStore){ + TxStream(TextDbLoader loader, Long id, String name, String kind){ super(name) this.id=id - this.database=db + this.loader=loader this.fullName=name this.kind=kind this.maxConcurrency=0 - //events = new TreeMap>() - events=backingStore.createTreeMap("stream-"+name) + events = new TreeMap>() + //events=backingStore.createTreeMap("stream-"+name) } List getGenerators(){ - return generators as List + return generators.collect { loader.generatorsById[it] } as List } @Override public IWaveformDb getDb() { - return database + return loader.db } @Override diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java index 130a40f..906096f 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/HierNode.java @@ -12,18 +12,25 @@ package com.minres.scviewer.database; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; +import java.beans.Transient; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; -public class HierNode implements IHierNode { +public class HierNode implements IHierNode, Serializable { + + /** + * + */ + private static final long serialVersionUID = -2278641781226609616L; protected String name; protected String parentName; - protected ArrayList childs; + protected transient ArrayList childs; - protected PropertyChangeSupport pcs; + protected transient PropertyChangeSupport pcs; public HierNode() { childs = new ArrayList(); diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java index 95d365c..d0e0412 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/RelationType.java @@ -10,10 +10,16 @@ *******************************************************************************/ package com.minres.scviewer.database; +import java.io.Serializable; import java.util.HashMap; -public class RelationType { +public class RelationType implements Serializable { + /** + * + */ + private static final long serialVersionUID = -5598253591502850283L; + private static HashMap registry = new HashMap<>(); private String name; diff --git a/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java index 8d6b199..67d4beb 100644 --- a/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java +++ b/com.minres.scviewer.database/src/com/minres/scviewer/database/internal/WaveformDb.java @@ -11,6 +11,7 @@ package com.minres.scviewer.database.internal; import java.io.File; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,7 +32,12 @@ import com.minres.scviewer.database.IWaveformEvent; import com.minres.scviewer.database.InputFormatException; import com.minres.scviewer.database.RelationType; -public class WaveformDb extends HierNode implements IWaveformDb { +public class WaveformDb extends HierNode implements IWaveformDb, Serializable { + + /** + * + */ + private static final long serialVersionUID = 4917280760027131179L; private static List loaders=new LinkedList();