use of org.apache.qpid.server.store.ConfiguredObjectRecord 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 org.apache.qpid.server.store.ConfiguredObjectRecord in project qpid-broker-j by apache.
the class BDBHAVirtualHostNodeImpl method onMaster.
private void onMaster() {
boolean success = false;
try {
boolean firstOpening = false;
closeVirtualHostIfExist().get();
getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_START());
VirtualHostStoreUpgraderAndRecoverer upgraderAndRecoverer = new VirtualHostStoreUpgraderAndRecoverer(this);
if (getConfigurationStore().isOpen()) {
upgraderAndRecoverer.reloadAndRecover(getConfigurationStore());
} else {
getConfigurationStore().upgradeStoreStructure();
ConfiguredObjectRecord[] initialRecords = getInitialRecords();
if (upgraderAndRecoverer.upgradeAndRecover(getConfigurationStore(), initialRecords)) {
setAttributes(Collections.<String, Object>singletonMap(VIRTUALHOST_INITIAL_CONFIGURATION, "{}"));
firstOpening = initialRecords.length == 0;
}
}
getEventLogger().message(getConfigurationStoreLogSubject(), ConfigStoreMessages.RECOVERY_COMPLETE());
VirtualHost<?> host = getVirtualHost();
if (host == null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Creating new virtualhost with name : " + getGroupName());
}
Map<String, Object> hostAttributes = new HashMap<>();
hostAttributes.put(VirtualHost.MODEL_VERSION, BrokerModel.MODEL_VERSION);
hostAttributes.put(VirtualHost.NAME, getGroupName());
hostAttributes.put(VirtualHost.TYPE, BDBHAVirtualHostImpl.VIRTUAL_HOST_TYPE);
createChild(VirtualHost.class, hostAttributes);
} else {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Recovered virtualhost with name : " + getGroupName());
}
final VirtualHost<?> recoveredHost = host;
// so the following test should always return true
if (recoveredHost instanceof QueueManagingVirtualHost) {
((QueueManagingVirtualHost<?>) recoveredHost).setFirstOpening(firstOpening);
}
Subject.doAs(getSubjectWithAddedSystemRights(), new PrivilegedAction<Object>() {
@Override
public Object run() {
recoveredHost.open();
return null;
}
});
}
success = true;
} catch (Exception e) {
LOGGER.error("Failed to activate on hearing MASTER change event", e);
} finally {
setState(success ? State.ACTIVE : State.ERRORED);
}
}
use of org.apache.qpid.server.store.ConfiguredObjectRecord in project qpid-broker-j by apache.
the class TestBrokerConfiguration method removeObjectConfiguration.
public UUID[] removeObjectConfiguration(final Class<? extends ConfiguredObject> category, final String name) {
final ConfiguredObjectRecord entry = findObject(category, name);
if (entry != null) {
if (category == VirtualHostNode.class) {
final List<ConfiguredObjectRecord> aliasRecords = new ArrayList<>();
for (ConfiguredObjectRecord record : getConfiguredObjectRecords()) {
if (record.getType().equals(VirtualHostAlias.class.getSimpleName()) && name.equals(record.getAttributes().get(ConfiguredObject.NAME))) {
aliasRecords.add(record);
}
}
_store.remove(aliasRecords.toArray(new ConfiguredObjectRecord[aliasRecords.size()]));
}
return _store.remove(entry);
}
return null;
}
use of org.apache.qpid.server.store.ConfiguredObjectRecord in project qpid-broker-j by apache.
the class TestBrokerConfiguration method clearStore.
public void clearStore(final DurableConfigurationStore configurationStore) {
final List<ConfiguredObjectRecord> recordsToDelete = new ArrayList<>();
configurationStore.openConfigurationStore(new ConfiguredObjectRecordHandler() {
@Override
public void handle(final ConfiguredObjectRecord record) {
recordsToDelete.add(record);
}
});
if (!recordsToDelete.isEmpty()) {
configurationStore.remove(recordsToDelete.toArray(new ConfiguredObjectRecord[recordsToDelete.size()]));
}
}
use of org.apache.qpid.server.store.ConfiguredObjectRecord in project qpid-broker-j by apache.
the class TestBrokerConfiguration method setObjectAttribute.
private boolean setObjectAttribute(ConfiguredObjectRecord entry, String attributeName, Object value) {
Map<String, Object> attributes = new HashMap<String, Object>(entry.getAttributes());
attributes.put(attributeName, value);
ConfiguredObjectRecord newEntry = new ConfiguredObjectRecordImpl(entry.getId(), entry.getType(), attributes, entry.getParents());
_store.update(false, newEntry);
return true;
}
Aggregations