Search in sources :

Example 26 with StoreException

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);
    }
}
Also used : StringWriter(java.io.StringWriter) IOException(java.io.IOException) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) StoreException(org.apache.qpid.server.store.StoreException)

Example 27 with StoreException

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));
    }
}
Also used : ByteArrayInputStream(java.io.ByteArrayInputStream) QpidByteBuffer(org.apache.qpid.server.bytebuffer.QpidByteBuffer) IOException(java.io.IOException) DataInputStream(java.io.DataInputStream) MessageMetaDataType(org.apache.qpid.server.plugin.MessageMetaDataType) StoreException(org.apache.qpid.server.store.StoreException)

Example 28 with StoreException

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;
}
Also used : AMQShortString(org.apache.qpid.server.protocol.v0_8.AMQShortString) DatabaseEntry(com.sleepycat.je.DatabaseEntry) StoreException(org.apache.qpid.server.store.StoreException) Transaction(com.sleepycat.je.Transaction) Database(com.sleepycat.je.Database) HashSet(java.util.HashSet)

Example 29 with StoreException

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);
    }
}
Also used : ConfiguredObjectBinding(org.apache.qpid.server.store.berkeleydb.tuple.ConfiguredObjectBinding) OperationStatus(com.sleepycat.je.OperationStatus) UUIDTupleBinding(org.apache.qpid.server.store.berkeleydb.tuple.UUIDTupleBinding) DatabaseEntry(com.sleepycat.je.DatabaseEntry) StoreException(org.apache.qpid.server.store.StoreException)

Example 30 with StoreException

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);
}
Also used : HashMap(java.util.HashMap) DatabaseEntry(com.sleepycat.je.DatabaseEntry) Cursor(com.sleepycat.je.Cursor) TupleInput(com.sleepycat.bind.tuple.TupleInput) StringWriter(java.io.StringWriter) Database(com.sleepycat.je.Database) UUID(java.util.UUID) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) DatabaseConfig(com.sleepycat.je.DatabaseConfig) TupleOutput(com.sleepycat.bind.tuple.TupleOutput) IOException(java.io.IOException) StoreException(org.apache.qpid.server.store.StoreException) IOException(java.io.IOException) StoreException(org.apache.qpid.server.store.StoreException) Transaction(com.sleepycat.je.Transaction) ConfiguredObject(org.apache.qpid.server.model.ConfiguredObject) ConfiguredObjectRecord(org.apache.qpid.server.store.ConfiguredObjectRecord) HashMap(java.util.HashMap) Map(java.util.Map)

Aggregations

StoreException (org.apache.qpid.server.store.StoreException)70 SQLException (java.sql.SQLException)28 Connection (java.sql.Connection)23 PreparedStatement (java.sql.PreparedStatement)21 DatabaseEntry (com.sleepycat.je.DatabaseEntry)20 IOException (java.io.IOException)18 OperationStatus (com.sleepycat.je.OperationStatus)13 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)10 ResultSet (java.sql.ResultSet)10 UUID (java.util.UUID)8 Database (com.sleepycat.je.Database)7 ByteArrayInputStream (java.io.ByteArrayInputStream)7 HashMap (java.util.HashMap)7 Map (java.util.Map)7 ModelVersion (org.apache.qpid.server.model.ModelVersion)7 LinkKey (org.apache.qpid.server.protocol.v1_0.LinkKey)7 HashSet (java.util.HashSet)5 QpidByteBuffer (org.apache.qpid.server.bytebuffer.QpidByteBuffer)5 Cursor (com.sleepycat.je.Cursor)4 DatabaseConfig (com.sleepycat.je.DatabaseConfig)4