Просмотр исходного кода

HPCC-16547 Allow an activity to be associated with an error

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 8 лет назад
Родитель
Сommit
59f44f0469

+ 15 - 1
common/workunit/workunit.cpp

@@ -1831,6 +1831,7 @@ public:
     virtual IStringVal & getExceptionFileName(IStringVal & str) const;
     virtual unsigned    getExceptionLineNo() const;
     virtual unsigned    getExceptionColumn() const;
+    virtual unsigned    getActivityId() const;
     virtual unsigned    getSequence() const;
     virtual void        setExceptionSource(const char *str);
     virtual void        setExceptionMessage(const char *str);
@@ -1840,6 +1841,7 @@ public:
     virtual void        setExceptionFileName(const char *str);
     virtual void        setExceptionLineNo(unsigned r);
     virtual void        setExceptionColumn(unsigned c);
+    virtual void        setActivityId(unsigned _id);
 };
 
 //==========================================================================================
@@ -8533,6 +8535,11 @@ unsigned CLocalWUException::getExceptionColumn() const
     return p->getPropInt("@col", 0);
 }
 
+unsigned CLocalWUException::getActivityId() const
+{
+    return p->getPropInt("@activity", 0);
+}
+
 unsigned CLocalWUException::getSequence() const
 {
     return p->getPropInt("@sequence", 0);
@@ -8578,6 +8585,11 @@ void CLocalWUException::setExceptionColumn(unsigned c)
     p->setPropInt("@col", c);
 }
 
+void CLocalWUException::setActivityId(unsigned _id)
+{
+    p->setPropInt("@activity", _id);
+}
+
 //==========================================================================================
 
 CLocalWUAppValue::CLocalWUAppValue(IPropertyTree *props, unsigned child) : p(props)
@@ -9883,7 +9895,7 @@ extern WORKUNIT_API const IExtendedWUInterface * queryExtendedWU(const IConstWor
 }
 
 
-extern WORKUNIT_API void addExceptionToWorkunit(IWorkUnit * wu, ErrorSeverity severity, const char * source, unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column)
+extern WORKUNIT_API void addExceptionToWorkunit(IWorkUnit * wu, ErrorSeverity severity, const char * source, unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, unsigned activity)
 {
     Owned<IWUException> we = wu->createException();
     we->setSeverity(severity);
@@ -9900,6 +9912,8 @@ extern WORKUNIT_API void addExceptionToWorkunit(IWorkUnit * wu, ErrorSeverity se
         if (column)
             we->setExceptionColumn(lineno);
     }
+    if (activity)
+        we->setActivityId(activity);
 }
 
 const char * skipLeadingXml(const char * text)

+ 3 - 1
common/workunit/workunit.hpp

@@ -502,6 +502,7 @@ interface IConstWUException : extends IInterface
     virtual unsigned getExceptionLineNo() const = 0;
     virtual unsigned getExceptionColumn() const = 0;
     virtual unsigned getSequence() const = 0;
+    virtual unsigned getActivityId() const = 0;
 };
 
 
@@ -515,6 +516,7 @@ interface IWUException : extends IConstWUException
     virtual void setExceptionFileName(const char * str) = 0;
     virtual void setExceptionLineNo(unsigned r) = 0;
     virtual void setExceptionColumn(unsigned c) = 0;
+    virtual void setActivityId(unsigned _id) = 0;
 };
 
 
@@ -1398,7 +1400,7 @@ extern WORKUNIT_API StringBuffer &formatGraphTimerLabel(StringBuffer &str, const
 extern WORKUNIT_API StringBuffer &formatGraphTimerScope(StringBuffer &str, const char *graphName, unsigned subGraphNum, unsigned __int64 subId);
 extern WORKUNIT_API bool parseGraphTimerLabel(const char *label, StringAttr &graphName, unsigned & graphNum, unsigned &subGraphNum, unsigned &subId);
 extern WORKUNIT_API bool parseGraphScope(const char *scope, StringAttr &graphName, unsigned & graphNum, unsigned &subGraphId);
-extern WORKUNIT_API void addExceptionToWorkunit(IWorkUnit * wu, ErrorSeverity severity, const char * source, unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column);
+extern WORKUNIT_API void addExceptionToWorkunit(IWorkUnit * wu, ErrorSeverity severity, const char * source, unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, unsigned activity);
 extern WORKUNIT_API void setWorkUnitFactory(IWorkUnitFactory *_factory);
 extern WORKUNIT_API IWorkUnitFactory * getWorkUnitFactory();
 extern WORKUNIT_API IWorkUnitFactory * getWorkUnitFactory(ISecManager *secmgr, ISecUser *secuser);

+ 1 - 1
ecl/eclagent/eclagent.cpp

@@ -1650,7 +1650,7 @@ void addException(IWorkUnit *w, ErrorSeverity severity, const char * source, uns
     PrintLog("%s", text);
     if ((severity == SeverityError) && (w->getState()!=WUStateAborting) && failOnError)
         w->setState(WUStateFailed);
-    addExceptionToWorkunit(w, severity, source, code, text, filename, lineno, column);
+    addExceptionToWorkunit(w, severity, source, code, text, filename, lineno, column, 0);
 }
 
 

+ 2 - 1
ecl/eclccserver/eclccserver.cpp

@@ -238,6 +238,7 @@ class EclccCompileThread : implements IPooledThread, implements IErrorReporter,
                     err->setExceptionCode(atoi(errCode));
                     err->setExceptionMessage(errText);
                     err->setExceptionFileName(file); // any point if it just says stdin?
+                    //MORE: How can we pass the activity id?  Should errors be output in a modified format?
                 }
                 else
                 {
@@ -491,7 +492,7 @@ public:
         {
             StringBuffer msg;
             e->errorMessage(msg);
-            addExceptionToWorkunit(workunit, SeverityError, "eclccserver", e->errorCode(), msg.str(), NULL, 0, 0);
+            addExceptionToWorkunit(workunit, SeverityError, "eclccserver", e->errorCode(), msg.str(), NULL, 0, 0, 0);
             e->Release();
         }
         if (ok)

+ 2 - 0
ecl/hql/hqlwuerr.cpp

@@ -74,6 +74,8 @@ void WorkUnitErrorReceiver::report(IError* eclError)
     StringBuffer msg;
     initializeError(exception, eclError->errorCode(), eclError->errorMessage(msg).str(), 
                     eclError->getFilename(), eclError->getLine(), eclError->getColumn(), eclError->getPosition());
+    if (eclError->getActivity())
+        exception->setActivityId(eclError->getActivity());
 }
 
 size32_t WorkUnitErrorReceiver::errCount()

+ 6 - 2
ecl/hqlcpp/hqlcpp.cpp

@@ -2093,11 +2093,15 @@ void HqlCppTranslator::doReportWarning(WarnErrorCategory category, ErrorSeverity
     Owned<IError> warnError;
     if (!location)
         location = queryActiveActivityLocation();
+    unsigned activity = 0;
+    if (activeActivities.ordinality())
+        activity = activeActivities.tos().queryActivityId();
+
     ErrorSeverity severity = (explicitSeverity == SeverityUnknown) ? queryDefaultSeverity(category) : explicitSeverity;
     if (location)
-        warnError.setown(createError(category, severity, id, msg, str(location->querySourcePath()), location->getStartLine(), location->getStartColumn(), 0));
+        warnError.setown(createError(category, severity, id, msg, str(location->querySourcePath()), location->getStartLine(), location->getStartColumn(), 0, activity));
     else
-        warnError.setown(createError(category, severity, id, msg, NULL, 0, 0, 0));
+        warnError.setown(createError(category, severity, id, msg, activity));
 
     errorProcessor->report(warnError);
 }

+ 1 - 0
esp/scm/ecldirect.ecm

@@ -24,6 +24,7 @@ ESPStruct [nil_remove] ECLDirectException
     string FileName;
     int LineNo;
     int Column;
+    int Activity;
 };
 
 ESPrequest RunEclRequest

+ 2 - 1
esp/scm/ws_workunits.ecm

@@ -45,6 +45,7 @@ ESPStruct [nil_remove] ECLException
     string FileName;
     int LineNo;
     int Column;
+    [min_ver("1.63")] int Activity;
 };
 //  ===========================================================================
 ESPStruct [nil_remove] ECLSchemaItem
@@ -1791,7 +1792,7 @@ ESPresponse [exceptions_inline, nil_remove] WUGetNumFileToCopyResponse
 
 ESPservice [
     auth_feature("DEFERRED"), //This declares that the method logic handles feature level authorization
-    version("1.62"), default_client_version("1.62"),
+    version("1.63"), default_client_version("1.63"),
     noforms,exceptions_inline("./smc_xslt/exceptions.xslt"),use_method_name] WsWorkunits
 {
     ESPmethod [resp_xsl_default("/esp/xslt/workunits.xslt")]     WUQuery(WUQueryRequest, WUQueryResponse);

+ 1 - 0
esp/services/ecldirect/EclDirectService.cpp

@@ -48,6 +48,7 @@ EclDirectWUExceptions::EclDirectWUExceptions(IConstWorkUnit& cw)
         e->setFileName(item.getExceptionFileName(s).str());
         e->setLineNo(item.getExceptionLineNo());
         e->setColumn(item.getExceptionColumn());
+        e->setActivity(item.getActivityId());
 
         switch (it->query().getSeverity())
         {

+ 10 - 8
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -145,18 +145,20 @@ WsWUExceptions::WsWUExceptions(IConstWorkUnit& wu): numerr(0), numwrn(0), numinf
     Owned<IConstWUExceptionIterator> it = &wu.getExceptions();
     ForEach(*it)
     {
-
+        IConstWUException & cur = it->query();
         SCMStringBuffer src, msg, file;
         Owned<IEspECLException> e= createECLException("","");
-        e->setCode(it->query().getExceptionCode());
-        e->setSource(it->query().getExceptionSource(src).str());
-        e->setMessage(it->query().getExceptionMessage(msg).str());
-        e->setFileName(it->query().getExceptionFileName(file).str());
-        e->setLineNo(it->query().getExceptionLineNo());
-        e->setColumn(it->query().getExceptionColumn());
+        e->setCode(cur.getExceptionCode());
+        e->setSource(cur.getExceptionSource(src).str());
+        e->setMessage(cur.getExceptionMessage(msg).str());
+        e->setFileName(cur.getExceptionFileName(file).str());
+        e->setLineNo(cur.getExceptionLineNo());
+        e->setColumn(cur.getExceptionColumn());
+        if (cur.getActivityId())
+            e->setActivity(cur.getActivityId());
 
         const char * label = "";
-        switch (it->query().getSeverity())
+        switch (cur.getSeverity())
         {
             default:
             case SeverityError: label = "Error"; numerr++; break;

+ 4 - 4
roxie/ccd/ccdcontext.cpp

@@ -295,7 +295,7 @@ protected:
             msg.append(type).append(" clause failed (execution will continue): ").append(e->errorCode()).append(": ");
             e->errorMessage(msg);
             WorkunitUpdate wu(&workunit->lock());
-            addExceptionToWorkunit(wu, SeverityWarning, "user", e->errorCode(), msg.str(), NULL, 0, 0);
+            addExceptionToWorkunit(wu, SeverityWarning, "user", e->errorCode(), msg.str(), NULL, 0, 0, 0);
         }
     }
     virtual void checkForAbort(unsigned wfid, IException * handling)
@@ -309,7 +309,7 @@ protected:
                 handling->errorMessage(msg);
                 msg.append(" (in item ").append(wfid).append(")");
                 WorkunitUpdate wu(&workunit->lock());
-                addExceptionToWorkunit(wu, SeverityWarning, "user", handling->errorCode(), msg.str(), NULL, 0, 0);
+                addExceptionToWorkunit(wu, SeverityWarning, "user", handling->errorCode(), msg.str(), NULL, 0, 0, 0);
                 handling->Release();
             }
             throw new WorkflowException(0, "Workunit abort request received", wfid, WorkflowException::ABORT, MSGAUD_user);
@@ -3570,7 +3570,7 @@ public:
         if (workUnit)
         {
             WorkunitUpdate wu(&workUnit->lock());
-            addExceptionToWorkunit(wu, severity, source, code, text, NULL, 0 ,0);
+            addExceptionToWorkunit(wu, severity, source, code, text, NULL, 0 ,0, 0);
         }
     }
     virtual void addWuAssertFailure(unsigned code, const char * text, const char * filename, unsigned lineno, unsigned column, bool isAbort)
@@ -3580,7 +3580,7 @@ public:
         if (workUnit)
         {
             WorkunitUpdate wu(&workUnit->lock());
-            addExceptionToWorkunit(wu, SeverityError, "user", code, text, filename, lineno, column);
+            addExceptionToWorkunit(wu, SeverityError, "user", code, text, filename, lineno, column, 0);
         }
         if (isAbort)
             rtlFailOnAssert();      // minimal implementation

+ 1 - 1
roxie/ccd/ccddali.cpp

@@ -907,5 +907,5 @@ extern void addWuException(IConstWorkUnit *workUnit, IException *E)
     unsigned code = E->errorCode();
     OERRLOG("%u - %s", code, message.str());
     WorkunitUpdate w(&workUnit->lock());
-    addExceptionToWorkunit(w, SeverityError, "Roxie", code, message.str(), NULL, 0, 0);
+    addExceptionToWorkunit(w, SeverityError, "Roxie", code, message.str(), NULL, 0, 0, 0);
 }

+ 12 - 6
system/jlib/jexcept.cpp

@@ -1400,7 +1400,7 @@ void printStackReport()
 class jlib_decl CError : public CInterfaceOf<IError>
 {
 public:
-    CError(WarnErrorCategory _category,ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position);
+    CError(WarnErrorCategory _category,ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity);
 
     virtual int             errorCode() const { return no; }
     virtual StringBuffer &  errorMessage(StringBuffer & ret) const { return ret.append(msg); }
@@ -1413,6 +1413,7 @@ public:
     virtual StringBuffer& toString(StringBuffer&) const;
     virtual ErrorSeverity getSeverity() const { return severity; }
     virtual IError * cloneSetSeverity(ErrorSeverity _severity) const;
+    virtual unsigned getActivity() const { return activity; }
 
 protected:
     ErrorSeverity severity;
@@ -1423,10 +1424,11 @@ protected:
     int lineno;
     int column;
     int position;
+    unsigned activity;
 };
 
-CError::CError(WarnErrorCategory _category, ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position):
-  severity(_severity), category(_category), msg(_msg), filename(_filename)
+CError::CError(WarnErrorCategory _category, ErrorSeverity _severity, int _no, const char* _msg, const char* _filename, int _lineno, int _column, int _position, unsigned _activity)
+    : severity(_severity), category(_category), msg(_msg), filename(_filename), activity(_activity)
 {
     no = _no;
     lineno = _lineno;
@@ -1451,11 +1453,15 @@ IError * CError::cloneSetSeverity(ErrorSeverity newSeverity) const
 {
     return new CError(category, newSeverity,
                          errorCode(), msg, filename,
-                         getLine(), getColumn(), getPosition());
+                         getLine(), getColumn(), getPosition(), getActivity());
 }
 
-IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char * filename, int lineno, int column, int pos)
+IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char * filename, int lineno, int column, int pos, unsigned activity)
 {
-    return new CError(category,severity,errNo,msg,filename,lineno,column,pos);
+    return new CError(category,severity,errNo,msg,filename,lineno,column,pos, activity);
 }
 
+IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity)
+{
+    return new CError(category,severity,errNo,msg,nullptr, 0, 0, 0, activity);
+}

+ 3 - 1
system/jlib/jexcept.hpp

@@ -216,12 +216,14 @@ public:
     virtual StringBuffer& toString(StringBuffer&) const = 0;
     virtual ErrorSeverity getSeverity() const = 0;
     virtual IError * cloneSetSeverity(ErrorSeverity _severity) const = 0;
+    virtual unsigned getActivity() const = 0;
 };
 
 inline bool isError(IError * error) { return isError(error->getSeverity()); }
 inline bool isFatal(IError * error) { return isFatal(error->getSeverity()); }
 
-extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char *filename, int lineno=0, int column=0, int pos=0);
+extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, const char *filename, int lineno=0, int column=0, int pos=0, unsigned activity = 0);
+extern jlib_decl IError *createError(WarnErrorCategory category, ErrorSeverity severity, int errNo, const char *msg, unsigned activity);
 
 #endif
 

+ 2 - 1
thorlcr/graph/thgraphmaster.cpp

@@ -1162,7 +1162,8 @@ public:
         try
         {
             Owned<IWorkUnit> w = updateWorkUnit();
-            addExceptionToWorkunit(w, SeverityError, "user", code, text, filename, lineno, column);
+            unsigned activity = 0;
+            addExceptionToWorkunit(w, SeverityError, "user", code, text, filename, lineno, column, activity);
         }
         catch (IException *E)
         {

+ 2 - 0
thorlcr/thorutil/thormisc.cpp

@@ -796,6 +796,8 @@ void reportExceptionToWorkunit(IConstWorkUnit &workunit,IException *e, ErrorSeve
                 we->setExceptionLineNo(line);
                 we->setExceptionColumn(column);
             }
+            if (te->queryActivityId())
+                we->setActivityId(te->queryActivityId());
         }
         else
             we->setSeverity(severity);