IO::Journal - Perl module providing durable transaction-oriented I/O
Version 0.2 ($Id: Journal.pm 8239 2009-07-26 03:28:55Z FREQUENCY@cpan.org $)
To ensure reliability, some file systems and databases provide support for something known as journalling. The idea is to ensure data consistency by creating a log of actions to be taken (called a Write Ahead Log) before committing them to disk. That way, if a transaction were to fail due to a system crash or other unexpected event, the write ahead log could be used to finish writing the data.
While this functionality is often available with networked databases, it can be a rather memory- and processor-intensive solution, even where reliable writes are important. In other cases, the filesystem does not provide native journalling support, so other tricks may be used to ensure data integrity, such as writing to a separate temporary file and then overwriting the file instead of modifying it in-place. Unfortunately, this method cannot handle threaded operations appropriately.
Thankfully, Alberto Bertogli published a userspace C library called libjio that can provide these features in a small (less than 1500 lines of code) library with no external dependencies.
This module is currently a preview release. Please, please, PLEASE don't use it for production use yet, until all the kinks have been found and sorted out.
use IO::Journal; my $journal = IO::Journal->open('>', 'filename.txt'); # Start a new transaction my $trans = $journal->begin_transaction(); $trans->syswrite("Hello"); $trans->syswrite("World\n"); $trans->commit; # File now contains "Hello World\n" $trans->rollback; # File is now blank
This module was tested under Perl 5.10.0, using Debian Linux. It provides some convenience methods similar to
IO::Handle, but most of the work is based on libjio, which may be installed automatically during this module's build process through
If you encounter any problems on a different version or architecture, please contact the maintainer.
IO::Journal object on top of libjio's file handle system (an opaque
jfs_t struct). This method opens the given file referenced by
filename using the given Perl-like
mode string, which behaves similarly to Perl's standard
Note that, unlike Perl's open, this method does not support the one-parameter variant where a mode and filename are specified in the same string.
my $journal = IO::Journal->open('>>', 'filename');
This method will return an appropriate IO::Journal::Transaction object or throw an exception on error.
This method starts a new transaction, which is essentially the same as libjio's
jtrans_new function. In order to understand how to work with transactions, you'll need to look at IO::Journal::Transaction.
For now, this is really just a nicer way of constructing a new Transaction object, similar in nature to:
my $trans = IO::Journal::Transaction->new($journal); # looks messier & is longer to type than my $trans = $journal->begin_transaction();
It returns a newly created IO::Journal::Transaction object, or throws an exception on error.
This function is the same as open, but is instead closer to the usual Unix system call, requiring a set of octal flags (those provided by fcntl.h and exposed to Perl in Fcntl).
As a result, it's much less convenient than using
open and doesn't have as much error checking either, since it's implemented completely in XS.
One useful feature of sysopen is that it optionally supports giving an octal specification of permissions to use in case the file doesn't yet exist. By default, new files are created with the permissions 0666 (rw-rw-rw-) but the actual file created will vary based on your running
Jonathan Yu <email@example.com>
Your name here ;-)
You can find documentation for this module with the perldoc command.
You can also look for information at:
You can access the most recent development version of this module at:
If you are a CPAN developer and would like to make modifications to the code base, please contact Adam Kennedy <firstname.lastname@example.org>, the repository administrator. I only ask that you contact me first to discuss the changes you wish to make to the distribution.
Please send relevant comments, rotten tomatoes and suggestions directly to the maintainer noted above.
If you have a bug report or feature request, please file them on the CPAN Request Tracker at http://rt.cpan.org. If you are able to submit your bug report in the form of failing unit tests, you are strongly encouraged to do so. Regular bug reports are always accepted and appreciated via the CPAN bug tracker.
Alien::Libjio, a Perl module for installing and finding libjio.
http://blitiri.com.ar/p/libjio/, Alberto Bertogli's page about libjio, which explains the purpose and features of libjio.
I have never developed an IO:: type module before this one, so I'm not completely aware of the interfaces yet. I hope to make it compatible with conventional interfaces like IO::Handle, but I might make a mistake.
There are no known bugs as of this release.
In a perfect world, I could just say that this package and all of the code it contains is Public Domain. It's a bit more complicated than that; you'll have to read the included LICENSE file to get the full details.
The software is provided "AS IS", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.