Преглед на файлове

Merge remote-tracking branch 'origin/candidate-7.10.x' into candidate-7.12.x

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>

# Conflicts:
#	version.cmake
Gavin Halliday преди 4 години
родител
ревизия
39d665c42e

+ 20 - 12
ecl/hthor/hthor.cpp

@@ -6300,6 +6300,19 @@ CHThorWorkUnitWriteActivity::CHThorWorkUnitWriteActivity(IAgentContext &_agent,
 {
 {
 }
 }
 
 
+static void throwWuResultTooLarge(size32_t outputLimit, IHThorWorkUnitWriteArg &helper)
+{
+    StringBuffer errMsg("Dataset too large to output to workunit (limit "); 
+    errMsg.append(outputLimit/0x100000).append(" megabytes), in result (");
+    const char *name = helper.queryName();
+    if (name)
+        errMsg.append("name=").append(name);
+    else
+        errMsg.append("sequence=").append(helper.getSequence());
+    errMsg.append(")");
+    throw MakeStringExceptionDirect(0, errMsg.str());
+}
+
 void CHThorWorkUnitWriteActivity::execute()
 void CHThorWorkUnitWriteActivity::execute()
 {
 {
     unsigned flags = helper.getFlags();
     unsigned flags = helper.getFlags();
@@ -6357,18 +6370,8 @@ void CHThorWorkUnitWriteActivity::execute()
                 break;
                 break;
         }
         }
         size32_t thisSize = inputMeta->getRecordSize(nextrec);
         size32_t thisSize = inputMeta->getRecordSize(nextrec);
-        if(outputLimit && ((rowdata.length() + thisSize) > outputLimit))
-        {
-            StringBuffer errMsg("Dataset too large to output to workunit (limit "); 
-            errMsg.append(outputLimit/0x100000).append(" megabytes), in result (");
-            const char *name = helper.queryName();
-            if (name)
-                errMsg.append("name=").append(name);
-            else
-                errMsg.append("sequence=").append(helper.getSequence());
-            errMsg.append(")");
-            throw MakeStringExceptionDirect(0, errMsg.str());
-         }
+        if (outputLimit && ((rowdata.length() + thisSize) > outputLimit))
+            throwWuResultTooLarge(outputLimit, helper);
         if (rowSerializer)
         if (rowSerializer)
         {
         {
             CThorDemoRowSerializer serializerTarget(rowdata);
             CThorDemoRowSerializer serializerTarget(rowdata);
@@ -6399,7 +6402,12 @@ void CHThorWorkUnitWriteActivity::execute()
     WorkunitUpdate w = agent.updateWorkUnit();
     WorkunitUpdate w = agent.updateWorkUnit();
     Owned<IWUResult> result = updateWorkUnitResult(w, helper.queryName(), helper.getSequence());
     Owned<IWUResult> result = updateWorkUnitResult(w, helper.queryName(), helper.getSequence());
     if (0 != (POFextend & helper.getFlags()))
     if (0 != (POFextend & helper.getFlags()))
+    {
+        __int64 existingSz = result->getResultRawSize(nullptr, nullptr);
+        if (outputLimit && ((rowdata.length() + existingSz) > outputLimit))
+            throwWuResultTooLarge(outputLimit, helper);
         result->addResultRaw(rowdata.length(), rowdata.toByteArray(), ResultFormatRaw);
         result->addResultRaw(rowdata.length(), rowdata.toByteArray(), ResultFormatRaw);
+    }
     else
     else
         result->setResultRaw(rowdata.length(), rowdata.toByteArray(), ResultFormatRaw);
         result->setResultRaw(rowdata.length(), rowdata.toByteArray(), ResultFormatRaw);
     result->setResultStatus(ResultStatusCalculated);
     result->setResultStatus(ResultStatusCalculated);

+ 1 - 0
esp/src/eclwatch/ActivityWidget.js

@@ -285,6 +285,7 @@ define([
                 }
                 }
             });
             });
             this.createStackControllerTooltip(this.id + "AutoRefresh", this.i18n.AutoRefresh + ": " + this.autoRefreshButton.get("checked"));
             this.createStackControllerTooltip(this.id + "AutoRefresh", this.i18n.AutoRefresh + ": " + this.autoRefreshButton.get("checked"));
+            this.resize();
         },
         },
 
 
         createGrid: function (domID) {
         createGrid: function (domID) {

+ 3 - 0
esp/src/eclwatch/DFUQueryWidget.js

@@ -211,6 +211,9 @@ define([
             if (confirm(this.i18n.DeleteSelectedFiles + "\n" + list)) {
             if (confirm(this.i18n.DeleteSelectedFiles + "\n" + list)) {
                 var context = this;
                 var context = this;
                 WsDfu.DFUArrayAction(selection, "Delete").then(function (response) {
                 WsDfu.DFUArrayAction(selection, "Delete").then(function (response) {
+                    selection.forEach(item => {
+                        context.listStore.remove(ESPLogicalFile.createID(item.Cluster, item.Name));
+                    });
                     context.refreshGrid(true);
                     context.refreshGrid(true);
                 });
                 });
             }
             }

+ 5 - 1
esp/src/src/ESPLogicalFile.ts

@@ -14,7 +14,7 @@ import * as WsDfu from "./WsDfu";
 
 
 const _logicalFiles = {};
 const _logicalFiles = {};
 
 
-const createID = function (Cluster, Name) {
+export const createID = function (Cluster, Name) {
     return (Cluster ? Cluster : "") + "--" + Name;
     return (Cluster ? Cluster : "") + "--" + Name;
 };
 };
 
 
@@ -69,6 +69,10 @@ const Store = declare([ESPRequest.Store], {
             });
             });
         }
         }
     },
     },
+    remove(id) {
+        this.inherited(arguments);
+        delete _logicalFiles[id];
+    },
     preProcessRow(item, request, query, options) {
     preProcessRow(item, request, query, options) {
         lang.mixin(item, {
         lang.mixin(item, {
             __hpcc_id: createID(item.NodeGroup, item.Name),
             __hpcc_id: createID(item.NodeGroup, item.Name),

+ 1 - 1
esp/src/src/WsTopology.ts

@@ -66,8 +66,8 @@ const TpLogFileStore = declare([Memory, Evented], {
                                 }
                                 }
 
 
                                 tempObj[cleanName] = value;
                                 tempObj[cleanName] = value;
-                                data.push(tempObj);
                             }
                             }
+                            data.push(tempObj);
                         }
                         }
                     }, this);
                     }, this);
                 }
                 }

+ 1 - 1
esp/src/src/react/wuStatus.tsx

@@ -99,7 +99,7 @@ export const WUStatus: React.FunctionComponent<WUStatus> = ({
                         <StepLabel {...labelProps}>{label}</StepLabel>
                         <StepLabel {...labelProps}>{label}</StepLabel>
                     </Step>;
                     </Step>;
                 })}
                 })}
-            </Stepper>;
+            </Stepper>
         </MuiThemeProvider>
         </MuiThemeProvider>
     );
     );
 };
 };

+ 18 - 11
thorlcr/activities/wuidwrite/thwuidwrite.cpp

@@ -38,12 +38,28 @@ protected:
     StringAttr resultName;
     StringAttr resultName;
     unsigned resultSeq;
     unsigned resultSeq;
 
 
+    void throwWuResultTooLarge()
+    {
+        StringBuffer errMsg("Dataset too large to output to workunit (limit is set to ");
+        errMsg.append(workunitWriteLimit/0x100000).append(") megabytes, in result (");
+        if (resultName.length())
+            errMsg.append("name=").append(resultName);
+        else
+            errMsg.append("sequence=").append(resultSeq);
+        errMsg.append(")");
+        throw MakeThorException(TE_WorkUnitWriteLimitExceeded, "%s", errMsg.str());
+    }
     void addResult(rowcount_t resultCount, MemoryBuffer &resultData, bool complete)
     void addResult(rowcount_t resultCount, MemoryBuffer &resultData, bool complete)
     {
     {
         Owned<IWorkUnit> wu = &container.queryJob().queryWorkUnit().lock();
         Owned<IWorkUnit> wu = &container.queryJob().queryWorkUnit().lock();
         Owned<IWUResult> result = updateWorkUnitResult(wu, resultName, resultSeq);
         Owned<IWUResult> result = updateWorkUnitResult(wu, resultName, resultSeq);
         if (appendOutput)
         if (appendOutput)
+        {
+            __int64 existingSz = result->getResultRawSize(nullptr, nullptr);
+            if (workunitWriteLimit && (existingSz+resultData.length() > workunitWriteLimit))
+                throwWuResultTooLarge();
             result->addResultRaw(resultData.length(), resultData.toByteArray(), ResultFormatRaw);
             result->addResultRaw(resultData.length(), resultData.toByteArray(), ResultFormatRaw);
+        }
         else
         else
             result->setResultRaw(resultData.length(), resultData.toByteArray(), ResultFormatRaw);
             result->setResultRaw(resultData.length(), resultData.toByteArray(), ResultFormatRaw);
         result->setResultRowCount(resultCount);
         result->setResultRowCount(resultCount);
@@ -121,17 +137,8 @@ public:
                 unsigned numGot;
                 unsigned numGot;
                 mb.read(numGot);
                 mb.read(numGot);
                 unsigned l=mb.remaining();
                 unsigned l=mb.remaining();
-                if (workunitWriteLimit && totalSize+resultData.length()+l > workunitWriteLimit)
-                {
-                    StringBuffer errMsg("Dataset too large to output to workunit (limit is set to ");
-                    errMsg.append(workunitWriteLimit/0x100000).append(") megabytes, in result (");
-                    if (resultName.length())
-                        errMsg.append("name=").append(resultName);
-                    else
-                        errMsg.append("sequence=").append(resultSeq);
-                    errMsg.append(")");
-                    throw MakeThorException(TE_WorkUnitWriteLimitExceeded, "%s", errMsg.str());
-                }
+                if (workunitWriteLimit && (totalSize+resultData.length()+l > workunitWriteLimit))
+                    throwWuResultTooLarge();
                 resultData.append(l, mb.readDirect(l));
                 resultData.append(l, mb.readDirect(l));
                 mb.clear();
                 mb.clear();
                 numResults += numGot;
                 numResults += numGot;