You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by db...@apache.org on 2016/03/21 15:51:31 UTC

ambari git commit: AMBARI-15392 : deleting temporary table and actual table in case of error while uploading table. (Nitiraj Rathore via dipayanb)

Repository: ambari
Updated Branches:
  refs/heads/branch-2.2 eeec0969d -> a3086696b


AMBARI-15392 : deleting temporary table and actual table in case of error while uploading table. (Nitiraj Rathore via dipayanb)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/a3086696
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/a3086696
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/a3086696

Branch: refs/heads/branch-2.2
Commit: a3086696b4ba7b6cf0bebe308aa1d257b0bb6bfb
Parents: eeec096
Author: Dipayan Bhowmick <di...@gmail.com>
Authored: Mon Mar 21 20:21:19 2016 +0530
Committer: Dipayan Bhowmick <di...@gmail.com>
Committed: Mon Mar 21 20:21:19 2016 +0530

----------------------------------------------------------------------
 .../ui/hive-web/app/controllers/upload-table.js | 213 +++++++++++++------
 1 file changed, 149 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/a3086696/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/upload-table.js
----------------------------------------------------------------------
diff --git a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/upload-table.js b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/upload-table.js
index 5085cc5..d883743 100644
--- a/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/upload-table.js
+++ b/contrib/views/hive/src/main/resources/ui/hive-web/app/controllers/upload-table.js
@@ -107,15 +107,19 @@ export default Ember.Controller.extend({
   }.observes('isFirstRowHeader'),
 
   popUploadProgressInfos : function(){
-    this.get('uploadProgressInfos').popObject();
+    var msg = this.get('uploadProgressInfos').popObject();
+   // console.log("popedup message : " + msg);
   },
 
   pushUploadProgressInfos : function(info){
     this.get('uploadProgressInfos').pushObject(info);
+   // console.log("pushed message : " + info);
   },
 
   clearUploadProgressModal : function(){
-    for( var i = 0 ; i < this.get('uploadProgressInfos').length ; i++){
+  //  console.log("inside clearUploadProgressModal this.get('uploadProgressInfos') : " + this.get('uploadProgressInfos'));
+    var len = this.get('uploadProgressInfos').length;
+    for( var i = 0 ; i < len ; i++){
       this.popUploadProgressInfos();
     }
   },
@@ -138,7 +142,7 @@ export default Ember.Controller.extend({
     this.set('isFirstRowHeader',true);
     this.set('files');
     this.set("firstRow");
-    this.set("selectedDatabase");
+    this.set("selectedDatabase",null);
     this.set("databaseName");
     this.set("filePath");
     this.set('tableName');
@@ -170,8 +174,6 @@ export default Ember.Controller.extend({
     console.log("finding status of job: ", jobId);
     var self = this;
     var fetchJobPromise = this.get('jobService').fetchJobStatus(jobId);
-//      console.log("fetchJobPromise : ", fetchJobPromise);
-
       fetchJobPromise.then(function (data) {
         console.log("waitForJobStatus : data : ", data);
         var status = data.jobStatus;
@@ -205,6 +207,7 @@ export default Ember.Controller.extend({
   generatePreview : function(files){
     var self = this;
     var promise = null;
+    this.waitForGeneratingPreview();
     if(this.get('isLocalUpload')){
       promise = this.uploadForPreview(files);
     }else{
@@ -249,14 +252,52 @@ export default Ember.Controller.extend({
     this.setError(error);
   },
 
+  createTable: function () {
+    console.log("table headers : ", this.get('header'));
+    var headers = this.get('header');
+
+    var selectedDatabase = this.get('selectedDatabase');
+    if (null == selectedDatabase || typeof selectedDatabase === 'undefined') {
+      throw new Error(Ember.I18n.t('hive.errors.emptyDatabase'));
+    }
+
+    this.set('databaseName', this.get('selectedDatabase').get('name'));
+    var databaseName = this.get('databaseName');
+    var tableName = this.get('tableName');
+    var isFirstRowHeader = this.get('isFirstRowHeader');
+    var filetype = this.get("selectedFileType");
+
+    if (null == databaseName || typeof databaseName === 'undefined' || databaseName == '') {
+      throw new Error(Ember.I18n.t('hive.errors.emptyDatabase'));
+    }
+    if (null == tableName || typeof tableName === 'undefined' || tableName == '') {
+      throw new Error(Ember.I18n.t('hive.errors.emptyTableName'));
+    }
+    if (null == isFirstRowHeader || typeof isFirstRowHeader === 'undefined') {
+      throw new Error(Ember.I18n.t('hive.errors.emptyIsFirstRow'));
+    }
+
+    this.validateColumns();
+
+    return this.get('uploader').createTable({
+      "isFirstRowHeader": isFirstRowHeader,
+      "header": headers,
+      "tableName": tableName,
+      "databaseName": databaseName,
+      "fileType":filetype
+    });
+  },
+
   createActualTable : function(){
     console.log("createActualTable");
+    this.pushUploadProgressInfos("<li> Starting to create Actual table.... </li>");
     return this.createTable();
   },
 
   waitForCreateActualTable: function (jobId) {
     console.log("waitForCreateActualTable");
-    this.pushUploadProgressInfos("<li>Creating actual table.... </li>");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Waiting for creation of Actual table.... </li>");
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
       self.waitForJobStatus(jobId, resolve, reject);
@@ -268,16 +309,19 @@ export default Ember.Controller.extend({
   onCreateActualTableSuccess : function(){
     console.log("onCreateTableSuccess");
     this.popUploadProgressInfos();
-    this.pushUploadProgressInfos("<li> Successfully created actual table. </li>");
+    this.pushUploadProgressInfos("<li> Successfully created Actual table. </li>");
   },
 
   onCreateActualTableFailure : function(error){
     console.log("onCreateActualTableFailure");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Failed to create Actual table. </li>");
     this.setError(error);
   },
 
   createTempTable : function(){
     console.log("createTempTable");
+    this.pushUploadProgressInfos("<li> Starting to create Temporary table.... </li>");
     var tempTableName = this.generateTempTableName();
     this.set('tempTableName',tempTableName);
     return this.get('uploader').createTable({
@@ -291,7 +335,8 @@ export default Ember.Controller.extend({
 
   waitForCreateTempTable: function (jobId) {
     console.log("waitForCreateTempTable");
-    this.pushUploadProgressInfos("<li>Creating temporary table.... </li>");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Waiting for creation of Temporary table.... </li>");
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
       self.waitForJobStatus(jobId, resolve, reject);
@@ -303,18 +348,60 @@ export default Ember.Controller.extend({
   onCreateTempTableSuccess : function(){
     console.log("onCreateTempTableSuccess");
     this.popUploadProgressInfos();
-    this.pushUploadProgressInfos("<li> Successfully created temporary table. </li>");
+    this.pushUploadProgressInfos("<li> Successfully created Temporary table. </li>");
   },
 
+  deleteTable : function(databaseName, tableName){
+    console.log("deleting table " + databaseName + "." + tableName);
+
+    return this.get('uploader').deleteTable({
+      "database":  databaseName,
+      "table": tableName
+    });
+  },
+
+  deleteTableOnError : function(databaseName,tableName, tableLabel){
+      //delete table and wait for delete job
+    var self = this;
+    this.pushUploadProgressInfos("<li> Deleting " + tableLabel + " table...  </li>");
+
+    return this.deleteTable(databaseName,tableName).then(function(data){
+      return new Ember.RSVP.Promise(function(resolve,reject){
+        self.waitForJobStatus(data.jobId,resolve,reject);
+      });
+    }).then(function(){
+      self.popUploadProgressInfos();
+      self.pushUploadProgressInfos("<li> Successfully deleted " + tableLabel + " table. </li>");
+      return Ember.RSVP.Promise.resolve();
+    },function(err){
+      self.popUploadProgressInfos();
+      self.pushUploadProgressInfos("<li> Failed to delete " + tableLabel + " table. </li>");
+      self.setError(err);
+      return Ember.RSVP.Promise.reject();
+    });
+  },
+
+  rollBackActualTableCreation : function(){
+    return this.deleteTableOnError(this.get("databaseName"),this.get("tableName"),"Actual");
+  },
+
+
   onCreateTempTableFailure : function(error){
     console.log("onCreateTempTableFailure");
     this.setError(error);
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Failed to create temporary table. </li>");
+    return this.rollBackActualTableCreation().then(function(data){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    },function(err){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    });
   },
 
   uploadFile : function(){
     console.log("uploadFile");
+    this.pushUploadProgressInfos("<li> Starting to upload the file .... </li>");
     if( this.get("isLocalUpload")){
-      this.pushUploadProgressInfos("<li>Uploading file .... </li>");
       return this.uploadTable();
     }else{
       return this.uploadTableFromHdfs();
@@ -323,8 +410,9 @@ export default Ember.Controller.extend({
 
   waitForUploadingFile: function (data) {
     console.log("waitForUploadingFile");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Waiting for uploading file .... </li>");
     if( data.jobId ){
-      this.pushUploadProgressInfos("<li>Uploading file .... </li>");
       var self = this;
           var p = new Ember.RSVP.Promise(function (resolve, reject) {
             self.waitForJobStatus(data.jobId, resolve, reject);
@@ -341,13 +429,34 @@ export default Ember.Controller.extend({
     this.pushUploadProgressInfos("<li> Successfully uploaded file. </li>");
   },
 
+  rollBackTempTableCreation : function(){
+    var self = this;
+    return this.deleteTableOnError(this.get("databaseName"),this.get("tempTableName"),"Temporary").then(function(data){
+      return self.rollBackActualTableCreation();
+    },function(err){
+      return self.rollBackActualTableCreation();
+    })
+  },
+
   onUploadingFileFailure: function (error) {
     console.log("onUploadingFileFailure");
     this.setError(error);
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Failed to upload file. </li>");
+    return this.rollBackTempTableCreation().then(function(data){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    },function(err){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    });
+  },
+
+  rollBackUploadFile : function(){
+    return this.rollBackTempTableCreation();
   },
 
   insertIntoTable : function(){
     console.log("insertIntoTable");
+    this.pushUploadProgressInfos("<li> Starting to Insert rows from temporary table to actual table .... </li>");
 
     return this.get('uploader').insertIntoTable({
       "fromDatabase":  this.get("databaseName"),
@@ -359,7 +468,8 @@ export default Ember.Controller.extend({
 
   waitForInsertIntoTable: function (jobId) {
     console.log("waitForInsertIntoTable");
-    this.pushUploadProgressInfos("<li>Inserting rows from temporary table to actual table .... </li>");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Waiting for Insertion of rows from temporary table to actual table .... </li>");
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
       self.waitForJobStatus(jobId, resolve, reject);
@@ -371,26 +481,35 @@ export default Ember.Controller.extend({
   onInsertIntoTableSuccess : function(){
     console.log("onInsertIntoTableSuccess");
     this.popUploadProgressInfos();
-    this.pushUploadProgressInfos("<li>Successfully inserted rows from temporary table to actual table. </li>");
+    this.pushUploadProgressInfos("<li> Successfully inserted rows from temporary table to actual table. </li>");
   },
 
   onInsertIntoTableFailure : function(error){
     console.log("onInsertIntoTableFailure");
     this.setError(error);
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Failed to insert rows from temporary table to actual table. </li>");
+    return this.rollBackUploadFile().then(function(data){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    },function(err){
+      return Ember.RSVP.Promise.reject(error); // always reject for the flow to stop
+    });
   },
 
   deleteTempTable : function(){
     console.log("deleteTempTable");
+    this.pushUploadProgressInfos("<li> Starting to delete temporary table .... </li>");
 
-    return this.get('uploader').deleteTable({
-      "database":  this.get("databaseName"),
-      "table": this.get("tempTableName")
-    });
+    return this.deleteTable(
+      this.get("databaseName"),
+      this.get("tempTableName")
+    );
   },
 
   waitForDeleteTempTable: function (jobId) {
     console.log("waitForDeleteTempTable");
-    this.pushUploadProgressInfos("<li>Deleting temporary table .... </li>");
+    this.popUploadProgressInfos();
+    this.pushUploadProgressInfos("<li> Waiting for deletion of temporary table .... </li>");
     var self = this;
     var p = new Ember.RSVP.Promise(function (resolve, reject) {
       self.waitForJobStatus(jobId, resolve, reject);
@@ -409,6 +528,7 @@ export default Ember.Controller.extend({
   onDeleteTempTableFailure : function(error){
     console.log("onDeleteTempTableFailure");
     this.setError(error);
+    this.setError("You will have to manually delete the table " + this.get("databaseName") + "." + this.get("tempTableName"));
   },
 
   createTableAndUploadFile : function(){
@@ -430,8 +550,8 @@ export default Ember.Controller.extend({
         return self.createTempTable(data);
       },function(error){
         if(!self.get('error')){
-          self.onCreateActualTableFailure(new Error("Server job for creation of actual table failed."));
           console.log("Error occurred: ", error);
+          self.onCreateActualTableFailure(new Error("Server job for creation of actual table failed."));
         }
         throw error;
       })
@@ -440,8 +560,8 @@ export default Ember.Controller.extend({
         return self.waitForCreateTempTable(data.jobId);
       },function(error){
         if(!self.get('error')){
-          self.onCreateTempTableFailure(error);
           console.log("Error occurred: ", error);
+          return self.onCreateTempTableFailure(error);
         }
         throw error;
       })
@@ -451,8 +571,8 @@ export default Ember.Controller.extend({
         return self.uploadFile(data);
       },function(error){
         if(!self.get('error')){
-          self.onCreateTempTableFailure(new Error("Server job for creation of temporary table failed."));
           console.log("Error occurred: ", error);
+          return self.onCreateTempTableFailure(new Error("Server job for creation of temporary table failed."));
         }
         throw error;
       }).then(function(data){
@@ -460,8 +580,8 @@ export default Ember.Controller.extend({
         return self.waitForUploadingFile(data);
       },function(error){
         if(!self.get('error')){
-          self.onUploadingFileFailure(error);
           console.log("Error occurred: ", error);
+          return self.onUploadingFileFailure(error);
         }
         throw error;
       })
@@ -471,8 +591,8 @@ export default Ember.Controller.extend({
         return self.insertIntoTable(data);
       },function(error){
         if(!self.get('error')){
-          self.onUploadingFileFailure(new Error("Server job for upload of file failed."));
           console.log("Error occurred: ", error);
+          return self.onUploadingFileFailure(new Error("Server job for upload of file failed."));
         }
         throw error;
       })
@@ -481,8 +601,8 @@ export default Ember.Controller.extend({
         return self.waitForInsertIntoTable(data.jobId);
       },function(error){
         if(!self.get('error')){
-          self.onInsertIntoTableFailure(error);
           console.log("Error occurred: ", error);
+          return self.onInsertIntoTableFailure(error);
         }
         throw error;
       })
@@ -492,9 +612,8 @@ export default Ember.Controller.extend({
         return self.deleteTempTable(data);
       },function(error){
         if(!self.get('error')){
-          self.onInsertIntoTableFailure(new Error("Server job for insert from temporary to actual table failed."));
-          self.setError(error);
           console.log("Error occurred: ", error);
+          return self.onInsertIntoTableFailure(new Error("Server job for insert from temporary to actual table failed."));
         }
         throw error;
       })
@@ -503,8 +622,8 @@ export default Ember.Controller.extend({
         return self.waitForDeleteTempTable(data.jobId);
       },function(error){
         if(!self.get('error')){
-          self.onDeleteTempTableFailure(error);
           console.log("Error occurred: ", error);
+          self.onDeleteTempTableFailure(error);
         }
         throw error;
       })
@@ -513,52 +632,18 @@ export default Ember.Controller.extend({
         self.onDeleteTempTableSuccess(data);
       },function(error){
         if(!self.get('error')){
-          self.onDeleteTempTableFailure(new Error("Server job for deleting temporary table failed."));
           console.log("Error occurred: ", error);
+          self.onDeleteTempTableFailure(new Error("Server job for deleting temporary table failed."));
         }
         throw error;
+      }).catch(function(error){
+        console.log("inside catch : ", error);
       }).finally(function(){
         console.log("finally hide the modal always");
         self.hideUploadModal();
       });
   },
 
-  createTable: function () {
-    console.log("table headers : ", this.get('header'));
-    var headers = this.get('header');
-
-    var selectedDatabase = this.get('selectedDatabase');
-    if (null == selectedDatabase || typeof selectedDatabase === 'undefined') {
-      throw new Error(Ember.I18n.t('hive.errors.emptyDatabase'));
-    }
-
-    this.set('databaseName', this.get('selectedDatabase').get('name'));
-    var databaseName = this.get('databaseName');
-    var tableName = this.get('tableName');
-    var isFirstRowHeader = this.get('isFirstRowHeader');
-    var filetype = this.get("selectedFileType");
-
-    if (null == databaseName || typeof databaseName === 'undefined' || databaseName == '') {
-      throw new Error(Ember.I18n.t('hive.errors.emptyDatabase'));
-    }
-    if (null == tableName || typeof tableName === 'undefined' || tableName == '') {
-      throw new Error(Ember.I18n.t('hive.errors.emptyTableName'));
-    }
-    if (null == isFirstRowHeader || typeof isFirstRowHeader === 'undefined') {
-      throw new Error(Ember.I18n.t('hive.errors.emptyIsFirstRow'));
-    }
-
-    this.validateColumns();
-
-    return this.get('uploader').createTable({
-      "isFirstRowHeader": isFirstRowHeader,
-      "header": headers,
-      "tableName": tableName,
-      "databaseName": databaseName,
-      "fileType":filetype
-    });
-  },
-
   validateColumns: function () {
     // throw exception if invalid.
   },