Browse Source

HPCC-20200 Improve attribute group processing

Improve processing of attribute groups

Signed-off-by: Ken Rowland <kenneth.rowland@lexisnexisrisk.com>
Ken Rowland 6 năm trước cách đây
mục cha
commit
b14c7fae9b

+ 1 - 1
configuration/config2/SchemaValue.cpp

@@ -52,7 +52,7 @@ SchemaValue::SchemaValue(const SchemaValue &value)
     m_valueLimitRuleType = value.m_valueLimitRuleType;
     m_valueLimitRuleData = value.m_valueLimitRuleData;
     m_requiredIf = value.m_requiredIf;
-    m_group = value.m_group;
+    m_groupByName = value.m_groupByName;
 
     // special processing? Maybe after inserting?
     std::vector<std::shared_ptr<SchemaValue>> m_mirrorToSchemaValues;

+ 3 - 3
configuration/config2/SchemaValue.hpp

@@ -86,8 +86,8 @@ class DECL_EXPORT SchemaValue
         const std::string &getValueLimitRuleData() { return m_valueLimitRuleData; }
         void setRequiredIf(const std::string &reqIf) { m_requiredIf = reqIf; }
         const std::string &getRequiredIf() const { return m_requiredIf; }
-        void setGroup(const std::string &group) { m_group = group; }
-        const std::string &getGroup() const { return m_group; }
+        void setGroupByName(const std::string &group) { m_groupByName = group; }
+        const std::string &getGroupByName() const { return m_groupByName; }
 
 
     protected:
@@ -104,7 +104,7 @@ class DECL_EXPORT SchemaValue
         std::string m_valueLimitRuleType;
         std::string m_valueLimitRuleData;
         std::string m_requiredIf;
-        std::string m_group;
+        std::string m_groupByName;
         // DON'T FORGET IF DATA ADDED, IT MAY MAY TO BE COPIED IN THE COPY CONSTRUCTOR!!
 
         struct {

+ 12 - 1
configuration/config2/XSDSchemaParser.cpp

@@ -197,10 +197,11 @@ void XSDSchemaParser::parseSimpleType(const pt::ptree &typeTree)
 }
 
 
-void XSDSchemaParser::parseAttribute(const pt::ptree &attr)
+std::shared_ptr<SchemaValue> XSDSchemaParser::parseAttribute(const pt::ptree &attr)
 {
     std::shared_ptr<SchemaValue> pCfgValue = getSchemaValue(attr);
     m_pSchemaItem->addAttribute(pCfgValue);
+    return pCfgValue;
 }
 
 
@@ -215,6 +216,8 @@ void XSDSchemaParser::parseAttributeGroup(const pt::ptree &attributeTree)
     {
         std::shared_ptr<SchemaItem> pValueSet = std::make_shared<SchemaItem>(groupName, "valueset", m_pSchemaItem);
         std::shared_ptr<XSDValueSetParser> pXSDValueSetParaser = std::make_shared<XSDValueSetParser>(pValueSet);
+        std::string groupByName = getXSDAttributeValue(attributeTree, "<xmlattr>.groupByName", false, "");
+        pXSDValueSetParaser->setGroupByName(groupByName);
         pXSDValueSetParaser->parseXSD(attributeTree.get_child("", pt::ptree()));
         m_pSchemaItem->addSchemaType(pValueSet, groupName);
     }
@@ -231,6 +234,14 @@ void XSDSchemaParser::parseAttributeGroup(const pt::ptree &attributeTree)
             {
                 std::vector<std::shared_ptr<SchemaValue>> attributes;
                 pValueSet->getAttributes(attributes);
+                std::string groupByName = getXSDAttributeValue(attributeTree, "<xmlattr>.groupByName", false, "");
+                if (!groupByName.empty())
+                {
+                    for (auto &attr: attributes)
+                    {
+                        attr->setGroupByName(groupByName);
+                    }
+                }
                 m_pSchemaItem->addAttribute(attributes);
 
                 //

+ 1 - 1
configuration/config2/XSDSchemaParser.hpp

@@ -48,7 +48,7 @@ class XSDSchemaParser : public SchemaParser
         virtual void parseXSD(const std::string &filename);
         virtual std::string getXSDAttributeValue(const pt::ptree &tree, const std::string &attriName, bool throwIfNotPresent=true, const std::string &defaultVal = (std::string(""))) const;
         virtual void parseAttributeGroup(const pt::ptree &attributeTree);
-        virtual void parseAttribute(const pt::ptree &attr);
+        virtual std::shared_ptr<SchemaValue> parseAttribute(const pt::ptree &attr);
 
         virtual void parseSimpleType(const pt::ptree &typeTree);
         virtual void parseComplexType(const pt::ptree &typeTree);

+ 3 - 21
configuration/config2/XSDValueSetParser.cpp

@@ -25,28 +25,10 @@ void XSDValueSetParser::parseXSD(const pt::ptree &valueSetTree)
     for (auto it = valueSetTree.begin(); it != valueSetTree.end(); ++it)
     {
         //
-        // Element parent (a type in realilty) and the element name help figure out how to process the XSD schema element
-        std::string elemType = it->first;
-        if (it->first == "xs:attributeGroup")
+        // Only handle attributes
+        if (it->first == "xs:attribute")
         {
-            parseAttributeGroup(it->second);
+            parseAttribute(it->second)->setGroupByName(m_groupByName);
         }
-        else if (it->first == "xs:attribute")
-        {
-            parseAttribute(it->second);
-        }
-    }
-}
-
-
-void XSDValueSetParser::parseAttributeGroup(const pt::ptree &attributeTree)
-{
-    std::string groupRefName = getXSDAttributeValue(attributeTree, "<xmlattr>.ref");
-    std::shared_ptr<SchemaItem> pValueSet = m_pSchemaItem->getSchemaType(groupRefName, true);
-    if (pValueSet)
-    {
-        std::vector<std::shared_ptr<SchemaValue>> attributes;
-        pValueSet->getAttributes(attributes);
-        m_pSchemaItem->addAttribute(attributes);
     }
 }

+ 6 - 0
configuration/config2/XSDValueSetParser.hpp

@@ -37,11 +37,17 @@ class XSDValueSetParser : public XSDSchemaParser
         virtual ~XSDValueSetParser() { }
         virtual void parseXSD(const pt::ptree &valueSetTree);
         void parseAttributeGroup(const pt::ptree &attributeTree);
+        void setGroupByName(const std::string &name) { m_groupByName = name; }
 
 
     protected:
 
         XSDValueSetParser() { }
+
+
+    protected:
+
+        std::string m_groupByName;
 };
 
 

+ 1 - 1
esp/services/ws_config2/ws_config2Service.cpp

@@ -804,7 +804,7 @@ void Cws_config2Ex::getAttributes(const std::shared_ptr<EnvironmentNode> &pEnvNo
             pAttribute->setReadOnly(pSchemaValue->isReadOnly());
             pAttribute->setHidden(pSchemaValue->isHidden());
             pAttribute->setDeprecated(pSchemaValue->isDeprecated());
-            std::string groupName = pSchemaValue->getGroup();
+            std::string groupName = pSchemaValue->getGroupByName();
             pAttribute->setGroup(groupName.empty() ? "Attributes" : groupName.c_str());
 
             //

+ 13 - 13
initfiles/componentfiles/configschema/xsd/eclagent.xsd

@@ -4,23 +4,23 @@
     xmlns:hpcc="someuri">
     <xs:include schemaLocation="types.xsd"/>
     <xs:complexType name="eclAgent">
-        <xs:attributeGroup name="Options" hpcc:docid="EA.t2">
-            <xs:attribute name="allowedPipePrograms" hpcc:displayName="Allowed Pipe Programs" hpcc:group="Options" type="xs:string" use="optional" default="*" hpcc:tab="Eclagent" hpcc:tooltip="Comma separated list of allowed PIPE programs (* for allow all)"/>
-            <xs:attribute name="daliServers" hpcc:displayName="Dali Servers" hpcc:group="Options" type="xs:string" use="required" hpcc:tooltip="Specifies the dali server to which this eclagent is attached"/>
-            <xs:attribute name="defaultMemoryLimitMB" hpcc:displayName="Default Memory Limit (MB)" hpcc:group="Options" type="xs:nonNegativeInteger" use="optional" default="300" hpcc:tooltip="Default memory limit in MB for eclagent"/>
-            <xs:attribute name="heapUseHugePages" hpcc:displayName="Heap Use Huge Pages" hpcc:group="Options" type="xs:boolean" default="false" hpcc:tooltip="Use memory from huge pages if they have been configured"/>
-            <xs:attribute name="heapUseTransparentHugePages" hpcc:displayName="Heam Use Transparent Huge Pages" hpcc:group="Options" type="xs:boolean" default="true" hpcc:tooltip="Use memory from transparent huge pages"/>
-            <xs:attribute name="heapRetainMemory" hpcc:displayName="Heap Retain Memory" hpcc:group="Options" type="xs:boolean" default="false" hpcc:tooltip="Retain and do not return unused memory to the operating system"/>
-            <xs:attribute name="pluginDirectory" hpcc:displayName="Plugin Directory" hpcc:group="Options" type="absolutePath" use="optional" default="/opt/HPCCSystems/plugins/" hpcc:tooltip="Directory where plugins are located"/>
-            <xs:attribute name="traceLevel" hpcc:displayName="Trace Level" hpcc:group="Options" type="xs:nonNegativeInteger" use="optional" default="0" hpcc:tooltip="Trace level"/> < - Shoud this be an enumerated list, or a range say 0-10
-            <xs:attribute name="thorConnectTimeout" hpcc:displayName="Thor Connect Timeout" hpcc:group="Options" type="xs:nonNegativeInteger" use="optional" default="600" hpcc:tooltip="Default connection timeout when sending query to Thor"/>
-            <xs:attribute name="wuQueueName" hpcc:displayName="Workunit Queue Name" hpcc:group="Options" type="xs:string" use="optional" default="" hpcc:tooltip="eclAgent Workunit Execution Queue Name" hpcc:autogenforwizard="true" hpcc:autogensuffix="_queue"/> <!-- is this keyed? do we need new auto name option for suffix -->
+        <xs:attributeGroup name="options" hpcc:groupByName="Options" hpcc:docid="EA.t2">
+            <xs:attribute name="allowedPipePrograms" hpcc:displayName="Allowed Pipe Programs" type="xs:string" use="optional" default="*" hpcc:tab="Eclagent" hpcc:tooltip="Comma separated list of allowed PIPE programs (* for allow all)"/>
+            <xs:attribute name="daliServers" hpcc:displayName="Dali Servers" type="xs:string" use="required" hpcc:tooltip="Specifies the dali server to which this eclagent is attached"/>
+            <xs:attribute name="defaultMemoryLimitMB" hpcc:displayName="Default Memory Limit (MB)" type="xs:nonNegativeInteger" use="optional" default="300" hpcc:tooltip="Default memory limit in MB for eclagent"/>
+            <xs:attribute name="heapUseHugePages" hpcc:displayName="Heap Use Huge Pages" type="xs:boolean" default="false" hpcc:tooltip="Use memory from huge pages if they have been configured"/>
+            <xs:attribute name="heapUseTransparentHugePages" hpcc:displayName="Heam Use Transparent Huge Pages" type="xs:boolean" default="true" hpcc:tooltip="Use memory from transparent huge pages"/>
+            <xs:attribute name="heapRetainMemory" hpcc:displayName="Heap Retain Memory" type="xs:boolean" default="false" hpcc:tooltip="Retain and do not return unused memory to the operating system"/>
+            <xs:attribute name="pluginDirectory" hpcc:displayName="Plugin Directory" type="absolutePath" use="optional" default="/opt/HPCCSystems/plugins/" hpcc:tooltip="Directory where plugins are located"/>
+            <xs:attribute name="traceLevel" hpcc:displayName="Trace Level" type="xs:nonNegativeInteger" use="optional" default="0" hpcc:tooltip="Trace level"/> < - Shoud this be an enumerated list, or a range say 0-10
+            <xs:attribute name="thorConnectTimeout" hpcc:displayName="Thor Connect Timeout" type="xs:nonNegativeInteger" use="optional" default="600" hpcc:tooltip="Default connection timeout when sending query to Thor"/>
+            <xs:attribute name="wuQueueName" hpcc:displayName="Workunit Queue Name" type="xs:string" use="optional" default="" hpcc:tooltip="eclAgent Workunit Execution Queue Name" hpcc:autogenforwizard="true" hpcc:autogensuffix="_queue"/> <!-- is this keyed? do we need new auto name option for suffix -->
         </xs:attributeGroup>
         <xs:sequence>
             <xs:element name="EclAgentProcess" hpcc:class="component" hpcc:itemType="eclAgent" hpcc:displayName="ECL Agent Process" maxOccurs="unbounded" hpcc:docid="EA.t1">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element name="Instance" maxOccurs="unbounded" hpcc:displayName="Bound Computers">
+                        <xs:element name="Instance" hpcc:itemType = "elementSet" maxOccurs="unbounded" hpcc:displayName="Instances">
                             <xs:complexType>
                                 <xs:attributeGroup ref="computerNodeReference"/>
                                 <xs:attribute name="directory" type="xs:string" use="optional" default="c$\eclagent" hpcc:hidden="true"/> <!-- hidden doesn't make sense -->
@@ -31,7 +31,7 @@
                     <xs:attributeGroup ref="buildInfo"/>
                     <xs:attribute name="name" type="xs:string" use="required" hpcc:displayName="Name" hpcc:uniqueKey="eclagentprocess_name" hpcc:tooltip="Name for this process"/>
                     <xs:attribute name="description" type="xs:string" use="optional" hpcc:displayName="Description" default="EclAgent process" hpcc:tooltip="Description for this process"/>
-                    <xs:attributeGroup ref="Options"/>
+                    <xs:attributeGroup ref="options"/>
                 </xs:complexType>
 
             </xs:element>

+ 16 - 34
initfiles/componentfiles/configschema/xsd/esp.xsd

@@ -12,10 +12,10 @@
                 <xs:complexType>
                     <xs:sequence>
 
-                        <xs:element name="EspBinding" maxOccurs="unbounded" hpcc:itemType="espbinding" hpcc:category="ESP Bindings" hpcc:insertLimitType="attribute" hpcc:insertLimitData="service" hpcc:displayName="ESP Service Bindings" hpcc:class="valueSet" hpcc:event="create">
+                        <xs:element name="EspBinding" maxOccurs="unbounded" hpcc:itemType="espbinding" hpcc:category="ESP Bindings" hpcc:insertLimitType="attribute" hpcc:insertLimitData="service" hpcc:displayName="ESP Service Bindings" hpcc:class="elementSet" hpcc:event="create">
                             <xs:complexType>
                                 <xs:sequence>
-                                    <xs:element name="Authenticate" minOccurs="0" maxOccurs="unbounded" hpcc:displayName="URL Authentication" hpcc:docid="ESP.t1">
+                                    <xs:element name="Authenticate" minOccurs="0" maxOccurs="unbounded" hpcc:class="elementSet" hpcc:displayName="URL Authentication" hpcc:docid="ESP.t1">
                                         <xs:complexType>
                                             <xs:attribute name="description" type="xs:string" use="optional" hpcc:displayName="Description"/>
                                             <xs:attribute name="path" type="xs:string" use="required" default="/" hpcc:displayName="Path" hpcc:tooltip="The logical path of a resource used for authentication"/>
@@ -34,7 +34,7 @@
                                             </xs:attribute>
                                         </xs:complexType>
                                     </xs:element>
-                                    <xs:element name="AuthenticateFeature" minOccurs="0" maxOccurs="unbounded" hpcc:displayName="Feature Authentication" hpcc:docid="ESP.t2">
+                                    <xs:element name="AuthenticateFeature" minOccurs="0" maxOccurs="unbounded" hpcc:class="elementSet" hpcc:displayName="Feature Authentication" hpcc:docid="ESP.t2">
                                         <xs:complexType>
                                             <xs:attribute name="authenticate" use="optional" default="Yes" hpcc:displayName="Authenticate" hpcc:tooltip="Validate access rights for this capability?">
                                                 <xs:simpleType>
@@ -49,13 +49,12 @@
                                         </xs:complexType>
                                     </xs:element>
 
-                                    <xs:element name="CustomBindingParameter" minOccurs="0" maxOccurs="unbounded" hpcc:displayName="Custom Binding Parameters">
+                                    <xs:element name="CustomBindingParameter" minOccurs="0" maxOccurs="unbounded" hpcc:class="elementSet" hpcc:displayName="Custom Binding Parameters">
                                         <xs:complexType>
                                             <xs:attribute name="key" type="xs:string" use="optional" hpcc:uniqueKey="custombindingparameter_key" hpcc:displayName="Key" />
                                             <xs:attribute name="value" type="xs:string" use="optional" hpcc:displayName="Value"/>
                                         </xs:complexType>
                                     </xs:element>
-
                                 </xs:sequence>
 
                                 <xs:attribute name="name" type="xs:string" use="required" hpcc:displayName="Binding Name" hpcc:autoName="" />
@@ -82,7 +81,7 @@
 
                         </xs:element>
 
-                        <xs:element name="Authentication" hpcc:docid="ESP.t4" hpcc:class="valueSet" hpcc:displayName="Authentication">
+                        <xs:element name="Authentication" hpcc:docid="ESP.t4" minOccurs="1" hpcc:class="valueSet" hpcc:displayName="Authentication">
                             <xs:complexType>
                                 <xs:attribute name="method" use="required" default="none" hpcc:displayName="Method" hpcc:modifiers="variableAttributes" hpcc:tooltip="The protocol to use for authenticating the service">
                                     <xs:simpleType>
@@ -120,7 +119,7 @@
                             </xs:complexType>
                         </xs:element>
 
-                        <xs:element name="AuthDomain" minOccurs="0" maxOccurs="unbounded" hpcc:displayName="AuthDomain" hpcc:class="valueSet" hpcc:docid="ESP.t7">
+                        <xs:element name="AuthDomain" minOccurs="0" maxOccurs="unbounded" hpcc:class="elementSet" hpcc:displayName="AuthDomain" hpcc:docid="ESP.t7">
                             <xs:complexType>
                                 <xs:attribute name="authType" use="required" default="AuthTypeMixed" hpcc:displayName="" hpcc:tooltip="User session Authentication type">
                                     <xs:simpleType>
@@ -152,6 +151,14 @@
                             </xs:complexType>
                         </xs:element>
 
+                        <xs:element name="ESPCacheGroup" hpcc:displayName="ESP Cache Group" hpcc:class="elementSet" maxOccurs="unbounded">
+                            <xs:complexType>
+                                <xs:attribute name="id" type="xs:string" hpcc:displayName="ID" use="required" hpcc:uniqueKey="espprocess_cachegroup_id"
+                                              hpcc:tooltip="Unique string to identify an ESP level cache group"/>
+                                <xs:attribute name="initString" type="xs:string" hpcc:displayName="Init String" use="required" hpcc:tooltip="A string sent to cache server for initiating the server."/>
+                            </xs:complexType>
+                        </xs:element>
+
                         <xs:element name="Instance" hpcc:itemType="hwinstance" maxOccurs="unbounded" hpcc:class="valueSet">
                             <xs:complexType>
                                 <xs:sequence>
@@ -180,8 +187,8 @@
                     <xs:attribute name="maxBacklogQueueSize" type="xs:nonNegativeInteger" use="optional" default="200" hpcc:displayName="Max Backlog Queue Size" hpcc:tooltip="Sets the sockets parameter for the maximum number of backlogged requests" />
                     <xs:attribute name="perfReportDelay" type="xs:nonNegativeInteger" use="optional" default="60" hpcc:displayName="Resource Usage Stats Logging Frequency" hpcc:tooltip="Sets the frequency for logging resource usage stats" />
                     <xs:attribute name="portalurl" type="xs:string" default="http://hpccsystems.com/download" hpcc:hidden="true" hpcc:tooltip="portal to HPCC Systems® web site" />
-                    <xs:attribute name="controlPort" type="xs:nonNegativeInteger" use="optional" default="8010" hpcc:displayName="Control Port"
-                        hpcc:uniqueKey="espprocess_controlport" hpcc:tooltip="Sets the network port for ESP control" />
+                    <xs:attribute name="controlPort" type="xs:nonNegativeInteger" use="optional" default="8010" hpcc:displayName="Control Port" hpcc:uniqueKey="espprocess_controlport"
+                        hpcc:tooltip="Sets the network port for ESP control" />
                     <xs:attribute name="logLevel" type="xs:nonNegativeInteger" use="optional" default="1" hpcc:displayName="Log Level" hpcc:tooltip="ets the log level [0: none, 1: min, 5: noraml, 10: max]" />
                     <xs:attribute name="componentfilesDir" type="xs:string" use="optional" default="${COMPONENTFILES_PATH}" hpcc:displayName="Component Files Dir" hpcc:tooltip="Sets the componentfiles directory" />
                     <xs:attribute name="logRequests" type="xs:boolean" use="optional" default="true" hpcc:displayName="Log Requests"/>
@@ -192,31 +199,6 @@
 
                 </xs:complexType>
 
-                <!--xs:key name="espprocess_name_key">
-                    <xs:selector xpath="./" />
-                    <xs:field xpath="@name" />
-                </xs:key>
-
-                <xs:key name="espprocess_controlport_key">
-                    <xs:selector xpath="./" />
-                    <xs:field xpath="@controlPort" />
-                </xs:key>
-
-                <xs:keyref name="esp_servicename_keyref" refer="espservice_name_key">
-                    <xs:selector xpath="./EspBinding" />
-                    <xs:field xpath="@service" />
-                </xs:keyref>
-
-                <xs:keyref name="espprocess_Instance_keyref" refer="computerNameKey">
-                    <xs:selector xpath="./Instance"/>
-                    <xs:field xpath="@computer"/>
-                </xs:keyref>
-
-                <xs:keyref name="espprocess_Instance_ipref" refer="computerIPAddressKey">
-                    <xs:selector xpath="./Instance"/>
-                    <xs:field xpath="@netAddress"/>
-                </xs:keyref -->
-
             </xs:element>
         </xs:sequence>
     </xs:complexType>

+ 7 - 7
initfiles/componentfiles/configschema/xsd/esp_service_smc.xsd

@@ -5,12 +5,12 @@
     <xs:include schemaLocation="types.xsd"/>
     <xs:complexType name="espsmc">
 
-        <xs:attributeGroup name="Monitoring" hpcc:docid="SMC-T02">
-            <xs:attribute name="monitorDaliFileServer" type="xs:boolean" use="true" default="false" hpcc:displayName="Monior Dali File Server" hpcc:group="Monitoring" hpcc:tooltip="Warn if dafilesrv process is not running on computers"/>
-            <xs:attribute name="excludePartitions" type="xs:string" use="optional" default="/dev*,/sys,/proc/*" hpcc:displayName="Exclude Partitions" hpcc:group="Monitoring" hpcc:tooltip="Comma, space or semicolon delimited list of partitions not to be monitored for free space"/>
-            <xs:attribute name="warnIfCpuLoadOver" type="xs:nonNegativeInteger" use="optional" default="95" hpcc:displayName="Warn CPU Load" hpcc:group="Monitoring" hpcc:tooltip="CPU load over this value is flagged as warning in monitoring output"/>
-            <xs:attribute name="warnIfFreeStorageUnder" type="xs:nonNegativeInteger" use="optional" default="5" hpcc:displayName="Warn Free Storage" hpcc:group="Monitoring" hpcc:tooltip="Available disk storage space under this value is flagged as warning in monitoring output"/>
-            <xs:attribute name="warnIfFreeMemoryUnder" type="xs:nonNegativeInteger" use="optional" default="5" hpcc:displayName="Warn Free Memory" hpcc:group="Monitoring" hpcc:tooltip="Available memory under this value is flagged as warning in monitoring output"/>
+        <xs:attributeGroup name="monitoring" hpcc:groupByName="Monitoring" hpcc:docid="SMC-T02">
+            <xs:attribute name="monitorDaliFileServer" type="xs:boolean" use="true" default="false" hpcc:displayName="Monior Dali File Server" hpcc:tooltip="Warn if dafilesrv process is not running on computers"/>
+            <xs:attribute name="excludePartitions" type="xs:string" use="optional" default="/dev*,/sys,/proc/*" hpcc:displayName="Exclude Partitions" hpcc:tooltip="Comma, space or semicolon delimited list of partitions not to be monitored for free space"/>
+            <xs:attribute name="warnIfCpuLoadOver" type="xs:nonNegativeInteger" use="optional" default="95" hpcc:displayName="Warn CPU Load" hpcc:tooltip="CPU load over this value is flagged as warning in monitoring output"/>
+            <xs:attribute name="warnIfFreeStorageUnder" type="xs:nonNegativeInteger" use="optional" default="5" hpcc:displayName="Warn Free Storage" hpcc:tooltip="Available disk storage space under this value is flagged as warning in monitoring output"/>
+            <xs:attribute name="warnIfFreeMemoryUnder" type="xs:nonNegativeInteger" use="optional" default="5" hpcc:displayName="Warn Free Memory" hpcc:tooltip="Available memory under this value is flagged as warning in monitoring output"/>
         </xs:attributeGroup>
 
         <xs:attributeGroup name="elkintegration">
@@ -155,7 +155,7 @@
                     <xs:attribute name="disableUppercaseTranslation" type="xs:boolean" use="optional" default="false" hpcc:displayName="Disable Uppercase Translation" hpcc:tooltip="To disable upper case translation for filter values in ViewKeyFile function" />
                     <xs:attribute name="enableLogDaliConnection" type="xs:boolean" use="optional" default="false" hpcc:displayName="Enable Log Dali Connection" hpcc:tooltip="Enable ESP/Dali Connection ID to be logged into esp.xml" />
                     <xs:attribute name="allowNewRoxieOnDemandQuery" type="xs:boolean" use="optional" default="false" hpcc:displayName="Allow New Roxie On Demand Query" hpcc:tooltip="allow new queries to be used by roxie on demand and roxie browser" />
-                    <xs:attributeGroup ref="Monitoring"/>
+                    <xs:attributeGroup ref="monitoring"/>
                     <xs:attributeGroup ref="elkintegration"/>
 
                 </xs:complexType>

+ 21 - 22
initfiles/componentfiles/configschema/xsd/hardware.xsd

@@ -3,50 +3,49 @@
         xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"
         xmlns:hpcc="someuri">
     <xs:include schemaLocation="types.xsd"/>
-    <xs:complexType name="hardware" >
+    <xs:complexType name="hardware" hpcc:class="component" hpcc:category="" hpcc:displayName="Hardware Configuration">
         <xs:sequence>
-            <xs:element name="Hardware" >
+            <xs:element name="Hardware" hpcc:displayname="Hardware">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element name="ComputerType" maxOccurs="unbounded" use="required" hpcc:category="Computer Types"
-                                    hpcc:class="valueSet">
+                        <xs:element name="ComputerType" maxOccurs="unbounded" hpcc:displayName="Defined computer types" hpcc:class="elementSet">
                             <xs:complexType>
-                                <xs:attribute name="name" group="Attributes" type="xs:string" hpcc:displayName="Name" use="required" hpcc:uniqueKey="computertype_name"/>
-                                <xs:attribute name="manufacturer" group="Attributes" hpcc:displayName="Manufacturer"type="xs:string"/>
-                                <xs:attribute name="computerType" group="Attributes" hpcc:displayName="Computer Type" type="xs:string"/>
-                                <xs:attribute name="nicSpeed" group="Attributes" hpcc:displayName="NIC Speed" type="xs:nonNegativeInteger"/>
+                                <xs:attribute name="name" type="xs:string" use="required"/>
+                                <xs:attribute name="nicSpeed" type="xs:nonNegativeInteger"/>
+                                <xs:attribute name="manufacturer" type="xs:string"/>
+                                <xs:attribute name="memory" type="xs:nonNegativeInteger"/>
+                                <xs:attribute name="computerType" type="xs:string"/>
                                 <xs:attribute name="opSys">
                                     <xs:simpleType>
                                         <xs:restriction base="xs:string">
-                                            <xs:enumeration value="linux"hpcc:displayName="Linux"/>
-                                            <xs:enumeration value="solaris"hpcc:displayName="Solaris"/>
-                                            <xs:enumeration value="W2K"hpcc:displayName="Windows 2000"/>
+                                            <xs:enumeration value="linux"/>
+                                            <xs:enumeration value="solaris"/>
+                                            <xs:enumeration value="W2K"/>
                                         </xs:restriction>
                                     </xs:simpleType>
                                 </xs:attribute>
                             </xs:complexType>
                         </xs:element>
 
-                        <xs:element name="Domain" maxOccurs="unbounded" use="required" hpcc:category="Domains" hpcc:class="valueSet">
+                        <xs:element name="Domain" maxOccurs="unbounded" hpcc:category="Domains" hpcc:class="elementSet">
                             <xs:complexType>
-                                <xs:attribute name="name" group="Attributes" hpcc:displayName="Name" type="xs:string" use="required" hpcc:uniqueKey="domain_name"/>
+                                <xs:attribute name="name" hpcc:displayName="Name" type="xs:string" use="required" hpcc:uniqueKey="domain_name"/>
                             </xs:complexType>
                         </xs:element>
 
-                        <xs:element name="Switch" maxOccurs="unbounded" hpcc:class="valueSet"
-                                    hpcc:doc="Describes a switch that is contained in the environment">
+                        <xs:element name="Switch" maxOccurs="unbounded" use="required" hpcc:class="valueSet"
+                                    hpcc:displayName="Switches">
                             <xs:complexType>
-                                <xs:attribute name="name" type="xs:string"/>
+                                <xs:attribute name="name" hpcc:displayName="Name" type="xs:string" use="required" hpcc:uniqueKey="switch_name"/>
                             </xs:complexType>
                         </xs:element>
 
-                        <xs:element name="Computer" maxOccurs="unbounded" use="required"hpcc:class="valueSet"
-                                    hpcc:displayName="Computers">
+                        <xs:element name="Computer" maxOccurs="unbounded" hpcc:class="elementSet" hpcc:displayName="Computers">
                             <xs:complexType>
-                                <xs:attribute name="name" group="Attributes" hpcc:displayName="Name" type="nodeName" use="required" hpcc:uniqueKey="computer_name"/>
-                                <xs:attribute name="netAddress" group="Attributes" hpcc:displayName="Net Address" type="ipV4Address" use="required" hpcc:uniqueKey="computer_netaddress"/>
-                                <xs:attribute name="domain" group="Attributes" hpcc:displayName="Domain" type="xs:string" hpcc:sourceKey="domain_name"/>
-                                <xs:attribute name="computerType" group="Attributes" hpcc:displayName="Computer type" type="xs:string" hpcc:sourceKey="computertype_name"/>
+                                <xs:attribute name="name" hpcc:displayName="Name" type="nodeName" use="required" hpcc:uniqueKey="computer_name"/>
+                                <xs:attribute name="netAddress" hpcc:displayName="Net Address" type="ipV4Address" use="required" hpcc:uniqueKey="computer_netaddress"/>
+                                <xs:attribute name="domain" hpcc:displayName="Domain" type="xs:string" hpcc:sourceKey="domain_name"/>
+                                <xs:attribute name="computerType" hpcc:displayName="Computer type" type="xs:string" hpcc:sourceKey="computertype_name"/>
                             </xs:complexType>
                         </xs:element>
                     </xs:sequence>

+ 215 - 193
initfiles/componentfiles/configschema/xsd/roxie.xsd

@@ -21,6 +21,208 @@
     xmlns:hpcc="someuri">
     <xs:include schemaLocation="types.xsd"/>
     <xs:complexType name="roxiecluster">
+
+        <xs:attributeGroup name="ldap" hpcc:groupByName="LDAP">
+            <xs:attribute name="ldapUser" type="xs:string" hpcc:displayName="LDAP User" use="optional" default="roxie" hpcc:tooltip="Specifies the user name for LDAP file access checking"/>
+            <xs:attribute name="ldapPassword" type="xs:string" hpcc:displayName="LDAP User Password" use="optional" hpcc:modifiers="mask,verify" hpcc:tooltip="Specifies the user name for LDAP file access checking"/>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="options" hpcc:groupByName="Options">
+            <xs:attribute name="affinity" type="xs:nonNegativeInteger" hpcc:displayName="Affinity" use="optional" default="0" hpcc:tooltip="If non-zero, binds the roxie process to use the specified cores only (bitmask)"/>
+            <xs:attribute name="allFilesDynamic" type="xs:boolean" hpcc:displayName="All Files Dynamic" use="optional" default="false" hpcc:tooltip="If enabled, files will be resolved per-query and not locked between queries"/>
+            <xs:attribute name="backgroundCopyClass" hpcc:displayName="Background Copy Class" default="none" hpcc:tooltip="Specify an IONICE class for the background copy thread">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="none" hpcc:displayName="None" hpcc:description=""/>
+                        <xs:enumeration value="best-effort" hpcc:displayName="Best Effort" hpcc:description=""/>
+                        <xs:enumeration value="idle" hpcc:displayName="Idle" hpcc:description=""/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="backgroundCopyPrio" hpcc:displayName="Background Copy Priority" use="optional" default="0" hpcc:tooltip="Specify an IONICE value for the background copy thread, if backgroundCopyClass set to best-effort">
+                <!-- Is this value required if the backgroundcopyclass is set to a particular value -->
+                <xs:simpleType>
+                    <!-- This is how to do a range, If not desired, add type="xs:nonNegativeInteger" above and remove the simpleType section -->
+                    <xs:restriction base="xs:nonNegativeInteger">
+                        <xs:minInclusive value="1"/>
+                        <xs:maxInclusive value="100"/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="callbackRetries" type="xs:nonNegativeInteger" hpcc:displayName="Callback Retries" use="optional" default="3" hpcc:tooltip="Number of retries before callbacks from agents to server are aborted"/>
+            <xs:attribute name="callbackTimeout" type="xs:nonNegativeInteger" hpcc:displayName="Callback Timeout" use="optional" default="5000" hpcc:tooltip="Timeout (in ms) before callbacks from agents to server are resent"/>
+            <!-- range? -->
+            <xs:attribute name="checkFileDate" type="xs:boolean" hpcc:displayName="Check File Date" use="optional" default="true" hpcc:tooltip="Compare file dates of physical files with the information in DFS"/>
+            <xs:attribute name="collectFactoryStatistics" type="xs:boolean" hpcc:displayName="Gather Factory Statistics" use="optional" default="true" hpcc:tooltip="Accumulate summary statistics for all queries"/>
+            <xs:attribute name="copyResources" type="xs:boolean" hpcc:displayName="Copy Resources" use="optional" default="true" hpcc:tooltip="Copies any missing data files/keys from the position they were in when query was deployed"/>
+            <xs:attribute name="coresPerQuery" type="xs:nonNegativeInteger" hpcc:displayName="Cores Per Query" use="optional" default="0" hpcc:tooltip="If non-zero, binds each incoming query to use the specified number of cores only"/>
+            <xs:attribute name="debugPermitted" type="xs:boolean" hpcc:displayName="Debug Permitted" use="optional" default="true" hpcc:tooltip="Allow the ECL query debugger to attach to queries on this Roxie"/>
+            <xs:attribute name="defaultHighPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default High Priority Time Limit (ms)" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active high-priority query (if not overriden)"/>
+            <!-- range? -->
+            <xs:attribute name="defaultHighPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default High Priority Time Warning (ms)" use="optional" default="5000" hpcc:tooltip="Time (in ms) before generating SNMP warning for a high-priority query (if not overriden)"/>
+            <xs:attribute name="defaultLowPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default Low Priority Time Limit (ms)" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active low-priority query (if not overriden)"/>
+            <xs:attribute name="defaultLowPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default Low Priority Time Warning (ms)" use="optional" default="0" hpcc:tooltip="Time (in ms) before generating SNMP warning for a low-priority query (if not overriden)"/>
+            <xs:attribute name="defaultMemoryLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default Memory Limit (bytes)" use="optional" default="0" hpcc:tooltip="Maximum amount of memory available for row data in any single active query (if not overriden)"/>
+            <xs:attribute name="defaultSLAPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default SLA Priority Time Limit (ms)" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active SLA-high-priority query (if not overriden)"/>
+            <xs:attribute name="defaultSLAPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default SLA Priority Time Warning (ms)" use="optional" default="5000" hpcc:tooltip="Time (in ms) before generating SNMP warning for a SLA-high-priority query (if not overriden)"/>
+            <xs:attribute name="defaultStripLeadingWhitespace" type="xs:boolean" hpcc:displayName="Default Strip Leading Whitespace" use="optional" default="true" hpcc:tooltip="Default value for stripping leading whitespace in input XML values"/>
+            <xs:attribute name="enableKeyDiff" type="xs:boolean" hpcc:displayName="Enable Key Diff" use="optional" default="true" hpcc:tooltip="Enable / Disable key diff functionality in roxie"/>
+            <xs:attribute name="enableSysLog" type="xs:boolean" hpcc:displayName="Enable Sys Log" use="optional" default="true" hpcc:tooltip="Enable use of syslog for monitoring"/>
+            <xs:attribute name="flushJHtreeCacheOnOOM" type="xs:boolean" hpcc:displayName="flushJHtreeCacheOnOOM" use="optional" default="true" hpcc:tooltip="Should the index node memory allocation flush the cache and retry if memory allocation fails"/>
+            <xs:attribute name="fieldTranslationEnabled" use="optional" hpcc:displayName="Enable Field Translation" default="false" hpcc:tooltip="Enables translation (where possible) of mismatched index layouts on-the-fly. Specify 'payload' to attempt to translate payload fields only">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="false" hpcc:displayName="False" hpcc:desciption=""/>
+                        <xs:enumeration value="true" hpcc:displayName="true" hpcc:description=""/>
+                        <xs:enumeration value="payload" hpcc:displayName="Payload" hpcc:description=""/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="highTimeout" type="xs:nonNegativeInteger" hpcc:displayName="High Timeout (ms)" use="optional" default="2000" hpcc:tooltip="Timeout (in ms) before high priority requests are resent to agents"/>
+            <!-- range, min value? -->
+            <xs:attribute name="httpCallerIdHeader" type="xs:string" hpcc:displayName="http Caller ID Header" use="optional" default="HPCC-Caller-Id" hpcc:tooltip="HTTP Header field to use for sending and receiving CallerId"/>
+            <xs:attribute name="httpGlobalIdHeader" type="xs:string" hpcc:displayName="http Global ID Header" use="optional" default="HPCC-Global-Id" hpcc:tooltip="HTTP Header field to use for sending and receiving GlobalId"/>
+            <xs:attribute name="ignoreOrphans" type="xs:boolean" hpcc:displayName="Ignore Orphans" use="optional" default="true" hpcc:tooltip="Treat out-of-date local files as if they were not present"/>
+            <xs:attribute name="lazyOpen" hpcc:displayName="Ignore Orphans" use="optional" default="smart" hpcc:tooltip="Delay opening files until first use. Select smart to use lazy mode only after a restart">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="false" hpcc:displayName="False" hpcc:description=""/>
+                        <xs:enumeration value="true" hpcc:displayName="True" hpcc:description=""/>
+                        <xs:enumeration value="smart" hpcc:displayName="Smart" hpcc:description=""/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+            <xs:attribute name="localFilesExpire" type="xs:integer" hpcc:displayName="Local Files Expire (ms)" use="optional" default="-1" hpcc:tooltip="Period (in ms) of inactivity before a local datafile handle is closed"/>
+            <xs:attribute name="localSlave" type="xs:boolean" hpcc:displayName="Local Slave" use="optional" default="false" hpcc:tooltip="All Roxie servers talk only to their embedded agent"/>
+            <xs:attribute name="lockSuperFiles" type="xs:boolean" hpcc:displayName="Lock SuperFiles" use="optional" default="false" hpcc:tooltip="If enabled, superfiles will be locked while queries that use them are loaded"/>
+            <xs:attribute name="lowTimeout" type="xs:nonNegativeInteger" hpcc:displayName="Low Timeout (ms)" use="optional" default="10000" hpcc:tooltip="Timeout (in ms) before low priority requests are resent to agents"/>
+            <xs:attribute name="maxLocalFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Max Local Files Open" use="optional" default="4000" hpcc:tooltip="Maximum number of local files to keep open"/>
+            <xs:attribute name="maxRemoteFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Max Remote Files Open" use="optional" default="1000" hpcc:tooltip="Maximum number of remote files to keep open"/>
+            <xs:attribute name="minFreeDiskSpace" type="xs:nonNegativeInteger" hpcc:displayName="Mininum Free Disk Space (bytes)" use="optional" default="1073741824" hpcc:tooltip="Minimum amount of disk space needed to be available for file copy to succeed"/>
+            <xs:attribute name="minLocalFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Minumum Local Files Open" use="optional" default="2000" hpcc:tooltip="Minimum number of local files to keep open"/>
+            <xs:attribute name="minRemoteFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Minimum Remote Files Open" use="optional" default="500" hpcc:tooltip="Minimum number of remote files to keep open"/>
+            <xs:attribute name="monitorDaliFileServer" type="xs:boolean" hpcc:displayName="Monitor Dali File Server" use="optional" default="false" hpcc:tooltip="Warn if dafilesrv process is not running on computers"/>
+            <xs:attribute name="preferredSubnet" type="ipV4Address" hpcc:displayName="Preferred Subnet" use="optional" default="" hpcc:tooltip="Preferred subnet to use for multi-NIC machines"/>
+            <xs:attribute name="preferredSubnetMask" type="ipV4Address" hpcc:displayName="Preferred Subnet Mask" use="optional" default="" hpcc:tooltip="Preferred subnet mask to use for multi-NIC machines"/>
+            <xs:attribute name="preloadOnceData" type="xs:boolean" hpcc:displayName="Preload Once Data" use="optional" default="true" hpcc:tooltip="Evaluate : ONCE sections of queries at query load time"/>
+            <xs:attribute name="prestartSlaveThreads" type="xs:boolean" hpcc:displayName="Prestart Slave Threads" use="optional" default="true" hpcc:tooltip="Prestart slave worker threads at startup"/>
+            <xs:attribute name="reloadRetriesFailed" type="xs:boolean" hpcc:displayName="Reload Retries Failed" use="optional" default="true" hpcc:tooltip="Retry loading of failed queries whenever QuerySet reloads"/>
+            <xs:attribute name="remoteFilesExpire" type="xs:integer" hpcc:displayName="Remte Files Expire (ms)" use="optional" default="3600000" hpcc:tooltip="Period (in ms) of inactivity before a remote datafile handle is closed"/>
+            <xs:attribute name="serverThreads" type="xs:nonNegativeInteger" hpcc:displayName="Server Threads" use="optional" default="30" hpcc:tooltip="Default number of threads processing Roxie server requests (if not specifed on Servers tab)"/>
+            <xs:attribute name="siteCertificate" type="xpathType" hpcc:displayName="Site Certificate" use="optional" hpcc:tooltip="Name of the site certificate component that is used for security">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <tooltip></tooltip>
+                        <xpath>/Environment/Software/SiteCertificate</xpath>
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:attribute>
+            <xs:attribute name="slaTimeout" type="xs:nonNegativeInteger" hpcc:displayName="SLA Timeout (ms)" use="optional" default="2000" hpcc:tooltip="Timeout (in ms) before SLA high priority requests are resent to agents"/>
+            <xs:attribute name="slaveQueryReleaseDelaySeconds" type="xs:nonNegativeInteger" hpcc:displayName="Slave Query Release Delay (s)" use="optional" default="60" hpcc:tooltip="Delay before unregistering slave queries to allow in-flight to complete. Files are locked until query is unregistered"/>
+            <xs:attribute name="slaveThreads" type="xs:nonNegativeInteger" hpcc:displayName="Slave Threads" use="optional" default="30" hpcc:tooltip="Number of threads processing agent requests"/>
+            <xs:attribute name="statsExpiryTime" type="xs:nonNegativeInteger" hpcc:displayName="Stats Expire Time (s)" use="optional" default="3600" hpcc:tooltip="Time (in seconds) that detailed reporting stats are kept"/>
+            <xs:attribute name="totalMemoryLimit" type="xs:nonNegativeInteger" hpcc:displayName="Total Memory Limit (bytes)" use="optional" default="1073741824" hpcc:tooltip="Maximum amount of memory available for row data in all active queries"/>
+            <xs:attribute name="heapUseHugePages" type="xs:boolean" hpcc:displayName="Use Heap Huge Pages" default="false" hpcc:tooltip="Allow roxie to use memory from huge pages if they have been configured"/>
+            <xs:attribute name="heapUseTransparentHugePages" type="xs:boolean" hpcc:displayName="Use Heap Transparent Huge Pages" default="true" hpcc:tooltip="Allow roxie to use memory from transparent huge pages"/>
+            <xs:attribute name="heapRetainMemory" type="xs:boolean" hpcc:displayName="Retain Heap Memory" default="false" hpcc:tooltip="Retain and do not return unused memory to the operating system"/>
+            <xs:attribute name="trapTooManyActiveQueries" type="xs:boolean" hpcc:displayName="Trap Too Many Active Queries" use="optional" default="true" hpcc:tooltip="should an SNMP trap get sent when too many active query error occurs"/>
+            <xs:attribute name="useHardLink" type="xs:boolean" hpcc:displayName="Use Hard Link" use="optional" default="false" hpcc:tooltip="If the data file exists on the current machine but in a different directory than roxie expects - create a hard link"/>
+            <xs:attribute name="useMemoryMappedIndexes" type="xs:boolean" hpcc:displayName="Use Memory Mapped Indices" use="optional" default="false" hpcc:tooltip="Using memory-mapped files when merging multiple result streams from row-compressed indexes"/>
+            <xs:attribute name="useRemoteResources" type="xs:boolean" hpcc:displayName="Use Remote Resources" use="optional" default="true" hpcc:tooltip="Reads any missing data files/keys from the position they were in when deployed"/>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="redundancy" hpcc:groupByName="Redundancy">
+            <xs:attribute name="cyclicOffset" type="xs:nonNegativeInteger" hpcc:displayName="Cyclic Offset"  use="optional" default="1" hpcc:tooltip="Offset for cyclic redundancy mode"/>
+            <xs:attribute name="channelsPerNode" type="xs:nonNegativeInteger" hpcc:displayName="Channels Per Node"  use="optional" default="1" hpcc:tooltip="Number of channels/data locations to use per node, in overloaded mode"/>
+            <xs:attribute name="numDataCopies" type="xs:nonNegativeInteger" hpcc:displayName="Number Data Copies"  use="optional" default="1" hpcc:tooltip="Number of copies of the data in redundant modes"/>
+            <xs:attribute name="slaveConfig" hpcc:displayName="Slave Config"  use="optional" default="" hpcc:tooltip="Roxie data redundancy mode">
+                <xs:simpleType>
+                    <xs:restriction base="xs:string">
+                        <xs:enumeration value="simple" hpcc:displayName="Simple" hpcc:description=""/>
+                        <xs:enumeration value="overloaded" hpcc:displayName="Overloaded" hpcc:description=""/>
+                        <xs:enumeration value="full redundancy" hpcc:displayName="Full Redundancy" hpcc:description=""/>
+                        <xs:enumeration value="cyclic redundancy" hpcc:displayName="Cyclic Redundancy" hpcc:description=""/>
+                    </xs:restriction>
+                </xs:simpleType>
+            </xs:attribute>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="tracing" hpcc:groupByName="Tracing">
+            <xs:attribute name="traceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Trace Level"  use="optional" default="1" hpcc:tooltip="Level of detail in reporting (set to 0 for none, 1 for normal, > 1 or more for extended)"/>
+            <xs:attribute name="logFullQueries" type="xs:boolean" hpcc:displayName="Log Full Queries"  use="optional" default="false" hpcc:tooltip="Log full text (unless blindLogging) and resource usage of all queries received"/>
+            <xs:attribute name="blindLogging" type="xs:boolean" hpcc:displayName="Blind Logging"  use="optional" default="false" hpcc:tooltip="Suppress all logging of any data or query text"/>
+            <xs:attribute name="memTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Memory Trace Level"  use="optional" default="1" hpcc:tooltip="Level of detail in reporting mem mgr information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
+            <xs:attribute name="miscDebugTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Misc Debug Trace Level"  use="optional" default="0" hpcc:tooltip="Level of miscellaneous debug tracing unrelated to all other tracing(set to 0 for none, 1 for normal, >1 or more for extended)"/>
+            <xs:attribute name="soapTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Soap trace Level"  use="optional" default="1" hpcc:tooltip="Level of detail in reporting SOAPCALL information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
+            <xs:attribute name="traceEnabled" type="xs:boolean" hpcc:displayName="Trace Enabled"  use="optional" default="false" hpcc:tooltip="TRACE activity output enabled by default (can be overridden in workunit or query)"/>
+            <xs:attribute name="traceLimit" type="xs:nonNegativeInteger" hpcc:displayName="Trace Limit"  use="optional" default="10" hpcc:tooltip="Number of rows output by TRACE activity"/>
+            <xs:attribute name="udpTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="UDP Trace Level"  use="optional" default="1" hpcc:tooltip="Level of detail in reporting udp information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
+            <xs:attribute name="useLogQueue" type="xs:boolean" hpcc:displayName="Use Log Queue"  use="optional" default="true" hpcc:tooltip="Queue logs messages"/>
+            <xs:attribute name="logQueueDrop" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Drop"  use="optional" default="32" hpcc:tooltip="Specifies the number of log messages which will be dropped if the maximum length of the queue of unhandled messages is exceeded"/>
+            <xs:attribute name="logQueueLen" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Length"  use="optional" default="512" hpcc:tooltip="Specifies the maximum length of the queue of unhandled log messages. Messages will be dropped if this is exceeded"/>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="udp" hpcc:groupByName="UDP">
+            <xs:attribute name="roxieMulticastEnabled" type="xs:boolean" hpcc:displayName="Enable Roxie Multicast" use="optional" default="true" hpcc:tooltip="Controls whether multicast is used to communicate between nodes"/>
+            <xs:attribute name="udpFlowSocketsSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Flow Socket Size (bytes)" use="optional" default="131071" hpcc:tooltip="Controls the read socket buffer size of the UDP layer flow control sockets"/>
+            <xs:attribute name="udpInlineCollation" type="xs:boolean" hpcc:displayName="UDP Inline Collation" use="optional" default="false" hpcc:tooltip="Controls whether UDP packets are collated on the reading thread or queued up for collation on a separate thread"/>
+            <xs:attribute name="udpInlineCollationPacketLimit" type="xs:nonNegativeInteger" hpcc:displayName="UDP Inline Colation Packet Limit" use="optional" default="50" hpcc:tooltip="Controls how many UDP packets requested at once when inline collation selected"/>
+            <xs:attribute name="udpLocalWriteSocketSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Local Write Socket Size (bytes)" use="optional" default="131071" hpcc:tooltip="Controls the write socket buffer size of the local UDP sockets (Agent to Server on same node)"/>
+            <xs:attribute name="udpMaxRetryTimedoutReqs" type="xs:nonNegativeInteger" hpcc:displayName="UDP Max Retry Timedout Reqs" use="optional" default="0" hpcc:tooltip="Controls the Max number of agent 'request to send' to be retried. 0 means keep retrying forever"/>
+            <xs:attribute name="udpMaxSlotsPerClient" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Length" use="optional" default="2147483647" hpcc:tooltip="UDP transport layer slots per client"/>
+            <xs:attribute name="udpMulticastBufferSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Multicast Buffer Size (bytes)" use="optional" default="131071" hpcc:tooltip="Controls the read socket buffer size of the UDP multicast sockets"/>
+            <xs:attribute name="udpOutQsPriority" type="xs:nonNegativeInteger" hpcc:displayName="UDP Quality of Service Priority" use="optional" default="0" hpcc:tooltip="Turns on/off Priority weight-based for output queues (0 round-robin no priority - old logic, 1 round-robin new logic, 2 and higher is factor of priority)"/>
+            <xs:attribute name="udpQueueSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Queue Size" use="optional" default="100" hpcc:tooltip="UDP transport layer receive queue size"/>
+            <xs:attribute name="udpRequestToSendTimeout" type="xs:nonNegativeInteger" hpcc:displayName="UDP Request To Send Timeout (units?)" use="optional" default="0" hpcc:tooltip="Controls the timeout value agent udp will wait for permission to send from a Roxie server, in milliseconds. Specify 0 to calcuate automatically"/>
+            <xs:attribute name="udpResendEnabled" type="xs:boolean" hpcc:displayName="Enable UDP Resend" use="optional" default="false" hpcc:tooltip="UDP transport layer packet resend ability"/>
+            <xs:attribute name="udpRetryBusySenders" type="xs:nonNegativeInteger" hpcc:displayName="UDP Retry Busy Senders" use="optional" default="0" hpcc:tooltip="Controls the number of times Roxie server will repeat search for an idle sender when requesting new data"/>
+            <xs:attribute name="udpSendQueueSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Send Queue Size" use="optional" default="50" hpcc:tooltip="UDP transport layer send queue size"/>
+            <xs:attribute name="udpSnifferEnabled" type="xs:boolean" hpcc:displayName="Enable UDP Sniffer" use="optional" default="true" hpcc:tooltip="Enable the UDP multicast sniffer for tracking which senders are busy"/>
+            <xs:attribute name="udpSnifferReadThreadPriority" type="nonNegativeInteger" hpcc:displayName="UDP Sniffer Read Thread Priority" use="optional" default="3" hpcc:tooltip="If non-zero, run the sniffer read thread at elevated priority level"/>
+            <xs:attribute name="udpSnifferSendThreadPriority" type="nonNegativeInteger" hpcc:displayName="UDP Sniffer Send Thread Priority" use="optional" default="3" hpcc:tooltip="If non-zero, run the sniffer send thread at elevated priority level"/>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="cache" hpcc:groupByName="Cache">
+            <xs:attribute name="blobCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Blob Cache Memory Size (Mb)"  use="optional" default="0" hpcc:tooltip="Size (in Mb) of blob index page cache"/>
+            <xs:attribute name="serverSideCacheSize" type="xs:nonNegativeInteger" hpcc:displayName="Server Side Cache Size"  use="optional" default="0" hpcc:tooltip="Number of agent results to cache on Roxie server"/>
+            <xs:attribute name="leafCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Leaf Cache Memory Size (Mb)"  use="optional" default="50" hpcc:tooltip="Size (in Mb) of leaf index page cache"/>
+            <xs:attribute name="nodeCachePreload" type="xs:boolean" hpcc:displayName="Enable Node Cache Preload"  use="optional" default="false" hpcc:tooltip="Prefill the node cache with all non-leaf pages from all indexes"/>
+            <xs:attribute name="nodeCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Node Cache Memory Size (Mb)"  use="optional" default="100" hpcc:tooltip="Size (in Mb) of non-leaf index page cache"/>
+        </xs:attributeGroup>
+
+        <xs:attributeGroup name="debug" hpcc:groupByName="Debug">
+            <xs:attribute name="checkCompleted" type="xs:boolean" hpcc:displayName="Check Completed" use="optional" default="true" hpcc:tooltip="Check pending replies when agent gets a retry request"/>
+            <xs:attribute name="dafilesrvLookupTimeout" type="xs:nonNegativeInteger" hpcc:displayName="DaFileserv Lookup Timeout (ms)" use="optional" default="10000" hpcc:tooltip="Maximum time (in milliseconds) dafilesrv will wait before timing out the first time through the list"/>
+            <xs:attribute name="defaultConcatPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Concat Preload" use="optional" default="0" hpcc:tooltip="Default concat preloa"/>
+            <xs:attribute name="defaultFetchPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Fetch Preload" use="optional" default="0" hpcc:tooltip="Default fetch preload"/>
+            <xs:attribute name="defaultFullKeyedJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Full Keyed Join Preload" use="optional" default="0" hpcc:tooltip="Default full keyed join preload"/>
+            <xs:attribute name="defaultKeyedJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Keyed Join Preload" use="optional" default="0" hpcc:tooltip="Default keyed join preload"/>
+            <xs:attribute name="defaultParallelJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Parallel Join Preload" use="optional" default="0" hpcc:tooltip="Default parallel join preload"/>
+            <xs:attribute name="defaultPrefetchProjectPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Prefetch Project Preload" use="optional" default="10" hpcc:tooltip="Default prefetch value for PROJECT,PREFETCH activity"/>
+            <xs:attribute name="diskReadBufferSize" type="xs:nonNegativeInteger" hpcc:displayName="Disk Read Buffer Size (bytes)" use="optional" default="65536" hpcc:tooltip="Default buffer size for disk read operations"/>
+            <xs:attribute name="doIbytiDelay" type="xs:boolean" hpcc:displayName="Enable IBYTI Ddelay Logic" use="optional" default="true" hpcc:tooltip="Enables the IBYTI delay logic in the agents"/>
+            <xs:attribute name="enableHeartBeat" type="xs:boolean" hpcc:displayName="Enable Heartbeat" use="optional" default="true" hpcc:tooltip="Enable HeartBeat messages to clients"/>
+            <xs:attribute name="fastLaneQueue" type="xs:boolean" hpcc:displayName="Enable Fast Lane Queue" use="optional" default="true" hpcc:tooltip="special fast-lane queue for simple queries"/>
+            <xs:attribute name="forceStdLog" type="xs:boolean" hpcc:displayName="Force Std Log Output" use="optional" default="false" hpcc:tooltip="Force log output to stderr even when redirected to null"/>
+            <xs:attribute name="ignoreMissingFiles" type="xs:boolean" hpcc:displayName="Ignore Missing Files" use="optional" default="false" hpcc:tooltip="Ignore missing files"/>
+            <xs:attribute name="indexReadChunkSize" type="xs:nonNegativeInteger" hpcc:displayName="Index Read Chunk Size" use="optional" default="60000" hpcc:tooltip="Break up results from indexRead (and other remote activities) every N bytes"/>
+            <xs:attribute name="initIbytiDelay" type="xs:nonNegativeInteger" hpcc:displayName="Init IBYTI Delay Time (ms)" use="optional" default="100" hpcc:tooltip="Initial time (in milliseconds) a secondary agent will wait for an IBYTI packet from a primary peer"/>
+            <xs:attribute name="jumboFrames" type="xs:boolean" hpcc:displayName="Jumbo Frames" use="optional" default="false" hpcc:tooltip="Set to true if using jumbo frames (MTU=9000) on the network"/>
+            <xs:attribute name="linuxYield" type="xs:boolean" hpcc:displayName="Linux Yield" use="optional" default="false" hpcc:tooltip="Yield to scheduler in some tight loops. May help latency on uniprocessor machines"/>
+            <xs:attribute name="maxBlockSize" type="xs:nonNegativeInteger" hpcc:displayName="Maximum Block Size (bytes)" use="optional" default="10000000" hpcc:tooltip="Max size of block read from client socket"/>
+            <xs:attribute name="maxLockAttempts" type="xs:nonNegativeInteger" hpcc:displayName="Maximum Lock Attempts" use="optional" default="5" hpcc:tooltip="Number of retries to get lock for global queries"/>
+            <xs:attribute name="memoryStatsInterval" type="xs:nonNegativeInteger" hpcc:displayName="Memory Stats Interval (s)" use="optional" default="60" hpcc:tooltip="Interval (in seconds) between reports on Roxie heap usage"/>
+            <xs:attribute name="memTraceSizeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Memory trace Size Limit (bytes?)" use="optional" default="0" hpcc:tooltip="Generate stacktrace whenever a request is made for a row larger than this threshold (0 to disable)"/>
+            <xs:attribute name="parallelAggregate" type="xs:nonNegativeInteger" hpcc:displayName="Parallel Aggregate" use="optional" default="0" hpcc:tooltip="Number of parallel threads to use for in-memory aggregate processing. Set to 0 to use one per CPU, 1 to disable parallel processing of in-memory aggregates"/>
+            <xs:attribute name="perChannelFlowLimit" type="xs:nonNegativeInteger" hpcc:displayName="Per Channel Flow Limit" use="optional" default="10" hpcc:tooltip="Number of pending queries permitted per channel (per active activity) before blocking"/>
+            <xs:attribute name="pingInterval" type="xs:nonNegativeInteger" hpcc:displayName="Ping Interval (s)" use="optional" default="60" hpcc:tooltip="Interval (in seconds) between Roxie server ping tests"/>
+            <xs:attribute name="preabortIndexReadsThreshold" type="xs:nonNegativeInteger" hpcc:displayName="Pre Abort Index Reads Threshold" use="optional" default="100" hpcc:tooltip="Use seek to precheck keyed limits (i.e. assume ,COUNT) on index reads if limit greater than this value"/>
+            <xs:attribute name="preabortKeyedJoinsThreshold" type="xs:nonNegativeInteger" hpcc:displayName="Pre Abort Keyed Joins Threshold" use="optional" default="100" hpcc:tooltip="Use seek to precheck limits on keyed joins if limit greater than this value"/>
+            <xs:attribute name="simpleLocalKeyedJoins" type="xs:boolean" hpcc:displayName="Simple Local Keyed Joins" use="optional" default="true" hpcc:tooltip="Enable single-threaded local keyed joins"/>
+            <xs:attribute name="socketCheckInterval" type="xs:nonNegativeInteger" hpcc:displayName="Socket Check Interval" use="optional" default="5000" hpcc:tooltip="Interval (in milliseconds) between checks that client socket is still open"/>
+            <xs:attribute name="systemMonitorInterval" type="xs:nonNegativeInteger" hpcc:displayName="System Monitor Interval (ms?)" use="optional" default="60000" hpcc:tooltip="How often to send an 'alive' message"/>
+        </xs:attributeGroup>
+
         <xs:sequence>
             <xs:element name="RoxieCluster" maxOccurs="unbounded" hpcc:itemType="roxiecluster" hpcc:displayName="Roxie Cluster" hpcc:class="component">
                 <!-- should make this default to the complexType name -->
@@ -113,202 +315,22 @@
                     <xs:attribute name="directory" type="absolutePath" hpcc:displayName="Directory" use="optional" default="${EXEC_PREFIX}/lib/${DIR_NAME}/roxie/" hpcc:tooltip="Specifies the directory to which the software will be deployed"/>
                     <!-- @XSD_PLUGIN_DEFINITION@ LN injects an attribute!! -->
                     <xs:attribute name="pluginsPath" type="relativePath" hpcc:displayName="Plugins Path" use="optional" default="${PLUGINS_PATH}" hpcc:tooltip="Alternate path where plugin files are deployed (./plugins is assumed if not specified)"/>
-                    <!-- LDAP attributes -->
-                    <xs:attribute name="ldapUser" type="xs:string" hpcc:displayName="LDAP User" hpcc:group="LDAP" use="optional" default="roxie" hpcc:tooltip="Specifies the user name for LDAP file access checking"/>
-                    <xs:attribute name="ldapPassword" type="xs:string" hpcc:displayName="LDAP User Password" hpcc:group="LDAP" use="optional" hpcc:modifiers="mask,verify" hpcc:tooltip="Specifies the user name for LDAP file access checking"/>
-                    <!-- Options attributes -->
-                    <xs:attribute name="affinity" type="xs:nonNegativeInteger" hpcc:displayName="Affinity" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="If non-zero, binds the roxie process to use the specified cores only (bitmask)"/>
-                    <xs:attribute name="allFilesDynamic" type="xs:boolean" hpcc:displayName="All Files Dynamic" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="If enabled, files will be resolved per-query and not locked between queries"/>
-                    <xs:attribute name="backgroundCopyClass" hpcc:displayName="Background Copy Class" hpcc:group="Options" default="none" hpcc:tooltip="Specify an IONICE class for the background copy thread">
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="none" hpcc:displayName="None" hpcc:description=""/>
-                                <xs:enumeration value="best-effort" hpcc:displayName="Best Effort" hpcc:description=""/>
-                                <xs:enumeration value="idle" hpcc:displayName="Idle" hpcc:description=""/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:attribute>
-                    <xs:attribute name="backgroundCopyPrio" hpcc:displayName="Background Copy Priority" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Specify an IONICE value for the background copy thread, if backgroundCopyClass set to best-effort">
-                        <!-- Is this value required if the backgroundcopyclass is set to a particular value -->
-                        <xs:simpleType>
-                            <!-- This is how to do a range, If not desired, add type="xs:nonNegativeInteger" above and remove the simpleType section -->
-                            <xs:restriction base="xs:nonNegativeInteger">
-                                <xs:minInclusive value="1"/>
-                                <xs:maxInclusive value="100"/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:attribute>
-                    <xs:attribute name="callbackRetries" type="xs:nonNegativeInteger" hpcc:displayName="Callback Retries" hpcc:group="Options" use="optional" default="3" hpcc:tooltip="Number of retries before callbacks from agents to server are aborted"/>
-                    <xs:attribute name="callbackTimeout" type="xs:nonNegativeInteger" hpcc:displayName="Callback Timeout" hpcc:group="Options" use="optional" default="5000" hpcc:tooltip="Timeout (in ms) before callbacks from agents to server are resent"/>
-                    <!-- range? -->
-                    <xs:attribute name="checkFileDate" type="xs:boolean" hpcc:displayName="Check File Date" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Compare file dates of physical files with the information in DFS"/>
-                    <xs:attribute name="collectFactoryStatistics" type="xs:boolean" hpcc:displayName="Gather Factory Statistics" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Accumulate summary statistics for all queries"/>
-                    <xs:attribute name="copyResources" type="xs:boolean" hpcc:displayName="Copy Resources" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Copies any missing data files/keys from the position they were in when query was deployed"/>
-                    <xs:attribute name="coresPerQuery" type="xs:nonNegativeInteger" hpcc:displayName="Cores Per Query" hpcc:group="options" use="optional" default="0" hpcc:tooltip="If non-zero, binds each incoming query to use the specified number of cores only"/>
-                    <xs:attribute name="debugPermitted" type="xs:boolean" hpcc:displayName="Debug Permitted" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Allow the ECL query debugger to attach to queries on this Roxie"/>
-                    <xs:attribute name="defaultHighPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default High Priority Time Limit (ms)" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active high-priority query (if not overriden)"/>
-                    <!-- range? -->
-                    <xs:attribute name="defaultHighPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default High Priority Time Warning (ms)" hpcc:group="Options" use="optional" default="5000" hpcc:tooltip="Time (in ms) before generating SNMP warning for a high-priority query (if not overriden)"/>
-                    <xs:attribute name="defaultLowPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default Low Priority Time Limit (ms)" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active low-priority query (if not overriden)"/>
-                    <xs:attribute name="defaultLowPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default Low Priority Time Warning (ms)" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Time (in ms) before generating SNMP warning for a low-priority query (if not overriden)"/>
-                    <xs:attribute name="defaultMemoryLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default Memory Limit (bytes)" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Maximum amount of memory available for row data in any single active query (if not overriden)"/>
-                    <xs:attribute name="defaultSLAPriorityTimeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Default SLA Priority Time Limit (ms)" hpcc:group="Options" use="optional" default="0" hpcc:tooltip="Maximum run time (in ms) for any single active SLA-high-priority query (if not overriden)"/>
-                    <xs:attribute name="defaultSLAPriorityTimeWarning" type="xs:nonNegativeInteger" hpcc:displayName="Default SLA Priority Time Warning (ms)" hpcc:group="Options" use="optional" default="5000" hpcc:tooltip="Time (in ms) before generating SNMP warning for a SLA-high-priority query (if not overriden)"/>
-                    <xs:attribute name="defaultStripLeadingWhitespace" type="xs:boolean" hpcc:displayName="Default Strip Leading Whitespace" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Default value for stripping leading whitespace in input XML values"/>
-                    <xs:attribute name="enableKeyDiff" type="xs:boolean" hpcc:displayName="Enable Key Diff" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Enable / Disable key diff functionality in roxie"/>
-                    <xs:attribute name="enableSysLog" type="xs:boolean" hpcc:displayName="Enable Sys Log" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Enable use of syslog for monitoring"/>
-                    <xs:attribute name="flushJHtreeCacheOnOOM" type="xs:boolean" hpcc:displayName="flushJHtreeCacheOnOOM" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Should the index node memory allocation flush the cache and retry if memory allocation fails"/>
-                    <xs:attribute name="fieldTranslationEnabled" use="optional" hpcc:displayName="Enable Field Translation" hpcc:group="Options" default="false" hpcc:tooltip="Enables translation (where possible) of mismatched index layouts on-the-fly. Specify 'payload' to attempt to translate payload fields only">
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="false" hpcc:displayName="False" hpcc:desciption=""/>
-                                <xs:enumeration value="true" hpcc:displayName="true" hpcc:description=""/>
-                                <xs:enumeration value="payload" hpcc:displayName="Payload" hpcc:description=""/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:attribute>
-                    <xs:attribute name="highTimeout" type="xs:nonNegativeInteger" hpcc:displayName="High Timeout (ms)" hpcc:group="Options" use="optional" default="2000" hpcc:tooltip="Timeout (in ms) before high priority requests are resent to agents"/>
-                    <!-- range, min value? -->
-                    <xs:attribute name="httpCallerIdHeader" type="xs:string" hpcc:displayName="http Caller ID Header" hpcc:group="Options" use="optional" default="HPCC-Caller-Id" hpcc:tooltip="HTTP Header field to use for sending and receiving CallerId"/>
-                    <xs:attribute name="httpGlobalIdHeader" type="xs:string" hpcc:displayName="http Global ID Header" hpcc:group="Options" use="optional" default="HPCC-Global-Id" hpcc:tooltip="HTTP Header field to use for sending and receiving GlobalId"/>
-                    <xs:attribute name="ignoreOrphans" type="xs:boolean" hpcc:displayName="Ignore Orphans" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Treat out-of-date local files as if they were not present"/>
-                    <xs:attribute name="lazyOpen" hpcc:displayName="Ignore Orphans" hpcc:group="Options" use="optional" default="smart" hpcc:tooltip="Delay opening files until first use. Select smart to use lazy mode only after a restart">
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="false" hpcc:displayName="False" hpcc:description=""/>
-                                <xs:enumeration value="true" hpcc:displayName="True" hpcc:description=""/>
-                                <xs:enumeration value="smart" hpcc:displayName="Smart" hpcc:description=""/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:attribute>
-                    <xs:attribute name="localFilesExpire" type="xs:integer" hpcc:displayName="Local Files Expire (ms)" hpcc:group="Options" use="optional" default="-1" hpcc:tooltip="Period (in ms) of inactivity before a local datafile handle is closed"/>
-                    <xs:attribute name="localSlave" type="xs:boolean" hpcc:displayName="Local Slave" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="All Roxie servers talk only to their embedded agent"/>
-                    <xs:attribute name="lockSuperFiles" type="xs:boolean" hpcc:displayName="Lock SuperFiles" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="If enabled, superfiles will be locked while queries that use them are loaded"/>
-                    <xs:attribute name="lowTimeout" type="xs:nonNegativeInteger" hpcc:displayName="Low Timeout (ms)" hpcc:group="Options" use="optional" default="10000" hpcc:tooltip="Timeout (in ms) before low priority requests are resent to agents"/>
-                    <xs:attribute name="maxLocalFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Max Local Files Open" hpcc:group="Options" use="optional" default="4000" hpcc:tooltip="Maximum number of local files to keep open"/>
-                    <xs:attribute name="maxRemoteFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Max Remote Files Open" hpcc:group="Options" use="optional" default="1000" hpcc:tooltip="Maximum number of remote files to keep open"/>
-                    <xs:attribute name="minFreeDiskSpace" type="xs:nonNegativeInteger" hpcc:displayName="Mininum Free Disk Space (bytes)" hpcc:group="Options" use="optional" default="1073741824" hpcc:tooltip="Minimum amount of disk space needed to be available for file copy to succeed"/>
-                    <xs:attribute name="minLocalFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Minumum Local Files Open" hpcc:group="Options" use="optional" default="2000" hpcc:tooltip="Minimum number of local files to keep open"/>
-                    <xs:attribute name="minRemoteFilesOpen" type="xs:nonNegativeInteger" hpcc:displayName="Minimum Remote Files Open" hpcc:group="Options" use="optional" default="500" hpcc:tooltip="Minimum number of remote files to keep open"/>
-                    <xs:attribute name="monitorDaliFileServer" type="xs:boolean" hpcc:displayName="Monitor Dali File Server" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="Warn if dafilesrv process is not running on computers"/>
-                    <xs:attribute name="preferredSubnet" type="ipV4Address" hpcc:displayName="Preferred Subnet" hpcc:group="Options" use="optional" default="" hpcc:tooltip="Preferred subnet to use for multi-NIC machines"/>
-                    <xs:attribute name="preferredSubnetMask" type="ipV4Address" hpcc:displayName="Preferred Subnet Mask" hpcc:group="Options" use="optional" default="" hpcc:tooltip="Preferred subnet mask to use for multi-NIC machines"/>
-                    <xs:attribute name="preloadOnceData" type="xs:boolean" hpcc:displayName="Preload Once Data" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Evaluate : ONCE sections of queries at query load time"/>
-                    <xs:attribute name="prestartSlaveThreads" type="xs:boolean" hpcc:displayName="Prestart Slave Threads" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Prestart slave worker threads at startup"/>
-                    <xs:attribute name="reloadRetriesFailed" type="xs:boolean" hpcc:displayName="Reload Retries Failed" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Retry loading of failed queries whenever QuerySet reloads"/>
-                    <xs:attribute name="remoteFilesExpire" type="xs:integer" hpcc:displayName="Remte Files Expire (ms)" hpcc:group="Options" use="optional" default="3600000" hpcc:tooltip="Period (in ms) of inactivity before a remote datafile handle is closed"/>
-                    <xs:attribute name="serverThreads" type="xs:nonNegativeInteger" hpcc:displayName="Server Threads" hpcc:group="Options" use="optional" default="30" hpcc:tooltip="Default number of threads processing Roxie server requests (if not specifed on Servers tab)"/>
-                    <xs:attribute name="siteCertificate" type="xpathType" hpcc:displayName="Site Certificate" hpcc:group="Options" use="optional" hpcc:tooltip="Name of the site certificate component that is used for security">
-                        <xs:annotation>
-                            <xs:appinfo>
-                                <tooltip></tooltip>
-                                <xpath>/Environment/Software/SiteCertificate</xpath>
-                            </xs:appinfo>
-                        </xs:annotation>
-                    </xs:attribute>
-                    <xs:attribute name="slaTimeout" type="xs:nonNegativeInteger" hpcc:displayName="SLA Timeout (ms)" hpcc:group="Options" use="optional" default="2000" hpcc:tooltip="Timeout (in ms) before SLA high priority requests are resent to agents"/>
-                    <xs:attribute name="slaveQueryReleaseDelaySeconds" type="xs:nonNegativeInteger" hpcc:displayName="Slave Query Release Delay (s)" hpcc:group="Options" use="optional" default="60" hpcc:tooltip="Delay before unregistering slave queries to allow in-flight to complete. Files are locked until query is unregistered"/>
-                    <xs:attribute name="slaveThreads" type="xs:nonNegativeInteger" hpcc:displayName="Slave Threads" hpcc:group="Options" use="optional" default="30" hpcc:tooltip="Number of threads processing agent requests"/>
-                    <xs:attribute name="statsExpiryTime" type="xs:nonNegativeInteger" hpcc:displayName="Stats Expire Time (s)" hpcc:group="Options" use="optional" default="3600" hpcc:tooltip="Time (in seconds) that detailed reporting stats are kept"/>
-                    <xs:attribute name="totalMemoryLimit" type="xs:nonNegativeInteger" hpcc:displayName="Total Memory Limit (bytes)" hpcc:group="Options" use="optional" default="1073741824" hpcc:tooltip="Maximum amount of memory available for row data in all active queries"/>
-                    <xs:attribute name="heapUseHugePages" type="xs:boolean" hpcc:displayName="Use Heap Huge Pages" hpcc:group="Options" default="false" hpcc:tooltip="Allow roxie to use memory from huge pages if they have been configured"/>
-                    <xs:attribute name="heapUseTransparentHugePages" type="xs:boolean" hpcc:displayName="Use Heap Transparent Huge Pages" hpcc:group="Options" default="true" hpcc:tooltip="Allow roxie to use memory from transparent huge pages"/>
-                    <xs:attribute name="heapRetainMemory" type="xs:boolean" hpcc:displayName="Retain Heap Memory" hpcc:group="Options" default="false" hpcc:tooltip="Retain and do not return unused memory to the operating system"/>
-                    <xs:attribute name="trapTooManyActiveQueries" type="xs:boolean" hpcc:displayName="Trap Too Many Active Queries" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="should an SNMP trap get sent when too many active query error occurs"/>
-                    <xs:attribute name="useHardLink" type="xs:boolean" hpcc:displayName="Use Hard Link" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="If the data file exists on the current machine but in a different directory than roxie expects - create a hard link"/>
-                    <xs:attribute name="useMemoryMappedIndexes" type="xs:boolean" hpcc:displayName="Use Memory Mapped Indices" hpcc:group="Options" use="optional" default="false" hpcc:tooltip="Using memory-mapped files when merging multiple result streams from row-compressed indexes"/>
-                    <xs:attribute name="useRemoteResources" type="xs:boolean" hpcc:displayName="Use Remote Resources" hpcc:group="Options" use="optional" default="true" hpcc:tooltip="Reads any missing data files/keys from the position they were in when deployed"/>
 
-                    <!-- Redundancy attributes -->
-                    <xs:attribute name="cyclicOffset" type="xs:nonNegativeInteger" hpcc:displayName="Cyclic Offset" hpcc:group="Redundancy" use="optional" default="1" hpcc:tooltip="Offset for cyclic redundancy mode"/>
-                    <xs:attribute name="channelsPerNode" type="xs:nonNegativeInteger" hpcc:displayName="Channels Per Node" hpcc:group="Redundancy" use="optional" default="1" hpcc:tooltip="Number of channels/data locations to use per node, in overloaded mode"/>
-                    <xs:attribute name="numDataCopies" type="xs:nonNegativeInteger" hpcc:displayName="Number Data Copies" hpcc:group="Redundancy" use="optional" default="1" hpcc:tooltip="Number of copies of the data in redundant modes"/>
-                    <xs:attribute name="slaveConfig" hpcc:displayName="Slave Config" hpcc:group="Redundancy" use="optional" default="" hpcc:tooltip="Roxie data redundancy mode">
-                        <xs:simpleType>
-                            <xs:restriction base="xs:string">
-                                <xs:enumeration value="simple" hpcc:displayName="Simple" hpcc:description=""/>
-                                <xs:enumeration value="overloaded" hpcc:displayName="Overloaded" hpcc:description=""/>
-                                <xs:enumeration value="full redundancy" hpcc:displayName="Full Redundancy" hpcc:description=""/>
-                                <xs:enumeration value="cyclic redundancy" hpcc:displayName="Cyclic Redundancy" hpcc:description=""/>
-                            </xs:restriction>
-                        </xs:simpleType>
-                    </xs:attribute>
-                    <!-- Tracing attributes -->
-                    <xs:attribute name="traceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Trace Level" hpcc:group="Tracing" use="optional" default="1" hpcc:tooltip="Level of detail in reporting (set to 0 for none, 1 for normal, > 1 or more for extended)"/>
-                    <xs:attribute name="logFullQueries" type="xs:boolean" hpcc:displayName="Log Full Queries" hpcc:group="Tracing" use="optional" default="false" hpcc:tooltip="Log full text (unless blindLogging) and resource usage of all queries received"/>
-                    <xs:attribute name="blindLogging" type="xs:boolean" hpcc:displayName="Blind Logging" hpcc:group="Tracing" use="optional" default="false" hpcc:tooltip="Suppress all logging of any data or query text"/>
-                    <xs:attribute name="memTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Memory Trace Level" hpcc:group="Tracing" use="optional" default="1" hpcc:tooltip="Level of detail in reporting mem mgr information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
-                    <xs:attribute name="miscDebugTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Misc Debug Trace Level" hpcc:group="Tracing" use="optional" default="0" hpcc:tooltip="Level of miscellaneous debug tracing unrelated to all other tracing(set to 0 for none, 1 for normal, >1 or more for extended)"/>
-                    <xs:attribute name="soapTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="Soap trace Level" hpcc:group="Tracing" use="optional" default="1" hpcc:tooltip="Level of detail in reporting SOAPCALL information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
-                    <xs:attribute name="traceEnabled" type="xs:boolean" hpcc:displayName="Trace Enabled" hpcc:group="Tracing" use="optional" default="false" hpcc:tooltip="TRACE activity output enabled by default (can be overridden in workunit or query)"/>
-                    <xs:attribute name="traceLimit" type="xs:nonNegativeInteger" hpcc:displayName="Trace Limit" hpcc:group="Tracing" use="optional" default="10" hpcc:tooltip="Number of rows output by TRACE activity"/>
-                    <xs:attribute name="udpTraceLevel" type="xs:nonNegativeInteger" hpcc:displayName="UDP Trace Level" hpcc:group="Tracing" use="optional" default="1" hpcc:tooltip="Level of detail in reporting udp information(set to 0 for none, 1 for normal, >1 or more for extended)"/>
-                    <xs:attribute name="useLogQueue" type="xs:boolean" hpcc:displayName="Use Log Queue" hpcc:group="Tracing" use="optional" default="true" hpcc:tooltip="Queue logs messages"/>
-                    <xs:attribute name="logQueueDrop" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Drop" hpcc:group="Tracing" use="optional" default="32" hpcc:tooltip="Specifies the number of log messages which will be dropped if the maximum length of the queue of unhandled messages is exceeded"/>
-                    <xs:attribute name="logQueueLen" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Length" hpcc:group="Tracing" use="optional" default="512" hpcc:tooltip="Specifies the maximum length of the queue of unhandled log messages. Messages will be dropped if this is exceeded"/>
-                    <!-- UDP attributes -->
-                    <xs:attribute name="roxieMulticastEnabled" type="xs:boolean" hpcc:displayName="Enable Roxie Multicast" hpcc:group="UDP" use="optional" default="true" hpcc:tooltip="Controls whether multicast is used to communicate between nodes"/>
-                    <xs:attribute name="udpFlowSocketsSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Flow Socket Size (bytes)" hpcc:group="UDP" use="optional" default="131071" hpcc:tooltip="Controls the read socket buffer size of the UDP layer flow control sockets"/>
-                    <xs:attribute name="udpInlineCollation" type="xs:boolean" hpcc:displayName="UDP Inline Collation" hpcc:group="UDP" use="optional" default="false" hpcc:tooltip="Controls whether UDP packets are collated on the reading thread or queued up for collation on a separate thread"/>
-                    <xs:attribute name="udpInlineCollationPacketLimit" type="xs:nonNegativeInteger" hpcc:displayName="UDP Inline Colation Packet Limit" hpcc:group="UDP" use="optional" default="50" hpcc:tooltip="Controls how many UDP packets requested at once when inline collation selected"/>
-                    <xs:attribute name="udpLocalWriteSocketSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Local Write Socket Size (bytes)" hpcc:group="UDP" use="optional" default="131071" hpcc:tooltip="Controls the write socket buffer size of the local UDP sockets (Agent to Server on same node)"/>
-                    <xs:attribute name="udpMaxRetryTimedoutReqs" type="xs:nonNegativeInteger" hpcc:displayName="UDP Max Retry Timedout Reqs" hpcc:group="UDP" use="optional" default="0" hpcc:tooltip="Controls the Max number of agent 'request to send' to be retried. 0 means keep retrying forever"/>
-                    <xs:attribute name="udpMaxSlotsPerClient" type="xs:nonNegativeInteger" hpcc:displayName="Log Queue Length" hpcc:group="UDP" use="optional" default="2147483647" hpcc:tooltip="UDP transport layer slots per client"/>
-                    <xs:attribute name="udpMulticastBufferSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Multicast Buffer Size (bytes)" hpcc:group="UDP" use="optional" default="131071" hpcc:tooltip="Controls the read socket buffer size of the UDP multicast sockets"/>
-                    <xs:attribute name="udpOutQsPriority" type="xs:nonNegativeInteger" hpcc:displayName="UDP Quality of Service Priority" hpcc:group="UDP" use="optional" default="0" hpcc:tooltip="Turns on/off Priority weight-based for output queues (0 round-robin no priority - old logic, 1 round-robin new logic, 2 and higher is factor of priority)"/>
-                    <xs:attribute name="udpQueueSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Queue Size" hpcc:group="UDP" use="optional" default="100" hpcc:tooltip="UDP transport layer receive queue size"/>
-                    <xs:attribute name="udpRequestToSendTimeout" type="xs:nonNegativeInteger" hpcc:displayName="UDP Request To Send Timeout (units?)" hpcc:group="UDP" use="optional" default="0" hpcc:tooltip="Controls the timeout value agent udp will wait for permission to send from a Roxie server, in milliseconds. Specify 0 to calcuate automatically"/>
-                    <xs:attribute name="udpResendEnabled" type="xs:boolean" hpcc:displayName="Enable UDP Resend" hpcc:group="UDP" use="optional" default="false" hpcc:tooltip="UDP transport layer packet resend ability"/>
-                    <xs:attribute name="udpRetryBusySenders" type="xs:nonNegativeInteger" hpcc:displayName="UDP Retry Busy Senders" hpcc:group="UDP" use="optional" default="0" hpcc:tooltip="Controls the number of times Roxie server will repeat search for an idle sender when requesting new data"/>
-                    <xs:attribute name="udpSendQueueSize" type="xs:nonNegativeInteger" hpcc:displayName="UDP Send Queue Size" hpcc:group="UDP" use="optional" default="50" hpcc:tooltip="UDP transport layer send queue size"/>
-                    <xs:attribute name="udpSnifferEnabled" type="xs:boolean" hpcc:displayName="Enable UDP Sniffer" hpcc:group="UDP" use="optional" default="true" hpcc:tooltip="Enable the UDP multicast sniffer for tracking which senders are busy"/>
-                    <xs:attribute name="udpSnifferReadThreadPriority" type="nonNegativeInteger" hpcc:displayName="UDP Sniffer Read Thread Priority" hpcc:group="UDP" use="optional" default="3" hpcc:tooltip="If non-zero, run the sniffer read thread at elevated priority level"/>
-                    <xs:attribute name="udpSnifferSendThreadPriority" type="nonNegativeInteger" hpcc:displayName="UDP Sniffer Send Thread Priority" hpcc:group="UDP" use="optional" default="3" hpcc:tooltip="If non-zero, run the sniffer send thread at elevated priority level"/>
-                    <!-- Cache attributes -->
-                    <xs:attribute name="blobCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Blob Cache Memory Size (Mb)" hpcc:group="Cache" use="optional" default="0" hpcc:tooltip="Size (in Mb) of blob index page cache"/>
-                    <xs:attribute name="serverSideCacheSize" type="xs:nonNegativeInteger" hpcc:displayName="Server Side Cache Size" hpcc:group="Cache" use="optional" default="0" hpcc:tooltip="Number of agent results to cache on Roxie server"/>
-                    <xs:attribute name="leafCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Leaf Cache Memory Size (Mb)" hpcc:group="Cache" use="optional" default="50" hpcc:tooltip="Size (in Mb) of leaf index page cache"/>
-                    <xs:attribute name="nodeCachePreload" type="xs:boolean" hpcc:displayName="Enable Node Cache Preload" hpcc:group="Cache" use="optional" default="false" hpcc:tooltip="Prefill the node cache with all non-leaf pages from all indexes"/>
-                    <xs:attribute name="nodeCacheMem" type="xs:nonNegativeInteger" hpcc:displayName="Node Cache Memory Size (Mb)" hpcc:group="Cache" use="optional" default="100" hpcc:tooltip="Size (in Mb) of non-leaf index page cache"/>
+                    <xs:attributeGroup ref="ldap"/>
+                    <xs:attributeGroup ref="options"/>
+                    <xs:attributeGroup ref="redundancy"/>
+                    <xs:attributeGroup ref="tracing"/>
+                    <xs:attributeGroup ref="udp"/>
+                    <xs:attributeGroup ref="cache"/>
                     <!-- SSH attributes Options for using remote SSH execution -->
-                    <xs:attribute name="SSHidentityfile" type="absolutePath" hpcc:displayName="SSH IdentityFile" hpcc:group="SSH" use="optional" default="$HOME/.ssh/id_rsa" hpcc:tooltip="location of identity file (private key) on Thor master"/>
-                    <xs:attribute name="SSHusername" type="xs:string" hpcc:displayName="SSH Username" hpcc:group="SSH" use="optional" default="hpcc" hpcc:tooltip="Username to use when running Thor slaves"/>
-                    <xs:attribute name="SSHpassword" type="xs:string" hpcc:modifiers="mask,verify" hpcc:displayName="SSH Password" hpcc:group="SSH" use="optional" default="" hpcc:tooltip="Fixed password - only required if no identity file present NB **insecure**"/>
+                    <xs:attribute name="SSHidentityfile" type="absolutePath" hpcc:displayName="SSH IdentityFile" hpcc:groupByName="SSH" use="optional" default="$HOME/.ssh/id_rsa" hpcc:tooltip="location of identity file (private key) on Thor master"/>
+                    <xs:attribute name="SSHusername" type="xs:string" hpcc:displayName="SSH Username" hpcc:groupByName="SSH" use="optional" default="hpcc" hpcc:tooltip="Username to use when running Thor slaves"/>
+                    <xs:attribute name="SSHpassword" type="xs:string" hpcc:modifiers="mask,verify" hpcc:displayName="SSH Password" hpcc:groupByName="SSH" use="optional" default="" hpcc:tooltip="Fixed password - only required if no identity file present NB **insecure**"/>
                     <!-- required if username set? -->
-                    <xs:attribute name="SSHtimeout" type="xs:nonNegativeInteger" hpcc:displayName="SSH Timeout (s)" hpcc:group="SSH" use="optional" default="0" hpcc:tooltip="Timeout in seconds for SSH connects"/>
-                    <xs:attribute name="SSHretries" type="xs:nonNegativeInteger" hpcc:displayName="SSH Retries" hpcc:group="SSH" use="optional" default="3" hpcc:tooltip="Number of times to retry failed connect"/>
-                    <!-- Ports attribute group removed, was no longer used -->
-                    <!-- Debug attributes -->
-                    <xs:attribute name="checkCompleted" type="xs:boolean" hpcc:displayName="Check Completed" hpcc:group="Debug" use="optional" default="true" hpcc:tooltip="Check pending replies when agent gets a retry request"/>
-                    <xs:attribute name="dafilesrvLookupTimeout" type="xs:nonNegativeInteger" hpcc:displayName="DaFileserv Lookup Timeout (ms)" hpcc:group="Debug" use="optional" default="10000" hpcc:tooltip="Maximum time (in milliseconds) dafilesrv will wait before timing out the first time through the list"/>
-                    <xs:attribute name="defaultConcatPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Concat Preload" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Default concat preloa"/>
-                    <xs:attribute name="defaultFetchPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Fetch Preload" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Default fetch preload"/>
-                    <xs:attribute name="defaultFullKeyedJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Full Keyed Join Preload" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Default full keyed join preload"/>
-                    <xs:attribute name="defaultKeyedJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Keyed Join Preload" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Default keyed join preload"/>
-                    <xs:attribute name="defaultParallelJoinPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Parallel Join Preload" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Default parallel join preload"/>
-                    <xs:attribute name="defaultPrefetchProjectPreload" type="xs:nonNegativeInteger" hpcc:displayName="Default Prefetch Project Preload" hpcc:group="Debug" use="optional" default="10" hpcc:tooltip="Default prefetch value for PROJECT,PREFETCH activity"/>
-                    <xs:attribute name="diskReadBufferSize" type="xs:nonNegativeInteger" hpcc:displayName="Disk Read Buffer Size (bytes)" hpcc:group="Debug" use="optional" default="65536" hpcc:tooltip="Default buffer size for disk read operations"/>
-                    <xs:attribute name="doIbytiDelay" type="xs:boolean" hpcc:displayName="Enable IBYTI Ddelay Logic" hpcc:group="Debug" use="optional" default="true" hpcc:tooltip="Enables the IBYTI delay logic in the agents"/>
-                    <xs:attribute name="enableHeartBeat" type="xs:boolean" hpcc:displayName="Enable Heartbeat" hpcc:group="Debug" use="optional" default="true" hpcc:tooltip="Enable HeartBeat messages to clients"/>
-                    <xs:attribute name="fastLaneQueue" type="xs:boolean" hpcc:displayName="Enable Fast Lane Queue" hpcc:group="Debug" use="optional" default="true" hpcc:tooltip="special fast-lane queue for simple queries"/>
-                    <xs:attribute name="forceStdLog" type="xs:boolean" hpcc:displayName="Force Std Log Output" hpcc:group="Debug" use="optional" default="false" hpcc:tooltip="Force log output to stderr even when redirected to null"/>
-                    <xs:attribute name="ignoreMissingFiles" type="xs:boolean" hpcc:displayName="Ignore Missing Files" hpcc:group="Debug" use="optional" default="false" hpcc:tooltip="Ignore missing files"/>
-                    <xs:attribute name="indexReadChunkSize" type="xs:nonNegativeInteger" hpcc:displayName="Index Read Chunk Size" hpcc:group="Debug" use="optional" default="60000" hpcc:tooltip="Break up results from indexRead (and other remote activities) every N bytes"/>
-                    <xs:attribute name="initIbytiDelay" type="xs:nonNegativeInteger" hpcc:displayName="Init IBYTI Delay Time (ms)" hpcc:group="Debug" use="optional" default="100" hpcc:tooltip="Initial time (in milliseconds) a secondary agent will wait for an IBYTI packet from a primary peer"/>
-                    <xs:attribute name="jumboFrames" type="xs:boolean" hpcc:displayName="Jumbo Frames" hpcc:group="Debug" use="optional" default="false" hpcc:tooltip="Set to true if using jumbo frames (MTU=9000) on the network"/>
-                    <xs:attribute name="linuxYield" type="xs:boolean" hpcc:displayName="Linux Yield" hpcc:group="Debug" use="optional" default="false" hpcc:tooltip="Yield to scheduler in some tight loops. May help latency on uniprocessor machines"/>
-                    <xs:attribute name="maxBlockSize" type="xs:nonNegativeInteger" hpcc:displayName="Maximum Block Size (bytes)" hpcc:group="Debug" use="optional" default="10000000" hpcc:tooltip="Max size of block read from client socket"/>
-                    <xs:attribute name="maxLockAttempts" type="xs:nonNegativeInteger" hpcc:displayName="Maximum Lock Attempts" hpcc:group="Debug" use="optional" default="5" hpcc:tooltip="Number of retries to get lock for global queries"/>
-                    <xs:attribute name="memoryStatsInterval" type="xs:nonNegativeInteger" hpcc:displayName="Memory Stats Interval (s)" hpcc:group="Debug" use="optional" default="60" hpcc:tooltip="Interval (in seconds) between reports on Roxie heap usage"/>
-                    <xs:attribute name="memTraceSizeLimit" type="xs:nonNegativeInteger" hpcc:displayName="Memory trace Size Limit (bytes?)" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Generate stacktrace whenever a request is made for a row larger than this threshold (0 to disable)"/>
-                    <xs:attribute name="parallelAggregate" type="xs:nonNegativeInteger" hpcc:displayName="Parallel Aggregate" hpcc:group="Debug" use="optional" default="0" hpcc:tooltip="Number of parallel threads to use for in-memory aggregate processing. Set to 0 to use one per CPU, 1 to disable parallel processing of in-memory aggregates"/>
-                    <xs:attribute name="perChannelFlowLimit" type="xs:nonNegativeInteger" hpcc:displayName="Per Channel Flow Limit" hpcc:group="Debug" use="optional" default="10" hpcc:tooltip="Number of pending queries permitted per channel (per active activity) before blocking"/>
-                    <xs:attribute name="pingInterval" type="xs:nonNegativeInteger" hpcc:displayName="Ping Interval (s)" hpcc:group="Debug" use="optional" default="60" hpcc:tooltip="Interval (in seconds) between Roxie server ping tests"/>
-                    <xs:attribute name="preabortIndexReadsThreshold" type="xs:nonNegativeInteger" hpcc:displayName="Pre Abort Index Reads Threshold" hpcc:group="Debug" use="optional" default="100" hpcc:tooltip="Use seek to precheck keyed limits (i.e. assume ,COUNT) on index reads if limit greater than this value"/>
-                    <xs:attribute name="preabortKeyedJoinsThreshold" type="xs:nonNegativeInteger" hpcc:displayName="Pre Abort Keyed Joins Threshold" hpcc:group="Debug" use="optional" default="100" hpcc:tooltip="Use seek to precheck limits on keyed joins if limit greater than this value"/>
-                    <xs:attribute name="simpleLocalKeyedJoins" type="xs:boolean" hpcc:displayName="Simple Local Keyed Joins" hpcc:group="Debug" use="optional" default="true" hpcc:tooltip="Enable single-threaded local keyed joins"/>
-                    <xs:attribute name="socketCheckInterval" type="xs:nonNegativeInteger" hpcc:displayName="Socket Check Interval" hpcc:group="Debug" use="optional" default="5000" hpcc:tooltip="Interval (in milliseconds) between checks that client socket is still open"/>
-                    <xs:attribute name="systemMonitorInterval" type="xs:nonNegativeInteger" hpcc:displayName="System Monitor Interval (ms?)" hpcc:group="Debug" use="optional" default="60000" hpcc:tooltip="How often to send an 'alive' message"/>
+                    <xs:attribute name="SSHtimeout" type="xs:nonNegativeInteger" hpcc:displayName="SSH Timeout (s)" hpcc:groupByName="SSH" use="optional" default="0" hpcc:tooltip="Timeout in seconds for SSH connects"/>
+                    <xs:attribute name="SSHretries" type="xs:nonNegativeInteger" hpcc:displayName="SSH Retries" hpcc:groupByName="SSH" use="optional" default="3" hpcc:tooltip="Number of times to retry failed connect"/>
+
+                    <xs:attributeGroup ref="debug"/>
                 </xs:complexType>
             </xs:element>
         </xs:sequence>

+ 11 - 11
initfiles/componentfiles/configschema/xsd/types.xsd

@@ -76,7 +76,7 @@
 
     <xs:complexType name="hwinstance">
         <xs:sequence>
-            <xs:element name="Instance" maxOccurs="unbounded">
+            <xs:element name="Instance" hpcc:displayName="Instances" hpcc:class="elementSet" minOccurs="0" maxOccurs="unbounded">
                 <xs:complexType>
                     <xs:attributeGroup ref="computerNodeReference"/>
                 </xs:complexType>
@@ -86,12 +86,12 @@
 
     <xs:complexType name="usernotes">
         <xs:seqeunce>
-            <xs:element name="Notes" maxOccurs="unbounded"/>
-            <xs:complexType>
+            <xs:element name="Notes" hpcc:displayName="Notes" hpcc:class="elementSet" minOcurrs="1" maxOccurs="unbounded"/>
+            <xs:complexType name="note">
                 <xs:sequence>
                     <xs:element name="Note" type="xs:string" minOccurs="0"/>
                 </xs:sequence>
-                <xs:attribute name="severity" group="Attributes" hpcc:displayName="Severity" use="optional" default="Minor" hpcc:tooltip="Significance of this note">
+                <xs:attribute name="severity" hpcc:displayName="Severity" use="optional" default="Minor" hpcc:tooltip="Significance of this note">
                     <xs:simpleType>
                         <xs:restriction base="xs:string">
                             <xs:enumeration value="Minor"/>
@@ -100,19 +100,19 @@
                         </xs:restriction>
                     </xs:simpleType>
                 </xs:attribute>
-                <xs:attribute name="date" group="Attributes" hpcc:displayName="Date/Time" type="AutoTimeStampType" use="optional" hpcc:readOnly="true" hpcc:tooltip="Date and time this note was entered"/>
-                <xs:attribute name="computer" group="Attributes" hpcc:displayName="Computer" type="AutoComputerType" use="optional" hpcc:readOnly="true" hpcc:tooltip="Computer from which this note was entered"/>
-                <xs:attribute name="user" group="Attributes" hpcc:displayName="User" type="AutoUseridType" use="optional" hpcc:readOnly="true" hpcc:tooltip="User account from which this note was entered"/>
+                <xs:attribute name="date" hpcc:displayName="Date/Time" type="AutoTimeStampType" use="optional" hpcc:readOnly="true" hpcc:tooltip="Date and time this note was entered"/>
+                <xs:attribute name="computer" hpcc:displayName="Computer" type="xs:string" use="optional" hpcc:readOnly="true" hpcc:tooltip="Computer from which this note was entered"/>
+                <xs:attribute name="user" hpcc:displayName="User" type="AutoUseridType" use="optional" hpcc:readOnly="true" hpcc:tooltip="User account from which this note was entered"/>
             </xs:complexType>
         </xs:seqeunce>
     </xs:complexType>
 
     <xs:complexType name="espservice_properties">
         <xs:sequence>
-            <xs:element name="Properties" use="optional" minOccurs="0" maxOccurs="1" hpcc:hidden="true">
+            <xs:element name="Properties" minOccurs="0" maxOccurs="1" hpcc:hidden="true">
                 <xs:complexType>
                     <xs:sequence>
-                        <xs:element name="Authenticate" use="optional" minOccurs="0" maxOccurs="1">
+                        <xs:element name="Authenticate" minOccurs="0" maxOccurs="1">
                             <xs:complexType>
                                 <xs:attribute name="access" type="xs:string"/>
                                 <xs:attribute name="description" type="xs:string"/>
@@ -121,7 +121,7 @@
                                 <xs:attribute name="resource" type="xs:string"/>
                             </xs:complexType>
                         </xs:element>
-                        <xs:element name="AuthenticateFeature" minOccurs="0" maxOccurs="unbounded">
+                        <xs:element name="AuthenticateFeature" hpcc:class="elementSet" minOccurs="0" maxOccurs="unbounded">
                             <xs:complexType>
                                 <xs:attribute name="description" type="xs:string"/>
                                 <xs:attribute name="path" type="xs:string"/>
@@ -172,7 +172,7 @@
         </xs:sequence>
     </xs:complexType>
 
-    <xs:attributeGroup name="buildInfo">
+    <xs:attributeGroup name="buildInfo" hpcc:groupByName="Attributes">
         <xs:attribute name="build" type="xs:string" use="required" hpcc:hidden="true" hpcc:autoGenerateType="fixedValue" hpcc:autoGenerateValue="_"/>
         <xs:attribute name="buildSet" type="xs:string" use="required" hpcc:hidden="true" hpcc:autoGenerateType="configProperty" hpcc:autoGenerateValue="componentName"/>
     </xs:attributeGroup>