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;
}
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);
}
}
Aggregations