[ https://issues.apache.org/jira/browse/JCR-2819?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12966353#action_12966353 ]
Bernd Eckenfels commented on JCR-2819: -------------------------------------- > As you may know, there was a discussion about how a file system is supposed > to work It was new to me, that it finally got some attention, but it sounds limited to ext4 - and it sounds like it is only covering the "close/rename(replace)" not "close/rename(new)" case. But anyway... NTFS or XFS are other systems to cover. > In many systems (specially clustered environments) it doesn't make sense to > ensure the data is written to disk, because the system is anyway crash proof. I dont understand this. Do you mean a Jackrabit cluster? In that case as far as I know the File Datastore has no special replication feature and will crash. On hardware clusters Crashes are also possible. > it's important that the repository is in a consistent state The problem is, if the fsync was not happening you get empty files under a hash. Which means that the repository is not consistent anymore and all new documents with the same hash give you a collission alert. So it is a matter of consitency. I agree that it might not be needed to make fsync the default, but users who care about transactional safety should be able to find the switch. > FileDataStore not crash safe > ---------------------------- > > Key: JCR-2819 > URL: https://issues.apache.org/jira/browse/JCR-2819 > Project: Jackrabbit Content Repository > Issue Type: Bug > Components: jackrabbit-core > Affects Versions: 2.1.2 > Environment: All > Reporter: Bernd Eckenfels > Priority: Minor > Attachments: FileDataStore.patch > > > The FileDataStore.addRecord() does create a temporary file and rename it to > the final location. On a crash, this can result in a file which is renamed > but the content is still empty. This especially happens on systems where data > in the filesystem is not journaled. You can resolve this problem by calling > the fdsync() method of the operating system before renaming the file. > Typically in Java this is done by first flushing all the Java buffers (i.e. > calling flush() on the highest output stream), and then using the > getFD().sync(); method on the FileOutputStream. > Note: this introduced some delay/additional IO load on the system, therefore > I think it might be best to make it configurable. But I think in some > environments the additional reliability is badly needed. > Sample patch without configuration parameter added. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.