in glean/rocksdb/rocksdb.cpp [1342:1438]
void DatabaseImpl::addDefineOwnership(DefineOwnership& def) {
auto t = makeAutoTimer("addDefineOwnership");
container_.requireOpen();
VLOG(1) << "addDefineOwnership: " <<
def.owners_.size() + def.new_owners_.size() << " owners, " <<
def.usets_.size() << " sets";
if (def.newSets_.size() > 0) {
folly::F14FastMap<UsetId,UsetId> substitution;
auto subst = [&](uint32_t old) -> uint32_t {
auto n = substitution.find(old);
if (n == substitution.end()) {
return old;
} else {
return n->second;
}
};
rocksdb::WriteBatch batch;
size_t numNewSets = 0;
for (auto uset : def.newSets_) {
std::set<UsetId> s;
uset->exp.set.foreach([&](uint32_t elt) {
s.insert(subst(elt));
});
SetU32 set = SetU32::from(s);
auto newUset = std::make_unique<Uset>(std::move(set), uset->exp.op, 0);
auto p = newUset.get();
auto oldId = uset->id;
auto q = usets_->add(std::move(newUset));
if (p == q) {
usets_->promote(p);
auto ownerset = p->toEliasFano();
putOwnerSet(batch, p->id, ownerset.op, ownerset.set);
ownerset.set.free();
numNewSets++;
}
VLOG(2) << "rebased set " << oldId << " -> " << q->id;
substitution[oldId] = q->id;
}
VLOG(1) << "addDefineOwnership: writing sets (" << numNewSets << ")";
check(container_.db->Write(container_.writeOptions, &batch));
for (auto& owner : def.owners_) {
owner = subst(owner);
}
}
// ownershipDerivedRaw :: (Pid,nat) -> vector<int64_t>
//
// Similarly to ownershipRaw, this is basically just an
// append-only log. The nat in the key is a per-Pid counter that
// we bump by one each time we add another batch of data for a
// Pid.
binary::Output key;
key.nat(def.pid_.toWord());
const auto [it, _] = ownership_derived_counters.insert(
{def.pid_.toWord(), 0});
key.nat(it->second++);
rocksdb::WriteBatch batch;
binary::Output val;
val.bytes(
def.ids_.data(),
def.ids_.size() *
sizeof(std::remove_reference<decltype(def.ids_)>::type::value_type));
val.bytes(
def.new_ids_.data(),
def.new_ids_.size() *
sizeof(std::remove_reference<decltype(def.new_ids_)>::type::value_type));
val.bytes(
def.owners_.data(),
def.owners_.size() *
sizeof(std::remove_reference<decltype(def.owners_)>::type::value_type));
val.bytes(
def.new_owners_.data(),
def.new_owners_.size() *
sizeof(std::remove_reference<decltype(def.new_owners_)>::type::value_type));
check(batch.Put(
container_.family(Family::ownershipDerivedRaw),
slice(key),
slice(val)));
check(container_.db->Write(container_.writeOptions, &batch));
VLOG(1) << "addDefineOwnership wrote " <<
def.ids_.size() + def.new_ids_.size() <<
" entries for pid " << def.pid_.toWord();
}