this might be over-engineered
This commit is contained in:
@ -16,12 +16,11 @@ using namespace returnvalue;
|
||||
|
||||
PersistentTmStore::PersistentTmStore(object_id_t objectId, const char* baseDir,
|
||||
std::string baseName, RolloverInterval intervalUnit,
|
||||
uint32_t intervalCount, timeval& currentTv,
|
||||
StorageManagerIF& tmStore, SdCardMountedIF& sdcMan)
|
||||
uint32_t intervalCount, StorageManagerIF& tmStore,
|
||||
SdCardMountedIF& sdcMan)
|
||||
: SystemObject(objectId),
|
||||
baseDir(baseDir),
|
||||
baseName(std::move(baseName)),
|
||||
currentTv(currentTv),
|
||||
sdcMan(sdcMan),
|
||||
tmStore(tmStore) {
|
||||
tcQueue = QueueFactory::instance()->createMessageQueue();
|
||||
@ -59,7 +58,7 @@ ReturnValue_t PersistentTmStore::assignAndOrCreateMostRecentFile() {
|
||||
}
|
||||
}
|
||||
if (not activeFile.has_value()) {
|
||||
return createMostRecentFile();
|
||||
return createMostRecentFile(std::nullopt);
|
||||
}
|
||||
return returnvalue::OK;
|
||||
}
|
||||
@ -77,6 +76,7 @@ ReturnValue_t PersistentTmStore::handleCommandQueue(StorageManagerIF& ipcStore,
|
||||
if (cmdMessage.getMessageType() == messagetypes::TM_STORE) {
|
||||
Command_t cmd = cmdMessage.getCommand();
|
||||
if (cmd == TmStoreMessage::DELETE_STORE_CONTENT_TIME) {
|
||||
Clock::getClock_timeval(¤tTv);
|
||||
store_address_t storeId = TmStoreMessage::getStoreId(&cmdMessage);
|
||||
auto accessor = ipcStore.getData(storeId);
|
||||
uint32_t deleteUpToUnixSeconds = 0;
|
||||
@ -85,6 +85,7 @@ ReturnValue_t PersistentTmStore::handleCommandQueue(StorageManagerIF& ipcStore,
|
||||
SerializeIF::Endianness::NETWORK);
|
||||
deleteUpTo(deleteUpToUnixSeconds);
|
||||
} else if (cmd == TmStoreMessage::DOWNLINK_STORE_CONTENT_TIME) {
|
||||
Clock::getClock_timeval(¤tTv);
|
||||
store_address_t storeId = TmStoreMessage::getStoreId(&cmdMessage);
|
||||
auto accessor = ipcStore.getData(storeId);
|
||||
if (accessor.second.size() < 8) {
|
||||
@ -147,6 +148,7 @@ ReturnValue_t PersistentTmStore::storePacket(PusTmReader& reader) {
|
||||
if (baseDirUninitialized) {
|
||||
updateBaseDir();
|
||||
}
|
||||
Clock::getClock_timeval(¤tTv);
|
||||
// It is assumed here that the filesystem is usable.
|
||||
if (not activeFile.has_value()) {
|
||||
ReturnValue_t result = assignAndOrCreateMostRecentFile();
|
||||
@ -155,21 +157,25 @@ ReturnValue_t PersistentTmStore::storePacket(PusTmReader& reader) {
|
||||
}
|
||||
}
|
||||
|
||||
if (currentTv.tv_sec < activeFileTv.tv_sec or
|
||||
currentTv.tv_sec - activeFileTv.tv_sec > static_cast<int>(rolloverDiffSeconds)) {
|
||||
if (file_size(activeFile.value()) + reader.getFullPacketLen() > fileBuf.size()) {
|
||||
uint8_t appendedCounter = 1;
|
||||
path rolloverName;
|
||||
while (true) {
|
||||
rolloverName = path(activeFile.value().string() + "." + std::to_string(appendedCounter));
|
||||
if (not exists(rolloverName)) {
|
||||
break;
|
||||
}
|
||||
appendedCounter++;
|
||||
}
|
||||
rename(activeFile.value(), rolloverName);
|
||||
std::ofstream of(activeFile.value(), std::ios::binary);
|
||||
bool createNewFile = false;
|
||||
std::optional<uint8_t> suffix = std::nullopt;
|
||||
if (currentTv.tv_sec > activeFileTv.tv_sec + static_cast<int>(rolloverDiffSeconds)) {
|
||||
createNewFile = true;
|
||||
currentSameSecNumber = 0;
|
||||
} else if (file_size(activeFile.value()) + reader.getFullPacketLen() > fileBuf.size()) {
|
||||
createNewFile = true;
|
||||
if (currentSameSecNumber >= MAX_FILES_IN_ONE_SECOND) {
|
||||
currentSameSecNumber = 0;
|
||||
}
|
||||
if (currentTv.tv_sec == activeFileTv.tv_sec) {
|
||||
suffix = currentSameSecNumber++;
|
||||
|
||||
} else {
|
||||
currentSameSecNumber = 0;
|
||||
}
|
||||
}
|
||||
if (createNewFile) {
|
||||
createMostRecentFile(currentSameSecNumber++);
|
||||
}
|
||||
|
||||
// Rollover conditions were handled, write to file now
|
||||
@ -311,7 +317,7 @@ void PersistentTmStore::fileToPackets(const std::filesystem::path& path, uint32_
|
||||
}
|
||||
}
|
||||
|
||||
ReturnValue_t PersistentTmStore::createMostRecentFile() {
|
||||
ReturnValue_t PersistentTmStore::createMostRecentFile(std::optional<uint8_t> suffix) {
|
||||
using namespace std::filesystem;
|
||||
unsigned currentIdx = 0;
|
||||
path pathStart = basePath / baseName;
|
||||
@ -329,9 +335,19 @@ ReturnValue_t PersistentTmStore::createMostRecentFile() {
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
currentIdx += writtenBytes;
|
||||
strncpy(reinterpret_cast<char*>(fileBuf.data() + currentIdx), ".bin",
|
||||
fileBuf.size() - currentIdx);
|
||||
char* res = strcpy(reinterpret_cast<char*>(fileBuf.data() + currentIdx), ".bin");
|
||||
if (res == nullptr) {
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
currentIdx += 4;
|
||||
if (suffix.has_value()) {
|
||||
std::string fullSuffix = "." + std::to_string(suffix.value());
|
||||
res = strcpy(reinterpret_cast<char*>(fileBuf.data() + currentIdx), fullSuffix.c_str());
|
||||
if (res == nullptr) {
|
||||
return returnvalue::FAILED;
|
||||
}
|
||||
currentIdx += fullSuffix.size();
|
||||
}
|
||||
|
||||
path newPath(std::string(reinterpret_cast<const char*>(fileBuf.data()), currentIdx));
|
||||
std::ofstream of(newPath, std::ios::binary);
|
||||
|
Reference in New Issue
Block a user