use of com.sleepycat.je.Database in project qpid-broker-j by apache.
the class UpgradeFrom4To5 method upgradeMetaData.
private void upgradeMetaData(final Environment environment, final UpgradeInteractionHandler handler, final Set<Long> messagesToDiscard, Transaction transaction) {
LOGGER.info("Message MetaData");
if (environment.getDatabaseNames().contains(OLD_METADATA_DB_NAME)) {
final MessageMetaDataBinding binding = new MessageMetaDataBinding();
CursorOperation databaseOperation = new CursorOperation() {
@Override
public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key, DatabaseEntry value) {
StorableMessageMetaData metaData = binding.entryToObject(value);
// get message id
Long messageId = LongBinding.entryToLong(key);
// ONLY copy data if message is delivered to existing queue
if (messagesToDiscard.contains(messageId)) {
return;
}
DatabaseEntry newValue = new DatabaseEntry();
binding.objectToEntry(metaData, newValue);
targetDatabase.put(transaction, key, newValue);
targetDatabase.put(transaction, key, newValue);
deleteCurrent();
}
};
new DatabaseTemplate(environment, OLD_METADATA_DB_NAME, NEW_METADATA_DB_NAME, transaction).run(databaseOperation);
environment.removeDatabase(transaction, OLD_METADATA_DB_NAME);
LOGGER.info(databaseOperation.getRowCount() + " Message MetaData entries");
}
}
use of com.sleepycat.je.Database in project qpid-broker-j by apache.
the class AbstractBDBPreferenceStore method updateOrCreateInternal.
private void updateOrCreateInternal(final Transaction txn, final Collection<PreferenceRecord> preferenceRecords) {
Database preferencesDb = getPreferencesDb();
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();
UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
MapBinding valueBinding = MapBinding.getInstance();
for (PreferenceRecord record : preferenceRecords) {
keyBinding.objectToEntry(record.getId(), key);
valueBinding.objectToEntry(record.getAttributes(), value);
OperationStatus status = preferencesDb.put(txn, key, value);
if (status != OperationStatus.SUCCESS) {
throw new StoreException(String.format("Error writing preference with id '%s' (status %s)", record.getId(), status.name()));
}
}
}
use of com.sleepycat.je.Database in project qpid-broker-j by apache.
the class AbstractBDBPreferenceStore method getPreferencesVersionDb.
private Database getPreferencesVersionDb() {
Database preferencesVersionDb;
try {
DatabaseConfig config = new DatabaseConfig().setTransactional(true).setAllowCreate(false);
preferencesVersionDb = getEnvironmentFacade().openDatabase(PREFERENCES_VERSION_DB_NAME, config);
} catch (DatabaseNotFoundException e) {
preferencesVersionDb = updateVersion(null, BrokerModel.MODEL_VERSION);
}
return preferencesVersionDb;
}
use of com.sleepycat.je.Database in project qpid-broker-j by apache.
the class AbstractBDBPreferenceStore method removeAndAdd.
private void removeAndAdd(final Collection<UUID> preferenceRecordsToRemove, final Collection<PreferenceRecord> preferenceRecordsToAdd, final Action<Transaction> preCommitAction) {
_useOrCloseRWLock.readLock().lock();
try {
final StoreState storeState = getStoreState();
if (!storeState.equals(StoreState.OPENED)) {
throw new IllegalStateException(String.format("PreferenceStore is not opened. Actual state : %s", storeState));
}
if (preferenceRecordsToRemove.isEmpty() && preferenceRecordsToAdd.isEmpty()) {
return;
}
EnvironmentFacade environmentFacade = getEnvironmentFacade();
Transaction txn = null;
try {
txn = environmentFacade.beginTransaction(null);
Database preferencesDb = getPreferencesDb();
DatabaseEntry key = new DatabaseEntry();
UUIDTupleBinding keyBinding = UUIDTupleBinding.getInstance();
for (UUID id : preferenceRecordsToRemove) {
getLogger().debug("Removing preference {}", id);
keyBinding.objectToEntry(id, key);
OperationStatus status = preferencesDb.delete(txn, key);
if (status == OperationStatus.NOTFOUND) {
getLogger().debug("Preference {} not found", id);
}
}
updateOrCreateInternal(txn, preferenceRecordsToAdd);
if (preCommitAction != null) {
preCommitAction.performAction(txn);
}
txn.commit();
txn = null;
} catch (RuntimeException e) {
throw environmentFacade.handleDatabaseException("Error on replacing of preferences: " + e.getMessage(), e);
} finally {
if (txn != null) {
abortTransactionSafely(txn, environmentFacade);
}
}
} finally {
_useOrCloseRWLock.readLock().unlock();
}
}
use of com.sleepycat.je.Database in project qpid-broker-j by apache.
the class OrphanConfigurationRecordPurger method purgeOrphans.
private void purgeOrphans(Environment env, final Transaction tx) throws Exception {
try (Database configDb = env.openDatabase(tx, CONFIGURED_OBJECTS_DB_NAME, READ_WRITE_DB_CONFIG)) {
final Set<UUID> records = new HashSet<>();
try (Cursor configCursor = configDb.openCursor(tx, null)) {
final DatabaseEntry key = new DatabaseEntry();
final DatabaseEntry value = new DatabaseEntry();
while (configCursor.getNext(key, value, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
final UUID recId = entryToUuid(new TupleInput(key.getData()));
records.add(recId);
}
}
int configRecordDeleted = 0;
int configHierarchyRecordsDeleted = 0;
try (Database hierarchyDb = env.openDatabase(null, CONFIGURED_OBJECT_HIERARCHY_DB_NAME, READ_WRITE_DB_CONFIG)) {
boolean loopAgain;
do {
loopAgain = false;
try (Cursor hierarchyCursor = hierarchyDb.openCursor(tx, null)) {
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();
boolean parentReferencingRecordFound = false;
while (hierarchyCursor.getNext(key, value, LockMode.DEFAULT) == OperationStatus.SUCCESS) {
final TupleInput keyInput = new TupleInput(key.getData());
final UUID childId = entryToUuid(keyInput);
final String parentType = keyInput.readString();
final UUID parentId = entryToUuid(new TupleInput(value.getData()));
if (_parentRootCategory.equals(parentType)) {
parentReferencingRecordFound = true;
} else if (!records.contains(parentId)) {
System.out.format("Orphan UUID : %s (has unknown parent with UUID %s of type %s)\n", childId, parentId, parentType);
hierarchyCursor.delete();
configHierarchyRecordsDeleted++;
loopAgain = true;
DatabaseEntry uuidKey = new DatabaseEntry();
final TupleOutput tupleOutput = uuidToKey(childId);
TupleBase.outputToEntry(tupleOutput, uuidKey);
final OperationStatus delete = configDb.delete(tx, uuidKey);
if (delete == OperationStatus.SUCCESS) {
records.remove(childId);
configRecordDeleted++;
}
}
}
if (!parentReferencingRecordFound) {
throw new IllegalStateException(String.format("No hierarchy record found with root category type (%s)." + " Cannot modify store.", _parentRootCategory));
}
}
} while (loopAgain);
System.out.format("Identified %d orphaned configured object record(s) " + "and %d hierarchy records for purging\n", configRecordDeleted, configHierarchyRecordsDeleted);
}
}
}
Aggregations