Skip to content
Snippets Groups Projects
Commit a73a143a authored by Ger van Diepen's avatar Ger van Diepen
Browse files

Bug 1207:

Improved for real mwimager usage
parent aa881936
No related branches found
No related tags found
No related merge requests found
......@@ -24,7 +24,7 @@ namespace LOFAR { namespace CEP {
/// It tells the name of the node and which file systems it has access to.
///
/// Currently the information is made persistent in a LOFAR .parset file.
/// In the future it needs to use the Centrol Processor Resource Manager.
/// In the future it needs to use the Central Processor Resource Manager.
class NodeDesc
{
......@@ -40,9 +40,9 @@ namespace LOFAR { namespace CEP {
void setName (const std::string& name)
{ itsName = name; }
/// Add a file system it has access to.
void addFileSys (const std::string& fsName)
{ itsFileSys.push_back (fsName); }
/// Add a file system the node has access to.
// A possible leading /auto is removed from the mountPoint.
void addFileSys (const std::string& fsName, const string& mountPoint);
/// Write it in parset format.
void write (std::ostream& os, const std::string& prefix) const;
......@@ -55,9 +55,20 @@ namespace LOFAR { namespace CEP {
const std::vector<std::string>& getFileSys() const
{ return itsFileSys; }
/// Get the mount points of the file systems.
const std::vector<std::string>& getMountPoints() const
{ return itsMounts; }
// Find the file system a file is on.
// The file must be given with its absolute file name.
// It does it by comparing the mount points with the leading part
// of the file name.
std::string findFileSys (const std::string& fileName) const;
private:
std::string itsName; //# full name of the node
std::vector<std::string> itsFileSys; //# name of file systems
std::string itsName; //# full name of the node
std::vector<std::string> itsFileSys; //# names of file systems
std::vector<std::string> itsMounts; //# and their mount points
};
}} /// end namespaces
......
......@@ -7,6 +7,7 @@
#include <MWCommon/NodeDesc.h>
#include <Common/StreamUtil.h>
#include <Common/LofarLogger.h>
#include <ostream>
namespace std {
......@@ -20,12 +21,83 @@ namespace LOFAR { namespace CEP {
{
itsName = parset.getString ("NodeName");
itsFileSys = parset.getStringVector ("NodeFileSys");
itsMounts = parset.getStringVector ("NodeMountPoints");
ASSERT (itsFileSys.size() == itsMounts.size());
for (uint i=0; i<itsMounts.size(); ++i) {
ASSERT (itsFileSys[i].size() > 0);
ASSERT (itsMounts[i].size() > 0 && itsMounts[i][0] == '/');
}
}
void NodeDesc::addFileSys (const string& fsName,
const string& mountPoint)
{
ASSERT (fsName.size() > 0);
string mp(mountPoint);
if (mp.size() > 5 && mp.substr(0,5) == "/auto") {
mp = mp.substr(5);
}
ASSERT (mp.size() > 0 && mp[0] == '/');
itsFileSys.push_back (fsName);
itsMounts.push_back (mp);
}
string NodeDesc::findFileSys (const string& fileName) const
{
// The file name must be absolute.
ASSERT (fileName.size() > 1 && fileName[0] == '/');
// Determine the max nr of parts in the mount point.
// Remember the root filesys (a single /).
int nrp = 0;
int rootfs = -1;
for (uint i=0; i<itsMounts.size(); ++i) {
int nr=0;
const string& str = itsMounts[i];
// A single / counts as no part.
if (str.size() == 1) {
rootfs = i;
} else {
for (uint j=0; j<str.size(); ++j) {
if (str[j] == '/') {
++nr;
}
}
}
if (nr > nrp) {
nrp = nr;
}
}
// Find the slashes in the file name for each part.
vector<int> pos(nrp, -1);
int nr = 0;
for (uint i=1; i<fileName.size() && nr<nrp; ++i) {
if (fileName[i] == '/') {
pos[nr++] = i;
}
}
// Now compare if it matches the file name.
// Start with the longest possible string.
for (int p=nr-1; p>=0; --p) {
string filePart = fileName.substr(0,pos[p]);
for (uint i=0; i<itsMounts.size(); ++i) {
if (filePart == itsMounts[i]) {
return itsFileSys[i];
}
}
}
// No match, so return root file system if there.
// Otherwise return empty string.
if (rootfs >= 0) {
return itsFileSys[rootfs];
}
return "";
}
void NodeDesc::write (ostream& os, const string& prefix) const
{
os << prefix << "NodeName = " << itsName << endl;
os << prefix << "NodeFileSys = " << itsFileSys << endl;
os << prefix << "NodeFileSys = " << itsFileSys << endl;
os << prefix << "NodeMountPoints = " << itsMounts << endl;
}
}} // end namespaces
......@@ -43,13 +43,13 @@ void doIt()
cl.setName ("cl");
NodeDesc node1;
node1.setName ("node1");
node1.addFileSys ("fs0");
node1.addFileSys ("fs1");
node1.addFileSys ("fs0", "/auto/fs0");
node1.addFileSys ("fs1", "/fs1");
cl.addNode (node1);
NodeDesc node2;
node2.setName ("node2");
node2.addFileSys ("fs1");
node2.addFileSys ("fs2");
node2.addFileSys ("fs1", "/auto/fs1");
node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2);
check(cl);
// Write into parset file.
......
......@@ -18,14 +18,20 @@ void check (const NodeDesc& node)
ASSERT (node.getFileSys().size() == 2);
ASSERT (node.getFileSys()[0] == "fs0");
ASSERT (node.getFileSys()[1] == "fs1");
ASSERT (node.getMountPoints()[0] == "/fs0/fs1");
ASSERT (node.getMountPoints()[1] == "/fs1");
ASSERT (node.findFileSys ("/fs1/abc") == "fs1");
ASSERT (node.findFileSys ("/fs0/fs1/abc") == "fs0");
ASSERT (node.findFileSys ("/fs0/abc") == "");
}
void doIt()
{
NodeDesc node;
node.setName ("node1");
node.addFileSys ("fs0");
node.addFileSys ("fs1");
node.addFileSys ("fs0", "/auto/fs0/fs1");
node.addFileSys ("fs1", "/fs1");
check(node);
// Write into parset file.
ofstream fos("tNodeDesc_tmp.fil");
......@@ -36,6 +42,11 @@ void doIt()
check(node2);
node = node2;
check(node);
// Chck that findFileSys handles a single / correctly.
node.addFileSys ("fs2", "/");
ASSERT (node.findFileSys ("/fs1/abc") == "fs1");
ASSERT (node.findFileSys ("/fs0/fs1/abc") == "fs0");
ASSERT (node.findFileSys ("/fs0/abc") == "fs2");
}
int main()
......
......@@ -19,19 +19,19 @@ void doIt1()
cl.setName ("cl");
NodeDesc node0;
node0.setName ("node0");
node0.addFileSys ("fs0");
node0.addFileSys ("fs1");
node0.addFileSys ("fs0", "/fs0");
node0.addFileSys ("fs1", "/fs1");
cl.addNode (node0);
NodeDesc node1;
node1.setName ("node1");
node1.addFileSys ("fs1");
node1.addFileSys ("fs2");
node1.addFileSys ("fs1", "/fs1");
node1.addFileSys ("fs2", "/fs2");
cl.addNode (node1);
NodeDesc node2;
node2.setName ("node2");
node2.addFileSys ("fs0");
node2.addFileSys ("fs1");
node2.addFileSys ("fs2");
node2.addFileSys ("fs0", "/fs0");
node2.addFileSys ("fs1", "/fs1");
node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2);
WorkersDesc wdesc(cl);
// Now define all workers which can perform 2 work types.
......@@ -80,15 +80,15 @@ void doIt2()
cl.setName ("cl");
NodeDesc node0;
node0.setName ("node0");
node0.addFileSys ("fs0");
node0.addFileSys ("fs0", "/fs0");
cl.addNode (node0);
NodeDesc node1;
node1.setName ("node1");
node1.addFileSys ("fs1");
node1.addFileSys ("fs1", "/fs1");
cl.addNode (node1);
NodeDesc node2;
node2.setName ("node2");
node2.addFileSys ("fs2");
node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2);
WorkersDesc wdesc(cl);
// Now define all workers which can perform 2 work types.
......
......@@ -2,5 +2,7 @@ ClusterName = cl
NNodes = 2
Node0.NodeName = node1
Node0.NodeFileSys = [node1:/usr]
Node0.NodeMountPoints = [/usr]
Node1.NodeName = node2
Node1.NodeFileSys = [node1:/usr]
Node1.NodeMountPoints = [/usr]
......@@ -2,5 +2,7 @@ ClusterName = cl
NNodes = 2
Node0.NodeName = node1
Node0.NodeFileSys = [node1:/usr]
Node0.NodeMountPoints = [/usr]
Node1.NodeName = node2
Node1.NodeFileSys = [node1:/usr]
Node1.NodeMountPoints = [/usr]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment