use of com.sleepycat.bind.tuple.TupleInput in project qpid-broker-j by apache.
the class UpgradeFrom7To8 method performUpgrade.
@Override
public void performUpgrade(Environment environment, UpgradeInteractionHandler handler, ConfiguredObject<?> parent) {
reportStarting(environment, 7);
DatabaseConfig dbConfig = new DatabaseConfig();
dbConfig.setTransactional(true);
dbConfig.setAllowCreate(true);
Database hierarchyDb = environment.openDatabase(null, "CONFIGURED_OBJECT_HIERARCHY", dbConfig);
Database configuredObjectsDb = environment.openDatabase(null, "CONFIGURED_OBJECTS", dbConfig);
Database configVersionDb = environment.openDatabase(null, "CONFIG_VERSION", dbConfig);
Database messageMetadataDb = environment.openDatabase(null, "MESSAGE_METADATA", dbConfig);
Database messageMetadataSeqDb = environment.openDatabase(null, "MESSAGE_METADATA.SEQ", dbConfig);
long maxMessageId = getMaximumMessageId(messageMetadataDb);
createMessageMetadataSequence(messageMetadataSeqDb, maxMessageId);
Cursor objectsCursor = null;
String stringifiedConfigVersion = BrokerModel.MODEL_VERSION;
int configVersion = getConfigVersion(configVersionDb);
if (configVersion > -1) {
stringifiedConfigVersion = "0." + configVersion;
}
configVersionDb.close();
String virtualHostName = parent.getName();
Map<String, Object> virtualHostAttributes = new HashMap<String, Object>();
virtualHostAttributes.put("modelVersion", stringifiedConfigVersion);
virtualHostAttributes.put("name", virtualHostName);
UUID virtualHostId = UUIDGenerator.generateVhostUUID(virtualHostName);
ConfiguredObjectRecord virtualHostRecord = new org.apache.qpid.server.store.ConfiguredObjectRecordImpl(virtualHostId, "VirtualHost", virtualHostAttributes);
Transaction txn = environment.beginTransaction(null, null);
try {
objectsCursor = configuredObjectsDb.openCursor(txn, null);
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry value = new DatabaseEntry();
ObjectMapper mapper = new ObjectMapper();
while (objectsCursor.getNext(key, value, LockMode.RMW) == OperationStatus.SUCCESS) {
UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
TupleInput input = TupleBinding.entryToInput(value);
String type = input.readString();
String json = input.readString();
Map<String, Object> attributes = null;
try {
attributes = mapper.readValue(json, MAP_TYPE_REFERENCE);
} catch (Exception e) {
throw new StoreException(e);
}
String name = (String) attributes.get("name");
if (type.equals("Exchange")) {
_defaultExchanges.remove(name);
}
if (!type.endsWith("Binding")) {
storeVirtualHostHierarchyRecord(hierarchyDb, txn, id, virtualHostId);
} else {
try {
DatabaseEntry hierarchyKey = new DatabaseEntry();
DatabaseEntry hierarchyValue = new DatabaseEntry();
Object queueIdString = attributes.remove("queue");
if (queueIdString instanceof String) {
UUID queueId = UUID.fromString(queueIdString.toString());
UUIDTupleBinding.getInstance().objectToEntry(queueId, hierarchyValue);
TupleOutput tupleOutput = new TupleOutput();
tupleOutput.writeLong(id.getMostSignificantBits());
tupleOutput.writeLong(id.getLeastSignificantBits());
tupleOutput.writeString("Queue");
TupleBinding.outputToEntry(tupleOutput, hierarchyKey);
hierarchyDb.put(txn, hierarchyKey, hierarchyValue);
}
Object exchangeIdString = attributes.remove("exchange");
if (exchangeIdString instanceof String) {
UUID exchangeId = UUID.fromString(exchangeIdString.toString());
UUIDTupleBinding.getInstance().objectToEntry(exchangeId, hierarchyValue);
TupleOutput tupleOutput = new TupleOutput();
tupleOutput.writeLong(id.getMostSignificantBits());
tupleOutput.writeLong(id.getLeastSignificantBits());
tupleOutput.writeString("Exchange");
TupleBinding.outputToEntry(tupleOutput, hierarchyKey);
hierarchyDb.put(txn, hierarchyKey, hierarchyValue);
}
TupleOutput tupleOutput = new TupleOutput();
tupleOutput.writeString(type);
StringWriter writer = new StringWriter();
mapper.writeValue(writer, attributes);
tupleOutput.writeString(writer.getBuffer().toString());
TupleBinding.outputToEntry(tupleOutput, value);
objectsCursor.putCurrent(value);
} catch (IOException e) {
throw new StoreException(e);
}
}
}
} finally {
if (objectsCursor != null) {
objectsCursor.close();
}
}
storeConfiguredObjectEntry(configuredObjectsDb, txn, virtualHostRecord);
for (Map.Entry<String, String> defaultExchangeEntry : _defaultExchanges.entrySet()) {
UUID id = UUIDGenerator.generateExchangeUUID(defaultExchangeEntry.getKey(), virtualHostName);
Map<String, Object> exchangeAttributes = new HashMap<String, Object>();
exchangeAttributes.put("name", defaultExchangeEntry.getKey());
exchangeAttributes.put("type", defaultExchangeEntry.getValue());
exchangeAttributes.put("lifetimePolicy", "PERMANENT");
ConfiguredObjectRecord exchangeRecord = new org.apache.qpid.server.store.ConfiguredObjectRecordImpl(id, "Exchange", exchangeAttributes);
storeConfiguredObjectEntry(configuredObjectsDb, txn, exchangeRecord);
storeVirtualHostHierarchyRecord(hierarchyDb, txn, id, virtualHostId);
}
txn.commit();
hierarchyDb.close();
configuredObjectsDb.close();
messageMetadataDb.close();
messageMetadataSeqDb.close();
reportFinished(environment, 8);
}
use of com.sleepycat.bind.tuple.TupleInput in project qpid-broker-j by apache.
the class PreparedTransactionBinding method entryToObject.
public static PreparedTransaction entryToObject(final CachingUUIDFactory uuidFactory, final DatabaseEntry value) {
TupleInput input = TupleBinding.entryToInput(value);
Transaction.EnqueueRecord[] enqueues = readEnqueueRecords(uuidFactory, input);
Transaction.DequeueRecord[] dequeues = readDequeueRecords(uuidFactory, input);
return new PreparedTransaction(enqueues, dequeues);
}
use of com.sleepycat.bind.tuple.TupleInput 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);
}
}
}
use of com.sleepycat.bind.tuple.TupleInput in project qpid-broker-j by apache.
the class ConfiguredObjectBindingTest method testObjectToEntryAndEntryToObject.
@Test
public void testObjectToEntryAndEntryToObject() {
TupleOutput tupleOutput = new TupleOutput();
_configuredObjectBinding.objectToEntry(_object, tupleOutput);
byte[] entryAsBytes = tupleOutput.getBufferBytes();
TupleInput tupleInput = new TupleInput(entryAsBytes);
ConfiguredObjectRecord storedObject = _configuredObjectBinding.entryToObject(tupleInput);
assertEquals("Unexpected attributes", DUMMY_ATTRIBUTES_MAP, storedObject.getAttributes());
assertEquals("Unexpected type", DUMMY_TYPE_STRING, storedObject.getType());
}
use of com.sleepycat.bind.tuple.TupleInput in project qpid-broker-j by apache.
the class AMQShortStringEncodingTest method testWriteReadNullValues.
@Test
public void testWriteReadNullValues() {
// write into tuple output
TupleOutput tupleOutput = new TupleOutput();
AMQShortStringEncoding.writeShortString(null, tupleOutput);
byte[] data = tupleOutput.getBufferBytes();
// read from tuple input
TupleInput tupleInput = new TupleInput(data);
AMQShortString result = AMQShortStringEncoding.readShortString(tupleInput);
assertNull("Expected null but got " + result, result);
}
Aggregations