Search in sources :

Example 1 with TupleOutput

use of com.sleepycat.bind.tuple.TupleOutput 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);
        }
    }
}
Also used : DatabaseEntry(com.sleepycat.je.DatabaseEntry) Cursor(com.sleepycat.je.Cursor) TupleInput(com.sleepycat.bind.tuple.TupleInput) OperationStatus(com.sleepycat.je.OperationStatus) Database(com.sleepycat.je.Database) UUID(java.util.UUID) HashSet(java.util.HashSet) TupleOutput(com.sleepycat.bind.tuple.TupleOutput)

Example 2 with TupleOutput

use of com.sleepycat.bind.tuple.TupleOutput in project qpid-broker-j by apache.

the class PreparedTransactionBinding method objectToEntry.

public static void objectToEntry(final PreparedTransaction preparedTransaction, final DatabaseEntry value) {
    TupleOutput tupleOutput = new TupleOutput();
    writeRecords(preparedTransaction.getEnqueues(), tupleOutput);
    writeRecords(preparedTransaction.getDequeues(), tupleOutput);
    TupleBinding.outputToEntry(tupleOutput, value);
}
Also used : TupleOutput(com.sleepycat.bind.tuple.TupleOutput)

Example 3 with TupleOutput

use of com.sleepycat.bind.tuple.TupleOutput in project qpid-broker-j by apache.

the class UpgradeFrom4To5 method createQueue.

protected void createQueue(final Environment environment, Transaction transaction, final String queueName) {
    final QueueRecordBinding binding = new QueueRecordBinding(null);
    final BindingTuple bindingTuple = new BindingTuple();
    DatabaseRunnable queueCreateOperation = new DatabaseRunnable() {

        @Override
        public void run(Database newQueueDatabase, Database newBindingsDatabase, Transaction transaction) {
            AMQShortString queueNameAMQ = new AMQShortString(queueName);
            QueueRecord record = new QueueRecord(queueNameAMQ, null, false, null);
            DatabaseEntry key = new DatabaseEntry();
            TupleOutput output = new TupleOutput();
            AMQShortStringEncoding.writeShortString(record.getNameShortString(), output);
            TupleBase.outputToEntry(output, key);
            DatabaseEntry newValue = new DatabaseEntry();
            binding.objectToEntry(record, newValue);
            newQueueDatabase.put(transaction, key, newValue);
            FieldTable emptyArguments = new FieldTable();
            addBindingToDatabase(bindingTuple, newBindingsDatabase, transaction, queueNameAMQ, AMQShortString.valueOf(ExchangeDefaults.DIRECT_EXCHANGE_NAME), queueNameAMQ, emptyArguments);
            // TODO QPID-3490 we should not persist a default exchange binding
            addBindingToDatabase(bindingTuple, newBindingsDatabase, transaction, queueNameAMQ, AMQShortString.valueOf(ExchangeDefaults.DEFAULT_EXCHANGE_NAME), queueNameAMQ, emptyArguments);
        }
    };
    new DatabaseTemplate(environment, NEW_QUEUE_DB_NAME, NEW_BINDINGS_DB_NAME, transaction).run(queueCreateOperation);
}
Also used : AMQShortString(org.apache.qpid.server.protocol.v0_8.AMQShortString) Transaction(com.sleepycat.je.Transaction) FieldTable(org.apache.qpid.server.protocol.v0_8.FieldTable) Database(com.sleepycat.je.Database) DatabaseEntry(com.sleepycat.je.DatabaseEntry) TupleOutput(com.sleepycat.bind.tuple.TupleOutput)

Example 4 with TupleOutput

use of com.sleepycat.bind.tuple.TupleOutput in project qpid-broker-j by apache.

the class ConfiguredObjectBindingTest method testObjectToEntryAndEntryToObject.

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());
}
Also used : TupleInput(com.sleepycat.bind.tuple.TupleInput) ConfiguredObjectRecord(org.apache.qpid.server.store.ConfiguredObjectRecord) TupleOutput(com.sleepycat.bind.tuple.TupleOutput)

Example 5 with TupleOutput

use of com.sleepycat.bind.tuple.TupleOutput 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

TupleOutput (com.sleepycat.bind.tuple.TupleOutput)10 TupleInput (com.sleepycat.bind.tuple.TupleInput)6 DatabaseEntry (com.sleepycat.je.DatabaseEntry)5 AMQShortString (org.apache.qpid.server.protocol.v0_8.AMQShortString)4 Database (com.sleepycat.je.Database)3 Cursor (com.sleepycat.je.Cursor)2 Transaction (com.sleepycat.je.Transaction)2 UUID (java.util.UUID)2 ConfiguredObjectRecord (org.apache.qpid.server.store.ConfiguredObjectRecord)2 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 DatabaseConfig (com.sleepycat.je.DatabaseConfig)1 OperationStatus (com.sleepycat.je.OperationStatus)1 IOException (java.io.IOException)1 StringWriter (java.io.StringWriter)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 ConfiguredObject (org.apache.qpid.server.model.ConfiguredObject)1 FieldTable (org.apache.qpid.server.protocol.v0_8.FieldTable)1 StoreException (org.apache.qpid.server.store.StoreException)1