This is an automated email from the ASF dual-hosted git repository.

alsuliman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c18f74fde [ASTERIXDB-3259][MTD] Handle 'database' in MetadataCache
0c18f74fde is described below

commit 0c18f74fde9503499aaa88939206b7c5a388f882
Author: Ali Alsuliman <[email protected]>
AuthorDate: Wed Sep 27 11:11:23 2023 -0700

    [ASTERIXDB-3259][MTD] Handle 'database' in MetadataCache
    
    - user model changes: no
    - storage format changes: no
    - interface changes: yes
    
    Details:
    
    - add getDatabase() in IMetadataNode/IMetadataManager
    - default the database for FunctionSignature
    
    Change-Id: I456c05d9f823a6524bad6ed75f618f5a95e969b0
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17814
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Murtadha Hubail <[email protected]>
---
 .../common/functions/FunctionSignature.java        |   5 +
 .../org/apache/asterix/metadata/MetadataCache.java | 464 +++++++++++++++------
 .../apache/asterix/metadata/MetadataManager.java   |  73 +++-
 .../org/apache/asterix/metadata/MetadataNode.java  |  17 +
 .../metadata/MetadataTransactionContext.java       | 118 +++---
 .../asterix/metadata/api/IMetadataManager.java     |   2 +
 .../apache/asterix/metadata/api/IMetadataNode.java |  40 +-
 7 files changed, 499 insertions(+), 220 deletions(-)

diff --git 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
index f3b1605554..7bb538fb3b 100644
--- 
a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
+++ 
b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/functions/FunctionSignature.java
@@ -23,6 +23,7 @@ import java.util.Objects;
 
 import org.apache.asterix.common.exceptions.AsterixException;
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.common.metadata.MetadataUtil;
 import 
org.apache.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
 import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 
@@ -92,6 +93,10 @@ public class FunctionSignature implements Serializable {
         return sb.toString();
     }
 
+    public String getDatabaseName() {
+        return MetadataUtil.databaseFor(dataverseName);
+    }
+
     public DataverseName getDataverseName() {
         return dataverseName;
     }
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
index a8d57ce0e0..f0547967d2 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataCache.java
@@ -58,36 +58,38 @@ public class MetadataCache {
 
     protected final Map<String, Database> databases = new HashMap<>();
     // Key is dataverse name.
-    protected final Map<DataverseName, Dataverse> dataverses = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Dataverse>> dataverses = 
new HashMap<>();
     // Key is dataverse name. Key of value map is dataset name.
-    protected final Map<DataverseName, Map<String, Dataset>> datasets = new 
HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Dataset>>> 
datasets = new HashMap<>();
     // Key is dataverse name. Key of value map is dataset name. Key of value 
map of value map is index name.
-    protected final Map<DataverseName, Map<String, Map<String, Index>>> 
indexes = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Map<String, 
Index>>>> indexes = new HashMap<>();
     // Key is dataverse name. Key of value map is datatype name.
-    protected final Map<DataverseName, Map<String, Datatype>> datatypes = new 
HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Datatype>>> 
datatypes = new HashMap<>();
     // Key is node group name.
     protected final Map<String, NodeGroup> nodeGroups = new HashMap<>();
     // Key is function Identifier . Key of value map is function name.
     protected final Map<FunctionSignature, Function> functions = new 
HashMap<>();
     // Key is adapter dataverse name. Key of value map is the adapter name
-    protected final Map<DataverseName, Map<String, DatasourceAdapter>> 
adapters = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
DatasourceAdapter>>> adapters = new HashMap<>();
 
     // Key is DataverseName, Key of the value map is the Policy name
-    protected final Map<DataverseName, Map<String, FeedPolicyEntity>> 
feedPolicies = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
FeedPolicyEntity>>> feedPolicies = new HashMap<>();
     // Key is library dataverse. Key of value map is the library name
-    protected final Map<DataverseName, Map<String, Library>> libraries = new 
HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Library>>> 
libraries = new HashMap<>();
     // Key is library dataverse. Key of value map is the feed name
-    protected final Map<DataverseName, Map<String, Feed>> feeds = new 
HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Feed>>> feeds = 
new HashMap<>();
     // Key is DataverseName, Key of the value map is the Policy name
-    protected final Map<DataverseName, Map<String, CompactionPolicy>> 
compactionPolicies = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
CompactionPolicy>>> compactionPolicies = new HashMap<>();
     // Key is DataverseName, Key of value map is feedConnectionId
-    protected final Map<DataverseName, Map<String, FeedConnection>> 
feedConnections = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
FeedConnection>>> feedConnections = new HashMap<>();
     // Key is synonym dataverse. Key of value map is the synonym name
-    protected final Map<DataverseName, Map<String, Synonym>> synonyms = new 
HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, Synonym>>> 
synonyms = new HashMap<>();
     // Key is DataverseName. Key of value map is the full-text filter name
-    protected final Map<DataverseName, Map<String, 
FullTextFilterMetadataEntity>> fullTextFilters = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
FullTextFilterMetadataEntity>>> fullTextFilters =
+            new HashMap<>();
     // Key is DataverseName. Key of value map is the full-text config name
-    protected final Map<DataverseName, Map<String, 
FullTextConfigMetadataEntity>> fullTextConfigs = new HashMap<>();
+    protected final Map<String, Map<DataverseName, Map<String, 
FullTextConfigMetadataEntity>>> fullTextConfigs =
+            new HashMap<>();
 
     // Atomically executes all metadata operations in ctx's log.
     public void commit(MetadataTransactionContext ctx) {
@@ -116,30 +118,33 @@ public class MetadataCache {
     }
 
     public void clear() {
-        synchronized (dataverses) {
-            synchronized (nodeGroups) {
-                synchronized (datasets) {
-                    synchronized (indexes) {
-                        synchronized (datatypes) {
-                            synchronized (functions) {
-                                synchronized (fullTextConfigs) {
-                                    synchronized (fullTextFilters) {
-                                        synchronized (adapters) {
-                                            synchronized (libraries) {
-                                                synchronized 
(compactionPolicies) {
-                                                    synchronized (synonyms) {
-                                                        dataverses.clear();
-                                                        nodeGroups.clear();
-                                                        datasets.clear();
-                                                        indexes.clear();
-                                                        datatypes.clear();
-                                                        functions.clear();
-                                                        
fullTextConfigs.clear();
-                                                        
fullTextFilters.clear();
-                                                        adapters.clear();
-                                                        libraries.clear();
-                                                        
compactionPolicies.clear();
-                                                        synonyms.clear();
+        synchronized (databases) {
+            synchronized (dataverses) {
+                synchronized (nodeGroups) {
+                    synchronized (datasets) {
+                        synchronized (indexes) {
+                            synchronized (datatypes) {
+                                synchronized (functions) {
+                                    synchronized (fullTextConfigs) {
+                                        synchronized (fullTextFilters) {
+                                            synchronized (adapters) {
+                                                synchronized (libraries) {
+                                                    synchronized 
(compactionPolicies) {
+                                                        synchronized 
(synonyms) {
+                                                            databases.clear();
+                                                            dataverses.clear();
+                                                            nodeGroups.clear();
+                                                            datasets.clear();
+                                                            indexes.clear();
+                                                            datatypes.clear();
+                                                            functions.clear();
+                                                            
fullTextConfigs.clear();
+                                                            
fullTextFilters.clear();
+                                                            adapters.clear();
+                                                            libraries.clear();
+                                                            
compactionPolicies.clear();
+                                                            synonyms.clear();
+                                                        }
                                                     }
                                                 }
                                             }
@@ -168,12 +173,25 @@ public class MetadataCache {
         synchronized (dataverses) {
             synchronized (datasets) {
                 synchronized (datatypes) {
+                    String databaseName = dataverse.getDatabaseName();
+                    Map<DataverseName, Dataverse> databaseDataverses =
+                            dataverses.computeIfAbsent(databaseName, k -> new 
HashMap<>());
                     DataverseName dataverseName = dataverse.getDataverseName();
-                    if (!dataverses.containsKey(dataverseName)) {
-                        datasets.put(dataverseName, new HashMap<>());
-                        datatypes.put(dataverseName, new HashMap<>());
-                        adapters.put(dataverseName, new HashMap<>());
-                        return dataverses.put(dataverseName, dataverse);
+                    if (!databaseDataverses.containsKey(dataverseName)) {
+                        //TODO(DB): why are we clearing 'datasets', 
'datatypes' and 'adapters'? should it be done for db
+                        Map<DataverseName, Map<String, Dataset>> 
dataverseDatasets =
+                                datasets.computeIfAbsent(databaseName, k -> 
new HashMap<>());
+                        dataverseDatasets.put(dataverseName, new HashMap<>());
+
+                        Map<DataverseName, Map<String, Datatype>> 
dataverseDatatypes =
+                                datatypes.computeIfAbsent(databaseName, k -> 
new HashMap<>());
+                        dataverseDatatypes.put(dataverseName, new HashMap<>());
+
+                        Map<DataverseName, Map<String, DatasourceAdapter>> 
dataverseAdapters =
+                                adapters.computeIfAbsent(databaseName, k -> 
new HashMap<>());
+                        dataverseAdapters.put(dataverseName, new HashMap<>());
+
+                        return databaseDataverses.put(dataverseName, 
dataverse);
                     }
                     return null;
                 }
@@ -191,13 +209,12 @@ public class MetadataCache {
                     addIndexIfNotExistsInternal(index);
                 }
 
-                Map<String, Dataset> m = 
datasets.get(dataset.getDataverseName());
-                if (m == null) {
-                    m = new HashMap<>();
-                    datasets.put(dataset.getDataverseName(), m);
-                }
-                if (!m.containsKey(dataset.getDatasetName())) {
-                    return m.put(dataset.getDatasetName(), dataset);
+                Map<DataverseName, Map<String, Dataset>> databaseDataverses =
+                        datasets.computeIfAbsent(dataset.getDatabaseName(), k 
-> new HashMap<>());
+                Map<String, Dataset> dataverseDatasets =
+                        
databaseDataverses.computeIfAbsent(dataset.getDataverseName(), k -> new 
HashMap<>());
+                if (!dataverseDatasets.containsKey(dataset.getDatasetName())) {
+                    return dataverseDatasets.put(dataset.getDatasetName(), 
dataset);
                 }
                 return null;
             }
@@ -212,13 +229,12 @@ public class MetadataCache {
 
     public Datatype addDatatypeIfNotExists(Datatype datatype) {
         synchronized (datatypes) {
-            Map<String, Datatype> m = 
datatypes.get(datatype.getDataverseName());
-            if (m == null) {
-                m = new HashMap<>();
-                datatypes.put(datatype.getDataverseName(), m);
-            }
-            if (!m.containsKey(datatype.getDatatypeName())) {
-                return m.put(datatype.getDatatypeName(), datatype);
+            Map<DataverseName, Map<String, Datatype>> databaseDataverses =
+                    datatypes.computeIfAbsent(datatype.getDatabaseName(), k -> 
new HashMap<>());
+            Map<String, Datatype> dataverseDatatypes =
+                    
databaseDataverses.computeIfAbsent(datatype.getDataverseName(), k -> new 
HashMap<>());
+            if (!dataverseDatatypes.containsKey(datatype.getDatatypeName())) {
+                return dataverseDatatypes.put(datatype.getDatatypeName(), 
datatype);
             }
             return null;
         }
@@ -232,15 +248,12 @@ public class MetadataCache {
 
     public CompactionPolicy addCompactionPolicyIfNotExists(CompactionPolicy 
compactionPolicy) {
         synchronized (compactionPolicies) {
-            Map<String, CompactionPolicy> p = 
compactionPolicies.get(compactionPolicy.getDataverseName());
-            if (p == null) {
-                p = new HashMap<>();
-                p.put(compactionPolicy.getPolicyName(), compactionPolicy);
-                compactionPolicies.put(compactionPolicy.getDataverseName(), p);
-            } else {
-                if (p.get(compactionPolicy.getPolicyName()) == null) {
-                    p.put(compactionPolicy.getPolicyName(), compactionPolicy);
-                }
+            Map<DataverseName, Map<String, CompactionPolicy>> 
databaseDataverses =
+                    
compactionPolicies.computeIfAbsent(compactionPolicy.getDatabaseName(), k -> new 
HashMap<>());
+            Map<String, CompactionPolicy> dataverseCompactionPolicies =
+                    
databaseDataverses.computeIfAbsent(compactionPolicy.getDataverseName(), k -> 
new HashMap<>());
+            if 
(!dataverseCompactionPolicies.containsKey(compactionPolicy.getPolicyName())) {
+                return 
dataverseCompactionPolicies.put(compactionPolicy.getPolicyName(), 
compactionPolicy);
             }
             return null;
         }
@@ -248,7 +261,12 @@ public class MetadataCache {
 
     public CompactionPolicy dropCompactionPolicy(CompactionPolicy 
compactionPolicy) {
         synchronized (compactionPolicies) {
-            Map<String, CompactionPolicy> p = 
compactionPolicies.get(compactionPolicy.getDataverseName());
+            Map<DataverseName, Map<String, CompactionPolicy>> 
databaseDataverses =
+                    compactionPolicies.get(compactionPolicy.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, CompactionPolicy> p = 
databaseDataverses.get(compactionPolicy.getDataverseName());
             if (p != null && p.get(compactionPolicy.getPolicyName()) != null) {
                 return p.remove(compactionPolicy.getPolicyName());
             }
@@ -270,7 +288,31 @@ public class MetadataCache {
                                                 synchronized (feeds) {
                                                     synchronized 
(compactionPolicies) {
                                                         synchronized 
(synonyms) {
-                                                            return 
databases.remove(database.getDatabaseName());
+                                                            String 
databaseName = database.getDatabaseName();
+                                                            
synonyms.remove(databaseName);
+                                                            
compactionPolicies.remove(databaseName);
+                                                            //TODO(DB): how 
about feedConnections, feedPolicies?
+                                                            
feeds.remove(databaseName);
+                                                            
libraries.remove(databaseName);
+                                                            
adapters.remove(databaseName);
+                                                            
fullTextFilters.remove(databaseName);
+                                                            
fullTextConfigs.remove(databaseName);
+                                                            
datatypes.remove(databaseName);
+                                                            
indexes.remove(databaseName);
+                                                            
datasets.remove(databaseName);
+                                                            
dataverses.remove(databaseName);
+
+                                                            
List<FunctionSignature> markedFunctionsForRemoval =
+                                                                    new 
ArrayList<>();
+                                                            for 
(FunctionSignature signature : functions.keySet()) {
+                                                                if 
(signature.getDatabaseName().equals(databaseName)) {
+                                                                    
markedFunctionsForRemoval.add(signature);
+                                                                }
+                                                            }
+                                                            for 
(FunctionSignature signature : markedFunctionsForRemoval) {
+                                                                
functions.remove(signature);
+                                                            }
+                                                            return 
databases.remove(databaseName);
                                                         }
                                                     }
                                                 }
@@ -299,28 +341,74 @@ public class MetadataCache {
                                             synchronized (feeds) {
                                                 synchronized 
(compactionPolicies) {
                                                     synchronized (synonyms) {
-                                                        
datasets.remove(dataverse.getDataverseName());
-                                                        
indexes.remove(dataverse.getDataverseName());
-                                                        
datatypes.remove(dataverse.getDataverseName());
-                                                        
adapters.remove(dataverse.getDataverseName());
-                                                        
compactionPolicies.remove(dataverse.getDataverseName());
+                                                        String databaseName = 
dataverse.getDatabaseName();
+                                                        DataverseName 
dataverseName = dataverse.getDataverseName();
+                                                        Map<DataverseName, 
Map<String, Dataset>> ds =
+                                                                
datasets.get(databaseName);
+                                                        if (ds != null) {
+                                                            
ds.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, Map<String, Index>>> idx =
+                                                                
indexes.get(databaseName);
+                                                        if (idx != null) {
+                                                            
idx.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, Datatype>> dt =
+                                                                
datatypes.get(databaseName);
+                                                        if (dt != null) {
+                                                            
dt.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, DatasourceAdapter>> ad =
+                                                                
adapters.get(databaseName);
+                                                        if (ad != null) {
+                                                            
ad.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, CompactionPolicy>> cp =
+                                                                
compactionPolicies.get(databaseName);
+                                                        if (cp != null) {
+                                                            
cp.remove(dataverseName);
+                                                        }
+
                                                         
List<FunctionSignature> markedFunctionsForRemoval =
                                                                 new 
ArrayList<>();
                                                         for (FunctionSignature 
signature : functions.keySet()) {
-                                                            if 
(signature.getDataverseName()
-                                                                    
.equals(dataverse.getDataverseName())) {
+                                                            if 
(signature.getDatabaseName().equals(databaseName)
+                                                                    && 
signature.getDataverseName()
+                                                                            
.equals(dataverseName)) {
                                                                 
markedFunctionsForRemoval.add(signature);
                                                             }
                                                         }
                                                         for (FunctionSignature 
signature : markedFunctionsForRemoval) {
                                                             
functions.remove(signature);
                                                         }
-                                                        
fullTextConfigs.remove(dataverse.getDataverseName());
-                                                        
fullTextFilters.remove(dataverse.getDataverseName());
-                                                        
libraries.remove(dataverse.getDataverseName());
-                                                        
feeds.remove(dataverse.getDataverseName());
-                                                        
synonyms.remove(dataverse.getDataverseName());
-                                                        return 
dataverses.remove(dataverse.getDataverseName());
+                                                        Map<DataverseName, 
Map<String, FullTextConfigMetadataEntity>> ftc =
+                                                                
fullTextConfigs.get(databaseName);
+                                                        if (ftc != null) {
+                                                            
ftc.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, FullTextFilterMetadataEntity>> ftf =
+                                                                
fullTextFilters.get(databaseName);
+                                                        if (ftf != null) {
+                                                            
ftf.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, Library>> lib =
+                                                                
libraries.get(databaseName);
+                                                        if (lib != null) {
+                                                            
lib.remove(dataverseName);
+                                                        }
+                                                        //TODO(DB): how about 
feedConnections, feedPolicies?
+                                                        Map<DataverseName, 
Map<String, Feed>> fd =
+                                                                
feeds.get(databaseName);
+                                                        if (fd != null) {
+                                                            
fd.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Map<String, Synonym>> syn =
+                                                                
synonyms.get(databaseName);
+                                                        if (syn != null) {
+                                                            
syn.remove(dataverseName);
+                                                        }
+                                                        Map<DataverseName, 
Dataverse> dv = dataverses.get(databaseName);
+                                                        return dv == null ? 
null : dv.remove(dataverseName);
                                                     }
                                                 }
                                             }
@@ -340,13 +428,20 @@ public class MetadataCache {
             synchronized (indexes) {
 
                 //remove the indexes of the dataset from indexes' cache
-                Map<String, Map<String, Index>> datasetMap = 
indexes.get(dataset.getDataverseName());
-                if (datasetMap != null) {
-                    datasetMap.remove(dataset.getDatasetName());
+                Map<DataverseName, Map<String, Map<String, Index>>> idxDb = 
indexes.get(dataset.getDatabaseName());
+                if (idxDb != null) {
+                    Map<String, Map<String, Index>> datasetMap = 
idxDb.get(dataset.getDataverseName());
+                    if (datasetMap != null) {
+                        datasetMap.remove(dataset.getDatasetName());
+                    }
                 }
 
                 //remove the dataset from datasets' cache
-                Map<String, Dataset> m = 
datasets.get(dataset.getDataverseName());
+                Map<DataverseName, Map<String, Dataset>> dsDb = 
datasets.get(dataset.getDatabaseName());
+                if (dsDb == null) {
+                    return null;
+                }
+                Map<String, Dataset> m = dsDb.get(dataset.getDataverseName());
                 if (m == null) {
                     return null;
                 }
@@ -357,7 +452,12 @@ public class MetadataCache {
 
     public Index dropIndex(Index index) {
         synchronized (indexes) {
-            Map<String, Map<String, Index>> datasetMap = 
indexes.get(index.getDataverseName());
+            Map<DataverseName, Map<String, Map<String, Index>>> 
databaseDataverses =
+                    indexes.get(index.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, Map<String, Index>> datasetMap = 
databaseDataverses.get(index.getDataverseName());
             if (datasetMap == null) {
                 return null;
             }
@@ -372,7 +472,11 @@ public class MetadataCache {
 
     public Datatype dropDatatype(Datatype datatype) {
         synchronized (datatypes) {
-            Map<String, Datatype> m = 
datatypes.get(datatype.getDataverseName());
+            Map<DataverseName, Map<String, Datatype>> databaseDataverses = 
datatypes.get(datatype.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, Datatype> m = 
databaseDataverses.get(datatype.getDataverseName());
             if (m == null) {
                 return null;
             }
@@ -386,25 +490,37 @@ public class MetadataCache {
         }
     }
 
-    public Dataverse getDataverse(DataverseName dataverseName) {
+    public Database getDatabase(String databaseName) {
+        synchronized (databases) {
+            return databases.get(databaseName);
+        }
+    }
+
+    public Dataverse getDataverse(String databaseName, DataverseName 
dataverseName) {
         synchronized (dataverses) {
-            return dataverses.get(dataverseName);
+            Map<DataverseName, Dataverse> db = dataverses.get(databaseName);
+            return db == null ? null : db.get(dataverseName);
         }
     }
 
-    public Dataset getDataset(DataverseName dataverseName, String datasetName) 
{
+    public Dataset getDataset(String databaseName, DataverseName 
dataverseName, String datasetName) {
         synchronized (datasets) {
-            Map<String, Dataset> m = datasets.get(dataverseName);
-            if (m == null) {
+            Map<DataverseName, Map<String, Dataset>> db = 
datasets.get(databaseName);
+            if (db == null) {
                 return null;
             }
-            return m.get(datasetName);
+            Map<String, Dataset> dv = db.get(dataverseName);
+            return dv == null ? null : dv.get(datasetName);
         }
     }
 
-    public Index getIndex(DataverseName dataverseName, String datasetName, 
String indexName) {
+    public Index getIndex(String databaseName, DataverseName dataverseName, 
String datasetName, String indexName) {
         synchronized (indexes) {
-            Map<String, Map<String, Index>> datasetMap = 
indexes.get(dataverseName);
+            Map<DataverseName, Map<String, Map<String, Index>>> db = 
indexes.get(databaseName);
+            if (db == null) {
+                return null;
+            }
+            Map<String, Map<String, Index>> datasetMap = db.get(dataverseName);
             if (datasetMap == null) {
                 return null;
             }
@@ -416,9 +532,13 @@ public class MetadataCache {
         }
     }
 
-    public Datatype getDatatype(DataverseName dataverseName, String 
datatypeName) {
+    public Datatype getDatatype(String databaseName, DataverseName 
dataverseName, String datatypeName) {
         synchronized (datatypes) {
-            Map<String, Datatype> m = datatypes.get(dataverseName);
+            Map<DataverseName, Map<String, Datatype>> db = 
datatypes.get(databaseName);
+            if (db == null) {
+                return null;
+            }
+            Map<String, Datatype> m = db.get(dataverseName);
             if (m == null) {
                 return null;
             }
@@ -438,9 +558,14 @@ public class MetadataCache {
         }
     }
 
-    public FullTextConfigMetadataEntity getFullTextConfig(DataverseName 
dataverseName, String configName) {
+    public FullTextConfigMetadataEntity getFullTextConfig(String databaseName, 
DataverseName dataverseName,
+            String configName) {
         synchronized (fullTextConfigs) {
-            Map<String, FullTextConfigMetadataEntity> m = 
fullTextConfigs.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextConfigMetadataEntity>> db = 
fullTextConfigs.get(databaseName);
+            if (db == null) {
+                return null;
+            }
+            Map<String, FullTextConfigMetadataEntity> m = 
db.get(dataverseName);
             if (m == null) {
                 return null;
             }
@@ -448,9 +573,14 @@ public class MetadataCache {
         }
     }
 
-    public FullTextFilterMetadataEntity getFullTextFilter(DataverseName 
dataverseName, String filterName) {
+    public FullTextFilterMetadataEntity getFullTextFilter(String databaseName, 
DataverseName dataverseName,
+            String filterName) {
         synchronized (fullTextFilters) {
-            Map<String, FullTextFilterMetadataEntity> m = 
fullTextFilters.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextFilterMetadataEntity>> db = 
fullTextFilters.get(databaseName);
+            if (db == null) {
+                return null;
+            }
+            Map<String, FullTextFilterMetadataEntity> m = 
db.get(dataverseName);
             if (m == null) {
                 return null;
             }
@@ -458,9 +588,13 @@ public class MetadataCache {
         }
     }
 
-    public List<Dataset> getDataverseDatasets(DataverseName dataverseName) {
+    public List<Dataset> getDataverseDatasets(String databaseName, 
DataverseName dataverseName) {
         synchronized (datasets) {
-            Map<String, Dataset> m = datasets.get(dataverseName);
+            Map<DataverseName, Map<String, Dataset>> db = 
datasets.get(databaseName);
+            if (db == null) {
+                return Collections.emptyList();
+            }
+            Map<String, Dataset> m = db.get(dataverseName);
             if (m == null) {
                 return Collections.emptyList();
             }
@@ -468,9 +602,17 @@ public class MetadataCache {
         }
     }
 
-    public List<Index> getDatasetIndexes(DataverseName dataverseName, String 
datasetName) {
-        synchronized (datasets) {
-            Map<String, Index> map = 
indexes.get(dataverseName).get(datasetName);
+    public List<Index> getDatasetIndexes(String databaseName, DataverseName 
dataverseName, String datasetName) {
+        synchronized (indexes) {
+            Map<DataverseName, Map<String, Map<String, Index>>> db = 
indexes.get(databaseName);
+            if (db == null) {
+                return Collections.emptyList();
+            }
+            Map<String, Map<String, Index>> dv = db.get(dataverseName);
+            if (dv == null) {
+                return Collections.emptyList();
+            }
+            Map<String, Index> map = dv.get(datasetName);
             if (map == null) {
                 return Collections.emptyList();
             }
@@ -519,13 +661,16 @@ public class MetadataCache {
     }
 
     public FullTextFilterMetadataEntity 
addFullTextFilterIfNotExists(FullTextFilterMetadataEntity filter) {
+        String databaseName = filter.getFullTextFilter().getDatabaseName();
         DataverseName dataverseName = 
filter.getFullTextFilter().getDataverseName();
         String filterName = filter.getFullTextFilter().getName();
         synchronized (fullTextFilters) {
-            Map<String, FullTextFilterMetadataEntity> m = 
fullTextFilters.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextFilterMetadataEntity>> 
databaseDataverses =
+                    fullTextFilters.computeIfAbsent(databaseName, k -> new 
HashMap<>());
+            Map<String, FullTextFilterMetadataEntity> m = 
databaseDataverses.get(dataverseName);
             if (m == null) {
                 m = new HashMap<>();
-                fullTextFilters.put(dataverseName, m);
+                databaseDataverses.put(dataverseName, m);
             }
             if (!m.containsKey(filterName)) {
                 return m.put(filterName, filter);
@@ -538,7 +683,12 @@ public class MetadataCache {
         DataverseName dataverseName = 
filterMetadataEntity.getFullTextFilter().getDataverseName();
         String filterName = filterMetadataEntity.getFullTextFilter().getName();
         synchronized (fullTextFilters) {
-            Map<String, FullTextFilterMetadataEntity> m = 
fullTextFilters.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextFilterMetadataEntity>> 
databaseDataverses =
+                    
fullTextFilters.get(filterMetadataEntity.getFullTextFilter().getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, FullTextFilterMetadataEntity> m = 
databaseDataverses.get(dataverseName);
             if (m == null) {
                 return null;
             }
@@ -549,13 +699,16 @@ public class MetadataCache {
     public FullTextConfigMetadataEntity addFullTextConfigIfNotExists(
             FullTextConfigMetadataEntity configMetadataEntity) {
         FullTextConfigDescriptor config = 
configMetadataEntity.getFullTextConfig();
+        String databaseName = config.getDatabaseName();
         DataverseName dataverseName = config.getDataverseName();
         String configName = config.getName();
         synchronized (fullTextConfigs) {
-            Map<String, FullTextConfigMetadataEntity> m = 
fullTextConfigs.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextConfigMetadataEntity>> 
databaseDataverses =
+                    fullTextConfigs.computeIfAbsent(databaseName, k -> new 
HashMap<>());
+            Map<String, FullTextConfigMetadataEntity> m = 
databaseDataverses.get(dataverseName);
             if (m == null) {
                 m = new HashMap<>();
-                fullTextConfigs.put(dataverseName, m);
+                databaseDataverses.put(dataverseName, m);
             }
             if (!m.containsKey(configName)) {
                 return m.put(configName, configMetadataEntity);
@@ -569,7 +722,12 @@ public class MetadataCache {
         DataverseName dataverseName = config.getDataverseName();
         String configName = config.getName();
         synchronized (fullTextConfigs) {
-            Map<String, FullTextConfigMetadataEntity> m = 
fullTextConfigs.get(dataverseName);
+            Map<DataverseName, Map<String, FullTextConfigMetadataEntity>> 
databaseDataverses =
+                    fullTextConfigs.get(config.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, FullTextConfigMetadataEntity> m = 
databaseDataverses.get(dataverseName);
             if (m == null) {
                 return null;
             }
@@ -579,11 +737,13 @@ public class MetadataCache {
 
     public Object addFeedPolicyIfNotExists(FeedPolicyEntity feedPolicy) {
         synchronized (feedPolicies) {
-            Map<String, FeedPolicyEntity> p = 
feedPolicies.get(feedPolicy.getDataverseName());
+            Map<DataverseName, Map<String, FeedPolicyEntity>> 
databaseDataverses =
+                    feedPolicies.computeIfAbsent(feedPolicy.getDatabaseName(), 
k -> new HashMap<>());
+            Map<String, FeedPolicyEntity> p = 
databaseDataverses.get(feedPolicy.getDataverseName());
             if (p == null) {
                 p = new HashMap<>();
                 p.put(feedPolicy.getPolicyName(), feedPolicy);
-                feedPolicies.put(feedPolicy.getDataverseName(), p);
+                databaseDataverses.put(feedPolicy.getDataverseName(), p);
             } else {
                 if (p.get(feedPolicy.getPolicyName()) == null) {
                     p.put(feedPolicy.getPolicyName(), feedPolicy);
@@ -595,7 +755,12 @@ public class MetadataCache {
 
     public Object dropFeedPolicy(FeedPolicyEntity feedPolicy) {
         synchronized (feedPolicies) {
-            Map<String, FeedPolicyEntity> p = 
feedPolicies.get(feedPolicy.getDataverseName());
+            Map<DataverseName, Map<String, FeedPolicyEntity>> 
databaseDataverses =
+                    feedPolicies.get(feedPolicy.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, FeedPolicyEntity> p = 
databaseDataverses.get(feedPolicy.getDataverseName());
             if (p != null && p.get(feedPolicy.getPolicyName()) != null) {
                 return p.remove(feedPolicy.getPolicyName()).getPolicyName();
             }
@@ -605,11 +770,13 @@ public class MetadataCache {
 
     public DatasourceAdapter addAdapterIfNotExists(DatasourceAdapter adapter) {
         synchronized (adapters) {
+            Map<DataverseName, Map<String, DatasourceAdapter>> 
databaseDataverses =
+                    
adapters.computeIfAbsent(adapter.getAdapterIdentifier().getDatabaseName(), k -> 
new HashMap<>());
             Map<String, DatasourceAdapter> adaptersInDataverse =
-                    
adapters.get(adapter.getAdapterIdentifier().getDataverseName());
+                    
databaseDataverses.get(adapter.getAdapterIdentifier().getDataverseName());
             if (adaptersInDataverse == null) {
                 adaptersInDataverse = new HashMap<>();
-                
adapters.put(adapter.getAdapterIdentifier().getDataverseName(), 
adaptersInDataverse);
+                
databaseDataverses.put(adapter.getAdapterIdentifier().getDataverseName(), 
adaptersInDataverse);
             }
             DatasourceAdapter adapterObject = 
adaptersInDataverse.get(adapter.getAdapterIdentifier().getName());
             if (adapterObject == null) {
@@ -621,8 +788,13 @@ public class MetadataCache {
 
     public DatasourceAdapter dropAdapterIfExists(DatasourceAdapter adapter) {
         synchronized (adapters) {
+            Map<DataverseName, Map<String, DatasourceAdapter>> 
databaseDataverses =
+                    
adapters.get(adapter.getAdapterIdentifier().getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
             Map<String, DatasourceAdapter> adaptersInDataverse =
-                    
adapters.get(adapter.getAdapterIdentifier().getDataverseName());
+                    
databaseDataverses.get(adapter.getAdapterIdentifier().getDataverseName());
             if (adaptersInDataverse != null) {
                 return 
adaptersInDataverse.remove(adapter.getAdapterIdentifier().getName());
             }
@@ -632,12 +804,14 @@ public class MetadataCache {
 
     public Library addLibraryIfNotExists(Library library) {
         synchronized (libraries) {
-            Map<String, Library> libsInDataverse = 
libraries.get(library.getDataverseName());
+            Map<DataverseName, Map<String, Library>> databaseDataverses =
+                    libraries.computeIfAbsent(library.getDatabaseName(), k -> 
new HashMap<>());
+            Map<String, Library> libsInDataverse = 
databaseDataverses.get(library.getDataverseName());
             boolean needToAdd = (libsInDataverse == null || 
libsInDataverse.get(library.getName()) != null);
             if (needToAdd) {
                 if (libsInDataverse == null) {
                     libsInDataverse = new HashMap<>();
-                    libraries.put(library.getDataverseName(), libsInDataverse);
+                    databaseDataverses.put(library.getDataverseName(), 
libsInDataverse);
                 }
                 return libsInDataverse.put(library.getName(), library);
             }
@@ -647,7 +821,11 @@ public class MetadataCache {
 
     public Library dropLibrary(Library library) {
         synchronized (libraries) {
-            Map<String, Library> librariesInDataverse = 
libraries.get(library.getDataverseName());
+            Map<DataverseName, Map<String, Library>> databaseDataverses = 
libraries.get(library.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, Library> librariesInDataverse = 
databaseDataverses.get(library.getDataverseName());
             if (librariesInDataverse != null) {
                 return librariesInDataverse.remove(library.getName());
             }
@@ -657,10 +835,13 @@ public class MetadataCache {
 
     public FeedConnection addFeedConnectionIfNotExists(FeedConnection 
feedConnection) {
         synchronized (feedConnections) {
-            Map<String, FeedConnection> feedConnsInDataverse = 
feedConnections.get(feedConnection.getDataverseName());
+            Map<DataverseName, Map<String, FeedConnection>> databaseDataverses 
=
+                    
feedConnections.computeIfAbsent(feedConnection.getDatabaseName(), k -> new 
HashMap<>());
+            Map<String, FeedConnection> feedConnsInDataverse =
+                    databaseDataverses.get(feedConnection.getDataverseName());
             if (feedConnsInDataverse == null) {
                 feedConnsInDataverse = new HashMap<>();
-                feedConnections.put(feedConnection.getDataverseName(), 
feedConnsInDataverse);
+                databaseDataverses.put(feedConnection.getDataverseName(), 
feedConnsInDataverse);
             }
             return feedConnsInDataverse.put(feedConnection.getConnectionId(), 
feedConnection);
         }
@@ -668,7 +849,13 @@ public class MetadataCache {
 
     public FeedConnection dropFeedConnection(FeedConnection feedConnection) {
         synchronized (feedConnections) {
-            Map<String, FeedConnection> feedConnsInDataverse = 
feedConnections.get(feedConnection.getDataverseName());
+            Map<DataverseName, Map<String, FeedConnection>> databaseDataverses 
=
+                    feedConnections.get(feedConnection.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, FeedConnection> feedConnsInDataverse =
+                    databaseDataverses.get(feedConnection.getDataverseName());
             if (feedConnsInDataverse != null) {
                 return 
feedConnsInDataverse.remove(feedConnection.getConnectionId());
             } else {
@@ -679,10 +866,12 @@ public class MetadataCache {
 
     public Feed addFeedIfNotExists(Feed feed) {
         synchronized (feeds) {
-            Map<String, Feed> feedsInDataverse = 
feeds.get(feed.getDataverseName());
+            Map<DataverseName, Map<String, Feed>> databaseDataverses =
+                    feeds.computeIfAbsent(feed.getDatabaseName(), k -> new 
HashMap<>());
+            Map<String, Feed> feedsInDataverse = 
databaseDataverses.get(feed.getDataverseName());
             if (feedsInDataverse == null) {
                 feedsInDataverse = new HashMap<>();
-                feeds.put(feed.getDataverseName(), feedsInDataverse);
+                databaseDataverses.put(feed.getDataverseName(), 
feedsInDataverse);
             }
             return feedsInDataverse.put(feed.getFeedName(), feed);
         }
@@ -690,7 +879,11 @@ public class MetadataCache {
 
     public Feed dropFeedIfExists(Feed feed) {
         synchronized (feeds) {
-            Map<String, Feed> feedsInDataverse = 
feeds.get(feed.getDataverseName());
+            Map<DataverseName, Map<String, Feed>> databaseDataverses = 
feeds.get(feed.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, Feed> feedsInDataverse = 
databaseDataverses.get(feed.getDataverseName());
             if (feedsInDataverse != null) {
                 return feedsInDataverse.remove(feed.getFeedName());
             }
@@ -700,18 +893,25 @@ public class MetadataCache {
 
     public Synonym addSynonymIfNotExists(Synonym synonym) {
         synchronized (synonyms) {
-            Map<String, Synonym> synonymsInDataverse = 
synonyms.get(synonym.getDataverseName());
+            Map<DataverseName, Map<String, Synonym>> databaseDataverses =
+                    synonyms.computeIfAbsent(synonym.getDatabaseName(), k -> 
new HashMap<>());
+            Map<String, Synonym> synonymsInDataverse = 
databaseDataverses.get(synonym.getDataverseName());
             if (synonymsInDataverse == null) {
                 synonymsInDataverse = new HashMap<>();
-                synonyms.put(synonym.getDataverseName(), synonymsInDataverse);
+                databaseDataverses.put(synonym.getDataverseName(), 
synonymsInDataverse);
             }
+            //TODO(DB): this actually overwrites if existing
             return synonymsInDataverse.put(synonym.getSynonymName(), synonym);
         }
     }
 
     public Synonym dropSynonym(Synonym synonym) {
         synchronized (synonyms) {
-            Map<String, Synonym> synonymsInDataverse = 
synonyms.get(synonym.getDataverseName());
+            Map<DataverseName, Map<String, Synonym>> databaseDataverses = 
synonyms.get(synonym.getDatabaseName());
+            if (databaseDataverses == null) {
+                return null;
+            }
+            Map<String, Synonym> synonymsInDataverse = 
databaseDataverses.get(synonym.getDataverseName());
             if (synonymsInDataverse != null) {
                 return synonymsInDataverse.remove(synonym.getSynonymName());
             }
@@ -720,10 +920,12 @@ public class MetadataCache {
     }
 
     private Index addIndexIfNotExistsInternal(Index index) {
-        Map<String, Map<String, Index>> datasetMap = 
indexes.get(index.getDataverseName());
+        Map<DataverseName, Map<String, Map<String, Index>>> databaseDataverses 
=
+                indexes.computeIfAbsent(index.getDatabaseName(), k -> new 
HashMap<>());
+        Map<String, Map<String, Index>> datasetMap = 
databaseDataverses.get(index.getDataverseName());
         if (datasetMap == null) {
             datasetMap = new HashMap<>();
-            indexes.put(index.getDataverseName(), datasetMap);
+            databaseDataverses.put(index.getDataverseName(), datasetMap);
         }
         Map<String, Index> indexMap = datasetMap.get(index.getDatasetName());
         if (indexMap == null) {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
index f2d9883ef1..040b48945f 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataManager.java
@@ -170,6 +170,37 @@ public abstract class MetadataManager implements 
IMetadataManager {
         }
     }
 
+    @Override
+    public Database getDatabase(MetadataTransactionContext ctx, String 
databaseName) throws AlgebricksException {
+        Objects.requireNonNull(databaseName);
+        // first look in the context to see if this transaction created the
+        // requested database itself (but the database is still uncommitted)
+        Database database = ctx.getDatabase(databaseName);
+        if (database != null) {
+            // don't add this database to the cache, since it is still 
uncommitted
+            return database;
+        }
+        if (ctx.databaseIsDropped(databaseName)) {
+            // database has been dropped by this transaction but could still 
be in the cache
+            return null;
+        }
+        database = cache.getDatabase(databaseName);
+        if (database != null) {
+            // database is already in the cache, don't add it again
+            return database;
+        }
+        try {
+            database = metadataNode.getDatabase(ctx.getTxnId(), databaseName);
+        } catch (RemoteException e) {
+            throw new 
MetadataException(ErrorCode.REMOTE_EXCEPTION_WHEN_CALLING_METADATA_NODE, e);
+        }
+        // we fetched the database from the MetadataNode. add it to the cache 
when this transaction commits
+        if (database != null) {
+            ctx.addDatabase(database);
+        }
+        return database;
+    }
+
     @Override
     public void addDatabase(MetadataTransactionContext ctx, Database database) 
throws AlgebricksException {
         try {
@@ -240,18 +271,18 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested dataverse itself (but the dataverse is still uncommitted).
-        Dataverse dataverse = ctx.getDataverse(dataverseName);
+        Dataverse dataverse = ctx.getDataverse(database, dataverseName);
         if (dataverse != null) {
             // Don't add this dataverse to the cache, since it is still
             // uncommitted.
             return dataverse;
         }
-        if (ctx.dataverseIsDropped(dataverseName)) {
+        if (ctx.dataverseIsDropped(database, dataverseName)) {
             // Dataverse has been dropped by this transaction but could still 
be
             // in the cache.
             return null;
         }
-        dataverse = cache.getDataverse(dataverseName);
+        dataverse = cache.getDataverse(database, dataverseName);
         if (dataverse != null) {
             // Dataverse is already in the cache, don't add it again.
             return dataverse;
@@ -316,19 +347,19 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested dataset itself (but the dataset is still uncommitted).
-        Dataset dataset = ctx.getDataset(dataverseName, datasetName);
+        Dataset dataset = ctx.getDataset(database, dataverseName, datasetName);
         if (dataset != null) {
             // Don't add this dataverse to the cache, since it is still
             // uncommitted.
             return dataset;
         }
-        if (ctx.datasetIsDropped(dataverseName, datasetName)) {
+        if (ctx.datasetIsDropped(database, dataverseName, datasetName)) {
             // Dataset has been dropped by this transaction but could still be
             // in the cache.
             return null;
         }
 
-        dataset = cache.getDataset(dataverseName, datasetName);
+        dataset = cache.getDataset(database, dataverseName, datasetName);
         if (dataset != null) {
             // Dataset is already in the cache, don't add it again.
             return dataset;
@@ -420,19 +451,19 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested datatype itself (but the datatype is still uncommitted).
-        Datatype datatype = ctx.getDatatype(dataverseName, datatypeName);
+        Datatype datatype = ctx.getDatatype(database, dataverseName, 
datatypeName);
         if (datatype != null) {
             // Don't add this dataverse to the cache, since it is still
             // uncommitted.
             return datatype;
         }
-        if (ctx.datatypeIsDropped(dataverseName, datatypeName)) {
+        if (ctx.datatypeIsDropped(database, dataverseName, datatypeName)) {
             // Datatype has been dropped by this transaction but could still be
             // in the cache.
             return null;
         }
 
-        datatype = cache.getDatatype(dataverseName, datatypeName);
+        datatype = cache.getDatatype(database, dataverseName, datatypeName);
         if (datatype != null) {
             // Datatype is already in the cache, don't add it again.
             return datatype;
@@ -488,20 +519,20 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested index itself (but the index is still uncommitted).
-        Index index = ctx.getIndex(dataverseName, datasetName, indexName);
+        Index index = ctx.getIndex(database, dataverseName, datasetName, 
indexName);
         if (index != null) {
             // Don't add this index to the cache, since it is still
             // uncommitted.
             return index;
         }
 
-        if (ctx.indexIsDropped(dataverseName, datasetName, indexName)) {
+        if (ctx.indexIsDropped(database, dataverseName, datasetName, 
indexName)) {
             // Index has been dropped by this transaction but could still be
             // in the cache.
             return null;
         }
 
-        index = cache.getIndex(dataverseName, datasetName, indexName);
+        index = cache.getIndex(database, dataverseName, datasetName, 
indexName);
         if (index != null) {
             // Index is already in the cache, don't add it again.
             return index;
@@ -632,7 +663,7 @@ public abstract class MetadataManager implements 
IMetadataManager {
             // in the cache.
             return null;
         }
-        if (ctx.getDataverse(functionSignature.getDataverseName()) != null) {
+        if (ctx.getDataverse(functionSignature.getDatabaseName(), 
functionSignature.getDataverseName()) != null) {
             // This transaction has dropped and subsequently created the same
             // dataverse.
             return null;
@@ -695,26 +726,26 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested full-text filter itself (but the full-text filter is 
still uncommitted).
-        FullTextFilterMetadataEntity filter = 
ctx.getFullTextFilter(dataverseName, filterName);
+        FullTextFilterMetadataEntity filter = ctx.getFullTextFilter(database, 
dataverseName, filterName);
         if (filter != null) {
             // Don't add this filter to the cache, since it is still
             // uncommitted.
             return filter;
         }
 
-        if (ctx.fullTextFilterIsDropped(dataverseName, filterName)) {
+        if (ctx.fullTextFilterIsDropped(database, dataverseName, filterName)) {
             // Filter has been dropped by this transaction but could still be
             // in the cache.
             return null;
         }
 
-        if (ctx.getDataverse(dataverseName) != null) {
+        if (ctx.getDataverse(database, dataverseName) != null) {
             // This transaction has dropped and subsequently created the same
             // dataverse.
             return null;
         }
 
-        filter = cache.getFullTextFilter(dataverseName, filterName);
+        filter = cache.getFullTextFilter(database, dataverseName, filterName);
         if (filter != null) {
             // filter is already in the cache, don't add it again.
             return filter;
@@ -754,26 +785,26 @@ public abstract class MetadataManager implements 
IMetadataManager {
         Objects.requireNonNull(database);
         // First look in the context to see if this transaction created the
         // requested full-text config itself (but the full-text config is 
still uncommitted).
-        FullTextConfigMetadataEntity configMetadataEntity = 
ctx.getFullTextConfig(dataverseName, configName);
+        FullTextConfigMetadataEntity configMetadataEntity = 
ctx.getFullTextConfig(database, dataverseName, configName);
         if (configMetadataEntity != null) {
             // Don't add this config to the cache, since it is still
             // uncommitted.
             return configMetadataEntity;
         }
 
-        if (ctx.fullTextConfigIsDropped(dataverseName, configName)) {
+        if (ctx.fullTextConfigIsDropped(database, dataverseName, configName)) {
             // config has been dropped by this transaction but could still be
             // in the cache.
             return null;
         }
 
-        if (ctx.getDataverse(dataverseName) != null) {
+        if (ctx.getDataverse(database, dataverseName) != null) {
             // This transaction has dropped and subsequently created the same
             // dataverse.
             return null;
         }
 
-        configMetadataEntity = cache.getFullTextConfig(dataverseName, 
configName);
+        configMetadataEntity = cache.getFullTextConfig(database, 
dataverseName, configName);
         if (configMetadataEntity != null) {
             // config is already in the cache, don't add it again.
             return configMetadataEntity;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
index 7d7289de35..e7d3a2fbd6 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataNode.java
@@ -1011,6 +1011,23 @@ public class MetadataNode implements IMetadataNode {
         }
     }
 
+    @Override
+    public Database getDatabase(TxnId txnId, String databaseName) throws 
AlgebricksException {
+        try {
+            ITupleReference searchKey = createTuple(databaseName);
+            DatabaseTupleTranslator tupleReaderWriter = 
tupleTranslatorProvider.getDatabaseTupleTranslator(false);
+            IValueExtractor<Database> valueExtractor = new 
MetadataEntityValueExtractor<>(tupleReaderWriter);
+            List<Database> results = new ArrayList<>();
+            searchIndex(txnId, 
mdIndexesProvider.getDatabaseEntity().getIndex(), searchKey, valueExtractor, 
results);
+            if (results.isEmpty()) {
+                return null;
+            }
+            return results.get(0);
+        } catch (HyracksDataException e) {
+            throw new AlgebricksException(e);
+        }
+    }
+
     @Override
     public Dataverse getDataverse(TxnId txnId, String database, DataverseName 
dataverseName)
             throws AlgebricksException {
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
index 88fd202b26..71015fc8aa 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/MetadataTransactionContext.java
@@ -142,6 +142,27 @@ public class MetadataTransactionContext extends 
MetadataCache {
         logAndApply(new MetadataLogicalOperation(compactionPolicy, true));
     }
 
+    public void addLibrary(Library library) {
+        droppedCache.dropLibrary(library);
+        logAndApply(new MetadataLogicalOperation(library, true));
+    }
+
+    public void addFeedPolicy(FeedPolicyEntity feedPolicy) {
+        droppedCache.dropFeedPolicy(feedPolicy);
+        logAndApply(new MetadataLogicalOperation(feedPolicy, true));
+
+    }
+
+    public void addFeed(Feed feed) {
+        droppedCache.dropFeedIfExists(feed);
+        logAndApply(new MetadataLogicalOperation(feed, true));
+    }
+
+    public void addFeedConnection(FeedConnection feedConnection) {
+        droppedCache.dropFeedConnection(feedConnection);
+        logAndApply(new MetadataLogicalOperation(feedConnection, true));
+    }
+
     public void dropDataset(String database, DataverseName dataverseName, 
String datasetName) {
         Dataset dataset = new Dataset(database, dataverseName, datasetName, 
null, null, null, null, null, null, null,
                 null, -1, MetadataUtil.PENDING_NO_OP);
@@ -168,11 +189,6 @@ public class MetadataTransactionContext extends 
MetadataCache {
         logAndApply(new MetadataLogicalOperation(dataverse, false));
     }
 
-    public void addLibrary(Library library) {
-        droppedCache.dropLibrary(library);
-        logAndApply(new MetadataLogicalOperation(library, true));
-    }
-
     public void dropDataDatatype(String database, DataverseName dataverseName, 
String datatypeName) {
         Datatype datatype = new Datatype(database, dataverseName, 
datatypeName, null, false);
         droppedCache.addDatatypeIfNotExists(datatype);
@@ -233,37 +249,66 @@ public class MetadataTransactionContext extends 
MetadataCache {
         logAndApply(new MetadataLogicalOperation(library, false));
     }
 
+    public void dropFeed(Feed feed) {
+        droppedCache.addFeedIfNotExists(feed);
+        logAndApply(new MetadataLogicalOperation(feed, false));
+    }
+
+    public void dropFeedConnection(String database, DataverseName 
dataverseName, String feedName, String datasetName) {
+        FeedConnection feedConnection =
+                new FeedConnection(database, dataverseName, feedName, 
datasetName, null, null, null, null);
+        droppedCache.addFeedConnectionIfNotExists(feedConnection);
+        logAndApply(new MetadataLogicalOperation(feedConnection, false));
+    }
+
     public void logAndApply(MetadataLogicalOperation op) {
         opLog.add(op);
         doOperation(op);
     }
 
-    public boolean dataverseIsDropped(DataverseName dataverseName) {
-        return droppedCache.getDataverse(dataverseName) != null;
+    public boolean databaseIsDropped(String databaseName) {
+        return droppedCache.getDatabase(databaseName) != null;
     }
 
-    public boolean datasetIsDropped(DataverseName dataverseName, String 
datasetName) {
-        if (droppedCache.getDataverse(dataverseName) != null) {
+    public boolean dataverseIsDropped(String databaseName, DataverseName 
dataverseName) {
+        if (droppedCache.getDatabase(databaseName) != null) {
             return true;
         }
-        return droppedCache.getDataset(dataverseName, datasetName) != null;
+        return droppedCache.getDataverse(databaseName, dataverseName) != null;
     }
 
-    public boolean indexIsDropped(DataverseName dataverseName, String 
datasetName, String indexName) {
-        if (droppedCache.getDataverse(dataverseName) != null) {
+    public boolean datasetIsDropped(String databaseName, DataverseName 
dataverseName, String datasetName) {
+        if (droppedCache.getDatabase(databaseName) != null) {
             return true;
         }
-        if (droppedCache.getDataset(dataverseName, datasetName) != null) {
+        if (droppedCache.getDataverse(databaseName, dataverseName) != null) {
             return true;
         }
-        return droppedCache.getIndex(dataverseName, datasetName, indexName) != 
null;
+        return droppedCache.getDataset(databaseName, dataverseName, 
datasetName) != null;
     }
 
-    public boolean datatypeIsDropped(DataverseName dataverseName, String 
datatypeName) {
-        if (droppedCache.getDataverse(dataverseName) != null) {
+    public boolean indexIsDropped(String databaseName, DataverseName 
dataverseName, String datasetName,
+            String indexName) {
+        if (droppedCache.getDatabase(databaseName) != null) {
             return true;
         }
-        return droppedCache.getDatatype(dataverseName, datatypeName) != null;
+        if (droppedCache.getDataverse(databaseName, dataverseName) != null) {
+            return true;
+        }
+        if (droppedCache.getDataset(databaseName, dataverseName, datasetName) 
!= null) {
+            return true;
+        }
+        return droppedCache.getIndex(databaseName, dataverseName, datasetName, 
indexName) != null;
+    }
+
+    public boolean datatypeIsDropped(String databaseName, DataverseName 
dataverseName, String datatypeName) {
+        if (droppedCache.getDatabase(databaseName) != null) {
+            return true;
+        }
+        if (droppedCache.getDataverse(databaseName, dataverseName) != null) {
+            return true;
+        }
+        return droppedCache.getDatatype(databaseName, dataverseName, 
datatypeName) != null;
     }
 
     public boolean nodeGroupIsDropped(String nodeGroup) {
@@ -271,49 +316,24 @@ public class MetadataTransactionContext extends 
MetadataCache {
     }
 
     public boolean functionIsDropped(FunctionSignature functionSignature) {
+        //TODO(DB): check database and dataverse first?
         return droppedCache.getFunction(functionSignature) != null;
     }
 
-    public boolean fullTextConfigIsDropped(DataverseName dataverseName, String 
configName) {
-        return droppedCache.getFullTextConfig(dataverseName, configName) != 
null;
+    public boolean fullTextConfigIsDropped(String databaseName, DataverseName 
dataverseName, String configName) {
+        //TODO(DB): check database and dataverse first?
+        return droppedCache.getFullTextConfig(databaseName, dataverseName, 
configName) != null;
     }
 
-    public boolean fullTextFilterIsDropped(DataverseName dataverseName, String 
filterName) {
-        return droppedCache.getFullTextFilter(dataverseName, filterName) != 
null;
+    public boolean fullTextFilterIsDropped(String databaseName, DataverseName 
dataverseName, String filterName) {
+        //TODO(DB): check database and dataverse first?
+        return droppedCache.getFullTextFilter(databaseName, dataverseName, 
filterName) != null;
     }
 
     public List<MetadataLogicalOperation> getOpLog() {
         return opLog;
     }
 
-    public void addFeedPolicy(FeedPolicyEntity feedPolicy) {
-        droppedCache.dropFeedPolicy(feedPolicy);
-        logAndApply(new MetadataLogicalOperation(feedPolicy, true));
-
-    }
-
-    public void addFeed(Feed feed) {
-        droppedCache.dropFeedIfExists(feed);
-        logAndApply(new MetadataLogicalOperation(feed, true));
-    }
-
-    public void dropFeed(Feed feed) {
-        droppedCache.addFeedIfNotExists(feed);
-        logAndApply(new MetadataLogicalOperation(feed, false));
-    }
-
-    public void addFeedConnection(FeedConnection feedConnection) {
-        droppedCache.dropFeedConnection(feedConnection);
-        logAndApply(new MetadataLogicalOperation(feedConnection, true));
-    }
-
-    public void dropFeedConnection(String database, DataverseName 
dataverseName, String feedName, String datasetName) {
-        FeedConnection feedConnection =
-                new FeedConnection(database, dataverseName, feedName, 
datasetName, null, null, null, null);
-        droppedCache.addFeedConnectionIfNotExists(feedConnection);
-        logAndApply(new MetadataLogicalOperation(feedConnection, false));
-    }
-
     @Override
     public void clear() {
         super.clear();
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
index 074a5cde60..226dd70034 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataManager.java
@@ -90,6 +90,8 @@ public interface IMetadataManager extends IMetadataBootstrap {
      */
     void abortTransaction(MetadataTransactionContext ctx) throws 
ACIDException, RemoteException;
 
+    Database getDatabase(MetadataTransactionContext ctx, String database) 
throws AlgebricksException;
+
     void addDatabase(MetadataTransactionContext ctx, Database database) throws 
AlgebricksException;
 
     void dropDatabase(MetadataTransactionContext ctx, String databaseName) 
throws AlgebricksException;
diff --git 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
index c167dd6064..b738533b43 100644
--- 
a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
+++ 
b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/api/IMetadataNode.java
@@ -83,6 +83,8 @@ public interface IMetadataNode extends Remote, Serializable {
 
     void dropDatabase(TxnId txnId, String databaseName) throws 
AlgebricksException, RemoteException;
 
+    Database getDatabase(TxnId txnId, String databaseName) throws 
AlgebricksException, RemoteException;
+
     /**
      * Inserts a new dataverse into the metadata, acquiring local locks on 
behalf of
      * the given transaction id.
@@ -98,17 +100,19 @@ public interface IMetadataNode extends Remote, 
Serializable {
     void addDataverse(TxnId txnId, Dataverse dataverse) throws 
AlgebricksException, RemoteException;
 
     /**
-     * Retrieves all dataverses, acquiring local locks on behalf of the given
-     * transaction id.
+     * Deletes the dataverse with given name, and all it's associated datasets,
+     * indexes, and types, acquiring local locks on behalf of the given 
transaction
+     * id.
      *
      * @param txnId
      *            A globally unique id for an active metadata transaction.
-     * @return A list of dataverse instances.
+     * @param dataverseName
+     *            Name of the dataverse to drop.
      * @throws AlgebricksException
      *             For example, if the dataverse does not exist.
-     * @throws RemoteException remote exception
      */
-    List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException, 
RemoteException;
+    void dropDataverse(TxnId txnId, String database, DataverseName 
dataverseName)
+            throws AlgebricksException, RemoteException;
 
     /**
      * Retrieves a dataverse with given name, acquiring local locks on behalf 
of the
@@ -127,33 +131,31 @@ public interface IMetadataNode extends Remote, 
Serializable {
             throws AlgebricksException, RemoteException;
 
     /**
-     * Retrieves all datasets belonging to the given dataverse, acquiring local
-     * locks on behalf of the given transaction id.
+     * Retrieves all dataverses, acquiring local locks on behalf of the given
+     * transaction id.
      *
      * @param txnId
      *            A globally unique id for an active metadata transaction.
-     * @param dataverseName
-     *            Name of the dataverse of which to find all datasets.
-     * @return A list of dataset instances.
+     * @return A list of dataverse instances.
      * @throws AlgebricksException
-     *             For example, if the dataverse does not exist. 
RemoteException
+     *             For example, if the dataverse does not exist.
+     * @throws RemoteException remote exception
      */
-    List<Dataset> getDataverseDatasets(TxnId txnId, String database, 
DataverseName dataverseName)
-            throws AlgebricksException, RemoteException;
+    List<Dataverse> getDataverses(TxnId txnId) throws AlgebricksException, 
RemoteException;
 
     /**
-     * Deletes the dataverse with given name, and all it's associated datasets,
-     * indexes, and types, acquiring local locks on behalf of the given 
transaction
-     * id.
+     * Retrieves all datasets belonging to the given dataverse, acquiring local
+     * locks on behalf of the given transaction id.
      *
      * @param txnId
      *            A globally unique id for an active metadata transaction.
      * @param dataverseName
-     *            Name of the dataverse to drop.
+     *            Name of the dataverse of which to find all datasets.
+     * @return A list of dataset instances.
      * @throws AlgebricksException
-     *             For example, if the dataverse does not exist.
+     *             For example, if the dataverse does not exist. 
RemoteException
      */
-    void dropDataverse(TxnId txnId, String database, DataverseName 
dataverseName)
+    List<Dataset> getDataverseDatasets(TxnId txnId, String database, 
DataverseName dataverseName)
             throws AlgebricksException, RemoteException;
 
     /**

Reply via email to