This repository was archived by the owner on Aug 26, 2024. It is now read-only.
forked from scylladb/cpp-driver
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcluster_metadata_resolver.hpp
More file actions
92 lines (71 loc) · 3 KB
/
cluster_metadata_resolver.hpp
File metadata and controls
92 lines (71 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
Copyright (c) DataStax, Inc.
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.
*/
#ifndef DATASTAX_INTERNAL_CLUSTER_METADATA_RESOLVER_HPP
#define DATASTAX_INTERNAL_CLUSTER_METADATA_RESOLVER_HPP
#include "address.hpp"
#include "allocated.hpp"
#include "callback.hpp"
#include "ref_counted.hpp"
#include "resolver.hpp"
#include <uv.h>
namespace datastax { namespace internal { namespace core {
struct ClusterSettings;
/**
* An abstract class for resolving contact points and other cluster metadata.
*/
class ClusterMetadataResolver : public RefCounted<ClusterMetadataResolver> {
public:
typedef SharedRefPtr<ClusterMetadataResolver> Ptr;
typedef internal::Callback<void, ClusterMetadataResolver*> Callback;
virtual ~ClusterMetadataResolver() {}
void resolve(uv_loop_t* loop, const AddressVec& contact_points, const Callback& callback) {
callback_ = callback;
internal_resolve(loop, contact_points);
}
virtual void cancel() { internal_cancel(); }
const AddressVec& resolved_contact_points() const { return resolved_contact_points_; }
const String& local_dc() const { return local_dc_; }
const String& local_rack() const { return local_rack_; }
protected:
virtual void internal_resolve(uv_loop_t* loop, const AddressVec& contact_points) = 0;
virtual void internal_cancel() = 0;
protected:
AddressVec resolved_contact_points_;
String local_dc_;
String local_rack_;
Callback callback_;
};
/**
* A interface for constructing instances of `ClusterMetadataResolver`s. The factory's instance
* creation method is passed the cluster settings object to allow cluster metadata resolvers to
* configure themselves with appropriate settings.
*/
class ClusterMetadataResolverFactory : public RefCounted<ClusterMetadataResolverFactory> {
public:
typedef SharedRefPtr<ClusterMetadataResolverFactory> Ptr;
virtual ~ClusterMetadataResolverFactory() {}
virtual ClusterMetadataResolver::Ptr new_instance(const ClusterSettings& settings) const = 0;
virtual const char* name() const = 0;
};
/**
* This factory creates cluster metadata resolvers that determine contact points using DNS.
* Domain names with multiple A-records are expanded into multiple contact points and addresses
* that are already resolved are passed through.
*/
class DefaultClusterMetadataResolverFactory : public ClusterMetadataResolverFactory {
public:
virtual ClusterMetadataResolver::Ptr new_instance(const ClusterSettings& settings) const;
virtual const char* name() const { return "Default"; }
};
}}} // namespace datastax::internal::core
#endif