Skip to content

Commit

Permalink
reduced the use of thread locals in schema implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
tglman committed Jun 15, 2017
1 parent 425eef5 commit 912613c
Show file tree
Hide file tree
Showing 11 changed files with 313 additions and 344 deletions.
Expand Up @@ -893,7 +893,7 @@ public List<ORecordOperation> commit(final OTransaction iTx, final Runnable call
ORecordInternal.setVersion(rop.getRecord(), updated.getVersion());
}
}
updateCollectionsFromChanges(ODatabaseRecordThreadLocal.INSTANCE.get().getSbTreeCollectionManager(),
updateCollectionsFromChanges(((OTransactionOptimistic)iTx).getDatabase().getSbTreeCollectionManager(),
response.getCollectionChanges());
// SET ALL THE RECORDS AS UNDIRTY
for (ORecordOperation txEntry : iTx.getAllRecordEntries())
Expand Down
Expand Up @@ -180,11 +180,12 @@ public OClass setSuperClasses(final List<? extends OClass> classes) {

@Override
public OClass addSuperClass(final OClass superClass) {
getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final ODatabaseDocumentInternal database = getDatabase();
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
checkParametersConflict(superClass);
acquireSchemaWriteLock();
try {
final ODatabaseDocumentInternal database = getDatabase();

final String cmd = String.format("alter class `%s` superclass +`%s`", name, superClass != null ? superClass.getName() : null);
database.command(cmd);

Expand All @@ -196,10 +197,10 @@ public OClass addSuperClass(final OClass superClass) {

@Override
public OClass removeSuperClass(OClass superClass) {
getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final ODatabaseDocumentInternal database = getDatabase();
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
acquireSchemaWriteLock();
try {
final ODatabaseDocumentInternal database = getDatabase();
final String cmd = String.format("alter class `%s` superclass -`%s`", name, superClass != null ? superClass.getName() : null);
database.command(cmd);
} finally {
Expand All @@ -211,10 +212,10 @@ public OClass removeSuperClass(OClass superClass) {
public OClass setName(final String name) {
if (getName().equals(name))
return this;

getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final ODatabaseDocumentInternal database = getDatabase();
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(name);
OClass oClass = getDatabase().getMetadata().getSchema().getClass(name);
OClass oClass = database.getMetadata().getSchema().getClass(name);
if (oClass != null) {
String error = String.format("Cannot rename class %s to %s. A Class with name %s exists", this.name, name, name);
throw new OSchemaException(error);
Expand All @@ -224,7 +225,6 @@ public OClass setName(final String name) {
"Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + name + "'");
acquireSchemaWriteLock();
try {
final ODatabaseDocumentInternal database = getDatabase();

final String cmd = String.format("alter class `%s` name `%s`", this.name, name);
database.command(cmd);
Expand All @@ -242,11 +242,11 @@ public OClass setShortName(String shortName) {
if (shortName.isEmpty())
shortName = null;
}
getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);
final ODatabaseDocumentInternal database = getDatabase();
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_UPDATE);

acquireSchemaWriteLock();
try {
final ODatabaseDocumentInternal database = getDatabase();
final String cmd = String.format("alter class `%s` shortname `%s`", name, shortName);
database.command(cmd);
} finally {
Expand Down
Expand Up @@ -20,7 +20,7 @@ public OSchemaRemote() {
}

@Override
public OClass getOrCreateClass(String iClassName, OClass... superClasses) {
public OClass getOrCreateClass(ODatabaseDocumentInternal database, String iClassName, OClass... superClasses) {
if (iClassName == null)
return null;

Expand All @@ -37,17 +37,17 @@ public OClass getOrCreateClass(String iClassName, OClass... superClasses) {

int[] clusterIds = null;

acquireSchemaWriteLock();
acquireSchemaWriteLock(database);
try {
cls = classes.get(iClassName.toLowerCase(Locale.ENGLISH));
if (cls != null)
return cls;

cls = createClass(iClassName, clusterIds, superClasses);
cls = createClass(database, iClassName, clusterIds, superClasses);

addClusterClassMap(cls);
} finally {
releaseSchemaWriteLock();
releaseSchemaWriteLock(database);
}

return cls;
Expand All @@ -57,21 +57,18 @@ protected OClassImpl createClassInstance(ODocument c) {
return new OClassRemote(this, c, (String) c.field("name"));
}


public OClass createClass(final String className, int[] clusterIds, OClass... superClasses) {
public OClass createClass(ODatabaseDocumentInternal database, final String className, int[] clusterIds, OClass... superClasses) {
final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(className);
if (wrongCharacter != null)
throw new OSchemaException(
"Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + className + "'");
OClass result;

final ODatabaseDocumentInternal db = getDatabase();

db.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
if (superClasses != null)
OClassImpl.checkParametersConflict(Arrays.asList(superClasses));

acquireSchemaWriteLock();
acquireSchemaWriteLock(database);
try {

final String key = className.toLowerCase(Locale.ENGLISH);
Expand Down Expand Up @@ -118,38 +115,37 @@ public OClass createClass(final String className, int[] clusterIds, OClass... su
}
}

db.command(cmd.toString());
database.command(cmd.toString());
reload();

result = classes.get(className.toLowerCase(Locale.ENGLISH));

// WAKE UP DB LIFECYCLE LISTENER
for (Iterator<ODatabaseLifecycleListener> it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); )
it.next().onCreateClass(getDatabase(), result);
it.next().onCreateClass(database, result);

for (Iterator<ODatabaseListener> it = db.getListeners().iterator(); it.hasNext(); )
it.next().onCreateClass(getDatabase(), result);
for (Iterator<ODatabaseListener> it = database.getListeners().iterator(); it.hasNext(); )
it.next().onCreateClass(database, result);

} finally {
releaseSchemaWriteLock();
releaseSchemaWriteLock(database);
}

return result;
}

public OClass createClass(final String className, int clusters, OClass... superClasses) {
public OClass createClass(ODatabaseDocumentInternal database, final String className, int clusters, OClass... superClasses) {
final Character wrongCharacter = OSchemaShared.checkClassNameIfValid(className);
if (wrongCharacter != null)
throw new OSchemaException(
"Invalid class name found. Character '" + wrongCharacter + "' cannot be used in class name '" + className + "'");

OClass result;

final ODatabaseDocumentInternal db = getDatabase();
db.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_CREATE);
if (superClasses != null)
OClassImpl.checkParametersConflict(Arrays.asList(superClasses));
acquireSchemaWriteLock();
acquireSchemaWriteLock(database);
try {

final String key = className.toLowerCase(Locale.ENGLISH);
Expand Down Expand Up @@ -185,19 +181,19 @@ public OClass createClass(final String className, int clusters, OClass... superC
cmd.append(clusters);
}

db.command(cmd.toString());
database.command(cmd.toString());
reload();
result = classes.get(className.toLowerCase(Locale.ENGLISH));

// WAKE UP DB LIFECYCLE LISTENER
for (Iterator<ODatabaseLifecycleListener> it = Orient.instance().getDbLifecycleListeners(); it.hasNext(); )
it.next().onCreateClass(getDatabase(), result);
it.next().onCreateClass(database, result);

for (Iterator<ODatabaseListener> it = db.getListeners().iterator(); it.hasNext(); )
it.next().onCreateClass(getDatabase(), result);
for (Iterator<ODatabaseListener> it = database.getListeners().iterator(); it.hasNext(); )
it.next().onCreateClass(database, result);

} finally {
releaseSchemaWriteLock();
releaseSchemaWriteLock(database);
}

return result;
Expand All @@ -217,18 +213,17 @@ private void checkClustersAreAbsent(final int[] iClusterIds) {
}
}

public void dropClass(final String className) {
final ODatabaseDocumentInternal db = getDatabase();
public void dropClass(ODatabaseDocumentInternal database, final String className) {

acquireSchemaWriteLock();
acquireSchemaWriteLock(database);
try {
if (getDatabase().getTransaction().isActive())
if (database.getTransaction().isActive())
throw new IllegalStateException("Cannot drop a class inside a transaction");

if (className == null)
throw new IllegalArgumentException("Class name is null");

getDatabase().checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE);
database.checkSecurity(ORule.ResourceGeneric.SCHEMA, ORole.PERMISSION_DELETE);

final String key = className.toLowerCase(Locale.ENGLISH);

Expand All @@ -244,15 +239,19 @@ public void dropClass(final String className) {
final StringBuilder cmd = new StringBuilder("drop class ");
cmd.append(className);
cmd.append(" unsafe");
db.command(cmd.toString());
database.command(cmd.toString());
reload();

// FREE THE RECORD CACHE
getDatabase().getLocalCache().freeCluster(cls.getDefaultClusterId());
database.getLocalCache().freeCluster(cls.getDefaultClusterId());

} finally {
releaseSchemaWriteLock();
releaseSchemaWriteLock(database);
}
}

@Override
public void checkEmbedded() {
throw new OSchemaException("'Internal' schema modification methods can be used only inside of embedded database");
}
}
Expand Up @@ -12,7 +12,6 @@
import com.orientechnologies.orient.core.sql.executor.OQueryStats;
import com.orientechnologies.orient.core.sql.parser.OStatementCache;
import com.orientechnologies.orient.core.storage.OStorage;
import com.orientechnologies.orient.core.storage.OStorageProxy;

/**
* Created by tglman on 13/06/17.
Expand Down Expand Up @@ -88,8 +87,8 @@ public synchronized void create(ODatabaseDocumentInternal database) {
scheduler.create(database);

// CREATE BASE VERTEX AND EDGE CLASSES
schema.createClass("V");
schema.createClass("E");
schema.createClass(database, "V");
schema.createClass(database, "E");
loaded = true;
}
}

0 comments on commit 912613c

Please sign in to comment.