Browse Source

Merge pull request #2485 from rengolin/roxie-help

Add usage message to Roxie

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 13 years ago
parent
commit
c00251ec96
3 changed files with 79 additions and 17 deletions
  1. 2 2
      initfiles/bin/init_roxie
  2. 44 15
      roxie/ccd/ccdmain.cpp
  3. 33 0
      roxie/roxie/roxie.cpp

+ 2 - 2
initfiles/bin/init_roxie

@@ -57,7 +57,7 @@ killed() {
 }
 
 trap "killed" SIGINT SIGTERM SIGKILL
-nohup roxie topology=RoxieTopology.xml logfile=$logfilename restarts=$restarts stdlog=0 2>>$logfilename.stderr 1>>$logfilename.stdout & 
+nohup roxie --topology=RoxieTopology.xml --logfile=$logfilename --restarts=$restarts --stdlog=0 2>>$logfilename.stderr 1>>$logfilename.stdout &
 echo $! > $PID_NAME 
 wait
 
@@ -66,7 +66,7 @@ while [ -e ${SENTINEL} ]; do
     export restarts=$(($restarts+1))
     echo Restarting $restarts >> $logfilename.stderr
     echo Restarting $restarts >> $logfilename.stdout
-    nohup roxie topology=RoxieTopology.xml logfile=$logfilename restarts=$restarts stdlog=0 2>>$logfilename.stderr 1>>$logfilename.stdout &
+    nohup roxie --topology=RoxieTopology.xml --logfile=$logfilename --restarts=$restarts --stdlog=0 2>>$logfilename.stderr 1>>$logfilename.stdout &
     echo $! > $PID_NAME
     wait
 done

+ 44 - 15
roxie/ccd/ccdmain.cpp

@@ -352,6 +352,23 @@ void FatalError(const char *format, ...)
     _exit(1);
 }
 
+// If changing these, please change roxie.cpp's roxie_server_usage() as well
+static void roxie_common_usage(const char * progName)
+{
+    StringBuffer program;
+    program.append(progName);
+    getFileNameOnly(program, false);
+    // Things that are also relevant to stand-alone executables
+    printf("Usage: %s [options]\n", program.str());
+    printf("\nOptions:\n");
+    printf("\t--daliServers=[host1,...]\t: List of Dali servers to use\n");
+    printf("\t--tracelevel=[integer]\t: Amount of information to dump on logs\n");
+    printf("\t--stdlog=[boolean]\t: Standard log format (based on tracelevel)\n");
+    printf("\t--logfile=[format]\t: Outputs to logfile, rather than stdout\n");
+    printf("\t--help|-h\t: This message\n");
+    printf("\n");
+}
+
 class MAbortHandler : implements IExceptionHandler
 {
     unsigned dummy; // to avoid complaints about an empty class...
@@ -420,6 +437,17 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
     getDaliServixPort();
     init_signals();
 
+    // stand alone usage only, not server
+    for (unsigned i=0; i<argc; i++)
+    {
+        if (stricmp(argv[i], "--help")==0 ||
+            stricmp(argv[i], "-h")==0)
+        {
+            roxie_common_usage(argv[0]);
+            return EXIT_SUCCESS;
+        }
+    }
+
     #ifdef _USE_CPPUNIT
     if (argc>=2 && stricmp(argv[1], "-selftest")==0)
     {
@@ -432,6 +460,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
         }
         else 
         {
+            // MORE - maybe add a 'list' function here?
             for (int name = 2; name < argc; name++)
             {
                 CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry(argv[name]);
@@ -473,8 +502,8 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
         removeSentinelFile(sentinelFile);
 
         StringBuffer topologyFile;
-        if (globals->hasProp("topology"))
-            globals->getProp("topology", topologyFile);
+        if (globals->hasProp("--topology"))
+            globals->getProp("--topology", topologyFile);
         else
             topologyFile.append(codeDirectory).append(PATHSEPCHAR).append("RoxieTopology.xml");
 
@@ -485,7 +514,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
         }
         else
         {
-            if (globals->hasProp("topology"))
+            if (globals->hasProp("--topology"))
             {
                 // Explicitly-named topology file SHOULD exist...
                 throw MakeStringException(ROXIE_INVALID_TOPOLOGY, "topology file %s not found", topologyFile.str());
@@ -496,18 +525,18 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
                  "<RoxieSlaveProcess dataDirectory='.' netAddress='.' channel='1'/>"
                 "</RoxieTopology>"
                 );
-            int port = globals->getPropInt("port", 9876);
+            int port = globals->getPropInt("--port", 9876);
             topology->setPropInt("RoxieServerProcess/@port", port);
-            topology->setProp("@daliServers", globals->queryProp("daliServers"));
-            topology->setProp("@traceLevel", globals->queryProp("traceLevel"));
+            topology->setProp("@daliServers", globals->queryProp("--daliServers"));
+            topology->setProp("@traceLevel", globals->queryProp("--traceLevel"));
         }
 
         topology->getProp("@name", roxieName);
         Owned<const IQueryDll> standAloneDll;
-        if (globals->hasProp("loadWorkunit"))
+        if (globals->hasProp("--loadWorkunit"))
         {
             StringBuffer workunitName;
-            globals->getProp("loadWorkunit", workunitName);
+            globals->getProp("--loadWorkunit", workunitName);
             standAloneDll.setown(createQueryDll(workunitName));
         }
         else
@@ -516,7 +545,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
             if (checkEmbeddedWorkUnitXML(dll))
             {
                 standAloneDll.setown(createExeQueryDll(argv[0]));
-                runOnce = globals->getPropInt("port", 0) == 0;
+                runOnce = globals->getPropInt("--port", 0) == 0;
             }
         }
 
@@ -533,10 +562,10 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
             getConfigurationDirectory(directoryTree,"query","roxie", roxieName, queryDirectory);
 
         //Logging stuff
-        if (globals->hasProp("logfile"))
+        if (globals->hasProp("--logfile"))
         {
             Owned<IComponentLogFileCreator> lf = createComponentLogFileCreator(topology, "roxie");
-            if (globals->getPropBool("stdlog", traceLevel != 0) || topology->getPropBool("@forceStdLog", false))
+            if (globals->getPropBool("--stdlog", traceLevel != 0) || topology->getPropBool("@forceStdLog", false))
                 lf->setMsgFields(MSGFIELD_time | MSGFIELD_thread | MSGFIELD_prefix);
             lf->setMaxDetail(TopDetail);
             lf->beginLogging();
@@ -553,7 +582,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
                 queryLogMsgManager()->enterQueueingMode();
                 queryLogMsgManager()->setQueueDroppingLimit(logQueueLen, logQueueDrop);
             }
-            if (globals->getPropBool("enableSysLog",true))
+            if (globals->getPropBool("--enableSysLog",true))
                 UseSysLogForOperatorMessages();
         }
 
@@ -571,7 +600,7 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
                 throw MakeStringException(ROXIE_INTERNAL_ERROR, "Invalid UserMetric element in topology file - name or regex missing");
         }
 
-        restarts = globals->getPropInt("restarts", 0);
+        restarts = globals->getPropInt("--restarts", 0);
         const char *preferredSubnet = topology->queryProp("@preferredSubnet");
         if (preferredSubnet)
         {
@@ -580,8 +609,8 @@ int STARTQUERY_API start_query(int argc, const char *argv[])
             if (!setPreferredSubnet(preferredSubnet, preferredSubnetMask))
                 throw MakeStringException(ROXIE_INTERNAL_ERROR, "Error setting preferred subnet %s mask %s", preferredSubnet, preferredSubnetMask);
         }
-        bool multiHostMode = globals->hasProp("host");
-        unsigned myHostNumber = globals->getPropInt("host", 0);
+        bool multiHostMode = globals->hasProp("--host");
+        unsigned myHostNumber = globals->getPropInt("--host", 0);
         if (restarts)
         {
             if (traceLevel)

+ 33 - 0
roxie/roxie/roxie.cpp

@@ -19,7 +19,40 @@
 #include "platform.h"
 #include "ccd.hpp"
 
+static void roxie_server_usage()
+{
+    printf("\nRoxie Server: Starts the Roxie service or executes a one-off query.\n");
+    printf("\troxie [options below]\n");
+
+    // Not documenting use of internal options: selftest, restarts, enableSysLog and host
+    printf("\nService:\n");
+    printf("\t--topology=[XML-file]\t: Reads Roxie topology (deafult RoxieTopology.xml)\n");
+    printf("\t--port=[integer]\t\t: Network port (default 9876)\n");
+    printf("\nOne-off query:\n");
+    printf("\t--loadWorkunit=[so|dll]\t: Load and execute shared library\n");
+    printf("\t-[xml|csv|raw]\t\t: Output format (default ascii)\n");
+    printf("\n");
+
+    // If changing these, please change ccdmain.cpp's roxie_common_usage() as well
+    printf("Generic:\n");
+    printf("\t--daliServers=[host1,...]\t: List of Dali servers to use\n");
+    printf("\t--tracelevel=[integer]\t: Amount of information to dump on logs\n");
+    printf("\t--stdlog=[boolean]\t: Standard log format (based on tracelevel)\n");
+    printf("\t--logfile=[format]\t: Outputs to logfile, rather than stdout\n");
+    printf("\t--help|-h\t: This message\n");
+    printf("\n");
+}
+
 int main(int argc, const char *argv[])
 {
+    for (unsigned i=0; i<argc; i++)
+    {
+        if (stricmp(argv[i], "--help")==0 ||
+            stricmp(argv[i], "-h")==0)
+        {
+            roxie_server_usage();
+            return EXIT_SUCCESS;
+        }
+    }
     return start_query(argc, argv);
 }