/* * Node.actor.cpp * * This source file is part of the FoundationDB open source project * * Copyright 2013-2018 Apple Inc. and the FoundationDB project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "DirectoryLayer.h" namespace FDB { DirectoryLayer::Node::Node(Reference const& directoryLayer, Optional const& subspace, IDirectory::Path const& path, IDirectory::Path const& targetPath) : directoryLayer(directoryLayer), subspace(subspace), path(path), targetPath(targetPath), loadedMetadata(false) { } bool DirectoryLayer::Node::exists() const { return subspace.present(); } ACTOR Future loadMetadata(DirectoryLayer::Node *n, Reference tr) { if(!n->exists()){ n->loadedMetadata = true; return *n; } Optional> layer = wait(tr->get(n->subspace.get().pack(DirectoryLayer::LAYER_KEY))); n->layer = layer.present() ? layer.get() : Standalone(); n->loadedMetadata = true; return *n; } //Calls to loadMetadata must keep the Node alive while the future is outstanding Future DirectoryLayer::Node::loadMetadata(Reference tr) { return FDB::loadMetadata(this, tr); } bool DirectoryLayer::Node::isInPartition(bool includeEmptySubpath) const { ASSERT(loadedMetadata); return exists() && layer == DirectoryLayer::PARTITION_LAYER && (includeEmptySubpath || targetPath.size() > path.size()); } IDirectory::Path DirectoryLayer::Node::getPartitionSubpath() const { return Path(targetPath.begin() + path.size(), targetPath.end()); } Reference DirectoryLayer::Node::getContents() const { ASSERT(exists()); ASSERT(loadedMetadata); return directoryLayer->contentsOfNode(subspace.get(), path, layer); } }