@@ -40,6 +40,8 @@ class meta_op_term_t : public op_term_t {
40
40
virtual bool is_deterministic () const { return false ; }
41
41
};
42
42
43
+ // If you don't have to modify any of the data, use
44
+ // `const_rethreading_metadata_accessor_t` instead which is more efficient.
43
45
struct rethreading_metadata_accessor_t : public on_thread_t {
44
46
explicit rethreading_metadata_accessor_t (scope_env_t *env)
45
47
: on_thread_t(env->env->cluster_access.semilattice_metadata->home_thread ()),
@@ -51,13 +53,28 @@ struct rethreading_metadata_accessor_t : public on_thread_t {
51
53
{ }
52
54
cluster_semilattice_metadata_t metadata;
53
55
cow_ptr_t <namespaces_semilattice_metadata_t <rdb_protocol_t > >::change_t
54
- ns_change;
56
+ ns_change;
55
57
metadata_searcher_t <namespace_semilattice_metadata_t <rdb_protocol_t > >
56
- ns_searcher;
58
+ ns_searcher;
57
59
metadata_searcher_t <database_semilattice_metadata_t > db_searcher;
58
60
metadata_searcher_t <datacenter_semilattice_metadata_t > dc_searcher;
59
61
};
60
62
63
+ struct const_rethreading_metadata_accessor_t : public on_thread_t {
64
+ explicit const_rethreading_metadata_accessor_t (scope_env_t *env)
65
+ : on_thread_t(env->env->cluster_access.semilattice_metadata->home_thread ()),
66
+ metadata(env->env->cluster_access.semilattice_metadata->get ()),
67
+ ns_searcher(&metadata.rdb_namespaces.get()->namespaces),
68
+ db_searcher(&metadata.databases.databases),
69
+ dc_searcher(&metadata.datacenters.datacenters)
70
+ { }
71
+ cluster_semilattice_metadata_t metadata;
72
+ const_metadata_searcher_t <namespace_semilattice_metadata_t <rdb_protocol_t > >
73
+ ns_searcher;
74
+ const_metadata_searcher_t <database_semilattice_metadata_t > db_searcher;
75
+ const_metadata_searcher_t <datacenter_semilattice_metadata_t > dc_searcher;
76
+ };
77
+
61
78
62
79
class meta_write_op_t : public meta_op_term_t {
63
80
public:
@@ -94,7 +111,7 @@ class db_term_t : public meta_op_term_t {
94
111
name_string_t db_name = get_name (arg (env, 0 ), this , " Database" );
95
112
uuid_u uuid;
96
113
{
97
- rethreading_metadata_accessor_t meta (env);
114
+ const_rethreading_metadata_accessor_t meta (env);
98
115
uuid = meta_get_uuid (&meta.db_searcher , db_name,
99
116
strprintf (" Database `%s` does not exist." ,
100
117
db_name.c_str ()), this );
@@ -165,7 +182,7 @@ class table_create_term_t : public meta_write_op_t {
165
182
if (counted_t <val_t > v = optarg (env, " datacenter" )) {
166
183
name_string_t name = get_name (v, this , " Table" );
167
184
{
168
- rethreading_metadata_accessor_t meta (env);
185
+ const_rethreading_metadata_accessor_t meta (env);
169
186
dc_id = meta_get_uuid (&meta.dc_searcher , name,
170
187
strprintf (" Datacenter `%s` does not exist." ,
171
188
name.str ().c_str ()),
@@ -355,7 +372,7 @@ class db_list_term_t : public meta_op_term_t {
355
372
virtual counted_t <val_t > eval_impl (scope_env_t *env, UNUSED eval_flags_t flags) {
356
373
std::vector<std::string> dbs;
357
374
{
358
- rethreading_metadata_accessor_t meta (env);
375
+ const_rethreading_metadata_accessor_t meta (env);
359
376
for (auto it = meta.db_searcher .find_next (meta.db_searcher .begin ());
360
377
it != meta.db_searcher .end ();
361
378
it = meta.db_searcher .find_next (++it)) {
@@ -393,7 +410,7 @@ class table_list_term_t : public meta_op_term_t {
393
410
std::vector<std::string> tables;
394
411
namespace_predicate_t pred (&db_id);
395
412
{
396
- rethreading_metadata_accessor_t meta (env);
413
+ const_rethreading_metadata_accessor_t meta (env);
397
414
for (auto it = meta.ns_searcher .find_next (meta.ns_searcher .begin (), pred);
398
415
it != meta.ns_searcher .end ();
399
416
it = meta.ns_searcher .find_next (++it, pred)) {
0 commit comments