fix max concurrency handling

This commit is contained in:
Eyck Jentzsch 2021-01-02 18:04:48 +01:00
parent bfbc40c282
commit b44f3418f4
2 changed files with 172 additions and 178 deletions

View File

@ -78,11 +78,21 @@ public class TextDbLoader implements IWaveformDbLoader{
if(file.isDirectory() || !file.exists()) return false; if(file.isDirectory() || !file.exists()) return false;
this.db=db; this.db=db;
this.streams = new ArrayList<>(); this.streams = new ArrayList<>();
try { TextDbParser parser = new TextDbParser(this);
boolean gzipped = isGzipped(file); boolean gzipped = isGzipped(file);
if(isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file))){ try {
File mapDbFile = File.createTempFile("."+file.getName(), null /*"tmp"*/, null /*file.parentFile*/); if(!isTxfile(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)))
mapDbFile.delete(); return false;
} catch(Throwable e) {
throw new InputFormatException();
}
File mapDbFile;
try {
mapDbFile = File.createTempFile("."+file.getName(), null /*"tmp"*/, null /*file.parentFile*/);
} catch (IOException e1) {
return false;
}
mapDbFile.delete(); // we just need a file name
mapDbFile.deleteOnExit(); mapDbFile.deleteOnExit();
this.mapDb = DBMaker this.mapDb = DBMaker
.fileDB(mapDbFile) .fileDB(mapDbFile)
@ -92,17 +102,15 @@ public class TextDbLoader implements IWaveformDbLoader{
.allocateStartSize(64*1024*1024) .allocateStartSize(64*1024*1024)
.allocateIncrement(64*1024*1024) .allocateIncrement(64*1024*1024)
.make(); .make();
// NPE here ---> try {
parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file)); parser.parseInput(gzipped?new GZIPInputStream(new FileInputStream(file)):new FileInputStream(file));
for(IWaveform stream: streams){ stream.getWidth(); }
return true;
} else
return false;
} catch(IllegalArgumentException|ArrayIndexOutOfBoundsException e) { } catch(IllegalArgumentException|ArrayIndexOutOfBoundsException e) {
} catch(Throwable e) { } catch(Throwable e) {
System.out.println("---->>> Exception "+e.toString()+" caught while loading database"); System.out.println("---->>> Exception "+e.toString()+" caught while loading database");
e.printStackTrace(); e.printStackTrace();
return false;
} }
streams.addAll(parser.streamsById.values());
return true; return true;
} }
@ -131,17 +139,11 @@ public class TextDbLoader implements IWaveformDbLoader{
} }
} }
private long stringToScale(String scale){ public Collection<RelationType> getAllRelationTypes(){
String cmp = scale.trim(); return relationTypes.values();
if("fs".equals(cmp)) return 1L;
if("ps".equals(cmp)) return 1000L;
if("ns".equals(cmp)) return 1000000L;
if("us".equals(cmp)) return 1000000000L;
if("ms".equals(cmp)) return 1000000000000L;
if("s".equals(cmp) ) return 1000000000000000L;
return 1L;
} }
static class TextDbParser {
static final Pattern scv_tr_stream = Pattern.compile("^scv_tr_stream\\s+\\(ID (\\d+),\\s+name\\s+\"([^\"]+)\",\\s+kind\\s+\"([^\"]+)\"\\)$"); static final Pattern scv_tr_stream = Pattern.compile("^scv_tr_stream\\s+\\(ID (\\d+),\\s+name\\s+\"([^\"]+)\",\\s+kind\\s+\"([^\"]+)\"\\)$");
static final Pattern scv_tr_generator = Pattern.compile("^scv_tr_generator\\s+\\(ID\\s+(\\d+),\\s+name\\s+\"([^\"]+)\",\\s+scv_tr_stream\\s+(\\d+),$"); static final Pattern scv_tr_generator = Pattern.compile("^scv_tr_generator\\s+\\(ID\\s+(\\d+),\\s+name\\s+\"([^\"]+)\",\\s+scv_tr_stream\\s+(\\d+),$");
static final Pattern begin_attribute = Pattern.compile("^begin_attribute \\(ID (\\d+), name \"([^\"]+)\", type \"([^\"]+)\"\\)$"); static final Pattern begin_attribute = Pattern.compile("^begin_attribute \\(ID (\\d+), name \"([^\"]+)\", type \"([^\"]+)\"\\)$");
@ -153,9 +155,15 @@ public class TextDbLoader implements IWaveformDbLoader{
TxGenerator generator = null; TxGenerator generator = null;
Tx transaction = null; Tx transaction = null;
boolean endTransaction=false; boolean endTransaction=false;
final TextDbLoader loader;
BufferedReader reader =null; BufferedReader reader =null;
private void parseInput(InputStream inputStream) throws IOException{ public TextDbParser(TextDbLoader loader) {
super();
this.loader = loader;
}
void parseInput(InputStream inputStream) throws IOException{
reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
String curLine = reader.readLine(); String curLine = reader.readLine();
String nextLine = null; String nextLine = null;
@ -174,13 +182,15 @@ public class TextDbLoader implements IWaveformDbLoader{
DataType type = DataType.valueOf(tokens[3]); DataType type = DataType.valueOf(tokens[3]);
String remaining = tokens.length>5?String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length-1)):""; String remaining = tokens.length>5?String.join(" ", Arrays.copyOfRange(tokens, 5, tokens.length-1)):"";
transactionsById.get(id).getAttributes().add(new TxAttribute(name, type, AssociationType.RECORD, remaining)); transactionsById.get(id).getAttributes().add(new TxAttribute(name, type, AssociationType.RECORD, remaining));
} else if("tx_begin".equals(tokens[0])){//matcher = line =~ /^tx_begin\s+(\d+)\s+(\d+)\s+(\d+)\s+([munpf]?s)/ } else if("tx_begin".equals(tokens[0])){
Long id = Long.parseLong(tokens[1]); Long id = Long.parseLong(tokens[1]);
TxGenerator gen=generatorsById.get(Long.parseLong(tokens[2])); TxGenerator gen=generatorsById.get(Long.parseLong(tokens[2]));
TxStream stream = (TxStream) gen.getStream();
stream.setConcurrency(stream.getConcurrency()+1);
transaction = new Tx(id, gen.getStream(), gen, Long.parseLong(tokens[3])*stringToScale(tokens[4])); transaction = new Tx(id, gen.getStream(), gen, Long.parseLong(tokens[3])*stringToScale(tokens[4]));
gen.getTransactions().add(transaction); gen.getTransactions().add(transaction);
transactionsById.put(id, transaction); transactionsById.put(id, transaction);
maxTime = maxTime>transaction.getBeginTime()?maxTime:transaction.getBeginTime(); loader.maxTime = loader.maxTime>transaction.getBeginTime()?loader.maxTime:transaction.getBeginTime();
if(nextLine!=null && nextLine.charAt(0)=='a') { if(nextLine!=null && nextLine.charAt(0)=='a') {
int idx=0; int idx=0;
while(nextLine!=null && nextLine.charAt(0)=='a') { while(nextLine!=null && nextLine.charAt(0)=='a') {
@ -196,9 +206,11 @@ public class TextDbLoader implements IWaveformDbLoader{
transaction = transactionsById.get(id); transaction = transactionsById.get(id);
assert Integer.parseInt(tokens[2])==transaction.getGenerator().getId(); assert Integer.parseInt(tokens[2])==transaction.getGenerator().getId();
transaction.setEndTime(Long.parseLong(tokens[3])*stringToScale(tokens[4])); transaction.setEndTime(Long.parseLong(tokens[3])*stringToScale(tokens[4]));
maxTime = maxTime>transaction.getEndTime()?maxTime:transaction.getEndTime(); loader.maxTime = loader.maxTime>transaction.getEndTime()?loader.maxTime:transaction.getEndTime();
if(nextLine!=null && nextLine.charAt(0)=='a') {
TxGenerator gen = (TxGenerator) transaction.getGenerator(); TxGenerator gen = (TxGenerator) transaction.getGenerator();
TxStream stream = (TxStream) gen.getStream();
stream.setConcurrency(stream.getConcurrency()-1);
if(nextLine!=null && nextLine.charAt(0)=='a') {
int idx=0; int idx=0;
while(nextLine!=null && nextLine.charAt(0)=='a') { while(nextLine!=null && nextLine.charAt(0)=='a') {
String[] attrTokens=nextLine.split("\\s+"); String[] attrTokens=nextLine.split("\\s+");
@ -212,17 +224,16 @@ public class TextDbLoader implements IWaveformDbLoader{
Tx tr2= transactionsById.get(Long.parseLong(tokens[2])); Tx tr2= transactionsById.get(Long.parseLong(tokens[2]));
Tx tr1= transactionsById.get(Long.parseLong(tokens[3])); Tx tr1= transactionsById.get(Long.parseLong(tokens[3]));
String relType=tokens[1].substring(1, tokens[1].length()-2); String relType=tokens[1].substring(1, tokens[1].length()-2);
if(!relationTypes.containsKey(relType)) if(!loader.relationTypes.containsKey(relType))
relationTypes.put(relType, RelationType.create(relType)); loader.relationTypes.put(relType, RelationType.create(relType));
TxRelation rel = new TxRelation(relationTypes.get(relType), tr1, tr2); TxRelation rel = new TxRelation(loader.relationTypes.get(relType), tr1, tr2);
tr1.getOutgoingRelations().add(rel); tr1.getOutgoingRelations().add(rel);
tr2.getIncomingRelations().add(rel); tr2.getIncomingRelations().add(rel);
} else if("scv_tr_stream".equals(tokens[0])){ } else if("scv_tr_stream".equals(tokens[0])){
Matcher matcher = scv_tr_stream.matcher(curLine); Matcher matcher = scv_tr_stream.matcher(curLine);
if (matcher.matches()) { if (matcher.matches()) {
Long id = Long.parseLong(matcher.group(1)); Long id = Long.parseLong(matcher.group(1));
TxStream stream = new TxStream(this, id, matcher.group(2), matcher.group(3)); TxStream stream = new TxStream(loader, id, matcher.group(2), matcher.group(3));
streams.add(stream);
streamsById.put(id, stream); streamsById.put(id, stream);
} }
} else if("scv_tr_generator".equals(tokens[0])){ } else if("scv_tr_generator".equals(tokens[0])){
@ -253,9 +264,16 @@ public class TextDbLoader implements IWaveformDbLoader{
return nextLine; return nextLine;
} }
public Collection<RelationType> getAllRelationTypes(){ private long stringToScale(String scale){
return relationTypes.values(); String cmp = scale.trim();
} if("fs".equals(cmp)) return 1L;
if("ps".equals(cmp)) return 1000L;
if("ns".equals(cmp)) return 1000000L;
if("us".equals(cmp)) return 1000000000L;
if("ms".equals(cmp)) return 1000000000000L;
if("s".equals(cmp) ) return 1000000000000000L;
return 1L;
}
}
} }

View File

@ -40,7 +40,19 @@ class TxStream extends HierNode implements IWaveform, Serializable {
private ArrayList<ITxGenerator> generators = new ArrayList<ITxGenerator>(); private ArrayList<ITxGenerator> generators = new ArrayList<ITxGenerator>();
private int maxConcurrency; private int maxConcurrency = 0;
private int concurrency = 0;
void setConcurrency(int concurrency) {
this.concurrency = concurrency;
if(concurrency>maxConcurrency)
maxConcurrency = concurrency;
}
int getConcurrency() {
return this.concurrency;
}
private BTreeMap<Long, IEvent[]> events; private BTreeMap<Long, IEvent[]> events;
@ -59,45 +71,9 @@ class TxStream extends HierNode implements IWaveform, Serializable {
@Override @Override
public int getWidth() { public int getWidth() {
if(maxConcurrency==0){
for(ITxGenerator generator:getGenerators()) {
for(ITx tx:generator.getTransactions()){
putEvent(new TxEvent(EventKind.BEGIN, tx));
putEvent(new TxEvent(EventKind.END, tx));
}
}
ArrayList<Long> rowendtime = new ArrayList<Long>();
rowendtime.add(0l);
for(Long time: events.keySet()){
IEvent[] value=events.get(time);
Arrays.asList(value).stream().filter(event -> event.getKind()==EventKind.BEGIN).forEach(event -> {
ITx tx = ((ITxEvent)event).getTransaction();
int rowIdx = 0;
for(rowIdx=0; rowIdx<rowendtime.size() && rowendtime.get(rowIdx)>tx.getBeginTime(); rowIdx++);
if(rowendtime.size()<=rowIdx)
rowendtime.add(tx.getEndTime());
else
rowendtime.set(rowIdx, tx.getEndTime());
((Tx)tx).setConcurrencyIndex(rowIdx);
});
}
maxConcurrency=rowendtime.size();
}
return maxConcurrency; return maxConcurrency;
} }
private void putEvent(ITxEvent event){
if(!events.containsKey(event.getTime()))
events.put(event.getTime(), new ITxEvent[]{event} );
else {
IEvent[] entries = events.get(event.getTime());
IEvent[] newEntries = Arrays.copyOf(entries, entries.length+1);
newEntries[entries.length]=event;
events.put(event.getTime(), newEntries);
}
}
@Override @Override
public NavigableMap<Long, IEvent[]> getEvents() { public NavigableMap<Long, IEvent[]> getEvents() {
return (NavigableMap<Long, IEvent[]>)events; return (NavigableMap<Long, IEvent[]>)events;