Browse Source

Merge pull request #985 from rengolin/superfile

Remove superfile on DFU addSuper failure

Reviewed-By: Jake Smith <jake.smith@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 13 years ago
parent
commit
f9dec60002
1 changed files with 31 additions and 21 deletions
  1. 31 21
      dali/dfu/dfuutil.cpp

+ 31 - 21
dali/dfu/dfuutil.cpp

@@ -709,29 +709,39 @@ public:
     void addSuper(const char *superfname, unsigned numtoadd, const char **subfiles, const char *before,IUserDescriptor *user)
     {
         Owned<IDistributedSuperFile> superfile = queryDistributedFileDirectory().lookupSuperFile(superfname,user);
-        if (!superfile)
+        bool newfile = false;
+        if (!superfile) {
             superfile.setown(queryDistributedFileDirectory().createSuperFile(superfname,true,false,user));
-        if (numtoadd) {
-            unsigned i;
-            for (i=0;i<numtoadd;i++)
-                if (superfile->querySubFileNamed(subfiles[i]))
-                    throwError1(DFUERR_DSuperFileContainsSub, subfiles[i]);
-            Owned<IDistributedFileTransaction> transaction;
-            if (numtoadd>1) {
-                transaction.setown(createDistributedFileTransaction(user));
-                transaction->start();
-            }
-            //StringBuffer before;
-            for (i=0;i<numtoadd;i++) {
-                if (before&&*before)
-                    superfile->addSubFile(subfiles[i],true,(stricmp(before,"*")==0)?NULL:before,false,transaction);
-                else
-                    superfile->addSubFile(subfiles[i],false,NULL,false,transaction);
-            }
-            if (transaction.get()) {
-                superfile.clear(); // superfile must not be active when transactiion committed
-                transaction->commit();
+            newfile = true;
+        }
+        try {
+            if (numtoadd) {
+                unsigned i;
+                for (i=0;i<numtoadd;i++)
+                    if (superfile->querySubFileNamed(subfiles[i]))
+                        throwError1(DFUERR_DSuperFileContainsSub, subfiles[i]);
+                Owned<IDistributedFileTransaction> transaction;
+                if (numtoadd>1) {
+                    transaction.setown(createDistributedFileTransaction(user));
+                    transaction->start();
+                }
+                //StringBuffer before;
+                for (i=0;i<numtoadd;i++) {
+                    if (before&&*before)
+                        superfile->addSubFile(subfiles[i],true,(stricmp(before,"*")==0)?NULL:before,false,transaction);
+                    else
+                        superfile->addSubFile(subfiles[i],false,NULL,false,transaction);
+                }
+                if (transaction.get()) {
+                    superfile.clear(); // superfile must not be active when transactiion committed
+                    transaction->commit();
+                }
             }
+        } catch (IException *e) {
+            // TODO: DFS transaction could take care of it
+            if (newfile)
+                queryDistributedFileDirectory().removeEntry(superfname,user);
+            throw;
         }
     }