Hi John,

On Apr 9, 2010, at 10:44 AM, John Knutson wrote:

> I'm currently in the process of trying to develop a data archive storage
> system for GPS data that is being received, and needs to be stored in
> real-time.
> 
> The storage doesn't seem to be that big of a problem.  The problem comes
> when we have applications that also need to be able to read that data in
> real-time.  I've been reading the documentation and doing some
> experimenting but haven't succeeded in coming up with a workable
> implementation.
> 
> First, doing a reopen where compression is involved has resulted in
> decompression errors.  That's not overly surprising but it'd be nice to
> be able to support compression and data following (along the same lines
> as tail -f) at the same time if at all possible.
> 
> Second, when I did do a reopen, I still never saw any of the new data
> updates.  Is the only way I'm going to be able to achieve this by
> closing and opening the file again, or is there a smarter way to do this?
> 
> Third, I'm using packet tables of compound data objects, due to the
> complexity of the data being stored.
> 
> Here's a bit of the code that I've been trying to implement (hopefully
> it's not excessive for the list):

        Currently, the HDF5 library doesn't support multiple processes 
accessing the same file, where 1+ of those processes is writing/modifying the 
file.  We are going to have some form of single-writer/multiple-reader access 
in the next major release, but it's still too early to make snapshots of this 
feature for external testing.

        Quincey

> #pragma ident "$Id: $"
> 
> /* This program is an attempt to determine the behavior of HDF when
> * you have multi-process access.  One writes, one reads.  Also there
> * will be an attempt to implement file following */
> 
> #include <unistd.h>
> #include <iostream>
> #include <H5Cpp.h>
> #include "Exception.hpp"
> #include "H5PacketTable.h"
> #include "MSNArchive.hpp"
> #include "PointerKiller.hpp"
> 
> using namespace std;
> 
> 
> // create and write to the file
> class ParentProcess
> {
> public:
>  ParentProcess()
>        : archive("archive.h5", H5F_ACC_TRUNC)
>  {
>        // make sure we immediately get the superblock written to the file.
>     archive.flush(H5F_SCOPE_GLOBAL);
>  }
> 
>  void parentProcess()
>  {
>     FL_PacketTable
> *navTable(msnh5::MSNArchive::openOrCreatePT(archive,
> msnh5::MSNArchive::ttNav200_2Table));
>     sglstd::PointerKiller<FL_PacketTable> pknt(navTable);
> 
>     while (true)
>     {
>        msnh5::NavBits200_2Type::Data data;
>        data.storeTime = gpstk::DayTime();
> 
>        if (navTable->AppendPacket((void*)(&data)) < 0)
>           cerr << "failed to append nav packet" << endl;
>        else
>        {
>           ostringstream s;
>           s << "parent wrote packet stamped @ " << data.storeTime.year
>             << "/" << data.storeTime.doy << "/" << data.storeTime.sod
>             << endl;
>           cerr << s.str();
>        }
> 
>        archive.flush(H5F_SCOPE_GLOBAL);
>        sleep(6);
>     }
>  }
> 
>  H5::H5File archive;
> };
> 
> class ChildProcess
> {
> public:
>  ChildProcess()
>        : archive("archive.h5", H5F_ACC_RDONLY)
>  {
>  }
> 
>  void childProcess()
>  {
>     int rc = 0;
>     hsize_t index = 0;
>     int err = 0;
> 
>     while (true)
>     {
>        msnh5::NavBits200_2Type::Data data;
>        FL_PacketTable
> *navTable(msnh5::MSNArchive::openOrCreatePT(archive,
> msnh5::MSNArchive::ttNav200_2Table));
>        sglstd::PointerKiller<FL_PacketTable> pknt(navTable);
> 
>        while ((rc = navTable->GetNextPacket(&data)) >= 0)
>        {
>           ostringstream s;
>           s << "child Read packet stamped @ " << data.storeTime.year
>             << "/" << data.storeTime.doy << "/" << data.storeTime.sod
>             << endl;
>           cerr << s.str();
>        }
> 
>        sleep(1);
> 
>        archive.reopen();
>     }
>  }
> 
>  H5::H5File archive;
> };
> 
> int main(int argc, char *argv[])
> {
>  msnh5::MSNArchive::initialize();
> //   H5::Exception::dontPrint();
> 
>  pid_t pid = fork();
> 
>  if (pid == 0)
>  {
>     cerr << "I'm the child" << endl;
>     sleep(10);
> 
>     ChildProcess cp;
> 
>     cp.childProcess();
>  }
>  else if (pid > 0)
>  {
>     cerr << "I'm the parent of child pid " << pid << endl;
>     ParentProcess pp;
> 
>     pp.parentProcess();
>  }
>  else if (pid < 0)
>  {
>     perror("fork");
>  }
> 
>  return 0;
> }
> 
> 
> _______________________________________________
> Hdf-forum is for HDF software users discussion.
> [email protected]
> http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org


_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org

Reply via email to