use of com.orientechnologies.orient.core.db.ODatabaseDocumentInternal in project orientdb by orientechnologies.
the class ODistributedTransactionManager method createUndoTasksFromTx.
/**
* Create undo content for distributed 2-phase rollback. This list of undo tasks is sent to all the nodes to revert a transaction
* and it's also applied locally.
*
* @param iTx Current transaction
*
* @return List of remote undo tasks
*/
protected List<OAbstractRemoteTask> createUndoTasksFromTx(final OTransaction iTx) {
final List<OAbstractRemoteTask> undoTasks = new ArrayList<OAbstractRemoteTask>();
for (ORecordOperation op : iTx.getAllRecordEntries()) {
OAbstractRemoteTask undoTask = null;
final ORecord record = op.getRecord();
switch(op.type) {
case ORecordOperation.CREATED:
// CREATE UNDO TASK LATER ONCE THE RID HAS BEEN ASSIGNED
break;
case ORecordOperation.UPDATED:
case ORecordOperation.DELETED:
// CREATE UNDO TASK WITH THE PREVIOUS RECORD CONTENT/VERSION
final ORecordId rid = (ORecordId) record.getIdentity();
final AtomicReference<ORecord> previousRecord = new AtomicReference<ORecord>();
OScenarioThreadLocal.executeAsDefault(new Callable<Object>() {
@Override
public Object call() throws Exception {
final ODatabaseDocumentInternal db = ODatabaseRecordThreadLocal.INSTANCE.get();
final ORecordOperation txEntry = db.getTransaction().getRecordEntry(rid);
if (txEntry != null && txEntry.type == ORecordOperation.DELETED)
// GET DELETED RECORD FROM TX
previousRecord.set(txEntry.getRecord());
else {
final OStorageOperationResult<ORawBuffer> loadedBuffer = ODatabaseRecordThreadLocal.INSTANCE.get().getStorage().getUnderlying().readRecord(rid, null, true, false, null);
if (loadedBuffer != null) {
// LOAD THE RECORD FROM THE STORAGE AVOIDING USING THE DB TO GET THE TRANSACTIONAL CHANGES
final ORecord loaded = Orient.instance().getRecordFactoryManager().newInstance(loadedBuffer.getResult().recordType);
ORecordInternal.fill(loaded, rid, loadedBuffer.getResult().version, loadedBuffer.getResult().getBuffer(), false);
previousRecord.set(loaded);
} else
// RECORD NOT FOUND ON LOCAL STORAGE, ASK TO DB BECAUSE IT COULD BE SHARDED AND RESIDE ON ANOTHER SERVER
previousRecord.set(db.load(rid));
}
return null;
}
});
if (previousRecord.get() == null)
throw new ORecordNotFoundException(rid);
if (op.type == ORecordOperation.UPDATED)
undoTask = new OFixUpdateRecordTask(previousRecord.get(), ORecordVersionHelper.clearRollbackMode(previousRecord.get().getVersion()));
else
undoTask = new OResurrectRecordTask(previousRecord.get());
break;
default:
continue;
}
if (undoTask != null)
undoTasks.add(undoTask);
}
return undoTasks;
}
use of com.orientechnologies.orient.core.db.ODatabaseDocumentInternal in project orientdb by orientechnologies.
the class OStorageRemote method copy.
@Override
public OStorageRemote copy(final ODatabaseDocumentTx source, final ODatabaseDocumentTx dest) {
ODatabaseDocumentInternal origin = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined();
final OStorageRemoteSession session = (OStorageRemoteSession) ODatabaseDocumentTxInternal.getSessionMetadata(source);
if (session != null) {
// TODO:may run a session reopen
final OStorageRemoteSession newSession = new OStorageRemoteSession(sessionSerialId.decrementAndGet());
newSession.connectionUserName = session.connectionUserName;
newSession.connectionUserPassword = session.connectionUserPassword;
ODatabaseDocumentTxInternal.setSessionMetadata(dest, newSession);
}
try {
dest.activateOnCurrentThread();
openRemoteDatabase();
} catch (IOException e) {
e.printStackTrace();
} finally {
ODatabaseRecordThreadLocal.INSTANCE.set(origin);
}
return this;
}
use of com.orientechnologies.orient.core.db.ODatabaseDocumentInternal in project orientdb by orientechnologies.
the class OStorageRemote method command.
/**
* Execute the command remotely and get the results back.
*/
public Object command(final OCommandRequestText iCommand) {
if (!(iCommand instanceof OSerializableStream))
throw new OCommandExecutionException("Cannot serialize the command to be executed to the server side.");
final boolean live = iCommand instanceof OLiveQuery;
final ODatabaseDocument database = ODatabaseRecordThreadLocal.INSTANCE.get();
return networkOperation(new OStorageRemoteOperation<Object>() {
@Override
public Object execute(final OChannelBinaryAsynchClient network, OStorageRemoteSession session) throws IOException {
Object result = null;
session.commandExecuting = true;
try {
final boolean asynch = iCommand instanceof OCommandRequestAsynch && ((OCommandRequestAsynch) iCommand).isAsynchronous();
try {
beginRequest(network, OChannelBinaryProtocol.REQUEST_COMMAND, session);
if (live) {
network.writeByte((byte) 'l');
} else {
// ASYNC / SYNC
network.writeByte((byte) (asynch ? 'a' : 's'));
}
network.writeBytes(OStreamSerializerAnyStreamable.INSTANCE.toStream(iCommand));
} finally {
endRequest(network);
}
try {
beginResponse(network, session);
// Collection of prefetched temporary record (nested projection record), to refer for avoid garbage collection.
List<ORecord> temporaryResults = new ArrayList<ORecord>();
boolean addNextRecord = true;
if (asynch) {
byte status;
// ASYNCH: READ ONE RECORD AT TIME
while ((status = network.readByte()) > 0) {
final ORecord record = (ORecord) OChannelBinaryProtocol.readIdentifiable(network);
if (record == null)
continue;
switch(status) {
case 1:
// PUT AS PART OF THE RESULT SET. INVOKE THE LISTENER
if (addNextRecord) {
addNextRecord = iCommand.getResultListener().result(record);
database.getLocalCache().updateRecord(record);
}
break;
case 2:
if (record.getIdentity().getClusterId() == -2)
temporaryResults.add(record);
// PUT IN THE CLIENT LOCAL CACHE
database.getLocalCache().updateRecord(record);
}
}
} else {
result = readSynchResult(network, database, temporaryResults);
if (live) {
final ODocument doc = ((List<ODocument>) result).get(0);
final Integer token = doc.field("token");
final Boolean unsubscribe = doc.field("unsubscribe");
if (token != null) {
if (Boolean.TRUE.equals(unsubscribe)) {
if (OStorageRemote.this.asynchEventListener != null)
OStorageRemote.this.asynchEventListener.unregisterLiveListener(token);
} else {
final OLiveResultListener listener = (OLiveResultListener) iCommand.getResultListener();
ODatabaseDocumentInternal current = ODatabaseRecordThreadLocal.INSTANCE.get();
final ODatabaseDocument dbCopy = current.copy();
ORemoteConnectionPool pool = OStorageRemote.this.connectionManager.getPool(network.getServerURL());
OStorageRemote.this.asynchEventListener.registerLiveListener(pool, token, new OLiveResultListener() {
@Override
public void onUnsubscribe(int iLiveToken) {
listener.onUnsubscribe(iLiveToken);
dbCopy.close();
}
@Override
public void onLiveResult(int iLiveToken, ORecordOperation iOp) throws OException {
dbCopy.activateOnCurrentThread();
listener.onLiveResult(iLiveToken, iOp);
}
@Override
public void onError(int iLiveToken) {
listener.onError(iLiveToken);
dbCopy.close();
}
});
}
} else {
throw new OStorageException("Cannot execute live query, returned null token");
}
}
}
if (!temporaryResults.isEmpty()) {
if (result instanceof OBasicResultSet<?>) {
((OBasicResultSet<?>) result).setTemporaryRecordCache(temporaryResults);
}
}
return result;
} finally {
endResponse(network);
}
} finally {
session.commandExecuting = false;
if (iCommand.getResultListener() != null && !live)
iCommand.getResultListener().end();
}
}
}, "Error on executing command: " + iCommand);
}
use of com.orientechnologies.orient.core.db.ODatabaseDocumentInternal in project orientdb by orientechnologies.
the class ODocument method setup.
/**
* Internal.
*/
@Override
protected void setup() {
super.setup();
final ODatabaseDocumentInternal db = ODatabaseRecordThreadLocal.INSTANCE.getIfDefined();
if (db != null)
_recordFormat = db.getSerializer();
if (_recordFormat == null)
// GET THE DEFAULT ONE
_recordFormat = ODatabaseDocumentTx.getDefaultSerializer();
}
use of com.orientechnologies.orient.core.db.ODatabaseDocumentInternal in project orientdb by orientechnologies.
the class ODocument method fetchClassName.
private void fetchClassName() {
final ODatabaseDocumentInternal database = getDatabaseIfDefinedInternal();
if (database != null && database.getStorageVersions() != null && database.getStorageVersions().classesAreDetectedByClusterId()) {
if (_recordId.getClusterId() < 0) {
checkForLoading();
checkForFields(ODocumentHelper.ATTRIBUTE_CLASS);
} else {
final OSchema schema = ((OMetadataInternal) database.getMetadata()).getImmutableSchemaSnapshot();
if (schema != null) {
OClass _clazz = schema.getClassByClusterId(_recordId.getClusterId());
if (_clazz != null)
_className = _clazz.getName();
}
}
} else {
// CLASS NOT FOUND: CHECK IF NEED LOADING AND UNMARSHALLING
checkForLoading();
checkForFields(ODocumentHelper.ATTRIBUTE_CLASS);
}
}
Aggregations