You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hy...@apache.org on 2015/09/22 23:05:50 UTC

tajo git commit: TAJO-1868: Allow TablespaceManager::get to return unregistered tablespace.

Repository: tajo
Updated Branches:
  refs/heads/master cf3eef92c -> 4a9628858


TAJO-1868: Allow TablespaceManager::get to return unregistered tablespace.

Closes #768


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

Branch: refs/heads/master
Commit: 4a9628858ee5632a2eaaac1959645689e4189e20
Parents: cf3eef9
Author: Hyunsik Choi <hy...@apache.org>
Authored: Tue Sep 22 14:04:08 2015 -0700
Committer: Hyunsik Choi <hy...@apache.org>
Committed: Tue Sep 22 14:04:08 2015 -0700

----------------------------------------------------------------------
 CHANGES                                         |   3 +
 .../apache/tajo/exception/ErrorMessages.java    |   1 +
 .../apache/tajo/exception/ExceptionUtil.java    |   1 +
 .../apache/tajo/exception/SQLExceptionUtil.java |   1 +
 .../UndefinedTablespaceHandlerException.java    |  34 ++
 tajo-common/src/main/proto/errors.proto         |   1 +
 .../org/apache/tajo/client/TestTajoClient.java  |  13 +
 .../tajo/engine/query/TestCreateTable.java      |   2 +-
 .../tajo/engine/query/TestHBaseTable.java       | 340 +++++++++++--------
 .../org/apache/tajo/storage/TestRowFile.java    |   2 +-
 .../create_table_on_absent_tablespace.sql       |   1 +
 .../engine/planner/PhysicalPlannerImpl.java     |   2 +-
 .../planner/physical/ColPartitionStoreExec.java |   2 +-
 .../engine/planner/physical/InsertRowsExec.java |   2 +-
 .../engine/planner/physical/SeqScanExec.java    |   2 +-
 .../engine/planner/physical/StoreTableExec.java |   9 +-
 .../org/apache/tajo/master/GlobalEngine.java    |   2 +-
 .../tajo/master/exec/CreateTableExecutor.java   |  18 +-
 .../apache/tajo/master/exec/DDLExecutor.java    |   4 +-
 .../exec/NonForwardQueryResultFileScanner.java  |   2 +-
 .../apache/tajo/master/exec/QueryExecutor.java  |   6 +-
 .../java/org/apache/tajo/querymaster/Query.java |   4 +-
 .../tajo/querymaster/QueryMasterTask.java       |   4 +-
 .../apache/tajo/querymaster/Repartitioner.java  |   6 +-
 .../java/org/apache/tajo/querymaster/Stage.java |   2 +-
 .../java/org/apache/tajo/worker/TaskImpl.java   |   2 +-
 .../apache/tajo/storage/TablespaceManager.java  |  56 ++-
 .../src/main/resources/storage-default.json     |  28 +-
 .../tajo/storage/hbase/HBasePutAppender.java    |   2 +-
 .../apache/tajo/storage/hbase/HBaseScanner.java |   4 +-
 .../tajo/storage/hbase/TestHBaseTableSpace.java |   6 +-
 .../org/apache/tajo/storage/FileAppender.java   |   8 +-
 .../org/apache/tajo/storage/FileTablespace.java |   7 +-
 .../storage/HashShuffleAppenderManager.java     |   2 +-
 .../apache/tajo/storage/TestFileTablespace.java |   4 +-
 .../storage/pgsql/TestPgSQLJdbcTableSpace.java  |  32 +-
 .../pgsql/TestPgSQLMetadataProvider.java        |  10 +-
 .../tajo/storage/pgsql/TestPgSQLQueryTests.java |   1 -
 38 files changed, 371 insertions(+), 255 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 057104f..fb0c8a6 100644
--- a/CHANGES
+++ b/CHANGES
@@ -38,6 +38,9 @@ Release 0.11.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1868: Allow TablespaceManager::get to return a unregistered 
+    tablespace. (hyunsik)
+
     TAJO-1867: TajoMaster should handle the change of ${tajo.root}. (hyunsik)
 
     TAJO-1134: start-tajo.sh should display WEB UI URL and TajoMaster RPC 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
index 9649644..ed84aa7 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ErrorMessages.java
@@ -72,6 +72,7 @@ public class ErrorMessages {
     ADD_MESSAGE(UNDEFINED_INDEX_FOR_TABLE, "index ''%s' does not exist", 1);
     ADD_MESSAGE(UNDEFINED_INDEX_FOR_COLUMNS, "index does not exist for '%s' columns of '%s' table", 2);
     ADD_MESSAGE(UNDEFINED_INDEX_NAME, "index name '%s' does not exist", 1);
+    ADD_MESSAGE(UNDEFINED_TABLESPACE_HANDLER, "No tablespace handler for URI scheme '%s'", 1);
 
     ADD_MESSAGE(DUPLICATE_TABLESPACE, "tablespace '%s' already exists", 1);
     ADD_MESSAGE(DUPLICATE_DATABASE, "database '%s' already exists", 1);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
index eea85fb..59c5776 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/ExceptionUtil.java
@@ -59,6 +59,7 @@ public class ExceptionUtil {
     ADD_EXCEPTION(UNDEFINED_PARTITION_KEY, UndefinedPartitionKeyException.class);
     ADD_EXCEPTION(UNDEFINED_OPERATOR, UndefinedOperatorException.class);
     ADD_EXCEPTION(UNDEFINED_INDEX_NAME, UndefinedIndexException.class);
+    ADD_EXCEPTION(UNDEFINED_TABLESPACE_HANDLER, UndefinedTablespaceHandlerException.class);
 
     ADD_EXCEPTION(DUPLICATE_TABLESPACE, DuplicateTablespaceException.class);
     ADD_EXCEPTION(DUPLICATE_DATABASE, DuplicateDatabaseException.class);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-common/src/main/java/org/apache/tajo/exception/SQLExceptionUtil.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/SQLExceptionUtil.java b/tajo-common/src/main/java/org/apache/tajo/exception/SQLExceptionUtil.java
index b5708e1..4b4ec97 100644
--- a/tajo-common/src/main/java/org/apache/tajo/exception/SQLExceptionUtil.java
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/SQLExceptionUtil.java
@@ -72,6 +72,7 @@ public class SQLExceptionUtil {
     SQLSTATES.put(ResultCode.UNDEFINED_PARTITION_METHOD,            "42T06");
     SQLSTATES.put(ResultCode.UNDEFINED_OPERATOR,                    "42883"); // == UNDEFINED_FUNCTION
     SQLSTATES.put(ResultCode.UNDEFINED_PARTITION_KEY,               "42T07");
+    SQLSTATES.put(ResultCode.UNDEFINED_TABLESPACE_HANDLER,          "42T11");
 
     SQLSTATES.put(ResultCode.DUPLICATE_TABLESPACE,                  "42T08");
     SQLSTATES.put(ResultCode.DUPLICATE_DATABASE,                    "42P04");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-common/src/main/java/org/apache/tajo/exception/UndefinedTablespaceHandlerException.java
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/java/org/apache/tajo/exception/UndefinedTablespaceHandlerException.java b/tajo-common/src/main/java/org/apache/tajo/exception/UndefinedTablespaceHandlerException.java
new file mode 100644
index 0000000..f1090d3
--- /dev/null
+++ b/tajo-common/src/main/java/org/apache/tajo/exception/UndefinedTablespaceHandlerException.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+package org.apache.tajo.exception;
+
+import org.apache.tajo.error.Errors;
+import org.apache.tajo.rpc.protocolrecords.PrimitiveProtos.ReturnState;
+
+public class UndefinedTablespaceHandlerException extends TajoException {
+	private static final long serialVersionUID = 277182608283894937L;
+
+  public UndefinedTablespaceHandlerException(ReturnState state) {
+    super(state);
+  }
+
+	public UndefinedTablespaceHandlerException(String spaceName) {
+		super(Errors.ResultCode.UNDEFINED_TABLESPACE_HANDLER, spaceName);
+	}
+}

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-common/src/main/proto/errors.proto
----------------------------------------------------------------------
diff --git a/tajo-common/src/main/proto/errors.proto b/tajo-common/src/main/proto/errors.proto
index 6a1780b..bb973f2 100644
--- a/tajo-common/src/main/proto/errors.proto
+++ b/tajo-common/src/main/proto/errors.proto
@@ -113,6 +113,7 @@ enum ResultCode {
   UNDEFINED_PARTITION_METHOD            = 521; // ?
   UNDEFINED_OPERATOR                    = 522; // SQLState: 42883 (=UNDEFINED_FUNCTION)
   UNDEFINED_PARTITION_KEY               = 523; // ?
+  UNDEFINED_TABLESPACE_HANDLER          = 524; // SQLState: 42T11 - No Tablespace Handler for the URI scheme
 
   DUPLICATE_TABLESPACE                  = 531;
   DUPLICATE_DATABASE                    = 532; // SQLState: 42P04

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
index 38819f1..60f04db 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/client/TestTajoClient.java
@@ -35,6 +35,8 @@ import org.apache.tajo.catalog.TableDesc;
 import org.apache.tajo.catalog.proto.CatalogProtos;
 import org.apache.tajo.conf.TajoConf;
 import org.apache.tajo.exception.TajoException;
+import org.apache.tajo.exception.UndefinedTablespaceException;
+import org.apache.tajo.exception.UndefinedTablespaceHandlerException;
 import org.apache.tajo.exception.UnsupportedException;
 import org.apache.tajo.ipc.ClientProtos;
 import org.apache.tajo.ipc.ClientProtos.QueryHistoryProto;
@@ -797,4 +799,15 @@ public class TestTajoClient {
     rpcClient2.getChannel().eventLoop().terminationFuture().sync();
     assertTrue(rpcClient2.getChannel().eventLoop().isTerminated());
   }
+
+  @Test(expected = UndefinedTablespaceException.class)
+  public void testCreateTableOnAbsentTablespace() throws TajoException {
+    client.updateQuery("CREATE TABLE testCreateTableOnAbsentTablespace (AGE INT) TABLESPACE unknown123");
+  }
+
+  @Test(expected = UndefinedTablespaceHandlerException.class)
+  public void testCreateTableWithAbsentTablespaceHandler() throws TajoException {
+    client.updateQuery(
+        "CREATE EXTERNAL TABLE testCreateTableWithAbsentTablespaceHandler (AGE INT) USING TEXT LOCATION 'hdfx://tajo'");
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
index ed1026e..e33f173 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestCreateTable.java
@@ -415,7 +415,7 @@ public class TestCreateTable extends QueryTestCaseBase {
       }
       if(isClonedSchema(origPartMethod.getExpressionSchema(),
                         newPartMethod.getExpressionSchema()) == false) {
-	fail("Partition columns of input tables do not match");
+	      fail("Partition columns of input tables do not match");
         return false;
       }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
index 760fa62..59cb3ec 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/engine/query/TestHBaseTable.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.engine.query;
 
+import com.google.common.base.Optional;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.fs.FileStatus;
@@ -151,15 +152,22 @@ public class TestHBaseTable extends QueryTestCaseBase {
 
   @Test
   public void testCreateNotExistsExternalHBaseTable() throws Exception {
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table1 (col1 text, col2 text, col3 text, col4 text) " +
-        "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col2:a,col3:,col2:b') " +
-            "LOCATION '%s/external_hbase_table'", tableSpaceUri);
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
+
     try {
-      executeString(sql).close();
-      fail("External table should be a existed table.");
-    } catch (Throwable e) {
-      assertTrue(e.getMessage().indexOf("External table should be a existed table.") >= 0);
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table1 (col1 text, col2 text, col3 text, col4 text) " +
+              "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col2:a,col3:,col2:b') " +
+              "LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      try {
+        executeString(sql).close();
+        fail("External table should be a existed table.");
+      } catch (Throwable e) {
+        assertTrue(e.getMessage().indexOf("External table should be a existed table.") >= 0);
+      }
+    } finally {
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
   }
 
@@ -177,195 +185,229 @@ public class TestHBaseTable extends QueryTestCaseBase {
 
   @Test
   public void testCreateExternalHBaseTable() throws Exception {
-    HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table_not_purge"));
-    hTableDesc.addFamily(new HColumnDescriptor("col1"));
-    hTableDesc.addFamily(new HColumnDescriptor("col2"));
-    hTableDesc.addFamily(new HColumnDescriptor("col3"));
-    testingCluster.getHBaseUtil().createTable(hTableDesc);
-
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk text, col1 text, col2 text, col3 text) " +
-        "USING hbase WITH ('table'='external_hbase_table_not_purge', 'columns'=':key,col1:a,col2:,col3:b') " +
-        "LOCATION '%s/external_hbase_table'", tableSpaceUri);
-    executeString(sql).close();
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
 
-    assertTableExists("external_hbase_mapped_table");
+    try {
+      HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table_not_purge"));
+      hTableDesc.addFamily(new HColumnDescriptor("col1"));
+      hTableDesc.addFamily(new HColumnDescriptor("col2"));
+      hTableDesc.addFamily(new HColumnDescriptor("col3"));
+      testingCluster.getHBaseUtil().createTable(hTableDesc);
+
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk text, col1 text, col2 text, col3 text) " +
+              "USING hbase WITH ('table'='external_hbase_table_not_purge', 'columns'=':key,col1:a,col2:,col3:b') " +
+              "LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      executeString(sql).close();
 
-    executeString("DROP TABLE external_hbase_mapped_table").close();
+      assertTableExists("external_hbase_mapped_table");
+
+      executeString("DROP TABLE external_hbase_mapped_table").close();
+
+      HBaseAdmin hAdmin = new HBaseAdmin(testingCluster.getHBaseUtil().getConf());
+      try {
+        assertTrue(hAdmin.tableExists("external_hbase_table_not_purge"));
+        hAdmin.disableTable("external_hbase_table_not_purge");
+        hAdmin.deleteTable("external_hbase_table_not_purge");
+      } finally {
+        hAdmin.close();
+      }
 
-    HBaseAdmin hAdmin =  new HBaseAdmin(testingCluster.getHBaseUtil().getConf());
-    try {
-      assertTrue(hAdmin.tableExists("external_hbase_table_not_purge"));
-      hAdmin.disableTable("external_hbase_table_not_purge");
-      hAdmin.deleteTable("external_hbase_table_not_purge");
     } finally {
-      hAdmin.close();
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
+
   }
 
   @Test
   public void testSimpleSelectQuery() throws Exception {
-    HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
-    hTableDesc.addFamily(new HColumnDescriptor("col1"));
-    hTableDesc.addFamily(new HColumnDescriptor("col2"));
-    hTableDesc.addFamily(new HColumnDescriptor("col3"));
-    testingCluster.getHBaseUtil().createTable(hTableDesc);
-
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk text, col1 text, col2 text, col3 text) " +
-        "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col1:a,col2:,col3:b') " +
-        "LOCATION '%s/external_hbase_table'", tableSpaceUri);
-    executeString(sql).close();
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
 
-    assertTableExists("external_hbase_mapped_table");
+    try {
+      HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
+      hTableDesc.addFamily(new HColumnDescriptor("col1"));
+      hTableDesc.addFamily(new HColumnDescriptor("col2"));
+      hTableDesc.addFamily(new HColumnDescriptor("col3"));
+      testingCluster.getHBaseUtil().createTable(hTableDesc);
+
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk text, col1 text, col2 text, col3 text) " +
+              "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col1:a,col2:,col3:b') " +
+              "LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      executeString(sql).close();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.getByName("cluster1").get();
-    HConnection hconn = space.getConnection();
-    HTableInterface htable = hconn.getTable("external_hbase_table");
+      assertTableExists("external_hbase_mapped_table");
 
-    try {
-      for (int i = 0; i < 100; i++) {
-        Put put = new Put(String.valueOf(i).getBytes());
-        put.add("col1".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
-        put.add("col1".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
-        put.add("col2".getBytes(), "k1".getBytes(), ("k1-" + i).getBytes());
-        put.add("col2".getBytes(), "k2".getBytes(), ("k2-" + i).getBytes());
-        put.add("col3".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
-        htable.put(put);
-      }
+      HConnection hconn = ((HBaseTablespace)existing.get()).getConnection();
+      HTableInterface htable = hconn.getTable("external_hbase_table");
 
-      ResultSet res = executeString("select * from external_hbase_mapped_table where rk > '20'");
-      assertResultSet(res);
-      cleanupQuery(res);
+      try {
+        for (int i = 0; i < 100; i++) {
+          Put put = new Put(String.valueOf(i).getBytes());
+          put.add("col1".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
+          put.add("col1".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
+          put.add("col2".getBytes(), "k1".getBytes(), ("k1-" + i).getBytes());
+          put.add("col2".getBytes(), "k2".getBytes(), ("k2-" + i).getBytes());
+          put.add("col3".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
+          htable.put(put);
+        }
+
+        ResultSet res = executeString("select * from external_hbase_mapped_table where rk > '20'");
+        assertResultSet(res);
+        cleanupQuery(res);
+      } finally {
+        executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
+        htable.close();
+      }
     } finally {
-      executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
-      htable.close();
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
   }
 
   @Test
   public void testBinaryMappedQuery() throws Exception {
-    HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
-    hTableDesc.addFamily(new HColumnDescriptor("col1"));
-    hTableDesc.addFamily(new HColumnDescriptor("col2"));
-    hTableDesc.addFamily(new HColumnDescriptor("col3"));
-    testingCluster.getHBaseUtil().createTable(hTableDesc);
-
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk int8, col1 text, col2 text, col3 int4)\n " +
-        "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key#b,col1:a,col2:,col3:b#b') " +
-        "LOCATION '%s/external_hbase_table'", tableSpaceUri);
-    executeString(sql).close();
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
 
-    assertTableExists("external_hbase_mapped_table");
+    try {
+      HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
+      hTableDesc.addFamily(new HColumnDescriptor("col1"));
+      hTableDesc.addFamily(new HColumnDescriptor("col2"));
+      hTableDesc.addFamily(new HColumnDescriptor("col3"));
+      testingCluster.getHBaseUtil().createTable(hTableDesc);
+
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk int8, col1 text, col2 text, col3 int4)\n " +
+              "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key#b,col1:a,col2:,col3:b#b') " +
+              "LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      executeString(sql).close();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.getByName("cluster1").get();
-    HConnection hconn = space.getConnection();
-    HTableInterface htable = hconn.getTable("external_hbase_table");
+      assertTableExists("external_hbase_mapped_table");
 
-    try {
-      for (int i = 0; i < 100; i++) {
-        Put put = new Put(Bytes.toBytes((long) i));
-        put.add("col1".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
-        put.add("col1".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
-        put.add("col2".getBytes(), "k1".getBytes(), ("k1-" + i).getBytes());
-        put.add("col2".getBytes(), "k2".getBytes(), ("k2-" + i).getBytes());
-        put.add("col3".getBytes(), "b".getBytes(), Bytes.toBytes(i));
-        htable.put(put);
-      }
+      HConnection hconn = ((HBaseTablespace)existing.get()).getConnection();
+      HTableInterface htable = hconn.getTable("external_hbase_table");
 
-      ResultSet res = executeString("select * from external_hbase_mapped_table where rk > 20");
-      assertResultSet(res);
-      res.close();
+      try {
+        for (int i = 0; i < 100; i++) {
+          Put put = new Put(Bytes.toBytes((long) i));
+          put.add("col1".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
+          put.add("col1".getBytes(), "b".getBytes(), ("b-" + i).getBytes());
+          put.add("col2".getBytes(), "k1".getBytes(), ("k1-" + i).getBytes());
+          put.add("col2".getBytes(), "k2".getBytes(), ("k2-" + i).getBytes());
+          put.add("col3".getBytes(), "b".getBytes(), Bytes.toBytes(i));
+          htable.put(put);
+        }
 
-      //Projection
-      res = executeString("select col3, col2, rk from external_hbase_mapped_table where rk > 95");
+        ResultSet res = executeString("select * from external_hbase_mapped_table where rk > 20");
+        assertResultSet(res);
+        res.close();
 
-      String expected = "col3,col2,rk\n" +
-          "-------------------------------\n" +
-          "96,{\"k1\":\"k1-96\", \"k2\":\"k2-96\"},96\n" +
-          "97,{\"k1\":\"k1-97\", \"k2\":\"k2-97\"},97\n" +
-          "98,{\"k1\":\"k1-98\", \"k2\":\"k2-98\"},98\n" +
-          "99,{\"k1\":\"k1-99\", \"k2\":\"k2-99\"},99\n";
+        //Projection
+        res = executeString("select col3, col2, rk from external_hbase_mapped_table where rk > 95");
 
-      assertEquals(expected, resultSetToString(res));
-      res.close();
+        String expected = "col3,col2,rk\n" +
+            "-------------------------------\n" +
+            "96,{\"k1\":\"k1-96\", \"k2\":\"k2-96\"},96\n" +
+            "97,{\"k1\":\"k1-97\", \"k2\":\"k2-97\"},97\n" +
+            "98,{\"k1\":\"k1-98\", \"k2\":\"k2-98\"},98\n" +
+            "99,{\"k1\":\"k1-99\", \"k2\":\"k2-99\"},99\n";
 
+        assertEquals(expected, resultSetToString(res));
+        res.close();
+
+      } finally {
+        executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
+        htable.close();
+      }
     } finally {
-      executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
-      htable.close();
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
   }
 
   @Test
   public void testColumnKeyValueSelectQuery() throws Exception {
-    HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
-    hTableDesc.addFamily(new HColumnDescriptor("col2"));
-    hTableDesc.addFamily(new HColumnDescriptor("col3"));
-    testingCluster.getHBaseUtil().createTable(hTableDesc);
-
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk1 text, col2_key text, col2_value text, col3 text) " +
-        "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col2:key:,col2:value:,col3:', " +
-        "'hbase.rowkey.delimiter'='_') LOCATION '%s/external_hbase_table'", tableSpaceUri);
-    executeString(sql).close();
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
 
-    assertTableExists("external_hbase_mapped_table");
+    try {
+      HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
+      hTableDesc.addFamily(new HColumnDescriptor("col2"));
+      hTableDesc.addFamily(new HColumnDescriptor("col3"));
+      testingCluster.getHBaseUtil().createTable(hTableDesc);
+
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk1 text, col2_key text, col2_value text, col3 text) " +
+              "USING hbase WITH ('table'='external_hbase_table', 'columns'=':key,col2:key:,col2:value:,col3:', " +
+              "'hbase.rowkey.delimiter'='_') LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      executeString(sql).close();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.getByName("cluster1").get();
-    HConnection hconn = space.getConnection();
-    HTableInterface htable = hconn.getTable("external_hbase_table");
+      assertTableExists("external_hbase_mapped_table");
 
-    try {
-      for (int i = 0; i < 10; i++) {
-        Put put = new Put(Bytes.toBytes("rk-" + i));
-        for (int j = 0; j < 5; j++) {
-          put.add("col2".getBytes(), ("key-" + j).getBytes(), Bytes.toBytes("value-" + j));
+      HConnection hconn = ((HBaseTablespace)existing.get()).getConnection();
+      HTableInterface htable = hconn.getTable("external_hbase_table");
+
+      try {
+        for (int i = 0; i < 10; i++) {
+          Put put = new Put(Bytes.toBytes("rk-" + i));
+          for (int j = 0; j < 5; j++) {
+            put.add("col2".getBytes(), ("key-" + j).getBytes(), Bytes.toBytes("value-" + j));
+          }
+          put.add("col3".getBytes(), "".getBytes(), ("col3-value-" + i).getBytes());
+          htable.put(put);
         }
-        put.add("col3".getBytes(), "".getBytes(), ("col3-value-" + i).getBytes());
-        htable.put(put);
-      }
 
-      ResultSet res = executeString("select * from external_hbase_mapped_table where rk1 >= 'rk-0'");
-      assertResultSet(res);
-      cleanupQuery(res);
+        ResultSet res = executeString("select * from external_hbase_mapped_table where rk1 >= 'rk-0'");
+        assertResultSet(res);
+        cleanupQuery(res);
+      } finally {
+        executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
+        htable.close();
+      }
     } finally {
-      executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
-      htable.close();
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
   }
 
   @Test
   public void testRowFieldSelectQuery() throws Exception {
-    HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
-    hTableDesc.addFamily(new HColumnDescriptor("col3"));
-    testingCluster.getHBaseUtil().createTable(hTableDesc);
-
-    String sql = String.format(
-        "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk1 text, rk2 text, col3 text) " +
-        "USING hbase WITH ('table'='external_hbase_table', 'columns'='0:key,1:key,col3:a', " +
-        "'hbase.rowkey.delimiter'='_') LOCATION '%s/external_hbase_table'", tableSpaceUri);
-    executeString(sql).close();
+    Optional<Tablespace> existing = TablespaceManager.removeTablespaceForTest("cluster1");
+    assertTrue(existing.isPresent());
 
-    assertTableExists("external_hbase_mapped_table");
+    try {
+      HTableDescriptor hTableDesc = new HTableDescriptor(TableName.valueOf("external_hbase_table"));
+      hTableDesc.addFamily(new HColumnDescriptor("col3"));
+      testingCluster.getHBaseUtil().createTable(hTableDesc);
+
+      String sql = String.format(
+          "CREATE EXTERNAL TABLE external_hbase_mapped_table (rk1 text, rk2 text, col3 text) " +
+              "USING hbase WITH ('table'='external_hbase_table', 'columns'='0:key,1:key,col3:a', " +
+              "'hbase.rowkey.delimiter'='_') LOCATION '%s/external_hbase_table'", tableSpaceUri);
+      executeString(sql).close();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.getByName("cluster1").get();
-    HConnection hconn = space.getConnection();
-    HTableInterface htable = hconn.getTable("external_hbase_table");
+      assertTableExists("external_hbase_mapped_table");
 
-    try {
-      for (int i = 0; i < 100; i++) {
-        Put put = new Put(("field1-" + i + "_field2-" + i).getBytes());
-        put.add("col3".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
-        htable.put(put);
-      }
 
-      ResultSet res = executeString("select * from external_hbase_mapped_table where rk1 > 'field1-20'");
-      assertResultSet(res);
-      cleanupQuery(res);
+      HConnection hconn = ((HBaseTablespace)existing.get()).getConnection();
+      HTableInterface htable = hconn.getTable("external_hbase_table");
+
+      try {
+        for (int i = 0; i < 100; i++) {
+          Put put = new Put(("field1-" + i + "_field2-" + i).getBytes());
+          put.add("col3".getBytes(), "a".getBytes(), ("a-" + i).getBytes());
+          htable.put(put);
+        }
+
+        ResultSet res = executeString("select * from external_hbase_mapped_table where rk1 > 'field1-20'");
+        assertResultSet(res);
+        cleanupQuery(res);
+      } finally {
+        executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
+        htable.close();
+      }
     } finally {
-      executeString("DROP TABLE external_hbase_mapped_table PURGE").close();
-      htable.close();
+      TablespaceManager.addTableSpaceForTest(existing.get());
     }
   }
 
@@ -483,7 +525,7 @@ public class TestHBaseTable extends QueryTestCaseBase {
     EvalNode evalNodeEq = new BinaryEval(EvalType.EQUAL, new FieldEval(tableDesc.getLogicalSchema().getColumn("rk")),
         new ConstEval(new TextDatum("021")));
     scanNode.setQual(evalNodeEq);
-    Tablespace tablespace = TablespaceManager.getByName("cluster1").get();
+    Tablespace tablespace = TablespaceManager.getByName("cluster1");
     List<Fragment> fragments = tablespace.getSplits("hbase_mapped_table", tableDesc, scanNode.getQual());
     assertEquals(1, fragments.size());
     assertEquals("021", new String(((HBaseFragment)fragments.get(0)).getStartRow()));

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
index c1d5a97..011803d 100644
--- a/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
+++ b/tajo-core-tests/src/test/java/org/apache/tajo/storage/TestRowFile.java
@@ -71,7 +71,7 @@ public class TestRowFile {
 
     TableMeta meta = CatalogUtil.newTableMeta("ROWFILE");
 
-    FileTablespace sm = (FileTablespace) TablespaceManager.get(cluster.getDefaultFileSystem().getUri()).get();
+    FileTablespace sm = (FileTablespace) TablespaceManager.get(cluster.getDefaultFileSystem().getUri());
 
     Path tablePath = new Path("/test");
     Path dataPath = new Path(tablePath, "test.tbl");

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core-tests/src/test/resources/queries/TestCreateTable/negative/create_table_on_absent_tablespace.sql
----------------------------------------------------------------------
diff --git a/tajo-core-tests/src/test/resources/queries/TestCreateTable/negative/create_table_on_absent_tablespace.sql b/tajo-core-tests/src/test/resources/queries/TestCreateTable/negative/create_table_on_absent_tablespace.sql
new file mode 100644
index 0000000..8db9868
--- /dev/null
+++ b/tajo-core-tests/src/test/resources/queries/TestCreateTable/negative/create_table_on_absent_tablespace.sql
@@ -0,0 +1 @@
+CREATE TABLE default.LINEITEM (XXX TEXT) TABLESPACE unknown;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
index 36d80da..461e405 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/PhysicalPlannerImpl.java
@@ -932,7 +932,7 @@ public class PhysicalPlannerImpl implements PhysicalPlanner {
           PartitionedTableScanNode partitionedTableScanNode = (PartitionedTableScanNode) scanNode;
           List<Fragment> fileFragments = TUtil.newList();
 
-          FileTablespace space = (FileTablespace) TablespaceManager.get(scanNode.getTableDesc().getUri()).get();
+          FileTablespace space = (FileTablespace) TablespaceManager.get(scanNode.getTableDesc().getUri());
           for (Path path : partitionedTableScanNode.getInputPaths()) {
             fileFragments.addAll(TUtil.newList(space.split(scanNode.getCanonicalName(), path)));
           }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
index a8a1c78..01d3c0f 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/ColPartitionStoreExec.java
@@ -197,7 +197,7 @@ public abstract class ColPartitionStoreExec extends UnaryPhysicalExec {
       actualFilePath = new Path(lastFileName + "_" + suffixId);
     }
 
-    appender = ((FileTablespace) TablespaceManager.get(lastFileName.toUri()).get())
+    appender = ((FileTablespace) TablespaceManager.get(lastFileName.toUri()))
         .getAppender(meta, outSchema, actualFilePath);
 
     appender.enableStats();

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
index f3a24a7..6c2f7a5 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/InsertRowsExec.java
@@ -65,7 +65,7 @@ public class InsertRowsExec extends UnaryPhysicalExec {
     sumStats = new TableStats();
 
     StoreTableNode storeTableNode = (StoreTableNode) plan;
-    appender = TablespaceManager.get(storeTableNode.getUri()).get().getAppenderForInsertRow(
+    appender = TablespaceManager.get(storeTableNode.getUri()).getAppenderForInsertRow(
         context.getQueryContext(),
         context.getTaskId(), meta, storeTableNode.getTableSchema(), context.getOutputPath());
     appender.enableStats();

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
index c2a6e99..a41d20a 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/SeqScanExec.java
@@ -268,7 +268,7 @@ public class SeqScanExec extends ScanExec {
 
     } else {
 
-      Tablespace tablespace = TablespaceManager.get(table.getUri()).get();
+      Tablespace tablespace = TablespaceManager.get(table.getUri());
       this.scanner = tablespace.getScanner(
           meta,
           plan.getPhysicalSchema(),

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
index c317f7f..8db1f5d 100644
--- a/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
+++ b/tajo-core/src/main/java/org/apache/tajo/engine/planner/physical/StoreTableExec.java
@@ -93,12 +93,7 @@ public class StoreTableExec extends UnaryPhysicalExec {
         lastFileName = new Path(lastFileName + "_" + suffixId);
       }
 
-      Optional<FileTablespace> spaceRes = TablespaceManager.get(lastFileName.toUri());
-      if (!spaceRes.isPresent())  {
-        throw new IllegalStateException("No Tablespace for " + lastFileName.toUri());
-      }
-
-      FileTablespace space = spaceRes.get();
+      FileTablespace space = TablespaceManager.get(lastFileName.toUri());
       appender = space.getAppender(meta, appenderSchema, lastFileName);
 
       if (suffixId > 0) {
@@ -107,7 +102,7 @@ public class StoreTableExec extends UnaryPhysicalExec {
       }
     } else {
       Path stagingDir = context.getQueryContext().getStagingDir();
-      appender = TablespaceManager.get(stagingDir.toUri()).get().getAppender(
+      appender = TablespaceManager.get(stagingDir.toUri()).getAppender(
           context.getQueryContext(),
           context.getTaskId(),
           meta,

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
index 0d14d9a..d5e5dd5 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/GlobalEngine.java
@@ -312,7 +312,7 @@ public class GlobalEngine extends AbstractService {
           InsertNode iNode = rootNode.getChild();
           Schema outSchema = iNode.getChild().getOutSchema();
 
-          TablespaceManager.get(tableDesc.getUri()).get().verifySchemaToWrite(tableDesc, outSchema);
+          TablespaceManager.get(tableDesc.getUri()).verifySchemaToWrite(tableDesc, outSchema);
 
         } catch (TajoException t) {
           state.addVerification(t);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
index 24f420c..f7b7bf2 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/CreateTableExecutor.java
@@ -132,23 +132,11 @@ public class CreateTableExecutor {
     }
   }
 
-  private Tablespace getTablespaceHandler(@Nullable String tableSpaceName, @Nullable URI tableUri)
-      throws UndefinedTablespaceException {
-
+  private Tablespace getTablespaceHandler(@Nullable String tableSpaceName, @Nullable URI tableUri) {
     if (tableSpaceName != null) {
-      Optional<Tablespace> ts = (Optional<Tablespace>) TablespaceManager.getByName(tableSpaceName);
-      if (ts.isPresent()) {
-        return ts.get();
-      } else {
-        throw new UndefinedTablespaceException(tableSpaceName);
-      }
+      return TablespaceManager.getByName(tableSpaceName);
     } else if (tableUri != null) {
-      Optional<Tablespace> ts = TablespaceManager.get(tableUri);
-      if (ts.isPresent()) {
-        return ts.get();
-      } else {
-        throw new UndefinedTablespaceException(tableUri.toString());
-      }
+      return TablespaceManager.get(tableUri);
     } else {
       return TablespaceManager.getDefault();
     }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
index c5d5838..15abf9e 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/DDLExecutor.java
@@ -311,7 +311,7 @@ public class DDLExecutor {
 
     if (purge) {
       try {
-        TablespaceManager.get(tableDesc.getUri()).get().purgeTable(tableDesc);
+        TablespaceManager.get(tableDesc.getUri()).purgeTable(tableDesc);
       } catch (IOException e) {
         throw new InternalError(e.getMessage());
       }
@@ -355,7 +355,7 @@ public class DDLExecutor {
             new UnsupportedException("table truncation on an external table '" + eachTableName + "'"));
       }
 
-      Tablespace space = TablespaceManager.get(tableDesc.getUri()).get();
+      Tablespace space = TablespaceManager.get(tableDesc.getUri());
 
       if (space instanceof FileTablespace) {
         tableDescList.add(tableDesc);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
index ac40c4f..e520cdb 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/NonForwardQueryResultFileScanner.java
@@ -102,7 +102,7 @@ public class NonForwardQueryResultFileScanner implements NonForwardQueryResultSc
   }
 
   private void initSeqScanExec() throws IOException, TajoException {
-    Tablespace tablespace = TablespaceManager.get(tableDesc.getUri()).get();
+    Tablespace tablespace = TablespaceManager.get(tableDesc.getUri());
 
     List<Fragment> fragments = Lists.newArrayList();
     if (tableDesc.hasPartition()) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
index ffdb3f0..d5341d8 100644
--- a/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
+++ b/tajo-core/src/main/java/org/apache/tajo/master/exec/QueryExecutor.java
@@ -458,7 +458,7 @@ public class QueryExecutor {
       String queryId = nodeUniqName + "_" + System.currentTimeMillis();
 
       URI finalOutputUri = insertNode.getUri();
-      Tablespace space = TablespaceManager.get(finalOutputUri).get();
+      Tablespace space = TablespaceManager.get(finalOutputUri);
       TableMeta tableMeta = new TableMeta(insertNode.getStorageType(), insertNode.getOptions());
       tableMeta.putOption(StorageConstants.INSERT_DIRECTLY, Boolean.TRUE.toString());
 
@@ -564,7 +564,7 @@ public class QueryExecutor {
     TableDesc tableDesc = PlannerUtil.getTableDesc(catalog, plan.getRootBlock().getRoot());
     if (tableDesc != null) {
 
-      Tablespace space = TablespaceManager.get(tableDesc.getUri()).get();
+      Tablespace space = TablespaceManager.get(tableDesc.getUri());
       FormatProperty formatProperty = space.getFormatProperty(tableDesc.getMeta());
 
       if (!formatProperty.isInsertable()) {
@@ -603,7 +603,7 @@ public class QueryExecutor {
     TableDesc tableDesc = PlannerUtil.getTableDesc(planner.getCatalog(), rootNode.getChild());
 
     if (tableDesc != null) {
-      Tablespace space = TablespaceManager.get(tableDesc.getUri()).get();
+      Tablespace space = TablespaceManager.get(tableDesc.getUri());
       space.rewritePlan(context, plan);
     }
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
index 1ec45d1..f06d28c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Query.java
@@ -470,7 +470,7 @@ public class Query implements EventHandler<QueryEvent> {
       QueryContext context = query.context.getQueryContext();
 
       if (lastStage != null && context.hasOutputTableUri()) {
-        Tablespace space = TablespaceManager.get(context.getOutputTableUri()).get();
+        Tablespace space = TablespaceManager.get(context.getOutputTableUri());
         try {
           LogicalRootNode rootNode = lastStage.getMasterPlan().getLogicalPlan().getRootBlock().getRoot();
           space.rollbackTable(rootNode.getChild());
@@ -493,7 +493,7 @@ public class Query implements EventHandler<QueryEvent> {
 
         // If there is not tabledesc, it is a select query without insert or ctas.
         // In this case, we should use default tablespace.
-        Tablespace space = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, "")).get();
+        Tablespace space = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, ""));
 
         Path finalOutputDir = space.commitTable(
             query.context.getQueryContext(),

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
index 1313dad..46e48e6 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/QueryMasterTask.java
@@ -322,7 +322,7 @@ public class QueryMasterTask extends CompositeService {
       optimizer.optimize(queryContext, plan);
 
       // when a given uri is null, TablespaceManager.get will return the default tablespace.
-      space = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, "")).get();
+      space = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, ""));
       space.rewritePlan(queryContext, plan);
 
       initStagingDir();
@@ -379,7 +379,7 @@ public class QueryMasterTask extends CompositeService {
     URI stagingDir;
 
     try {
-      Tablespace tablespace = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, "")).get();
+      Tablespace tablespace = TablespaceManager.get(queryContext.get(QueryVars.OUTPUT_TABLE_URI, ""));
       TableDesc desc = PlannerUtil.getOutputTableDesc(plan);
 
       FormatProperty formatProperty = tablespace.getFormatProperty(desc.getMeta());

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
index 3ce86b1..bddf198 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Repartitioner.java
@@ -113,7 +113,7 @@ public class Repartitioner {
         // if table has no data, tablespace will return empty FileFragment.
         // So, we need to handle FileFragment by its size.
         // If we don't check its size, it can cause IndexOutOfBoundsException.
-        Tablespace space = TablespaceManager.get(tableDesc.getUri()).get();
+        Tablespace space = TablespaceManager.get(tableDesc.getUri());
         List<Fragment> fileFragments = space.getSplits(scans[i].getCanonicalName(), tableDesc, null);
         if (fileFragments.size() > 0) {
           fragments[i] = fileFragments.get(0);
@@ -378,7 +378,7 @@ public class Repartitioner {
 
         Path[] partitionScanPaths = null;
         TableDesc tableDesc = masterContext.getTableDesc(eachScan);
-        Tablespace space = TablespaceManager.get(tableDesc.getUri()).get();
+        Tablespace space = TablespaceManager.get(tableDesc.getUri());
 
         if (eachScan.getType() == NodeType.PARTITIONS_SCAN) {
 
@@ -507,7 +507,7 @@ public class Repartitioner {
       Path[] partitionScanPaths = null;
 
 
-      Tablespace space = TablespaceManager.get(desc.getUri()).get();
+      Tablespace space = TablespaceManager.get(desc.getUri());
 
       if (scan.getType() == NodeType.PARTITIONS_SCAN) {
         PartitionedTableScanNode partitionScan = (PartitionedTableScanNode) scan;

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
index 125c83c..282edcc 100644
--- a/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
+++ b/tajo-core/src/main/java/org/apache/tajo/querymaster/Stage.java
@@ -1132,7 +1132,7 @@ public class Stage implements EventHandler<StageEvent> {
       TableDesc table = stage.context.getTableDesc(scan);
 
       Collection<Fragment> fragments;
-      Tablespace tablespace = TablespaceManager.get(scan.getTableDesc().getUri()).get();
+      Tablespace tablespace = TablespaceManager.get(scan.getTableDesc().getUri());
 
       // Depending on scanner node's type, it creates fragments. If scan is for
       // a partitioned table, It will creates lots fragments for all partitions.

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java
index 4e3a8bf..a8e874c 100644
--- a/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java
+++ b/tajo-core/src/main/java/org/apache/tajo/worker/TaskImpl.java
@@ -142,7 +142,7 @@ public class TaskImpl implements Task {
         this.sortComp = new BaseTupleComparator(finalSchema, sortNode.getSortKeys());
       }
     } else {
-      Path outFilePath = ((FileTablespace) TablespaceManager.get(queryContext.getStagingDir().toUri()).get())
+      Path outFilePath = ((FileTablespace) TablespaceManager.get(queryContext.getStagingDir().toUri()))
           .getAppenderFilePath(getId(), queryContext.getStagingDir());
       LOG.info("Output File Path: " + outFilePath);
       context.setOutputPath(outFilePath);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TablespaceManager.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TablespaceManager.java b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TablespaceManager.java
index a1fa857..85d5d51 100644
--- a/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TablespaceManager.java
+++ b/tajo-storage/tajo-storage-common/src/main/java/org/apache/tajo/storage/TablespaceManager.java
@@ -33,6 +33,9 @@ import org.apache.hadoop.fs.Path;
 import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.MetadataProvider;
 import org.apache.tajo.conf.TajoConf;
+import org.apache.tajo.exception.TajoRuntimeException;
+import org.apache.tajo.exception.UndefinedTablespaceException;
+import org.apache.tajo.exception.UndefinedTablespaceHandlerException;
 import org.apache.tajo.exception.UnsupportedException;
 import org.apache.tajo.storage.fragment.Fragment;
 import org.apache.tajo.util.JavaResourceUtil;
@@ -276,10 +279,11 @@ public class TablespaceManager implements StorageService {
   public static final String KEY_SPACES = "spaces";
 
   private static Tablespace initializeTableSpace(String spaceName, URI uri, JSONObject spaceDesc) {
-    Class<? extends Tablespace> clazz = TABLE_SPACE_HANDLERS.get(UriUtil.getScheme(uri));
+    final String scheme = UriUtil.getScheme(uri);
+    Class<? extends Tablespace> clazz = TABLE_SPACE_HANDLERS.get(scheme);
 
     if (clazz == null) {
-      throw new RuntimeException("Not found Tablespace handler for " + uri.toString());
+      throw new TajoRuntimeException(new UndefinedTablespaceHandlerException(scheme));
     }
 
     try {
@@ -319,6 +323,18 @@ public class TablespaceManager implements StorageService {
     return Optional.fromNullable(existing);
   }
 
+  @VisibleForTesting
+  public static Optional<Tablespace> removeTablespaceForTest(String name) {
+    Tablespace existing = null;
+    synchronized (SPACES_URIS_MAP) {
+      URI uri = SPACES_URIS_MAP.remove(name);
+      if (uri != null) {
+        existing = TABLE_SPACES.remove(uri);
+      }
+    }
+    return Optional.fromNullable(existing);
+  }
+
   public Iterable<String> getSupportSchemes() {
     return TABLE_SPACE_HANDLERS.keySet();
   }
@@ -330,10 +346,10 @@ public class TablespaceManager implements StorageService {
    * @param <T> Tablespace class type
    * @return Tablespace. If uri is null, the default tablespace will be returned.
    */
-  public static <T extends Tablespace> Optional<T> get(@Nullable String uri) {
+  public static <T extends Tablespace> T get(@Nullable String uri) {
 
     if (uri == null || uri.isEmpty()) {
-      return (Optional<T>) Optional.of(getDefault());
+      return getDefault();
     }
 
     Tablespace lastOne = null;
@@ -345,7 +361,17 @@ public class TablespaceManager implements StorageService {
         lastOne = entry.getValue();
       }
     }
-    return (Optional<T>) Optional.fromNullable(lastOne);
+
+    if (lastOne == null) {
+      lastOne = initializeTableSpace(UUID.randomUUID().toString(), URI.create(uri), new JSONObject());
+      try {
+        lastOne.init(systemConf);
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+    return (T) lastOne;
   }
 
   /**
@@ -355,11 +381,11 @@ public class TablespaceManager implements StorageService {
    * @param <T> Tablespace class type
    * @return Tablespace. If uri is null, the default tablespace will be returned.
    */
-  public static <T extends Tablespace> Optional<T> get(@Nullable URI uri) {
+  public static <T extends Tablespace> T get(@Nullable URI uri) {
     if (uri == null) {
-      return (Optional<T>) Optional.of(getDefault());
+      return getDefault();
     } else {
-      return (Optional<T>) get(uri.toString());
+      return (T) get(uri.toString());
     }
   }
 
@@ -369,19 +395,19 @@ public class TablespaceManager implements StorageService {
    * @return
    */
   public static <T extends Tablespace> T getDefault() {
-    return (T) getByName(DEFAULT_TABLESPACE_NAME).get();
+    return (T) getByName(DEFAULT_TABLESPACE_NAME);
   }
 
   public static <T extends Tablespace> T getLocalFs() {
-    return (T) get(LOCAL_FS_URI).get();
+    return (T) get(LOCAL_FS_URI);
   }
 
-  public static Optional<? extends Tablespace> getByName(String name) {
+  public static <T extends Tablespace> T getByName(String name) {
     URI uri = SPACES_URIS_MAP.get(name);
     if (uri != null) {
-      return Optional.of(TABLE_SPACES.get(uri));
+      return (T) TABLE_SPACES.get(uri);
     } else {
-      return Optional.absent();
+      throw new TajoRuntimeException(new UndefinedTablespaceException(name));
     }
   }
 
@@ -398,13 +424,13 @@ public class TablespaceManager implements StorageService {
 
   @Override
   public URI getTableURI(@Nullable String spaceName, String databaseName, String tableName) {
-    Tablespace space = spaceName == null ? getDefault() : getByName(spaceName).get();
+    Tablespace space = spaceName == null ? getDefault() : getByName(spaceName);
     return space.getTableUri(databaseName, tableName);
   }
 
   @Override
   public long getTableVolumn(URI tableUri) throws UnsupportedException {
-    return get(tableUri).get().getTableVolume(tableUri);
+    return get(tableUri).getTableVolume(tableUri);
   }
 
   public static Iterable<Tablespace> getAllTablespaces() {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-common/src/main/resources/storage-default.json
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-common/src/main/resources/storage-default.json b/tajo-storage/tajo-storage-common/src/main/resources/storage-default.json
index 3ede2d4..a24f301 100644
--- a/tajo-storage/tajo-storage-common/src/main/resources/storage-default.json
+++ b/tajo-storage/tajo-storage-common/src/main/resources/storage-default.json
@@ -1,24 +1,36 @@
 {
   "storages": {
-    "hdfs": {
-      "handler": "org.apache.tajo.storage.FileTablespace",
-      "default-format": "text"
-    },
     "file": {
       "handler": "org.apache.tajo.storage.FileTablespace",
       "default-format": "text"
     },
-    "s3": {
-      "handler": "org.apache.tajo.storage.FileTablespace",
-      "default-format": "text"
-    },
     "hbase:zk": {
       "handler": "org.apache.tajo.storage.hbase.HBaseTablespace",
       "default-format": "hbase"
     },
+    "hdfs": {
+      "handler": "org.apache.tajo.storage.FileTablespace",
+      "default-format": "text"
+    },
     "jdbc:postgresql": {
       "handler": "org.apache.tajo.storage.pgsql.PgSQLTablespace",
       "default-format": "rowstore"
+    },
+    "s3": {
+      "handler": "org.apache.tajo.storage.FileTablespace",
+      "default-format": "text"
+    },
+    "s3a": {
+      "handler": "org.apache.tajo.storage.FileTablespace",
+      "default-format": "text"
+    },
+    "s3n": {
+      "handler": "org.apache.tajo.storage.FileTablespace",
+      "default-format": "text"
+    },
+    "swift": {
+      "handler": "org.apache.tajo.storage.FileTablespace",
+      "default-format": "text"
     }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java
index 7943134..20b1a08 100644
--- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java
+++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBasePutAppender.java
@@ -47,7 +47,7 @@ public class HBasePutAppender extends AbstractHBaseAppender {
   public void init() throws IOException {
     super.init();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.get(uri).get();
+    HBaseTablespace space = (HBaseTablespace) TablespaceManager.get(uri);
     HConnection hconn = space.getConnection();
     htable = hconn.getTable(columnMapping.getHbaseTableName());
     htable.setAutoFlushTo(false);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseScanner.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseScanner.java b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseScanner.java
index 90f7aa0..55d27a1 100644
--- a/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseScanner.java
+++ b/tajo-storage/tajo-storage-hbase/src/main/java/org/apache/tajo/storage/hbase/HBaseScanner.java
@@ -144,7 +144,7 @@ public class HBaseScanner implements Scanner {
     rowKeyDelimiter = columnMapping.getRowKeyDelimiter();
     rowKeyFieldIndexes = columnMapping.getRowKeyFieldIndexes();
 
-    HBaseTablespace space = (HBaseTablespace) TablespaceManager.get(fragment.getUri()).get();
+    HBaseTablespace space = (HBaseTablespace) TablespaceManager.get(fragment.getUri());
     hbaseConf = space.getHbaseConf();
     initScanner();
   }
@@ -192,7 +192,7 @@ public class HBaseScanner implements Scanner {
     }
 
     if (htable == null) {
-      HConnection hconn = ((HBaseTablespace) TablespaceManager.get(fragment.getUri()).get()).getConnection();
+      HConnection hconn = ((HBaseTablespace) TablespaceManager.get(fragment.getUri())).getConnection();
       htable = hconn.getTable(fragment.getHbaseTableName());
     }
     scanner = htable.getScanner(scan);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestHBaseTableSpace.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestHBaseTableSpace.java b/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestHBaseTableSpace.java
index 56ca9be..913c586 100644
--- a/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestHBaseTableSpace.java
+++ b/tajo-storage/tajo-storage-hbase/src/test/java/org/apache/tajo/storage/hbase/TestHBaseTableSpace.java
@@ -58,8 +58,8 @@ public class TestHBaseTableSpace {
 
   @Test
   public void testTablespaceHandler() throws Exception {
-    assertTrue((TablespaceManager.getByName("cluster1").get()) instanceof HBaseTablespace);
-    assertTrue((TablespaceManager.get(URI.create("hbase:zk://host1:2171")).get())
+    assertTrue((TablespaceManager.getByName("cluster1")) instanceof HBaseTablespace);
+    assertTrue((TablespaceManager.get(URI.create("hbase:zk://host1:2171")))
         instanceof HBaseTablespace);
   }
 
@@ -73,7 +73,7 @@ public class TestHBaseTableSpace {
     EvalNode evalNodeA = new BinaryEval(EvalType.AND, evalNode1, evalNode2);
     scanNode.setQual(evalNodeA);
 
-    HBaseTablespace storageManager = (HBaseTablespace) TablespaceManager.getByName("cluster1").get();
+    HBaseTablespace storageManager = (HBaseTablespace) TablespaceManager.getByName("cluster1");
     List<Set<EvalNode>> indexEvals =
         storageManager.findIndexablePredicateSet(scanNode.getQual(), new Column[]{rowkeyColumn});
     assertNotNull(indexEvals);

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileAppender.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileAppender.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileAppender.java
index efe2bfd..eeeadcb 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileAppender.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileAppender.java
@@ -58,13 +58,7 @@ public abstract class FileAppender implements Appender {
         throw new IllegalArgumentException("Configuration must be an instance of TajoConf");
       }
 
-      Optional<FileTablespace> spaceResult = TablespaceManager.get(workDir.toUri());
-
-      if (!spaceResult.isPresent()) {
-        throw new IllegalStateException("No TableSpace for " + workDir.toUri());
-      }
-
-      FileTablespace space = spaceResult.get();
+      FileTablespace space = TablespaceManager.get(workDir.toUri());
       this.path = space.getAppenderFilePath(taskAttemptId, workDir);
 
     } else {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileTablespace.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileTablespace.java
index af981bb..1b0952e 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileTablespace.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/FileTablespace.java
@@ -720,12 +720,7 @@ public class FileTablespace extends Tablespace {
       // for temporarily written in the storage directory
       stagingDir = fs.makeQualified(new Path(stagingRootPath, queryId));
     } else {
-      Optional<Tablespace> spaceResult = TablespaceManager.get(outputPath);
-      if (!spaceResult.isPresent()) {
-        throw new IOException("No registered Tablespace for " + outputPath);
-      }
-
-      Tablespace space = spaceResult.get();
+      Tablespace space = TablespaceManager.get(outputPath);
       if (space.getProperty().isMovable()) { // checking if this tablespace allows MOVE operation
         // If this space allows move operation, the staging directory will be underneath the final output table uri.
         stagingDir = fs.makeQualified(StorageUtil.concatPath(outputPath, TMP_STAGING_DIR_PREFIX, queryId));

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/HashShuffleAppenderManager.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/HashShuffleAppenderManager.java b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/HashShuffleAppenderManager.java
index 1d32291..b118044 100644
--- a/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/HashShuffleAppenderManager.java
+++ b/tajo-storage/tajo-storage-hdfs/src/main/java/org/apache/tajo/storage/HashShuffleAppenderManager.java
@@ -85,7 +85,7 @@ public class HashShuffleAppenderManager {
           fs.mkdirs(dataFile.getParent());
         }
 
-        FileTablespace space = (FileTablespace) TablespaceManager.get(dataFile.toUri()).get();
+        FileTablespace space = (FileTablespace) TablespaceManager.get(dataFile.toUri());
         FileAppender appender = (FileAppender) space.getAppender(meta, outSchema, dataFile);
         appender.enableStats();
         appender.init();

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
index f536514..627e4ed 100644
--- a/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
+++ b/tajo-storage/tajo-storage-hdfs/src/test/java/org/apache/tajo/storage/TestFileTablespace.java
@@ -282,10 +282,10 @@ public class TestFileTablespace {
       existingTs = TablespaceManager.addTableSpaceForTest(distTablespace);
 
       /* Distributed FileSystem */
-      space = (FileTablespace) TablespaceManager.get(uri).get();
+      space = (FileTablespace) TablespaceManager.get(uri);
       assertEquals(cluster.getFileSystem().getUri(), space.getFileSystem().getUri());
 
-      space = (FileTablespace) TablespaceManager.getByName("testGetFileTablespace").get();
+      space = (FileTablespace) TablespaceManager.getByName("testGetFileTablespace");
       assertEquals(cluster.getFileSystem().getUri(), space.getFileSystem().getUri());
 
     } finally {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLJdbcTableSpace.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLJdbcTableSpace.java b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLJdbcTableSpace.java
index cf4fe12..05b26e8 100644
--- a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLJdbcTableSpace.java
+++ b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLJdbcTableSpace.java
@@ -18,6 +18,7 @@
 
 package org.apache.tajo.storage.pgsql;
 
+import com.google.common.base.Optional;
 import net.minidev.json.JSONObject;
 import org.apache.tajo.catalog.MetadataProvider;
 import org.apache.tajo.catalog.TableDesc;
@@ -44,31 +45,31 @@ public class TestPgSQLJdbcTableSpace {
 
   @Test(timeout = 1000)
   public void testTablespaceHandler() throws Exception {
-    assertTrue((TablespaceManager.getByName("pgsql_cluster").get()) instanceof PgSQLTablespace);
-    assertEquals("pgsql_cluster", (TablespaceManager.getByName("pgsql_cluster").get().getName()));
+    assertTrue((TablespaceManager.getByName("pgsql_cluster")) instanceof PgSQLTablespace);
+    assertEquals("pgsql_cluster", (TablespaceManager.getByName("pgsql_cluster").getName()));
 
-    assertTrue((TablespaceManager.get(jdbcUrl).get()) instanceof PgSQLTablespace);
-    assertTrue((TablespaceManager.get(jdbcUrl + "&table=tb1").get()) instanceof PgSQLTablespace);
+    assertTrue((TablespaceManager.get(jdbcUrl)) instanceof PgSQLTablespace);
+    assertTrue((TablespaceManager.get(jdbcUrl + "&table=tb1")) instanceof PgSQLTablespace);
 
-    assertEquals(jdbcUrl, TablespaceManager.get(jdbcUrl).get().getUri().toASCIIString());
-    assertTrue(TablespaceManager.get(jdbcUrl).get().getMetadataProvider() instanceof PgSQLMetadataProvider);
+    assertEquals(jdbcUrl, TablespaceManager.get(jdbcUrl).getUri().toASCIIString());
+    assertTrue(TablespaceManager.get(jdbcUrl).getMetadataProvider() instanceof PgSQLMetadataProvider);
   }
 
   @Test(timeout = 1000, expected = TajoRuntimeException.class)
   public void testCreateTable() throws IOException, TajoException {
-    Tablespace space = TablespaceManager.getByName("pgsql_cluster").get();
+    Tablespace space = TablespaceManager.getByName("pgsql_cluster");
     space.createTable(null, false);
   }
 
   @Test(timeout = 1000, expected = TajoRuntimeException.class)
   public void testDropTable() throws IOException, TajoException {
-    Tablespace space = TablespaceManager.getByName("pgsql_cluster").get();
+    Tablespace space = TablespaceManager.getByName("pgsql_cluster");
     space.purgeTable(null);
   }
 
   @Test(timeout = 1000)
   public void testGetSplits() throws IOException, TajoException {
-    Tablespace space = TablespaceManager.getByName("pgsql_cluster").get();
+    Tablespace space = TablespaceManager.getByName("pgsql_cluster");
     MetadataProvider provider = space.getMetadataProvider();
     TableDesc table = provider.getTableDesc(null, "lineitem");
     List<Fragment> fragments = space.getSplits("lineitem", table, null);
@@ -111,8 +112,6 @@ public class TestPgSQLJdbcTableSpace {
 
   public static JSONObject getJsonTablespace(Map<String, String> connProperties)
       throws IOException {
-    String uri = PgSQLTestServer.getInstance().getJdbcUrl().split("\\?")[0];
-
     JSONObject configElements = new JSONObject();
     configElements.put(JdbcTablespace.CONFIG_KEY_MAPPED_DATABASE, PgSQLTestServer.DATABASE_NAME);
 
@@ -124,4 +123,15 @@ public class TestPgSQLJdbcTableSpace {
 
     return configElements;
   }
+
+  @Test
+  public void testTemporaryTablespace() {
+    Optional<Tablespace> ts = TablespaceManager.removeTablespaceForTest("pgsql_cluster");
+    assertTrue(ts.isPresent());
+
+    Tablespace tempTs = TablespaceManager.get(jdbcUrl);
+    assertNotNull(tempTs);
+
+    TablespaceManager.addTableSpaceForTest(ts.get());
+  }
 }

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLMetadataProvider.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLMetadataProvider.java b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLMetadataProvider.java
index 2221f94..2af4179 100644
--- a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLMetadataProvider.java
+++ b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLMetadataProvider.java
@@ -39,28 +39,28 @@ public class TestPgSQLMetadataProvider {
 
   @Test
   public void testGetTablespaceName() throws Exception {
-    Tablespace tablespace = TablespaceManager.get(jdbcUrl).get();
+    Tablespace tablespace = TablespaceManager.get(jdbcUrl);
     MetadataProvider provider = tablespace.getMetadataProvider();
     assertEquals("pgsql_cluster", provider.getTablespaceName());
   }
 
   @Test
   public void testGetDatabaseName() throws Exception {
-    Tablespace tablespace = TablespaceManager.get(jdbcUrl).get();
+    Tablespace tablespace = TablespaceManager.get(jdbcUrl);
     MetadataProvider provider = tablespace.getMetadataProvider();
     assertEquals("tpch", provider.getDatabaseName());
   }
 
   @Test
   public void testGetSchemas() throws Exception {
-    Tablespace tablespace = TablespaceManager.get(jdbcUrl).get();
+    Tablespace tablespace = TablespaceManager.get(jdbcUrl);
     MetadataProvider provider = tablespace.getMetadataProvider();
     assertTrue(provider.getSchemas().isEmpty());
   }
 
   @Test
   public void testGetTables() throws Exception {
-    Tablespace tablespace = TablespaceManager.get(jdbcUrl).get();
+    Tablespace tablespace = TablespaceManager.get(jdbcUrl);
     MetadataProvider provider = tablespace.getMetadataProvider();
 
     final Set<String> expected = Sets.newHashSet(PgSQLTestServer.TPCH_TABLES);
@@ -72,7 +72,7 @@ public class TestPgSQLMetadataProvider {
 
   @Test
   public void testGetTableDescriptor() throws Exception {
-    Tablespace tablespace = TablespaceManager.get(jdbcUrl).get();
+    Tablespace tablespace = TablespaceManager.get(jdbcUrl);
     MetadataProvider provider = tablespace.getMetadataProvider();
 
     for (String tableName : PgSQLTestServer.TPCH_TABLES) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/4a962885/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLQueryTests.java
----------------------------------------------------------------------
diff --git a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLQueryTests.java b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLQueryTests.java
index 9655968..5b52105 100644
--- a/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLQueryTests.java
+++ b/tajo-storage/tajo-storage-pgsql/src/test/java/org/apache/tajo/storage/pgsql/TestPgSQLQueryTests.java
@@ -26,7 +26,6 @@ import org.apache.tajo.storage.TablespaceManager;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;