@Override public int getOrCreate( AbstractTransactionManager txManager, EntityIdGenerator idGenerator, PersistenceManager persistence, String name) { Response<Integer> response = master.createPropertyKey(requestContextFactory.newRequestContext(), name); xaDsm.applyTransactions(response); return response.response().intValue(); }
private void checkDataConsistencyWithMaster( URI availableMasterId, Master master, NeoStoreXaDataSource nioneoDataSource, TransactionIdStore transactionIdStore) throws IOException { long myLastCommittedTx = transactionIdStore.getLastCommittingTransactionId(); int myMaster = -1; long myChecksum = 0; TransactionMetadataCache.TransactionMetadata metadata = nioneoDataSource .getDependencyResolver() .resolveDependency(LogicalTransactionStore.class) .getMetadataFor(myLastCommittedTx); myMaster = metadata.getMasterId(); myChecksum = metadata.getChecksum(); HandshakeResult handshake; try (Response<HandshakeResult> response = master.handshake(myLastCommittedTx, nioneoDataSource.getStoreId())) { handshake = response.response(); requestContextFactory.setEpoch(handshake.epoch()); } catch (BranchedDataException e) { // Rethrow wrapped in a branched data exception on our side, to clarify where the problem // originates. throw new BranchedDataException( "The database stored on this machine has diverged from that " + "of the master. This will be automatically resolved.", e); } catch (RuntimeException e) { // Checked exceptions will be wrapped as the cause if this was a serialized // server-side exception if (e.getCause() instanceof MissingLogDataException) { /* * This means the master was unable to find a log entry for the txid we just asked. This * probably means the thing we asked for is too old or too new. Anyway, since it doesn't * have the tx it is better if we just throw our store away and ask for a new copy. Next * time around it shouldn't have to even pass from here. */ throw new StoreOutOfDateException( "The master is missing the log required to complete the " + "consistency check", e.getCause()); } throw e; } if (myMaster != -1 && (myMaster != handshake.txAuthor() || myChecksum != handshake.txChecksum())) { String msg = "The cluster contains two logically different versions of the database.. This will be " + "automatically resolved. Details: I (machineId:" + config.get(ClusterSettings.server_id) + ") think machineId for txId (" + myLastCommittedTx + ") is " + myMaster + ", but master (machineId:" + getServerId(availableMasterId) + ") says that it's " + handshake; throw new BranchedDataException(msg); } msgLog.logMessage( "Master id for last committed tx ok with highestTxId=" + myLastCommittedTx + " with masterId=" + myMaster, true); }