use of org.apache.qpid.server.store.StoreException in project qpid-broker-j by apache.
the class MapBinding method objectToEntry.
@Override
public void objectToEntry(final Map<String, Object> map, final TupleOutput output) {
try {
StringWriter writer = new StringWriter();
final ObjectMapper objectMapper = ConfiguredObjectJacksonModule.newObjectMapper(true);
objectMapper.writeValue(writer, map);
output.writeString(writer.toString());
} catch (IOException e) {
throw new StoreException(e);
}
}
use of org.apache.qpid.server.store.StoreException in project qpid-broker-j by apache.
the class MessageMetaDataBinding method entryToObject.
@Override
public StorableMessageMetaData entryToObject(DatabaseEntry entry) {
try (DataInputStream stream = new DataInputStream(new ByteArrayInputStream(entry.getData(), entry.getOffset(), entry.getSize()))) {
final int bodySize = stream.readInt() ^ 0x80000000;
final int metaDataType = stream.readByte() & 0xff;
MessageMetaDataType type = MessageMetaDataTypeRegistry.fromOrdinal(metaDataType);
try (QpidByteBuffer buf = QpidByteBuffer.asQpidByteBuffer(stream)) {
return type.createMetaData(buf);
}
} catch (IOException | RuntimeException e) {
throw new StoreException(String.format("Unable to convert entry %s to metadata", entry));
}
}
use of org.apache.qpid.server.store.StoreException in project qpid-broker-j by apache.
the class UpgradeFrom4To5 method upgradeDelivery.
private Set<Long> upgradeDelivery(final Environment environment, final Set<String> existingQueues, final UpgradeInteractionHandler handler, Transaction transaction) {
final Set<Long> messagesToDiscard = new HashSet<Long>();
final Set<String> queuesToDiscard = new HashSet<String>();
final QueueEntryKeyBinding queueEntryKeyBinding = new QueueEntryKeyBinding();
LOGGER.info("Delivery Records");
CursorOperation databaseOperation = new CursorOperation() {
@Override
public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key, DatabaseEntry value) {
QueueEntryKey entryKey = queueEntryKeyBinding.entryToObject(key);
Long messageId = entryKey.getMessageId();
final String queueName = entryKey.getQueueName().toString();
if (!existingQueues.contains(queueName)) {
if (queuesToDiscard.contains(queueName)) {
messagesToDiscard.add(messageId);
} else {
String lineSeparator = System.getProperty("line.separator");
String question = MessageFormat.format("Found persistent messages for non-durable queue ''{1}''. " + " Do you with to create this queue and move all the messages into it?" + lineSeparator + "NOTE: Answering No will result in these messages being discarded!", queueName);
UpgradeInteractionResponse response = handler.requireResponse(question, UpgradeInteractionResponse.YES, UpgradeInteractionResponse.YES, UpgradeInteractionResponse.NO, UpgradeInteractionResponse.ABORT);
if (response == UpgradeInteractionResponse.YES) {
createQueue(environment, transaction, queueName);
existingQueues.add(queueName);
} else if (response == UpgradeInteractionResponse.NO) {
queuesToDiscard.add(queueName);
messagesToDiscard.add(messageId);
} else {
throw new StoreException("Unable is aborted!");
}
}
}
if (!messagesToDiscard.contains(messageId)) {
DatabaseEntry newKey = new DatabaseEntry();
queueEntryKeyBinding.objectToEntry(entryKey, newKey);
targetDatabase.put(transaction, newKey, value);
}
}
};
new DatabaseTemplate(environment, OLD_DELIVERY_DB, NEW_DELIVERY_DB, transaction).run(databaseOperation);
if (!messagesToDiscard.isEmpty()) {
databaseOperation = new CursorOperation() {
@Override
public void processEntry(Database sourceDatabase, Database targetDatabase, Transaction transaction, DatabaseEntry key, DatabaseEntry value) {
QueueEntryKey entryKey = queueEntryKeyBinding.entryToObject(key);
Long messageId = entryKey.getMessageId();
if (messagesToDiscard.contains(messageId)) {
messagesToDiscard.remove(messageId);
}
}
};
new DatabaseTemplate(environment, NEW_DELIVERY_DB, transaction).run(databaseOperation);
}
LOGGER.info(databaseOperation.getRowCount() + " Delivery Records entries ");
environment.removeDatabase(transaction, OLD_DELIVERY_DB);
return messagesToDiscard;
}
use of org.apache.qpid.server.store.StoreException in project qpid-broker-j by apache.
the class UpgradeFrom7To8 method storeConfiguredObjectEntry.
private void storeConfiguredObjectEntry(Database configuredObjectsDb, final Transaction txn, ConfiguredObjectRecord configuredObject) {
DatabaseEntry key = new DatabaseEntry();
UUIDTupleBinding uuidBinding = UUIDTupleBinding.getInstance();
uuidBinding.objectToEntry(configuredObject.getId(), key);
DatabaseEntry value = new DatabaseEntry();
ConfiguredObjectBinding configuredObjectBinding = ConfiguredObjectBinding.getInstance();
configuredObjectBinding.objectToEntry(configuredObject, value);
OperationStatus status = configuredObjectsDb.put(txn, key, value);
if (status != OperationStatus.SUCCESS) {
throw new StoreException("Error writing configured object " + configuredObject + " to database: " + status);
}
}
use of org.apache.qpid.server.store.StoreException 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);
}
Aggregations