summaryrefslogtreecommitdiffstats
path: root/slobrok/src/tests/oldapi/mirror.h
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /slobrok/src/tests/oldapi/mirror.h
Publish
Diffstat (limited to 'slobrok/src/tests/oldapi/mirror.h')
-rw-r--r--slobrok/src/tests/oldapi/mirror.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/slobrok/src/tests/oldapi/mirror.h b/slobrok/src/tests/oldapi/mirror.h
new file mode 100644
index 00000000000..4bd100f5b5b
--- /dev/null
+++ b/slobrok/src/tests/oldapi/mirror.h
@@ -0,0 +1,135 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#ifndef Old_MIRROR_H
+#define Old_MIRROR_H
+
+#include <vespa/fnet/frt/frt.h>
+#include <vespa/vespalib/util/gencnt.h>
+#include <vespa/slobrok/backoff.h>
+
+namespace slobrok {
+namespace api {
+
+/**
+ * @brief Defines an interface for the name server lookup.
+ **/
+class IMirrorOld {
+protected:
+ static bool match(const char *name, const char *pattern);
+
+public:
+ /**
+ * @brief Release any allocated resources.
+ **/
+ virtual ~IMirrorOld() { }
+
+ /**
+ * @brief vector of <name, connectionspec> pairs.
+ *
+ * The first element of each pair is a string containing the
+ * service name. The second is the connection spec, typically
+ * "tcp/foo.bar.com:42"
+ **/
+ typedef std::vector< std::pair<std::string, std::string> > SpecList;
+
+ /**
+ * Obtain all the services matching a given pattern.
+ *
+ * The pattern is matched against all service names in the local
+ * mirror repository. A service name may contain '/' as a
+ * separator token. A pattern may contain '*' to match anything up
+ * to the next '/' (or the end of the name). This means that the
+ * pattern 'foo/<!-- slash-star -->*<!-- star-slash -->/baz' would
+ * match the service names 'foo/bar/baz' and 'foo/xyz/baz'. The
+ * pattern 'foo/b*' would match 'foo/bar', but neither 'foo/xyz'
+ * nor 'foo/bar/baz'. The pattern 'a*b' will never match anything.
+ *
+ * @return a list of all matching services, with corresponding connect specs
+ * @param pattern The pattern used for matching
+ **/
+ virtual SpecList lookup(const std::string & pattern) const = 0;
+
+ /**
+ * Obtain the number of updates seen by this mirror. The value may
+ * wrap, but will never become 0 again. This can be used for name
+ * lookup optimization, because the results returned by lookup()
+ * will never change unless this number also changes.
+ *
+ * @return number of slobrok updates seen
+ **/
+ virtual uint32_t updates() const = 0;
+};
+
+/**
+ * @brief A MirrorOld object is used to keep track of the services
+ * registered with a slobrok cluster.
+ *
+ * Updates to the service repository are fetched in the
+ * background. Lookups against this object is done using an internal
+ * mirror of the service repository.
+ **/
+class MirrorOld : public FNET_Task,
+ public FRT_IRequestWait,
+ public IMirrorOld
+{
+public:
+ /**
+ * @brief Create a new MirrorOld using the given Supervisor and slobrok
+ * connect specs.
+ *
+ * @param orb the Supervisor to use
+ * @param slobroks slobrok connect spec list
+ **/
+ MirrorOld(FRT_Supervisor &orb, const std::vector<std::string> &slobroks);
+
+ /**
+ * @brief Clean up.
+ **/
+ ~MirrorOld();
+
+ // Inherit doc from IMirrorOld.
+ SpecList lookup(const std::string & pattern) const;
+
+ // Inherit doc from IMirrorOld.
+ uint32_t updates() const { return _updates.getAsInt(); }
+
+ /**
+ * @brief Ask if the MirrorOld has got any useful information from
+ * the Slobrok
+ *
+ * On application startup it is often useful to run the event loop
+ * for some time until this functions returns true (or if it never
+ * does, time out and tell the user there was no answer from any
+ * Service Location Broker).
+ *
+ * @return true if the MirrorOld object has
+ * asked for updates from a Slobrok and got any answer back
+ **/
+ bool ready() const { return _updates.getAsInt() != 0; }
+
+private:
+ MirrorOld(const MirrorOld &);
+ MirrorOld &operator=(const MirrorOld &);
+
+ /** from FNET_Task, polls slobrok **/
+ void PerformTask();
+
+ /** from FRT_IRequestWait **/
+ void RequestDone(FRT_RPCRequest *req);
+
+ FRT_Supervisor &_orb;
+ mutable FastOS_Mutex _lock;
+ bool _reqDone;
+ SpecList _specs;
+ vespalib::GenCnt _specsGen;
+ vespalib::GenCnt _updates;
+ std::vector<std::string> _slobrokspecs;
+ uint32_t _idx;
+ BackOff _backOff;
+ FRT_Target *_target;
+ FRT_RPCRequest *_req;
+};
+
+} // namespace api
+} // namespace slobrok
+
+#endif