aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2016-09-02 14:24:34 -0400
committerShea Levy <shea@shealevy.com>2016-09-02 14:24:34 -0400
commita705e8ce0a8aaf3afe885892834468e95c197a16 (patch)
tree69703f6498c8e5047f90f1dcc26cdb3ae45c6e29
parent0f3963329018d9cf930e2a0e2b0ec2f4e26b40b3 (diff)
Factor a general remote FS accessor out of BinaryCacheStore
-rw-r--r--src/libstore/binary-cache-store.cc66
-rw-r--r--src/libstore/remote-fs-accessor.cc57
-rw-r--r--src/libstore/remote-fs-accessor.hh29
3 files changed, 88 insertions, 64 deletions
diff --git a/src/libstore/binary-cache-store.cc b/src/libstore/binary-cache-store.cc
index e71ea6a57..ab80e4032 100644
--- a/src/libstore/binary-cache-store.cc
+++ b/src/libstore/binary-cache-store.cc
@@ -6,8 +6,7 @@
#include "globals.hh"
#include "nar-info.hh"
#include "sync.hh"
-#include "worker-protocol.hh"
-#include "nar-accessor.hh"
+#include "remote-fs-accessor.hh"
#include "nar-info-disk-cache.hh"
#include <chrono>
@@ -232,70 +231,9 @@ Path BinaryCacheStore::addTextToStore(const string & name, const string & s,
return info.path;
}
-/* Given requests for a path /nix/store/<x>/<y>, this accessor will
- first download the NAR for /nix/store/<x> from the binary cache,
- build a NAR accessor for that NAR, and use that to access <y>. */
-struct BinaryCacheStoreAccessor : public FSAccessor
-{
- ref<BinaryCacheStore> store;
-
- std::map<Path, ref<FSAccessor>> nars;
-
- BinaryCacheStoreAccessor(ref<BinaryCacheStore> store)
- : store(store)
- {
- }
-
- std::pair<ref<FSAccessor>, Path> fetch(const Path & path_)
- {
- auto path = canonPath(path_);
-
- auto storePath = store->toStorePath(path);
- std::string restPath = std::string(path, storePath.size());
-
- if (!store->isValidPath(storePath))
- throw InvalidPath(format("path ‘%1%’ is not a valid store path") % storePath);
-
- auto i = nars.find(storePath);
- if (i != nars.end()) return {i->second, restPath};
-
- StringSink sink;
- store->narFromPath(storePath, sink);
-
- auto accessor = makeNarAccessor(sink.s);
- nars.emplace(storePath, accessor);
- return {accessor, restPath};
- }
-
- Stat stat(const Path & path) override
- {
- auto res = fetch(path);
- return res.first->stat(res.second);
- }
-
- StringSet readDirectory(const Path & path) override
- {
- auto res = fetch(path);
- return res.first->readDirectory(res.second);
- }
-
- std::string readFile(const Path & path) override
- {
- auto res = fetch(path);
- return res.first->readFile(res.second);
- }
-
- std::string readLink(const Path & path) override
- {
- auto res = fetch(path);
- return res.first->readLink(res.second);
- }
-};
-
ref<FSAccessor> BinaryCacheStore::getFSAccessor()
{
- return make_ref<BinaryCacheStoreAccessor>(ref<BinaryCacheStore>(
- std::dynamic_pointer_cast<BinaryCacheStore>(shared_from_this())));
+ return make_ref<RemoteFSAccessor>(ref<Store>(shared_from_this()));
}
}
diff --git a/src/libstore/remote-fs-accessor.cc b/src/libstore/remote-fs-accessor.cc
new file mode 100644
index 000000000..ca14057c2
--- /dev/null
+++ b/src/libstore/remote-fs-accessor.cc
@@ -0,0 +1,57 @@
+#include "remote-fs-accessor.hh"
+#include "nar-accessor.hh"
+
+namespace nix {
+
+
+RemoteFSAccessor::RemoteFSAccessor(ref<Store> store)
+ : store(store)
+{
+}
+
+std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path & path_)
+{
+ auto path = canonPath(path_);
+
+ auto storePath = store->toStorePath(path);
+ std::string restPath = std::string(path, storePath.size());
+
+ if (!store->isValidPath(storePath))
+ throw InvalidPath(format("path ‘%1%’ is not a valid store path") % storePath);
+
+ auto i = nars.find(storePath);
+ if (i != nars.end()) return {i->second, restPath};
+
+ StringSink sink;
+ store->narFromPath(storePath, sink);
+
+ auto accessor = makeNarAccessor(sink.s);
+ nars.emplace(storePath, accessor);
+ return {accessor, restPath};
+}
+
+FSAccessor::Stat RemoteFSAccessor::stat(const Path & path)
+{
+ auto res = fetch(path);
+ return res.first->stat(res.second);
+}
+
+StringSet RemoteFSAccessor::readDirectory(const Path & path)
+{
+ auto res = fetch(path);
+ return res.first->readDirectory(res.second);
+}
+
+std::string RemoteFSAccessor::readFile(const Path & path)
+{
+ auto res = fetch(path);
+ return res.first->readFile(res.second);
+}
+
+std::string RemoteFSAccessor::readLink(const Path & path)
+{
+ auto res = fetch(path);
+ return res.first->readLink(res.second);
+}
+
+}
diff --git a/src/libstore/remote-fs-accessor.hh b/src/libstore/remote-fs-accessor.hh
new file mode 100644
index 000000000..28f36c829
--- /dev/null
+++ b/src/libstore/remote-fs-accessor.hh
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "fs-accessor.hh"
+#include "ref.hh"
+#include "store-api.hh"
+
+namespace nix {
+
+class RemoteFSAccessor : public FSAccessor
+{
+ ref<Store> store;
+
+ std::map<Path, ref<FSAccessor>> nars;
+
+ std::pair<ref<FSAccessor>, Path> fetch(const Path & path_);
+public:
+
+ RemoteFSAccessor(ref<Store> store);
+
+ Stat stat(const Path & path) override;
+
+ StringSet readDirectory(const Path & path) override;
+
+ std::string readFile(const Path & path) override;
+
+ std::string readLink(const Path & path) override;
+};
+
+}