Search in sources :

Example 26 with ObjectDatabase

use of org.locationtech.geogig.storage.ObjectDatabase in project GeoGig by boundlessgeo.

the class BinaryPackedChanges method write.

/**
     * Writes the set of changes to the provided output stream.
     * 
     * @param out the stream to write to
     * @param changes the changes to write
     * @throws IOException
     * @return the number of objects written
     */
public long write(OutputStream out, Iterator<DiffEntry> changes) throws IOException {
    final ObjectDatabase objectDatabase = repository.objectDatabase();
    out = new CountingOutputStream(out);
    // avoids sending the same metadata object multiple times
    Set<ObjectId> writtenMetadataIds = new HashSet<ObjectId>();
    // buffer to avoid ObjectId cloning its internal state for each object
    byte[] oidbuffer = new byte[ObjectId.NUM_BYTES];
    long objectCount = 0;
    while (changes.hasNext()) {
        DiffEntry diff = changes.next();
        if (diff.isDelete()) {
            out.write(CHUNK_TYPE.DIFF_ENTRY.value());
        } else {
            // its a change or an addition, new object is guaranteed to be present
            NodeRef newObject = diff.getNewObject();
            ObjectId metadataId = newObject.getMetadataId();
            if (writtenMetadataIds.contains(metadataId)) {
                out.write(CHUNK_TYPE.OBJECT_AND_DIFF_ENTRY.value());
            } else {
                out.write(CHUNK_TYPE.METADATA_OBJECT_AND_DIFF_ENTRY.value());
                RevObject metadata = objectDatabase.get(metadataId);
                writeObjectId(metadataId, out, oidbuffer);
                serializer.createObjectWriter(metadata.getType()).write(metadata, out);
                writtenMetadataIds.add(metadataId);
                objectCount++;
            }
            ObjectId objectId = newObject.objectId();
            writeObjectId(objectId, out, oidbuffer);
            RevObject object = objectDatabase.get(objectId);
            serializer.createObjectWriter(object.getType()).write(object, out);
            objectCount++;
        }
        DataOutput dataOut = new DataOutputStream(out);
        FormatCommonV1.writeDiff(diff, dataOut);
    }
    // signal the end of changes
    out.write(CHUNK_TYPE.FILTER_FLAG.value());
    final boolean filtersApplied = changes instanceof FilteredDiffIterator && ((FilteredDiffIterator) changes).wasFiltered();
    out.write(filtersApplied ? 1 : 0);
    LOGGER.info(String.format("Written %,d bytes to remote accounting for %,d objects.", ((CountingOutputStream) out).getCount(), objectCount));
    return objectCount;
}
Also used : DataOutput(java.io.DataOutput) ObjectId(org.locationtech.geogig.api.ObjectId) FormatCommonV1.readObjectId(org.locationtech.geogig.storage.datastream.FormatCommonV1.readObjectId) RevObject(org.locationtech.geogig.api.RevObject) DataOutputStream(java.io.DataOutputStream) NodeRef(org.locationtech.geogig.api.NodeRef) CountingOutputStream(com.google.common.io.CountingOutputStream) ObjectDatabase(org.locationtech.geogig.storage.ObjectDatabase) HashSet(java.util.HashSet) DiffEntry(org.locationtech.geogig.api.plumbing.diff.DiffEntry)

Example 27 with ObjectDatabase

use of org.locationtech.geogig.storage.ObjectDatabase in project GeoGig by boundlessgeo.

the class LocalRemoteRepo method walkHead.

protected void walkHead(final ObjectId newHeadId, final boolean fetch, final ProgressListener progress) {
    Repository from = localRepository;
    Repository to = remoteGeoGig.getRepository();
    if (fetch) {
        Repository tmp = to;
        to = from;
        from = tmp;
    }
    final ObjectDatabase fromDb = from.objectDatabase();
    final ObjectDatabase toDb = to.objectDatabase();
    final RevObject object = fromDb.get(newHeadId);
    RevCommit commit = null;
    RevTag tag = null;
    if (object.getType().equals(TYPE.COMMIT)) {
        commit = (RevCommit) object;
    } else if (object.getType().equals(TYPE.TAG)) {
        tag = (RevTag) object;
        commit = fromDb.getCommit(tag.getCommitId());
    }
    if (commit != null) {
        final RevTree newTree = fromDb.getTree(commit.getTreeId());
        List<ObjectId> parentIds = new ArrayList<>(commit.getParentIds());
        if (parentIds.isEmpty()) {
            parentIds.add(ObjectId.NULL);
        }
        RevTree oldTree = RevTree.EMPTY;
        // the diff against each parent is not working. For some reason some buckets that are
        // equal between the two ends of the comparison never get transferred (at some point
        // they shouldn't be equal and so the Consumer notified of it/them). Yet with the target
        // databse exists check for each tree the performance is good enough.
        // for (ObjectId parentId : parentIds) {
        // if (!parentId.isNull()) {
        // RevCommit parent = fromDb.getCommit(parentId);
        // oldTree = fromDb.getTree(parent.getTreeId());
        // }
        copyNewObjects(oldTree, newTree, fromDb, toDb, progress);
        // }
        Preconditions.checkState(toDb.exists(newTree.getId()));
        toDb.put(commit);
    }
    if (tag != null) {
        toDb.put(tag);
    }
}
Also used : Repository(org.locationtech.geogig.repository.Repository) RevTag(org.locationtech.geogig.api.RevTag) ObjectDatabase(org.locationtech.geogig.storage.ObjectDatabase) RevObject(org.locationtech.geogig.api.RevObject) ObjectId(org.locationtech.geogig.api.ObjectId) ArrayList(java.util.ArrayList) RevTree(org.locationtech.geogig.api.RevTree) RevCommit(org.locationtech.geogig.api.RevCommit)

Aggregations

ObjectDatabase (org.locationtech.geogig.storage.ObjectDatabase)27 RevTree (org.locationtech.geogig.api.RevTree)18 ObjectId (org.locationtech.geogig.api.ObjectId)13 RevObject (org.locationtech.geogig.api.RevObject)8 DiffEntry (org.locationtech.geogig.api.plumbing.diff.DiffEntry)8 Test (org.junit.Test)7 NodeRef (org.locationtech.geogig.api.NodeRef)7 RevCommit (org.locationtech.geogig.api.RevCommit)5 RevTreeBuilder (org.locationtech.geogig.api.RevTreeBuilder)5 CoordinateReferenceSystem (org.opengis.referencing.crs.CoordinateReferenceSystem)4 HashSet (java.util.HashSet)3 ReferencedEnvelope (org.geotools.geometry.jts.ReferencedEnvelope)3 Node (org.locationtech.geogig.api.Node)3 IOException (java.io.IOException)2 Iterator (java.util.Iterator)2 LinkedList (java.util.LinkedList)2 CommitBuilder (org.locationtech.geogig.api.CommitBuilder)2 ProgressListener (org.locationtech.geogig.api.ProgressListener)2 Ref (org.locationtech.geogig.api.Ref)2 TYPE (org.locationtech.geogig.api.RevObject.TYPE)2