Skip to content
Snippets Groups Projects
Commit 52d5e4e8 authored by Pascal Pieper's avatar Pascal Pieper
Browse files

Test now has an intermediateFile information to decide when it is allowed to...

Test now has an intermediateFile information to decide when it is allowed to have either appended (or deleted) a file or not
parent 3b7c18e1
No related branches found
No related tags found
No related merge requests found
......@@ -32,7 +32,7 @@ namespace paffs{
static constexpr uint8_t treeNodeCacheSize = 5; //max. 1,5 * dataBytesPerPage(TreeNode) Bytes per Entry
static constexpr uint8_t areaSummaryCacheSize = 16; //Currently 2 Bit per dataPagesPerArea
static constexpr uint8_t maxNumberOfDevices = 1;
static constexpr uint8_t maxNumberOfInodes = 10; //limits simultaneously open files/folders excluding duplicates
static constexpr uint8_t maxNumberOfFiles = 10; //limits simultaneously open files including duplicates
static constexpr uint8_t maxNumberOfInodes = 20; //limits simultaneously open files/folders excluding duplicates
static constexpr uint8_t maxNumberOfFiles = 20; //limits simultaneously open files including duplicates
static constexpr uint16_t maxPagesPerWrite = 256; //limits the size of a single write to a file or folder
}
......@@ -34,7 +34,7 @@ class Powerloss : public Test{
static constexpr unsigned int maxChangesUntilPowerloss = 200000;
unsigned int filesize[numberOfFiles];
unsigned int filesizeBackup[numberOfFiles];
int intermediateFile = -1;
unsigned long accesses = 0;
unsigned long powerlosses = 0;
......@@ -88,11 +88,11 @@ public:
exitAndRedo = true;
changesUntilNextPowerloss = dis(gen);
//backup memories
memcpy(filesizeBackup, filesize, sizeof(unsigned int) * numberOfFiles);
ofstream es(filesizefil, ios::out | ios::binary);
es.write(reinterpret_cast<char*>(filesize), sizeof(unsigned int) * numberOfFiles);
es.write(reinterpret_cast<char*>(&accesses), sizeof(unsigned int));
es.write(reinterpret_cast<char*>(&powerlosses), sizeof(unsigned int));
es.write(reinterpret_cast<char*>(&intermediateFile), sizeof(int));
es.close();
ofstream ef(flashfile, ios::out | ios::binary);
mFCs.front()->getDebugInterface()->serialize(ef);
......@@ -100,29 +100,6 @@ public:
ofstream em(mramfile, ios::out | ios::binary);
mMrams.front()->serialize(em);
em.close();
//FIXME DEBUG
//debug
/* printf("\n\nDEBUG: sumCache prePowerloss\n");
static_cast<paffs_IF*>(fsif)->getPaffs()->getDevice(0)->sumCache.printStatus();
AreaManagement* areaMgmt = &static_cast<paffs_IF*>(fsif)->getPaffs()->getDevice(0)->areaMgmt;
printf("Info: \n\t%" PTYPE_AREAPOS " used Areas\n", areaMgmt->getUsedAreas());
for (AreaPos i = 0; i < areasNo; i++)
{
printf("\tArea %3" PTYPE_AREAPOS " on %4" PTYPE_AREAPOS " as %10s %s\n",
i,
areaMgmt->getPos(i),
areaNames[areaMgmt->getType(i)],
areaStatusNames[areaMgmt->getStatus(i)]);
if (i > 128)
{
printf("\n -- truncated 128-%" PTYPE_AREAPOS " Areas.\n", areasNo);
break;
}
}
printf("\t----------------------\n");*/
//FIXME DEBUG
}
}
......@@ -163,10 +140,44 @@ public:
fsif->f_stat(filename.c_str(), &info);
if(info.fsize != filesize[file])
{
if(!silent) fprintf(stderr, "\nFile %u of different size (was %lu, should %u)\n",
file, info.fsize, filesize[file]);
fsif->f_close(&fd);
return -1;
if(intermediateFile == static_cast<int>(file))
{ //We may or may not have succeeded with the operation
if(filesize[file] >= maxFilesize)
{ //We were about to delete this file
if(info.fsize == 0)
{ //we succeeded
filesize[file] = 0;
}
else
{ //We did not, but also not equal to former size?
if(!silent) fprintf(stderr, "\nFile %u of different size (was %lu, should %u or 0)\n",
file, info.fsize, filesize[file]);
fsif->f_close(&fd);
return -1;
}
}
else
{ //we were about to append to this file
if(info.fsize == filesize[file] + blocksize)
{ //Success
filesize[file] += blocksize;
}
else
{ //Something different
if(!silent) fprintf(stderr, "\nFile %u of different size (was %lu, should %u or %u)\n",
file, info.fsize, filesize[file], filesize[file] + blocksize);
fsif->f_close(&fd);
return -1;
}
}
}
else
{
if(!silent) fprintf(stderr, "\nFile %u of different size (was %lu, should %u)\n",
file, info.fsize, filesize[file]);
fsif->f_close(&fd);
return -1;
}
}
int ret = fsif->f_open(&fd, filename.c_str(), FSIF_READ);
......@@ -251,10 +262,10 @@ public:
}
fsif->f_close(&fd);
//This is a bit complicated, because it may or may not be deleted
//If we break before or after the initial deletion log entry.
filesize[fileNo] = 0;
intermediateFile = fileNo;
ret = fsif->f_delete(filename.c_str());
filesize[fileNo] = 0;
intermediateFile = -1;
if(ret != 0)
{
if(!silent) fprintf(stderr, "\nFile %u could not be deleted!\nError: %s\n", fileNo, fsif->f_getLastError());
......@@ -274,6 +285,7 @@ public:
generateTestpattern(data, filename.c_str(), filename.length(), blocksize);
unsigned int bw;
intermediateFile = fileNo;
ret = fsif->f_write(&fd, data, blocksize, &bw);
if(ret != 0 || bw != blocksize)
{
......@@ -282,6 +294,7 @@ public:
return ret;
}
filesize[fileNo] += bw;
intermediateFile = -1;
fsif->f_close(&fd);
}
return 0;
......@@ -309,12 +322,8 @@ public:
ins.read(reinterpret_cast<char*>(filesize), sizeof(unsigned int) * numberOfFiles);
ins.read(reinterpret_cast<char*>(&accesses), sizeof(unsigned int));
ins.read(reinterpret_cast<char*>(&powerlosses), sizeof(unsigned int));
ins.read(reinterpret_cast<char*>(&intermediateFile), sizeof(int));
ins.close();
printf("Filesize:\n");
for(unsigned i = 0; i < numberOfFiles; i++)
{
printf("%3u: %4u Byte\n", i, filesize[i]);
}
TraceMask bkp = traceMask;
traceMask = (traceMask & ~PAFFS_WRITE_VERIFY_AS) |
PAFFS_TRACE_DEVICE |
......@@ -322,13 +331,13 @@ public:
PAFFS_TRACE_JOURNAL |
PAFFS_TRACE_ASCACHE |
PAFFS_TRACE_PACACHE |
PAFFS_TRACE_VERIFY_DEV |
PAFFS_TRACE_PAGESTATEM |
PAFFS_TRACE_VERBOSE;
fsif->mount();
traceMask = bkp;
}
}
while(true)
{
enableCallback();
......@@ -346,7 +355,12 @@ public:
//Restore memories to the point its access was done
// Deserialize
memcpy(filesize, filesizeBackup, sizeof(unsigned int) * numberOfFiles);
ifstream ins(filesizefil, ios::in | ios::binary);
ins.read(reinterpret_cast<char*>(filesize), sizeof(unsigned int) * numberOfFiles);
ins.read(reinterpret_cast<char*>(&accesses), sizeof(unsigned int));
ins.read(reinterpret_cast<char*>(&powerlosses), sizeof(unsigned int));
ins.read(reinterpret_cast<char*>(&intermediateFile), sizeof(int));
ins.close();
ifstream inf(flashfile, ios::in | ios::binary);
mFCs.front()->getDebugInterface()->deserialize(inf);
inf.close();
......@@ -360,6 +374,7 @@ public:
PAFFS_TRACE_JOURNAL |
PAFFS_TRACE_ASCACHE |
PAFFS_TRACE_PACACHE |
PAFFS_TRACE_VERIFY_DEV |
PAFFS_TRACE_PAGESTATEM |
PAFFS_TRACE_VERBOSE;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment