Search code examples
javascriptnode.jsraspberry-piraspbianraspberry-pi3

Node.js filesystem save file error 56 EROFS while saving every 2 seconds


I am running node.js on raspbian and trying to save/update a file every 2/3 seconds using the following code:

var saveFileSaving = false;

function loop() {
    mainLoop = setTimeout(function() {
        // update data

        saveSaveFile(data, function() {
            //console.log("Saved data to file");
            loop();
        });
    }, 1500);
}

function saveSaveFile(data, callback) {
    if(!saveFileSaving) {
        saveFileSaving = true;
        var wstream = fs.createWriteStream(path.join(__dirname, 'save.json'));

        wstream.on('finish', function () {
            saveFileSaving = false;
            callback(data);
        });

        wstream.on('error', function (error) {
            console.log(error);
            saveFileSaving = false;
            wstream.end();
            callback(null);
        });

        wstream.write(JSON.stringify(data));
        wstream.end();
    } else {
        callback(null);
    }
}

When I run this it works fine for an hour then starts spitting out:

[25/May/2016 11:3:4 am]  { [Error: EROFS, open '<path to file>']
  errno: 56,
  code: 'EROFS',
  path: '<path to file>' }

I have tried jsonfile plugin which also sends out a similiar write error after an hour.

I have tried both fileSystem.writeFile and fileSystem.writeFileSync both give the same error after an hour.

I was thinking it had to do with the handler not being let go before a new save occurs which is why I started using the saveFileSaving flag.

Resetting the system via hard reset fixes the issue (soft reset does not work as the system seems to be locked up).

Any suggestions guys? I have searched the web and so only found one other question slightly similar from 4 years ago which was left in limbo.

Note: I am using the callback function from the code to continue with the main loop.


Solution

  • I was able to get this working by unlinking the file and saving the file every time I save while it is not pretty it works and shouldn't cause too much overhead.

    I also added a backup solution which saves a backup every 5 minutes in case the save file has issues.

    Thank you for everyone's help.