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 { ...@@ -24,7 +24,7 @@ namespace LOFAR { namespace CEP {
/// It tells the name of the node and which file systems it has access to. /// 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. /// 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 class NodeDesc
{ {
...@@ -40,9 +40,9 @@ namespace LOFAR { namespace CEP { ...@@ -40,9 +40,9 @@ namespace LOFAR { namespace CEP {
void setName (const std::string& name) void setName (const std::string& name)
{ itsName = name; } { itsName = name; }
/// Add a file system it has access to. /// Add a file system the node has access to.
void addFileSys (const std::string& fsName) // A possible leading /auto is removed from the mountPoint.
{ itsFileSys.push_back (fsName); } void addFileSys (const std::string& fsName, const string& mountPoint);
/// Write it in parset format. /// Write it in parset format.
void write (std::ostream& os, const std::string& prefix) const; void write (std::ostream& os, const std::string& prefix) const;
...@@ -55,9 +55,20 @@ namespace LOFAR { namespace CEP { ...@@ -55,9 +55,20 @@ namespace LOFAR { namespace CEP {
const std::vector<std::string>& getFileSys() const const std::vector<std::string>& getFileSys() const
{ return itsFileSys; } { 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: private:
std::string itsName; //# full name of the node std::string itsName; //# full name of the node
std::vector<std::string> itsFileSys; //# name of file systems std::vector<std::string> itsFileSys; //# names of file systems
std::vector<std::string> itsMounts; //# and their mount points
}; };
}} /// end namespaces }} /// end namespaces
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <MWCommon/NodeDesc.h> #include <MWCommon/NodeDesc.h>
#include <Common/StreamUtil.h> #include <Common/StreamUtil.h>
#include <Common/LofarLogger.h>
#include <ostream> #include <ostream>
namespace std { namespace std {
...@@ -20,12 +21,83 @@ namespace LOFAR { namespace CEP { ...@@ -20,12 +21,83 @@ namespace LOFAR { namespace CEP {
{ {
itsName = parset.getString ("NodeName"); itsName = parset.getString ("NodeName");
itsFileSys = parset.getStringVector ("NodeFileSys"); 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 void NodeDesc::write (ostream& os, const string& prefix) const
{ {
os << prefix << "NodeName = " << itsName << endl; os << prefix << "NodeName = " << itsName << endl;
os << prefix << "NodeFileSys = " << itsFileSys << endl; os << prefix << "NodeFileSys = " << itsFileSys << endl;
os << prefix << "NodeMountPoints = " << itsMounts << endl;
} }
}} // end namespaces }} // end namespaces
...@@ -43,13 +43,13 @@ void doIt() ...@@ -43,13 +43,13 @@ void doIt()
cl.setName ("cl"); cl.setName ("cl");
NodeDesc node1; NodeDesc node1;
node1.setName ("node1"); node1.setName ("node1");
node1.addFileSys ("fs0"); node1.addFileSys ("fs0", "/auto/fs0");
node1.addFileSys ("fs1"); node1.addFileSys ("fs1", "/fs1");
cl.addNode (node1); cl.addNode (node1);
NodeDesc node2; NodeDesc node2;
node2.setName ("node2"); node2.setName ("node2");
node2.addFileSys ("fs1"); node2.addFileSys ("fs1", "/auto/fs1");
node2.addFileSys ("fs2"); node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2); cl.addNode (node2);
check(cl); check(cl);
// Write into parset file. // Write into parset file.
......
...@@ -18,14 +18,20 @@ void check (const NodeDesc& node) ...@@ -18,14 +18,20 @@ void check (const NodeDesc& node)
ASSERT (node.getFileSys().size() == 2); ASSERT (node.getFileSys().size() == 2);
ASSERT (node.getFileSys()[0] == "fs0"); ASSERT (node.getFileSys()[0] == "fs0");
ASSERT (node.getFileSys()[1] == "fs1"); 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() void doIt()
{ {
NodeDesc node; NodeDesc node;
node.setName ("node1"); node.setName ("node1");
node.addFileSys ("fs0"); node.addFileSys ("fs0", "/auto/fs0/fs1");
node.addFileSys ("fs1"); node.addFileSys ("fs1", "/fs1");
check(node); check(node);
// Write into parset file. // Write into parset file.
ofstream fos("tNodeDesc_tmp.fil"); ofstream fos("tNodeDesc_tmp.fil");
...@@ -36,6 +42,11 @@ void doIt() ...@@ -36,6 +42,11 @@ void doIt()
check(node2); check(node2);
node = node2; node = node2;
check(node); 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() int main()
......
...@@ -19,19 +19,19 @@ void doIt1() ...@@ -19,19 +19,19 @@ void doIt1()
cl.setName ("cl"); cl.setName ("cl");
NodeDesc node0; NodeDesc node0;
node0.setName ("node0"); node0.setName ("node0");
node0.addFileSys ("fs0"); node0.addFileSys ("fs0", "/fs0");
node0.addFileSys ("fs1"); node0.addFileSys ("fs1", "/fs1");
cl.addNode (node0); cl.addNode (node0);
NodeDesc node1; NodeDesc node1;
node1.setName ("node1"); node1.setName ("node1");
node1.addFileSys ("fs1"); node1.addFileSys ("fs1", "/fs1");
node1.addFileSys ("fs2"); node1.addFileSys ("fs2", "/fs2");
cl.addNode (node1); cl.addNode (node1);
NodeDesc node2; NodeDesc node2;
node2.setName ("node2"); node2.setName ("node2");
node2.addFileSys ("fs0"); node2.addFileSys ("fs0", "/fs0");
node2.addFileSys ("fs1"); node2.addFileSys ("fs1", "/fs1");
node2.addFileSys ("fs2"); node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2); cl.addNode (node2);
WorkersDesc wdesc(cl); WorkersDesc wdesc(cl);
// Now define all workers which can perform 2 work types. // Now define all workers which can perform 2 work types.
...@@ -80,15 +80,15 @@ void doIt2() ...@@ -80,15 +80,15 @@ void doIt2()
cl.setName ("cl"); cl.setName ("cl");
NodeDesc node0; NodeDesc node0;
node0.setName ("node0"); node0.setName ("node0");
node0.addFileSys ("fs0"); node0.addFileSys ("fs0", "/fs0");
cl.addNode (node0); cl.addNode (node0);
NodeDesc node1; NodeDesc node1;
node1.setName ("node1"); node1.setName ("node1");
node1.addFileSys ("fs1"); node1.addFileSys ("fs1", "/fs1");
cl.addNode (node1); cl.addNode (node1);
NodeDesc node2; NodeDesc node2;
node2.setName ("node2"); node2.setName ("node2");
node2.addFileSys ("fs2"); node2.addFileSys ("fs2", "/fs2");
cl.addNode (node2); cl.addNode (node2);
WorkersDesc wdesc(cl); WorkersDesc wdesc(cl);
// Now define all workers which can perform 2 work types. // Now define all workers which can perform 2 work types.
......
...@@ -2,5 +2,7 @@ ClusterName = cl ...@@ -2,5 +2,7 @@ ClusterName = cl
NNodes = 2 NNodes = 2
Node0.NodeName = node1 Node0.NodeName = node1
Node0.NodeFileSys = [node1:/usr] Node0.NodeFileSys = [node1:/usr]
Node0.NodeMountPoints = [/usr]
Node1.NodeName = node2 Node1.NodeName = node2
Node1.NodeFileSys = [node1:/usr] Node1.NodeFileSys = [node1:/usr]
Node1.NodeMountPoints = [/usr]
...@@ -2,5 +2,7 @@ ClusterName = cl ...@@ -2,5 +2,7 @@ ClusterName = cl
NNodes = 2 NNodes = 2
Node0.NodeName = node1 Node0.NodeName = node1
Node0.NodeFileSys = [node1:/usr] Node0.NodeFileSys = [node1:/usr]
Node0.NodeMountPoints = [/usr]
Node1.NodeName = node2 Node1.NodeName = node2
Node1.NodeFileSys = [node1:/usr] 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