Skip to content

Commit 6bcd6fa

Browse files
committed
2 parents 4dba8a0 + a55fb69 commit 6bcd6fa

File tree

8 files changed

+132
-35
lines changed

8 files changed

+132
-35
lines changed

src/main/java/net/sharksystem/asap/apps/testsupport/ASAPTestPeerFS.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import net.sharksystem.asap.ASAPPeerFS;
44
import net.sharksystem.asap.ASAPException;
55
import net.sharksystem.asap.ASAPEncounterConnectionType;
6+
import net.sharksystem.testhelper.ASAPTesthelper;
67
import net.sharksystem.utils.Log;
78

89
import java.io.IOException;

src/main/java/net/sharksystem/asap/engine/ASAPChunkStorageFS.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,15 @@ String getChunkFileTrunkname(int era, String uri) {
7575
String setupChunkFolder(int era, String targetUrl) {
7676
String eraFolderString = this.getPath(era);
7777
File eraFolder = new File(eraFolderString);
78-
Log.writeLog(this, "produced chunk folder name: " + eraFolderString);
78+
//Log.writeLog(this, "produced chunk folder name: " + eraFolderString);
7979
if(!eraFolder.exists()) {
80-
Log.writeLog(this, "folder does not exist - create: " + eraFolderString);
80+
//Log.writeLog(this, "folder does not exist - create: " + eraFolderString);
8181
eraFolder.mkdirs();
8282
}
8383

84-
Log.writeLog(this, "chunk folder exists: " + eraFolder);
84+
//Log.writeLog(this, "chunk folder exists: " + eraFolder);
8585
String fileNameWithoutExtension = eraFolderString + "/" + Utils.url2FileName(targetUrl);
86-
Log.writeLog(this, "use this file name to store chunk (meta)data: " + fileNameWithoutExtension);
86+
//Log.writeLog(this, "use this file name to store chunk (meta)data: " + fileNameWithoutExtension);
8787
return fileNameWithoutExtension;
8888
}
8989

src/main/java/net/sharksystem/asap/engine/ASAPEngine.java

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ public void newEra() {
108108
this.newEra(false, -1);
109109
}
110110

111+
/**
112+
* Set a new ear in this storage - if forced: set newEra as specified without questioning
113+
* @param force
114+
* @param nextEra
115+
*/
111116
private void newEra(boolean force, int nextEra) {
112117
try {
113118
this.syncMemento();
@@ -116,32 +121,54 @@ private void newEra(boolean force, int nextEra) {
116121
}
117122

118123
if(force || this.contentChanged) {
119-
if(this.contentChanged) Log.writeLog(this, this.toString(), "content changed - increment era...");
120-
if(force) Log.writeLog(this, this.toString(), "increment era to add new chunks");
121-
try {
122-
int oldEra = this.era;
123-
nextEra = nextEra < 0 ? this.getNextEra(this.era) : nextEra;
124+
// set as fast as possible to make race conditions less likely
125+
this.contentChanged = false;
124126

125-
// set as fast as possible to make race conditions less likely
126-
this.contentChanged = false;
127+
if(force) {
128+
Log.writeLog(this, this.toString(), "forced setting era to " + nextEra);
129+
} else {
130+
// calculate new era
131+
nextEra = nextEra < 0 ? this.getNextEra(this.era) : nextEra;
132+
Log.writeLog(this, this.toString(), "era not forced - incremented era to " + nextEra);
133+
}
134+
try {
135+
int previousEra = this.era;
127136

128137
// we are done here - we are in a new era.
129138
this.era = nextEra;
130139

131140
// persistent values
132141
if(this.memento != null) this.memento.save(this);
133142

134-
// drop very very old chunks - if available
135-
this.getChunkStorage().dropChunks(nextEra);
143+
/* now:
144+
previousEra .. era that was used a few milliseconds before. Keep it.
145+
this.era .. era we are going to work with
146+
147+
Now, there could be a very old version with same number as this.era - remove it before you set up
148+
fresh era
149+
*/
136150

137-
// setup new era - copy all chunks
138-
for(ASAPInternalChunk chunk : this.getChunkStorage().getChunks(oldEra)) {
139-
ASAPInternalChunk copyChunk = this.getChunkStorage().getChunk(chunk.getUri(), nextEra);
140-
copyChunk.clone(chunk);
151+
if(this.era == previousEra) {
152+
Log.writeLog(this, this.toString(), "this.era == previousEra - nothing to do");
153+
} else {
154+
// drop very very old chunks - if available - if not - don't care
155+
this.getChunkStorage().dropChunks(this.era);
156+
157+
Log.writeLog(this, this.toString(),
158+
"setup new era by cloning previous chunk meta data: "
159+
+ this.era + " <- " + previousEra);
160+
// setup new era - copy all chunks
161+
for(ASAPInternalChunk chunk : this.getChunkStorage().getChunks(previousEra)) {
162+
Log.writeLog(this, this.toString(),"going to clone: " + chunk);
163+
ASAPInternalChunk copyChunk = this.getChunkStorage().getChunk(chunk.getUri(), this.era);
164+
copyChunk.clone(chunk);
165+
Log.writeLog(this, this.toString(),"done cloning: " + copyChunk);
166+
}
141167
}
142168

143169
Log.writeLog(this, this.toString(), "era incremented");
144170
} catch (IOException ex) {
171+
ex.printStackTrace();
145172
Log.writeLogErr(this, this.toString(),
146173
"IOException while incrementing era: " + ex.getLocalizedMessage());
147174
}

src/main/java/net/sharksystem/asap/engine/ASAPInternalChunkFS.java

Lines changed: 79 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public class ASAPInternalChunkFS implements ASAPInternalChunk {
3737

3838
@Override
3939
public void clone(ASAPInternalChunk chunkSource) throws IOException {
40+
if(metaFile.getAbsolutePath().contains("ultihopTests/Alice_42/1/sha")) {
41+
Log.writeLog(this, this.toString(), "DEBUGGING_Multihop_Bug #2: " + metaFile.exists());
42+
}
43+
4044
this.uri = chunkSource.getUri();
4145
this.recipients = chunkSource.getRecipients();
4246
this.extraData = chunkSource.getExtraData();
@@ -116,7 +120,7 @@ private void initFiles(String trunkName) throws IOException {
116120
Log.writeLog(this, "meta file does not exist / set up: " + this.metaFile);
117121
if(!this.metaFile.getParentFile().exists()) {
118122
this.metaFile.getParentFile().mkdirs();
119-
Log.writeLog(this, "parent folder created: " + this.messageFile.getParentFile().exists());
123+
//Log.writeLog(this, "parent folder created: " + this.messageFile.getParentFile().exists());
120124
}
121125
this.metaFile.createNewFile();
122126
} else {
@@ -361,22 +365,83 @@ private boolean readMetaData(File metaFile) throws IOException {
361365
return true;
362366
}
363367

364-
private void writeMetaData(File metaFile) throws IOException {
368+
private void writeMetaData(File file2writeMetaData) throws IOException {
365369
// write data to metafile
366-
DataOutputStream dos = new DataOutputStream(new FileOutputStream(metaFile));
370+
/*
371+
if(file2writeMetaData.exists()) {
372+
if(file2writeMetaData.getAbsolutePath().contains("ultihopTests/Alice_42/1/sha")) {
373+
Log.writeLog(this, this.toString(), "\nDEBUGGING_Multihop_Bug #1: " +
374+
"\nfile2WriteMetaData:" + file2writeMetaData.getAbsolutePath() +
375+
"\nexists:" + file2writeMetaData.exists() +
376+
"\ncanWrite:" + file2writeMetaData.canWrite()
377+
);
378+
}
379+
this.metaFile.delete();
380+
this.metaFile.createNewFile();
381+
}
382+
*/
367383

368-
// do it as first element - shure how many bytes we read..
369-
ASAPSerialization.writeASAPHopList(this.hopList, dos);
370-
371-
dos.writeUTF(this.uri);
372-
dos.writeUTF(this.getExtraAsString());
373-
dos.writeUTF(SerializationHelper.collection2String(this.recipients));
374-
dos.writeUTF(SerializationHelper.collection2String(this.deliveredTo));
384+
try {
385+
/*
386+
if(file2writeMetaData.getAbsolutePath().contains("ultihopTests/Alice_42/1/sha")) {
387+
Log.writeLog(this, this.toString(), "\nDEBUGGING_Multihop_Bug #1: open:" +
388+
"\nfile2WriteMetaData:" + file2writeMetaData.getAbsolutePath() +
389+
"\nexists:" + file2writeMetaData.exists() +
390+
"\ncanWrite:" + file2writeMetaData.canWrite()
391+
);
392+
}
393+
*/
394+
FileOutputStream fos = new FileOutputStream(file2writeMetaData);
395+
Log.writeLog(this, this.toString(), "\\nDEBUGGING_Multihop_Bug: write meta data to:" +
396+
"\nfile2WriteMetaData:" + file2writeMetaData.getAbsolutePath() +
397+
"\nexists:" + file2writeMetaData.exists() +
398+
"\ncanWrite:" + file2writeMetaData.canWrite()
399+
);
400+
DataOutputStream dos = new DataOutputStream(fos);
375401

376-
// write offsetList
377-
dos.writeUTF(this.messageStartOffsetListAsString());
378-
379-
dos.close();
402+
// do it as first element - shure how many bytes we read..
403+
ASAPSerialization.writeASAPHopList(this.hopList, dos);
404+
405+
dos.writeUTF(this.uri);
406+
dos.writeUTF(this.getExtraAsString());
407+
dos.writeUTF(SerializationHelper.collection2String(this.recipients));
408+
dos.writeUTF(SerializationHelper.collection2String(this.deliveredTo));
409+
410+
// write offsetList
411+
dos.writeUTF(this.messageStartOffsetListAsString());
412+
413+
fos.close();
414+
dos.close();
415+
}
416+
catch(IOException ioe) {
417+
// TODO: debugging code
418+
Log.writeLog(this, this.toString(), "\nDEBUGGING_Multihop_Bug #3: file2WriteMetaData:" +
419+
"\nfile2WriteMetaData:" + file2writeMetaData.getAbsolutePath() +
420+
"\nexists:" + file2writeMetaData.exists() +
421+
"\ncanWrite:" + file2writeMetaData.canWrite());
422+
String fname = new StringTokenizer(ioe.getLocalizedMessage()).nextToken();
423+
Log.writeLog(this, this.toString(), "\nDEBUGGING_Multihop_Bug #4: not found" +
424+
"\nfile2WriteMetaData:" + file2writeMetaData.getAbsolutePath());
425+
File fNotFound = new File(fname);
426+
Log.writeLog(this, this.toString(), "\nDEBUGGING_Multihop_Bug #5: file not found" +
427+
"\nfile2WriteMetaData:" + fNotFound.getAbsolutePath() +
428+
"\nexists:" + fNotFound.exists() +
429+
"\ncanWrite:" + fNotFound.canWrite());
430+
System.out.flush();
431+
try {
432+
// debugging output
433+
Thread.sleep(10);
434+
} catch (InterruptedException e) {
435+
//throw new RuntimeException(e);
436+
}
437+
Log.writeLog(this, this.toString(), "DEBUGGING_Multihop_Bug - try write again");
438+
FileOutputStream fos = new FileOutputStream(fNotFound);
439+
fos.write(42);
440+
// never reaches that point
441+
Log.writeLog(this, this.toString(), "DEBUGGING_Multihop_Bug - wrote");
442+
443+
throw ioe;
444+
}
380445
}
381446

382447
private String messageStartOffsetListAsString() {

src/main/java/net/sharksystem/fs/FSUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public static void removeFolder(String eraPathName) {
3434
}
3535

3636
dir.delete();
37-
dir.deleteOnExit();
37+
//dir.deleteOnExit();
3838
try {
3939
Thread.sleep(1); // give file system a moment
4040
} catch (InterruptedException e) {

src/main/java/net/sharksystem/utils/testsupport/TestHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ public class TestHelper {
88
public static int portNumber = 4444;
99

1010
public static int getPortNumber() {
11-
return portNumber++;
11+
portNumber++;
12+
//System.out.println(">>>>>>>>>>>>>>>> portnumber: " + portNumber);
13+
return portNumber;
1214
}
1315

1416
public static String getFullTempFolderName(String fullRootFolderName, boolean increment) {

src/test/java/net/sharksystem/V1TestSuite.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
ConnectPeers.class, //
3232
//MultipleEncounterTests.class
3333
//E2EStreamPairLinkTestVersion2.class TODO
34+
3435
})
3536
public class V1TestSuite {
3637

src/test/java/net/sharksystem/asap/engine/MultihopTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,10 @@ public void asapRoutingIsFiniteAndCheckEra() throws IOException, ASAPException,
419419
System.out.println("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
420420
alicePeer.startEncounter(TestHelper.getPortNumber(), claraPeer);
421421
// give your app a moment to process
422-
Thread.sleep(1000);
422+
Thread.sleep(500);
423423
alicePeer.stopEncounter(claraPeer);
424-
Thread.sleep(1000);
424+
Thread.sleep(500);
425+
//Thread.sleep(60*1000);
425426
Assert.assertEquals(1, claraListener.numberOfMessages);
426427

427428
// Alice:1->2 new connection after new data added to channel.

0 commit comments

Comments
 (0)