Pārlūkot izejas kodu

HPCC-21209 Ensure onCreate() is called before input is started

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 6 gadi atpakaļ
vecāks
revīzija
43ea56b5cb

+ 2 - 0
roxie/ccd/ccdcontext.cpp

@@ -2129,6 +2129,8 @@ protected:
                 {
                     Owned<IWorkUnitFactory> factory = getWorkUnitFactory();
                     Owned<IConstWorkUnit> externalWU = factory->openWorkUnit(wuid);
+                    if (!externalWU)
+                        throw MakeStringException(ROXIE_FILE_ERROR, "Failed to open workunit %s", wuid);
                     externalWU->remoteCheckAccess(queryUserDescriptor(), false);
                     Owned<IConstWUResult> wuResult = getWorkUnitResult(externalWU, stepname, sequence);
                     if (!wuResult)

+ 2 - 0
roxie/ccd/ccdserver.cpp

@@ -19711,11 +19711,13 @@ public:
         }
         catch (IException *E)
         {
+            ensureCreated();
             onException(E);
             started = true;
         }
         catch (...)
         {
+            ensureCreated();
             onException(MakeStringException(ROXIE_INTERNAL_ERROR, "Unknown exception caught"));
             started = true;
         }

+ 32 - 0
testing/regress/ecl/catchonstart.ecl

@@ -0,0 +1,32 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2018 HPCC Systems®.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+############################################################################## */
+
+//nohthor
+//nothor
+
+r := { unsigned i };
+
+namesRecord :=
+            RECORD
+string20        surname;
+dataset(r)      ids;
+            END;
+
+//Deliberately read a non-existant value to force a failure during activity start
+in2 := dataset(workunit('nonExistant', 'DoesNotExist'), namesRecord);
+caught := CATCH(in2, onFAIL(transform(namesRecord, SELF.ids := DATASET([FAILCODE], r); SELF.surname := 'Not Found')));
+output(caught);

+ 3 - 0
testing/regress/ecl/key/catchonstart.xml

@@ -0,0 +1,3 @@
+<Dataset name='Result 1'>
+ <Row><surname>Not Found           </surname><ids><Row><i>1409</i></Row></ids></Row>
+</Dataset>