Skip to content

Commit 2345654

Browse files
- transaction mechanism optimized
- frame cleanup process added - common performance improved - some unstable in MT algorithms fixed
1 parent c7a4424 commit 2345654

29 files changed

Lines changed: 343 additions & 288 deletions

config/properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ frame.size=8192
2121
frame.size.ix=8192
2222

2323
# system code page
24-
codepage=Cp1251
24+
codepage=UTF8
2525

2626
###########################################
2727
# runtime parameters

interference-2020.1.jar

-376 KB
Binary file not shown.

interference-2020.1.jar.md5

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/main/java/su/interference/core/DataChunk.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ public DataChunk (ValueSet vs, Session s, Table t) {
320320
} catch (Exception e) {
321321
e.printStackTrace();
322322
}
323-
header.setLen(getChunkLen());
323+
header.setLen(getChunk().length);
324+
//header.setLen(getChunkLen());
324325
}
325326

326327
//serializer INSERT ONLY!!! (with generate Id value)
@@ -332,7 +333,7 @@ public DataChunk (Object o, Session s) throws IOException, InvocationTargetExcep
332333
public DataChunk (Object o, Session s, RowId r) throws IOException, InvocationTargetException, NoSuchMethodException, InternalException, ClassNotFoundException, InstantiationException, IllegalAccessException {
333334
this.entity = o;
334335
this.state = NORMAL_STATE;
335-
this.header = new RowHeader(r, null, getChunkLen(), false);
336+
this.header = new RowHeader(r, null, getChunk().length, false);
336337
}
337338

338339
public DataChunk (byte[] b, int file, long frame, int hsize, DataObject t, Class c) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InternalException, MalformedURLException {
@@ -411,6 +412,7 @@ public byte[] getChunk () {
411412
return null;
412413
}
413414

415+
//todo
414416
public int getChunkLen () {
415417
if (state == INIT_STATE) {
416418
return chunk.length;
@@ -480,7 +482,8 @@ public Object getEntity () {
480482
}
481483
}
482484
if (t.isIndex()) {
483-
final DataChunk dc = (DataChunk) Instance.getInstance().getChunkByPointer(this.getHeader().getFramePtr(), this.getHeader().getFramePtrRowId().getRowPointer());
485+
final ResultSetEntity rsa = (ResultSetEntity) ((Table) this.t).getTableClass().getAnnotation(ResultSetEntity.class);
486+
final DataChunk dc = rsa == null ? (DataChunk) Instance.getInstance().getChunkByPointer(this.getHeader().getFramePtr(), this.getHeader().getFramePtrRowId().getRowPointer()) : this;
484487
((IndexChunk)o).setDataChunk(dc);
485488
if (dc == null) {
486489
// todo during rframe.IndexFrame.init system directory not yet contains replicated FrameData objects
@@ -541,6 +544,8 @@ public Object getEntity (Class c, Object[] params) {
541544
} catch (Exception e) {
542545
e.printStackTrace();
543546
}
547+
this.chunk = null;
548+
this.state = NORMAL_STATE;
544549
return entity;
545550
}
546551

@@ -598,6 +603,12 @@ public void updateEntity(Object o) throws InternalException, ClassNotFoundExcept
598603
}
599604
}
600605

606+
protected void setNormalState() {
607+
//set chunk to normal state after update
608+
this.chunk = null;
609+
this.state = NORMAL_STATE;
610+
}
611+
601612
//for UNDO processing
602613
public DataChunk cloneEntity(Session s) throws IOException, InvocationTargetException, NoSuchMethodException, InternalException, ClassNotFoundException, InstantiationException, IllegalAccessException {
603614
final byte[] b = this.getChunk();
@@ -644,8 +655,8 @@ public void setHeader(Header header) {
644655
//lock mechanism
645656

646657
private synchronized DataChunk insertUC (FrameData cb, UndoChunk uc, Session s, LLT llt) throws Exception {
647-
final FrameData ub = s.getTransaction().getAvailableFrame(uc, true);
648-
658+
final WaitFrame ubw = s.getTransaction().getAvailableFrame(uc, true);
659+
final FrameData ub = ubw.getBd();
649660
if (ub == null) {
650661
//s.getTransaction().createUndoFrames(s);
651662
//ub = s.getTransaction().getAvailableFrame(uc, true);
@@ -665,7 +676,7 @@ private synchronized DataChunk insertUC (FrameData cb, UndoChunk uc, Session s,
665676
} else {
666677
s.getTransaction().storeFrame(cb, ub, 0, s, llt);
667678
}
668-
ub.release();
679+
ubw.release();
669680
return dc;
670681
}
671682

src/main/java/su/interference/core/Frame.java

Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ public FrameData getFrameData() {
9696
return frameData;
9797
}
9898

99+
public void setFrameData(FrameData frameData) {
100+
this.frameData = frameData;
101+
}
102+
99103
public DataObject getDataObject() {
100104
return dataObject;
101105
}
@@ -271,10 +275,11 @@ public Frame(byte[] bb, int file, long pointer, int size, FrameData bd, DataObje
271275
this.res09 = bs.getIntFromBytes(92);
272276

273277
if ((this.file==0)&&(this.pointer==0)) {
278+
logger.error("empty frame header frameId = " + (bd == null ? "N/A" : bd.getFrameId()) + " allocId = " + (bd == null ? "N/A" : bd.getAllocId()));
274279
throw new EmptyFrameHeaderFound();
275280
}
276281
if ((this.file!=file)||(this.pointer!=pointer)) {
277-
logger.error("InvalidFrameHeader: " + this.file + ":" + file + " " + this.pointer + ":" + pointer);
282+
logger.error("invalid frame header frameId = " + (bd == null ? "N/A" : bd.getFrameId()) + " allocId = " + (bd == null ? "N/A" : bd.getAllocId()));
278283
throw new InvalidFrameHeader();
279284
}
280285
if (this.objectId<0) {
@@ -296,8 +301,10 @@ public synchronized byte[] getFrame() throws InvalidFrame {
296301

297302
if (Config.getConfig().SYNC_LOCK_ENABLE||sync==0) {
298303
for (Chunk c : data.getChunks()) {
304+
final byte[] chunk_ = c.getChunk();
305+
c.getHeader().setLen(chunk_.length);
299306
res2.append(c.getHeader().getHeader());
300-
res2.append(c.getChunk());
307+
res2.append(chunk_);
301308
used = used + c.getBytesAmount();
302309
}
303310
} else {
@@ -306,8 +313,10 @@ public synchronized byte[] getFrame() throws InvalidFrame {
306313
}
307314
for (Chunk c : data.getChunks()) {
308315
if (c.getHeader().getLltId() < sync) {
316+
final byte[] chunk_ = c.getChunk();
317+
// c.getHeader().setLen(chunk_.length);
309318
res2.append(c.getHeader().getHeader());
310-
res2.append(c.getChunk());
319+
res2.append(chunk_);
311320
used = used + c.getBytesAmount();
312321
}
313322
}
@@ -352,32 +361,6 @@ public synchronized byte[] getFrame() throws InvalidFrame {
352361
return res.getBytes();
353362
}
354363

355-
public synchronized byte[] flushHeader() {
356-
final ByteString res = new ByteString();
357-
final ByteString bs = new ByteString(this.b);
358-
res.addBytesFromInt(this.file);
359-
res.addBytesFromLong(this.pointer);
360-
res.addBytesFromInt(this.objectId);
361-
res.addBytesFromInt(this.type);
362-
res.addBytesFromInt(this.cptr);
363-
res.addBytesFromInt(this.bytesAmount);
364-
res.addBytesFromInt(this.rowCntr);
365-
res.addBytesFromInt(this.sptr);
366-
res.addBytesFromInt(this.allocFile);
367-
res.addBytesFromLong(this.allocPointer);
368-
res.addBytesFromInt(this.res01);
369-
res.addBytesFromInt(this.res02);
370-
res.addBytesFromInt(this.res03);
371-
res.addBytesFromInt(this.res04);
372-
res.addBytesFromInt(this.res05);
373-
res.addBytesFromLong(this.res06);
374-
res.addBytesFromLong(this.res07);
375-
res.addBytesFromLong(this.res08);
376-
res.addBytesFromInt(this.res09);
377-
res.append(bs.substring(FRAME_HEADER_SIZE, this.b.length));
378-
return res.getBytes();
379-
}
380-
381364
public boolean equals (Frame bl) {
382365
if ((this.file==bl.getFile())&&(this.pointer==bl.getPointer())) {
383366
return true;
@@ -461,7 +444,7 @@ public synchronized int updateChunk(DataChunk chunk, Object o, Session s, LLT ll
461444
if (chunk.getEntity()!=o) { //not same object
462445
chunk.updateEntity(o);
463446
}
464-
447+
chunk.setNormalState();
465448
final byte[] ncb = chunk.getChunk();
466449
chunk.getHeader().setLen(ncb.length);
467450
final int newlen = chunk.getBytesAmount();
@@ -652,11 +635,6 @@ public HashMap getLiveTransactions() {
652635
return rtran;
653636
}
654637

655-
public ArrayList<TransFrame> getLiveTransFrames() {
656-
final long ptr = this.file + this.pointer;
657-
return Instance.getInstance().getTransFrames(ptr);
658-
}
659-
660638
public int getBytesAmount() {
661639
int used = FRAME_HEADER_SIZE;
662640
final int size = data.getChunks().size();

src/main/java/su/interference/core/IndexElement.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,4 @@ public void setElement(Object element) {
6464
this.element = element;
6565
}
6666

67-
public String ElementToString () {
68-
return "" + this.element;
69-
}
70-
7167
}

src/main/java/su/interference/core/IndexElementKey.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,6 @@ public boolean equals(final Object obj) {
7676
return false;
7777
}
7878

79-
public String keyToString() {
80-
String res = "";
81-
for (int i=0; i<key.length; i++) {
82-
res = res + key[i];
83-
}
84-
return res;
85-
}
86-
8779
public Object[] getKey() {
8880
return key;
8981
}
@@ -92,4 +84,11 @@ public void setKey(Object[] key) {
9284
this.key = key;
9385
}
9486

87+
public int hashCode() {
88+
int hashCode = 1;
89+
for (Object o : key)
90+
hashCode = 31 * hashCode + (o == null ? 0 : o.hashCode());
91+
return hashCode;
92+
}
93+
9594
}

src/main/java/su/interference/core/Instance.java

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,11 @@ public void startupInstance(Session s) throws Exception, NoSuchMethodException,
378378
startProcesses(s);
379379
systemState = Instance.SYSTEM_STATE_UP;
380380
//checkInMemoryIndexes();
381-
logger.info(" ");
382-
logger.info(" ");
383-
logger.info("interference started");
384-
logger.info(" ");
385-
logger.info(" ");
381+
logger.info("\n----------------------------------------------------------------------\n" +
382+
"------------------------ interference started ------------------------\n" +
383+
"------------------ (c) head systems, ltd 2010-2020 -------------------\n" +
384+
"--------------------------- release 2020.1 ---------------------------\n" +
385+
"----------------------------------------------------------------------");
386386
} else {
387387

388388
systemState = Instance.SYSTEM_STATE_NA;
@@ -406,6 +406,8 @@ private static void registerMetrics() throws Exception {
406406
Metrics.register(Metrics.HISTOGRAM, "recordRCount");
407407
Metrics.register(Metrics.HISTOGRAM, "recordLCount");
408408
Metrics.register(Metrics.HISTOGRAM, "syncQueue");
409+
Metrics.register(Metrics.TIMER, "systemCleanUp");
410+
Metrics.register(Metrics.METER, "сleanUpBlocks");
409411
}
410412

411413
private void checkInMemoryIndexes() {
@@ -568,6 +570,12 @@ public Table getFrameDataTable() {
568570
return (Table)((DataChunk)tt.getMapFieldByColumn("name").getMap().get("su.interference.persistent.FrameData")).getEntity();
569571
}
570572

573+
protected Map getFramesMap () {
574+
final Table t = getTableByName("su.interference.persistent.FrameData");
575+
final MapField ixf = t.getMapFieldByColumn("frameId");
576+
return ixf.getMap();
577+
}
578+
571579
public FrameData getFrameById (long id) {
572580
final Table t = getTableByName("su.interference.persistent.FrameData");
573581
final MapField ixf = t.getMapFieldByColumn("frameId");
@@ -681,45 +689,22 @@ public synchronized List<Process> getProcesses () {
681689
return r;
682690
}
683691

684-
//used in getUndoChunkByRowId
685-
public ArrayList<TransFrame> getTransFrames(long cframeId) {
686-
final Table t = getTableByName("su.interference.persistent.TransFrame");
687-
final ArrayList<TransFrame> r = new ArrayList<TransFrame>();
688-
for (Object o : t.getIndexFieldByColumn("cframeId").getIndex().getObjectsByKey(cframeId)) {
689-
r.add((TransFrame)((DataChunk)o).getEntity());
690-
}
691-
return r;
692-
}
693-
694692
//used in storeFrame
695693
public TransFrame getTransFrameById(long transId, long cframeId, long uframe) {
696694
final Table t = getTableByName("su.interference.persistent.TransFrame");
697-
for (Object o : t.getIndexFieldByColumn("cframeId").getIndex().getObjectsByKey(cframeId)) {
698-
final TransFrame tb = (TransFrame)((DataChunk)o).getEntity();
699-
if (tb.getTransId()==transId&&tb.getUframeId()==uframe) {
700-
return tb;
701-
}
695+
final TransFrameId id = new TransFrameId(cframeId, uframe, transId);
696+
DataChunk dc = (DataChunk) t.getMapFieldByColumn("frameId").getMap().get(id);
697+
if (dc != null) {
698+
return (TransFrame) dc.getEntity();
702699
}
703700
return null;
704701
}
705702

706-
//used in commit/rollback mechanism
707-
public synchronized ArrayList<TransFrame> getTransFrameByTransId (long transId) {
708-
final Table t = getTableByName("su.interference.persistent.TransFrame");
709-
final ArrayList<TransFrame> r = new ArrayList<TransFrame>();
710-
for (Object o : t.getIndexFieldByColumn("transId").getIndex().getObjectsByKey(transId)) {
711-
r.add((TransFrame)((DataChunk)o).getEntity());
712-
}
713-
return r;
714-
}
715-
716703
//used in unlock table mechanism
704+
@Deprecated
717705
public synchronized ArrayList<TransFrame> getTransFrameByObjectId (int objectId) {
718-
final Table t = getTableByName("su.interference.persistent.TransFrame");
706+
//final Table t = getTableByName("su.interference.persistent.TransFrame");
719707
final ArrayList<TransFrame> r = new ArrayList<TransFrame>();
720-
for (Object o : t.getIndexFieldByColumn("objectId").getIndex().getObjectsByKey(objectId)) {
721-
r.add((TransFrame)((DataChunk)o).getEntity());
722-
}
723708
return r;
724709
}
725710

src/main/java/su/interference/core/LLT.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,15 @@ private static boolean poolNotEmpty() {
104104
}
105105

106106
public void add(Frame b) {
107+
b.getFrameData().setSynced(false);
107108
frames.put(b.getFrameData().getFrameId(), b);
108109
}
109110

110111
public void commit() {
111112
pool.remove(this.id);
112113
if (this.lock) {
113114
for (Map.Entry<Long, Frame> entry : frames.entrySet()) {
115+
entry.getValue().getFrameData().setSynced(true);
114116
entry.getValue().clearSnaps(this.id);
115117
}
116118
frames.clear();
@@ -129,7 +131,7 @@ public long getId() {
129131
return id;
130132
}
131133

132-
public StackTraceElement[] getTrace() {
134+
private StackTraceElement[] getTrace() {
133135
return trace;
134136
}
135137
}

src/main/java/su/interference/core/SyncFrame.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ public class SyncFrame implements Comparable, Serializable, AllowRPredicate {
5858
private Frame rFrame;
5959
private final HashMap<Long, Long> imap;
6060
private final HashMap<Long, Transaction> rtran;
61-
private final ArrayList<TransFrame> tframes;
6261
private final static long serialVersionUID = 8712349857239487289L;
6362

6463
public SyncFrame(Frame frame, Session s, FreeFrame fb) throws Exception {
@@ -80,7 +79,6 @@ public SyncFrame(Frame frame, Session s, FreeFrame fb) throws Exception {
8079

8180
className = bd == null ? null : t.getName();
8281
rtran = frame.getLiveTransactions();
83-
tframes = frame.getLiveTransFrames();
8482
if (frame.getClass().getName().equals("su.interference.core.DataFrame")) {
8583
if (frame.getType()!=0) {
8684
throw new InternalException();
@@ -92,8 +90,16 @@ public SyncFrame(Frame frame, Session s, FreeFrame fb) throws Exception {
9290
final long nextId_ = db.getNextFrame()+db.getNextFile();
9391
try {
9492
//todo NPE possibly by evicted frame
95-
prevId = prevId_ == 0 ? 0 : Instance.getInstance().getFrameById(prevId_).getAllocId();
96-
nextId = nextId_ == 0 ? 0 : Instance.getInstance().getFrameById(nextId_).getAllocId();
93+
try {
94+
prevId = prevId_ == 0 ? 0 : Instance.getInstance().getFrameById(prevId_).getAllocId();
95+
} catch (NullPointerException npe) {
96+
logger.info("evicted frame caused an NPE during SyncFrame construction id = " + frame.getPtr());
97+
}
98+
try {
99+
nextId = nextId_ == 0 ? 0 : Instance.getInstance().getFrameById(nextId_).getAllocId();
100+
} catch (NullPointerException npe) {
101+
logger.info("evicted frame caused an NPE during SyncFrame construction id = " + frame.getPtr());
102+
}
97103
} catch (Exception e) {
98104
e.printStackTrace();
99105
}
@@ -126,7 +132,7 @@ public SyncFrame(Frame frame, Session s, FreeFrame fb) throws Exception {
126132
fileType = Instance.getInstance().getDataFileById(frame.getFile()).getType();
127133
b = frame.getFrame();
128134
frameId = frame.getPtr();
129-
this.allocId = frame.getAllocFile()+ frame.getAllocPointer();
135+
this.allocId = frame.getAllocFile() + frame.getAllocPointer();
130136
}
131137

132138
public Frame getRFrame() {
@@ -217,10 +223,6 @@ public HashMap<Long, Transaction> getRtran() {
217223
return rtran;
218224
}
219225

220-
public ArrayList<TransFrame> getTframes() {
221-
return tframes;
222-
}
223-
224226
public boolean equals (SyncFrame bl) {
225227
if ((this.getFile()==bl.getFile())&&(this.getPointer()==bl.getPointer())) {
226228
return true;

0 commit comments

Comments
 (0)