From a503f46a12be1de8c4dc4c8702e5d3dbf001b0bf Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Mon, 14 Mar 2016 13:31:52 +0000
Subject: [PATCH] Task #9052: Create MS data files outside MS structure, and
 move them in after MS structure has been created

---
 .../OutputProc/src/MSWriterCorrelated.cc       | 18 +++++++++++++++---
 .../OutputProc/src/MeasurementSetFormat.cc     |  5 ++++-
 RTCP/Cobalt/OutputProc/test/tSubbandWriter.cc  | 14 ++++++--------
 3 files changed, 25 insertions(+), 12 deletions(-)

diff --git a/RTCP/Cobalt/OutputProc/src/MSWriterCorrelated.cc b/RTCP/Cobalt/OutputProc/src/MSWriterCorrelated.cc
index 52004bb85dc..d57c038002e 100644
--- a/RTCP/Cobalt/OutputProc/src/MSWriterCorrelated.cc
+++ b/RTCP/Cobalt/OutputProc/src/MSWriterCorrelated.cc
@@ -24,6 +24,7 @@
 
 #include <sys/types.h>
 #include <fcntl.h>
+#include <cstdio>
 #include <boost/format.hpp>
 #include <boost/lexical_cast.hpp>
 
@@ -47,7 +48,8 @@ namespace LOFAR
 
     MSWriterCorrelated::MSWriterCorrelated (const std::string &logPrefix, const std::string &msName, const Parset &parset, unsigned subbandIndex)
       :
-      MSWriterFile(str(format("%s/table.f0data") % msName)),
+      // Write the data to a temporary file, until we have a MeasurementSet we can move it into.
+      MSWriterFile(str(format("%s-table.f0data") % msName)),
       itsLogPrefix(logPrefix),
       itsMSname(msName),
       itsParset(parset),
@@ -60,7 +62,7 @@ namespace LOFAR
 
       // Create Sequence file
       if (LofarStManVersion > 1) {
-        string seqfilename = str(format("%s/table.f0seqnr") % msName);
+        string seqfilename = str(format("%s-table.f0seqnr") % msName);
 
         try {
           itsSequenceNumbersFile = new FileStream(seqfilename, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
@@ -73,7 +75,7 @@ namespace LOFAR
 
     void MSWriterCorrelated::init()
     {
-      // Creaate MeasurementSet
+      // Create MeasurementSet
 #if defined HAVE_AIPSPP
       MeasurementSetFormat myFormat(itsParset, 512);
 
@@ -81,6 +83,16 @@ namespace LOFAR
 
       LOG_DEBUG_STR(itsLogPrefix << "MeasurementSet created");
 #endif // defined HAVE_AIPSPP
+
+      // Move data file into the measurement set
+      if (rename(str(format("%s-table.f0data") % itsMSname).c_str(),
+                 str(format("%s/table.f0data") % itsMSname).c_str()) < 0)
+        THROW_SYSCALL(str(format("rename(%s-table.f0data, %s/table.f0data)") % itsMSname % itsMSname));
+
+      // Move sequence file into the measurement set
+      if (rename(str(format("%s-table.f0seqnr") % itsMSname).c_str(),
+                 str(format("%s/table.f0seqnr") % itsMSname).c_str()) < 0)
+        THROW_SYSCALL(str(format("rename(%s-table.f0seqnr, %s/table.f0seqnr)") % itsMSname % itsMSname));
     }
 
 
diff --git a/RTCP/Cobalt/OutputProc/src/MeasurementSetFormat.cc b/RTCP/Cobalt/OutputProc/src/MeasurementSetFormat.cc
index fdaae7cf6f0..dac5383e4f9 100644
--- a/RTCP/Cobalt/OutputProc/src/MeasurementSetFormat.cc
+++ b/RTCP/Cobalt/OutputProc/src/MeasurementSetFormat.cc
@@ -126,7 +126,7 @@ namespace LOFAR
     {
       ScopedLock scopedLock(sharedMutex);
 
-      /// First create a valid MeasurementSet with all required
+      /// Create the MeasurementSet with all required
       /// tables. Note that the MS object is destroyed immediately.
       createMSTables(MSname, subband);
       /// Next make a metafile which describes the raw datafile we're
@@ -152,9 +152,12 @@ namespace LOFAR
         }
 
         SetupNewTable newtab(MSname, td, Table::New);
+
         LofarStMan lofarstman;
         newtab.bindAll(lofarstman);
 
+        // MSLofar() constructor needs a NEW table, to avoid checks
+        // for subtables that aren't yet there.
         itsMS = new MSLofar(newtab);
         itsMS->createDefaultSubtables(Table::New);
 
diff --git a/RTCP/Cobalt/OutputProc/test/tSubbandWriter.cc b/RTCP/Cobalt/OutputProc/test/tSubbandWriter.cc
index 527aa4449d4..24eee255d26 100644
--- a/RTCP/Cobalt/OutputProc/test/tSubbandWriter.cc
+++ b/RTCP/Cobalt/OutputProc/test/tSubbandWriter.cc
@@ -70,14 +70,14 @@ SUITE(SubbandWriter)
       ps.add("Observation.nrBeams",                                  "1");
       ps.add("Observation.Beam[0].subbandList",                      "[0]");
       ps.add("Observation.DataProducts.Output_Correlated.enabled",   "true");
-      ps.add("Observation.DataProducts.Output_Correlated.filenames", "[tWriter.out_raw]");
+      ps.add("Observation.DataProducts.Output_Correlated.filenames", "[tSubbandWriter.out_raw]");
       ps.add("Observation.DataProducts.Output_Correlated.locations", "[localhost:.]");
       ps.add("Cobalt.OutputProc.StaticMetaDataDirectory",            "tSubbandWriter.in_1");
       ps.updateSettings();
     }
 
     ~OneBeam() {
-      int dummy = system("rm -rf tWriter.out_raw");
+      int dummy = system("rm -rf tSubbandWriter.out_raw");
 
       (void)dummy; // satisfy compiler
     }
@@ -97,7 +97,6 @@ SUITE(SubbandWriter)
     {
 #     pragma omp section
       {
-        w.init();
         w.process();
       }
 
@@ -119,7 +118,7 @@ SUITE(SubbandWriter)
 
     // verify output
     {
-      FileStream f("tWriter.out_raw/table.f0data");
+      FileStream f("tSubbandWriter.out_raw/table.f0data");
 
       CorrelatedData data(ps.nrMergedStations(), ps.settings.correlator.nrChannels, ps.settings.correlator.nrSamplesPerIntegration(), heapAllocator, 512);
 
@@ -140,7 +139,6 @@ SUITE(SubbandWriter)
     {
 #     pragma omp section
       {
-        w.init();
         w.process();
       }
 
@@ -165,7 +163,7 @@ SUITE(SubbandWriter)
 
     // list failures BEFORE obs
     {
-      Table tab("tWriter.out_raw/LOFAR_ANTENNA_FIELD");
+      Table tab("tSubbandWriter.out_raw/LOFAR_ANTENNA_FIELD");
       ROArrayColumn<Bool> flagCol(tab, "ELEMENT_FLAG");
 
       if (flagCol.nrow() == 0) {
@@ -193,7 +191,7 @@ SUITE(SubbandWriter)
 
     // list failures DURING obs
     {
-      Table tab("tWriter.out_raw/LOFAR_ELEMENT_FAILURE");
+      Table tab("tSubbandWriter.out_raw/LOFAR_ELEMENT_FAILURE");
       ROTableRow row(tab);
 
 
@@ -216,7 +214,7 @@ SUITE(SubbandWriter)
 
 int main()
 {
-  INIT_LOGGER("tWriter");
+  INIT_LOGGER("tSubbandWriter");
 
   omp_set_nested(true);
 
-- 
GitLab