@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();
 }
Example #2
0
  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);
  }