|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectcom.sleepycat.je.dbi.DbTree
public class DbTree
DbTree represents the database directory for this environment. DbTree is itself implemented through two databases. The nameDatabase maps databaseName-> an internal databaseId. The idDatabase maps databaseId->DatabaseImpl. For example, suppose we have two databases, foo and bar. We have the following structure: nameDatabase idDatabase IN IN | | BIN BIN +-------------+--------+ +---------------+--------+ . | | . | | NameLNs NameLN NameLN MapLNs for MapLN MapLN for internal key=bar key=foo internal dbs key=53 key=79 dbs data= data= data= data= dbId79 dbId53 DatabaseImpl DatabaseImpl | | Tree for foo Tree for bar | | root IN root IN Databases, Cursors, the cleaner, compressor, and other entities have references to DatabaseImpls. It's important that object identity is properly maintained, and that all constituents reference the same DatabaseImpl for the same db, lest they develop disparate views of the in-memory database; corruption would ensue. To ensure that, all entities must obtain their DatabaseImpl by going through the idDatabase. DDL type operations such as create, rename, remove and truncate get their transactional semantics by transactionally locking the NameLN appropriately. A read-lock on the NameLN, called a handle lock, is maintained for all DBs opened via the public API (openDatabase). This prevents them from being renamed or removed while open. However, for internal database operations, no handle lock on the NameLN is acacuiqred and MapLNs are locked with short-lived non-transactional Lockers. An entity that is trying to get a reference to the DatabaseImpl gets a short lived read lock just for the fetch of the MapLN. A write lock on the MapLN is taken when the database is created, deleted, or when the MapLN is evicted. (see DatabaseImpl.isInUse()) The nameDatabase operates pretty much as a regular application database in terms of eviction and recovery. The idDatabase requires special treatment for both eviction and recovery. The issues around eviction of the idDatabase center on the need to ensure that there are no other current references to the DatabaseImpl other than that held by the mapLN. The presence of a current reference would both make the DatabaseImpl not GC'able, and more importantly, would lead to object identify confusion later on. For example, if the MapLN is evicted while there is a current reference to its DatabaseImpl, and then refetched, there will be two in-memory versions of the DatabaseImpl. Since locks on the idDatabase are short lived, DatabaseImpl.useCount acts as a reference count of active current references. DatabaseImpl.useCount must be modified and read in conjunction with appropropriate locking on the MapLN. See DatabaseImpl.isInUse() for details. This reference count checking is only needed when the entire MapLN is evicted. It's possible to evict only the root IN of the database in question, since that doesn't interfere with the DatabaseImpl object identity.
Field Summary | |
---|---|
static DatabaseId |
ID_DB_ID
|
static DatabaseId |
NAME_DB_ID
|
static java.lang.String |
REP_OPERATIONS_NAME
|
static java.lang.String |
UTILIZATION_DB_NAME
|
Constructor Summary | |
---|---|
DbTree()
Create a dbTree from the log. |
|
DbTree(EnvironmentImpl env)
Create a new dbTree for a new environment. |
Method Summary | |
---|---|
DatabaseImpl |
createDb(Locker locker,
java.lang.String databaseName,
DatabaseConfig dbConfig,
Database databaseHandle)
Create a database. |
(package private) void |
dbRemove(Locker locker,
java.lang.String databaseName)
Remove the database by deleting the nameLN. |
(package private) boolean |
dbRename(Locker locker,
java.lang.String databaseName,
java.lang.String newName)
Return true if the operation succeeded, false otherwise. |
(package private) void |
deleteMapLN(DatabaseId id)
|
void |
dump()
For debugging. |
void |
dumpLog(java.lang.StringBuffer sb,
boolean verbose)
Write the object into the string buffer for log dumping. |
(package private) java.lang.String |
dumpString(int nSpaces)
|
DatabaseImpl |
getDb(DatabaseId dbId)
Get a database object based on an id only. |
DatabaseImpl |
getDb(DatabaseId dbId,
long lockTimeout)
Get a database object based on an id only. |
DatabaseImpl |
getDb(DatabaseId dbId,
long lockTimeout,
java.util.Map dbCache)
Get a database object based on an id only, caching the id-db mapping in the given map. |
DatabaseImpl |
getDb(DatabaseId dbId,
long lockTimeout,
java.lang.String dbNameIfAvailable)
Get a database object based on an id only. |
DatabaseImpl |
getDb(Locker nameLocker,
java.lang.String databaseName,
Database databaseHandle)
Get a database object given a database name. |
java.lang.String |
getDbName(DatabaseId id)
Return the database name for a given db. |
java.util.List |
getDbNames()
|
java.util.Map |
getDbNamesAndIds()
|
int |
getHighestLevel()
|
int |
getHighestLevel(DatabaseImpl dbImpl)
|
java.util.List |
getInternalDbNames()
Return a list of the names of internally used databases. |
java.util.List |
getInternalNoLookupDbNames()
Return a list of the names of internally used databases that don't get looked up through the naming tree. |
int |
getLastDbId()
Get the latest allocated id, for checkpoint info. |
int |
getLogSize()
|
long |
getTransactionId()
|
boolean |
isReservedDbName(java.lang.String name)
Returns true if the name is a reserved JE database name. |
void |
modifyDbRoot(DatabaseImpl db)
Called by the Tree to propagate a root change. |
void |
optionalModifyDbRoot(DatabaseImpl db)
Called by the Tree to propagate a root change. |
void |
readFromLog(java.nio.ByteBuffer itemBuffer,
byte entryTypeVersion)
Initialize this object from the data in itemBuf. |
void |
rebuildINListMapDb()
Rebuild the IN list after recovery. |
void |
releaseDb(DatabaseImpl db)
Decrements the use count of the given DB, allowing it to be evicted if the use count reaches zero. |
void |
releaseDbs(java.util.Map dbCache)
Calls releaseDb for all DBs in the given map of DatabaseId to DatabaseImpl. |
(package private) void |
setEnvironmentImpl(EnvironmentImpl envImpl)
Set the db environment during recovery, after instantiating the tree from the log. |
void |
setLastDbId(int maxDbId)
Initialize the db id, from recovery. |
java.lang.String |
toString()
|
(package private) TruncateResult |
truncate(Locker locker,
DatabaseImpl oldDatabase,
boolean returnCount)
Deprecated. This method used by Database.truncate() |
(package private) long |
truncate(Locker locker,
java.lang.String databaseName,
boolean returnCount)
To truncate, remove the database named by databaseName and create a new database in its place. |
boolean |
verify(VerifyConfig config,
java.io.PrintStream out)
|
void |
writeToLog(java.nio.ByteBuffer logBuffer)
Serialize this object into the buffer. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
---|
public static final DatabaseId ID_DB_ID
public static final DatabaseId NAME_DB_ID
public static final java.lang.String UTILIZATION_DB_NAME
public static final java.lang.String REP_OPERATIONS_NAME
Constructor Detail |
---|
public DbTree() throws DatabaseException
DatabaseException
public DbTree(EnvironmentImpl env) throws DatabaseException
DatabaseException
Method Detail |
---|
public int getLastDbId()
public void setLastDbId(int maxDbId)
void setEnvironmentImpl(EnvironmentImpl envImpl) throws DatabaseException
DatabaseException
public DatabaseImpl createDb(Locker locker, java.lang.String databaseName, DatabaseConfig dbConfig, Database databaseHandle) throws DatabaseException
locker
- owning lockerdatabaseName
- identifier for databasedbConfig
-
DatabaseException
public void optionalModifyDbRoot(DatabaseImpl db) throws DatabaseException
db
- the target db
DatabaseException
public void modifyDbRoot(DatabaseImpl db) throws DatabaseException
db
- the target db
DatabaseException
boolean dbRename(Locker locker, java.lang.String databaseName, java.lang.String newName) throws DatabaseException
DatabaseException
void dbRemove(Locker locker, java.lang.String databaseName) throws DatabaseException
DatabaseException
long truncate(Locker locker, java.lang.String databaseName, boolean returnCount) throws DatabaseException
returnCount
- if true, must return the count of records in the
database, which can be an expensive option.
DatabaseException
void deleteMapLN(DatabaseId id) throws DatabaseException
DatabaseException
TruncateResult truncate(Locker locker, DatabaseImpl oldDatabase, boolean returnCount) throws DatabaseException
DatabaseException
public DatabaseImpl getDb(Locker nameLocker, java.lang.String databaseName, Database databaseHandle) throws DatabaseException
nameLocker
- is used to access the NameLN. As always, a NullTxn
is used to access the MapLN.databaseName
- target database
DatabaseException
public DatabaseImpl getDb(DatabaseId dbId) throws DatabaseException
DatabaseException
public DatabaseImpl getDb(DatabaseId dbId, long lockTimeout) throws DatabaseException
DatabaseException
public DatabaseImpl getDb(DatabaseId dbId, long lockTimeout, java.util.Map dbCache) throws DatabaseException
DatabaseException
public DatabaseImpl getDb(DatabaseId dbId, long lockTimeout, java.lang.String dbNameIfAvailable) throws DatabaseException
DatabaseException
public void releaseDb(DatabaseImpl db)
public void releaseDbs(java.util.Map dbCache)
public void rebuildINListMapDb() throws DatabaseException
DatabaseException
public boolean verify(VerifyConfig config, java.io.PrintStream out) throws DatabaseException
DatabaseException
public java.lang.String getDbName(DatabaseId id) throws DatabaseException
DatabaseException
public java.util.Map getDbNamesAndIds() throws DatabaseException
DatabaseException
public java.util.List getDbNames() throws DatabaseException
DatabaseException
public java.util.List getInternalNoLookupDbNames()
public java.util.List getInternalDbNames()
public boolean isReservedDbName(java.lang.String name)
public int getHighestLevel() throws DatabaseException
DatabaseException
public int getHighestLevel(DatabaseImpl dbImpl) throws DatabaseException
DatabaseException
public int getLogSize()
getLogSize
in interface Loggable
Loggable.getLogSize()
public void writeToLog(java.nio.ByteBuffer logBuffer)
Loggable
writeToLog
in interface Loggable
logBuffer
- is the destination bufferLoggable.writeToLog(java.nio.ByteBuffer)
public void readFromLog(java.nio.ByteBuffer itemBuffer, byte entryTypeVersion) throws LogException
Loggable
readFromLog
in interface Loggable
LogException
Loggable.readFromLog(java.nio.ByteBuffer, byte)
public void dumpLog(java.lang.StringBuffer sb, boolean verbose)
Loggable
dumpLog
in interface Loggable
sb
- destination string bufferverbose
- if true, dump the full, verbose versionLoggable.dumpLog(java.lang.StringBuffer, boolean)
public long getTransactionId()
getTransactionId
in interface Loggable
Loggable.getTransactionId()
java.lang.String dumpString(int nSpaces)
public java.lang.String toString()
toString
in class java.lang.Object
public void dump() throws DatabaseException
DatabaseException
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |