google-cloud-bigtable 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/google-cloud-bigtable.rb +19 -21
- data/lib/google/cloud/bigtable.rb +11 -17
- data/lib/google/cloud/bigtable/app_profile.rb +148 -82
- data/lib/google/cloud/bigtable/app_profile/job.rb +5 -8
- data/lib/google/cloud/bigtable/app_profile/list.rb +11 -5
- data/lib/google/cloud/bigtable/chunk_processor.rb +23 -35
- data/lib/google/cloud/bigtable/cluster.rb +38 -11
- data/lib/google/cloud/bigtable/cluster/job.rb +3 -7
- data/lib/google/cloud/bigtable/cluster/list.rb +20 -18
- data/lib/google/cloud/bigtable/column_family.rb +22 -229
- data/lib/google/cloud/bigtable/column_family_map.rb +426 -0
- data/lib/google/cloud/bigtable/column_range.rb +9 -1
- data/lib/google/cloud/bigtable/convert.rb +12 -4
- data/lib/google/cloud/bigtable/errors.rb +4 -1
- data/lib/google/cloud/bigtable/gc_rule.rb +184 -65
- data/lib/google/cloud/bigtable/instance.rb +136 -126
- data/lib/google/cloud/bigtable/instance/cluster_map.rb +9 -7
- data/lib/google/cloud/bigtable/instance/job.rb +4 -3
- data/lib/google/cloud/bigtable/instance/list.rb +14 -9
- data/lib/google/cloud/bigtable/longrunning_job.rb +6 -0
- data/lib/google/cloud/bigtable/mutation_entry.rb +19 -23
- data/lib/google/cloud/bigtable/mutation_operations.rb +82 -29
- data/lib/google/cloud/bigtable/policy.rb +9 -5
- data/lib/google/cloud/bigtable/project.rb +62 -140
- data/lib/google/cloud/bigtable/read_modify_write_rule.rb +9 -4
- data/lib/google/cloud/bigtable/read_operations.rb +28 -41
- data/lib/google/cloud/bigtable/routing_policy.rb +171 -0
- data/lib/google/cloud/bigtable/row.rb +18 -7
- data/lib/google/cloud/bigtable/row_filter.rb +49 -20
- data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +71 -43
- data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +4 -1
- data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +74 -43
- data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +22 -7
- data/lib/google/cloud/bigtable/row_range.rb +5 -0
- data/lib/google/cloud/bigtable/rows_mutator.rb +14 -17
- data/lib/google/cloud/bigtable/rows_reader.rb +18 -14
- data/lib/google/cloud/bigtable/sample_row_key.rb +5 -2
- data/lib/google/cloud/bigtable/service.rb +161 -242
- data/lib/google/cloud/bigtable/status.rb +76 -0
- data/lib/google/cloud/bigtable/table.rb +141 -236
- data/lib/google/cloud/bigtable/table/cluster_state.rb +7 -1
- data/lib/google/cloud/bigtable/table/list.rb +14 -7
- data/lib/google/cloud/bigtable/value_range.rb +5 -0
- data/lib/google/cloud/bigtable/version.rb +1 -1
- metadata +27 -25
- data/lib/google/cloud/bigtable/table/column_family_map.rb +0 -70
@@ -17,6 +17,7 @@ module Google
|
|
17
17
|
module Cloud
|
18
18
|
module Bigtable
|
19
19
|
class AppProfile
|
20
|
+
##
|
20
21
|
# # Job
|
21
22
|
#
|
22
23
|
# A resource representing the long-running, asynchronous processing of
|
@@ -34,7 +35,7 @@ module Google
|
|
34
35
|
# bigtable = Google::Cloud::Bigtable.new
|
35
36
|
#
|
36
37
|
# instance = bigtable.instance("my-instance")
|
37
|
-
# app_profile =
|
38
|
+
# app_profile = instance.app_profile("my-app-profile")
|
38
39
|
#
|
39
40
|
# app_profile.description = "User data instance app profile"
|
40
41
|
# routing_policy = Google::Cloud::Bigtable::AppProfile.single_cluster_routing(
|
@@ -59,6 +60,7 @@ module Google
|
|
59
60
|
# end
|
60
61
|
#
|
61
62
|
class Job < LongrunningJob
|
63
|
+
##
|
62
64
|
# The instance that is the object of the operation.
|
63
65
|
#
|
64
66
|
# @return [Google::Cloud::Bigtable::AppProfile, nil] The app profile instance, or
|
@@ -70,7 +72,7 @@ module Google
|
|
70
72
|
# bigtable = Google::Cloud::Bigtable.new
|
71
73
|
#
|
72
74
|
# instance = bigtable.instance("my-instance")
|
73
|
-
# app_profile =
|
75
|
+
# app_profile = instance.app_profile("my-app-profile")
|
74
76
|
#
|
75
77
|
# app_profile.description = "User data instance app profile"
|
76
78
|
# routing_policy = Google::Cloud::Bigtable::AppProfile.single_cluster_routing(
|
@@ -81,11 +83,6 @@ module Google
|
|
81
83
|
#
|
82
84
|
# job = app_profile.save
|
83
85
|
#
|
84
|
-
# job.done? #=> false
|
85
|
-
# job.reload!
|
86
|
-
# job.done? #=> true
|
87
|
-
#
|
88
|
-
# # OR
|
89
86
|
# job.wait_until_done!
|
90
87
|
#
|
91
88
|
# app_profile = job.app_profile
|
@@ -93,7 +90,7 @@ module Google
|
|
93
90
|
def app_profile
|
94
91
|
return nil unless done?
|
95
92
|
return nil unless @grpc.grpc_op.result == :response
|
96
|
-
AppProfile.from_grpc
|
93
|
+
AppProfile.from_grpc @grpc.results, service
|
97
94
|
end
|
98
95
|
end
|
99
96
|
end
|
@@ -19,6 +19,7 @@ module Google
|
|
19
19
|
module Cloud
|
20
20
|
module Bigtable
|
21
21
|
class AppProfile
|
22
|
+
##
|
22
23
|
# AppProfile::List is a special-case array with additional
|
23
24
|
# values.
|
24
25
|
class List < DelegateClass(::Array)
|
@@ -33,9 +34,10 @@ module Google
|
|
33
34
|
# @private
|
34
35
|
# Creates a new AppProfile::List with an array of snapshot instances.
|
35
36
|
def initialize arr = []
|
36
|
-
super
|
37
|
+
super arr
|
37
38
|
end
|
38
39
|
|
40
|
+
##
|
39
41
|
# Whether there is a next page of instances.
|
40
42
|
#
|
41
43
|
# @return [Boolean]
|
@@ -51,10 +53,12 @@ module Google
|
|
51
53
|
# if app_profiles.next?
|
52
54
|
# next_app_profiles = app_profiles.next
|
53
55
|
# end
|
56
|
+
#
|
54
57
|
def next?
|
55
58
|
grpc.next_page?
|
56
59
|
end
|
57
60
|
|
61
|
+
##
|
58
62
|
# Retrieves the next page of app_profiles.
|
59
63
|
#
|
60
64
|
# @return [AppProfile::List] The list of instances.
|
@@ -70,14 +74,16 @@ module Google
|
|
70
74
|
# if app_profiles.next?
|
71
75
|
# next_app_profiles = app_profiles.next
|
72
76
|
# end
|
77
|
+
#
|
73
78
|
def next
|
74
79
|
ensure_grpc!
|
75
80
|
|
76
81
|
return nil unless next?
|
77
82
|
grpc.next_page
|
78
|
-
self.class.from_grpc
|
83
|
+
self.class.from_grpc grpc, service
|
79
84
|
end
|
80
85
|
|
86
|
+
##
|
81
87
|
# Retrieves remaining results by repeatedly invoking {#next} until
|
82
88
|
# {#next?} returns `false`. Calls the given block once for each
|
83
89
|
# result, which is passed as the argument to the block.
|
@@ -117,14 +123,14 @@ module Google
|
|
117
123
|
# end
|
118
124
|
#
|
119
125
|
def all
|
120
|
-
return enum_for
|
126
|
+
return enum_for :all unless block_given?
|
121
127
|
|
122
128
|
results = self
|
123
129
|
loop do
|
124
130
|
results.each { |r| yield r }
|
125
131
|
break unless next?
|
126
132
|
grpc.next_page
|
127
|
-
results = self.class.from_grpc
|
133
|
+
results = self.class.from_grpc grpc, service
|
128
134
|
end
|
129
135
|
end
|
130
136
|
|
@@ -136,7 +142,7 @@ module Google
|
|
136
142
|
def self.from_grpc grpc, service
|
137
143
|
app_profiles = List.new(
|
138
144
|
Array(grpc.response.app_profiles).map do |app_profile|
|
139
|
-
AppProfile.from_grpc
|
145
|
+
AppProfile.from_grpc app_profile, service
|
140
146
|
end
|
141
147
|
)
|
142
148
|
app_profiles.grpc = grpc
|
@@ -46,6 +46,7 @@ module Google
|
|
46
46
|
reset_to_new_row
|
47
47
|
end
|
48
48
|
|
49
|
+
##
|
49
50
|
# Process chunk and build full row with cells
|
50
51
|
#
|
51
52
|
# @param chunk [Google::Bigtable::V2::ReadRowsResponse::CellChunk]
|
@@ -53,12 +54,8 @@ module Google
|
|
53
54
|
def process chunk
|
54
55
|
self.chunk = chunk
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
chunk.value_size > 0,
|
59
|
-
"Commit rows cannot have a non-zero value_size."
|
60
|
-
)
|
61
|
-
end
|
57
|
+
|
58
|
+
raise_if chunk.value_size.positive?, "Commit rows cannot have a non-zero value_size." if chunk.commit_row
|
62
59
|
|
63
60
|
if state == NEW_ROW
|
64
61
|
process_new_row
|
@@ -69,6 +66,7 @@ module Google
|
|
69
66
|
end
|
70
67
|
end
|
71
68
|
|
69
|
+
##
|
72
70
|
# Validate row status commit or reset
|
73
71
|
#
|
74
72
|
# @raise [Google::Cloud::Bigtable::InvalidRowStateError]
|
@@ -81,11 +79,12 @@ module Google
|
|
81
79
|
chunk.family_name ||
|
82
80
|
chunk.qualifier ||
|
83
81
|
!chunk.value.empty? ||
|
84
|
-
chunk.timestamp_micros
|
82
|
+
chunk.timestamp_micros.positive?)
|
85
83
|
|
86
84
|
raise_if value, "A reset should have no data"
|
87
85
|
end
|
88
86
|
|
87
|
+
##
|
89
88
|
# Validate chunk has new row state
|
90
89
|
#
|
91
90
|
# @raise [Google::Cloud::Bigtable::InvalidRowStateError]
|
@@ -94,36 +93,29 @@ module Google
|
|
94
93
|
# or if family name or column qualifier are empty
|
95
94
|
#
|
96
95
|
def validate_new_row
|
97
|
-
raise_if
|
98
|
-
raise_if
|
99
|
-
raise_if
|
100
|
-
raise_if
|
101
|
-
|
102
|
-
|
103
|
-
)
|
104
|
-
raise_if(chunk.family_name.nil?, "A family must be set")
|
105
|
-
raise_if(chunk.qualifier.nil?, "A column qualifier must be set")
|
96
|
+
raise_if row.key, "A new row cannot have existing state"
|
97
|
+
raise_if chunk.row_key.empty?, "A row key must be set"
|
98
|
+
raise_if chunk.reset_row, "A new row cannot be reset"
|
99
|
+
raise_if last_key == chunk.row_key, "A commit happened but the same key followed"
|
100
|
+
raise_if chunk.family_name.nil?, "A family must be set"
|
101
|
+
raise_if chunk.qualifier.nil?, "A column qualifier must be set"
|
106
102
|
end
|
107
103
|
|
104
|
+
##
|
108
105
|
# Validate chunk merge is in progress to build new row
|
109
106
|
#
|
110
107
|
# @raise [Google::Cloud::Bigtable::InvalidRowStateError]
|
111
108
|
# If row and chunk row key are not same or chunk row key is empty.
|
112
109
|
#
|
113
110
|
def validate_row_in_progress
|
114
|
-
raise_if
|
115
|
-
!chunk.row_key.empty? && chunk.row_key != row.key,
|
116
|
-
"A commit is required between row keys"
|
117
|
-
)
|
111
|
+
raise_if !chunk.row_key.empty? && chunk.row_key != row.key, "A commit is required between row keys"
|
118
112
|
|
119
|
-
raise_if
|
120
|
-
chunk.family_name && chunk.qualifier.nil?,
|
121
|
-
"A qualifier must be specified"
|
122
|
-
)
|
113
|
+
raise_if chunk.family_name && chunk.qualifier.nil?, "A qualifier must be specified"
|
123
114
|
|
124
115
|
validate_reset_row
|
125
116
|
end
|
126
117
|
|
118
|
+
##
|
127
119
|
# Process new row by setting values from current chunk.
|
128
120
|
#
|
129
121
|
# @return [Google::Cloud::Bigtable::Row]
|
@@ -142,6 +134,7 @@ module Google
|
|
142
134
|
next_state!
|
143
135
|
end
|
144
136
|
|
137
|
+
##
|
145
138
|
# Process chunk if row state is in progress
|
146
139
|
#
|
147
140
|
# @return [Google::Cloud::Bigtable::Row]
|
@@ -158,6 +151,7 @@ module Google
|
|
158
151
|
next_state!
|
159
152
|
end
|
160
153
|
|
154
|
+
##
|
161
155
|
# Process chunk if row cell state is in progress
|
162
156
|
#
|
163
157
|
# @return [Google::Cloud::Bigtable::Row]
|
@@ -170,6 +164,7 @@ module Google
|
|
170
164
|
next_state!
|
171
165
|
end
|
172
166
|
|
167
|
+
##
|
173
168
|
# Set next state of row.
|
174
169
|
#
|
175
170
|
# @return [Google::Cloud::Bigtable::Row]
|
@@ -198,13 +193,7 @@ module Google
|
|
198
193
|
|
199
194
|
# Build cell and append to row.
|
200
195
|
def persist_cell
|
201
|
-
cell = Row::Cell.new
|
202
|
-
cur_family,
|
203
|
-
cur_qaul,
|
204
|
-
cur_ts,
|
205
|
-
cur_val,
|
206
|
-
cur_labels
|
207
|
-
)
|
196
|
+
cell = Row::Cell.new cur_family, cur_qaul, cur_ts, cur_val, cur_labels
|
208
197
|
row.cells[cur_family] << cell
|
209
198
|
|
210
199
|
# Clear cached cell values
|
@@ -224,6 +213,7 @@ module Google
|
|
224
213
|
self.cur_labels = nil
|
225
214
|
end
|
226
215
|
|
216
|
+
##
|
227
217
|
# Validate last row is completed
|
228
218
|
#
|
229
219
|
# @raise [Google::Cloud::Bigtable::InvalidRowStateError]
|
@@ -232,14 +222,12 @@ module Google
|
|
232
222
|
def validate_last_row_complete
|
233
223
|
return if row.key.nil?
|
234
224
|
|
235
|
-
raise_if
|
236
|
-
!chunk.commit_row,
|
237
|
-
"Response ended with pending row without commit"
|
238
|
-
)
|
225
|
+
raise_if !chunk.commit_row, "Response ended with pending row without commit"
|
239
226
|
end
|
240
227
|
|
241
228
|
private
|
242
229
|
|
230
|
+
##
|
243
231
|
# Raise error on condition failure
|
244
232
|
#
|
245
233
|
# @raise [Google::Cloud::Bigtable::InvalidRowStateError]
|
@@ -21,6 +21,7 @@ require "google/cloud/bigtable/cluster/job"
|
|
21
21
|
module Google
|
22
22
|
module Cloud
|
23
23
|
module Bigtable
|
24
|
+
##
|
24
25
|
# # Cluster
|
25
26
|
#
|
26
27
|
# A configuration object describing how Cloud Bigtable should treat traffic
|
@@ -54,59 +55,74 @@ module Google
|
|
54
55
|
@service = service
|
55
56
|
end
|
56
57
|
|
58
|
+
##
|
57
59
|
# The unique identifier for the project.
|
58
60
|
#
|
59
61
|
# @return [String]
|
62
|
+
#
|
60
63
|
def project_id
|
61
64
|
@grpc.name.split("/")[1]
|
62
65
|
end
|
63
66
|
|
67
|
+
##
|
64
68
|
# The unique identifier for the instance.
|
65
69
|
#
|
66
70
|
# @return [String]
|
71
|
+
#
|
67
72
|
def instance_id
|
68
73
|
@grpc.name.split("/")[3]
|
69
74
|
end
|
70
75
|
|
76
|
+
##
|
71
77
|
# The unique identifier for the cluster.
|
72
78
|
#
|
73
79
|
# @return [String]
|
80
|
+
#
|
74
81
|
def cluster_id
|
75
82
|
@grpc.name.split("/")[5]
|
76
83
|
end
|
77
84
|
|
85
|
+
##
|
78
86
|
# The unique name of the cluster. Value in the form
|
79
87
|
# `projects/<project_id>/instances/<instance_id>/clusters/<cluster_id>`.
|
80
88
|
#
|
81
89
|
# @return [String]
|
90
|
+
#
|
82
91
|
def path
|
83
92
|
@grpc.name
|
84
93
|
end
|
85
94
|
|
95
|
+
##
|
86
96
|
# The current instance state.
|
87
97
|
# Possible values are
|
88
98
|
# `:CREATING`, `:READY`, `:STATE_NOT_KNOWN`, `:RESIZING`, `:DISABLED`.
|
89
99
|
#
|
90
100
|
# @return [Symbol]
|
101
|
+
#
|
91
102
|
def state
|
92
103
|
@grpc.state
|
93
104
|
end
|
94
105
|
|
106
|
+
##
|
95
107
|
# The cluster has been successfully created and is ready to serve requests.
|
96
108
|
#
|
97
109
|
# @return [Boolean]
|
110
|
+
#
|
98
111
|
def ready?
|
99
112
|
state == :READY
|
100
113
|
end
|
101
114
|
|
115
|
+
##
|
102
116
|
# The instance is currently being created, and may be destroyed if the
|
103
117
|
# creation process encounters an error.
|
104
118
|
#
|
105
119
|
# @return [Boolean]
|
120
|
+
#
|
106
121
|
def creating?
|
107
122
|
state == :CREATING
|
108
123
|
end
|
109
124
|
|
125
|
+
##
|
110
126
|
# The cluster is currently being resized, and may revert to its previous
|
111
127
|
# node count if the process encounters an error.
|
112
128
|
# A cluster is still capable of serving requests while being resized,
|
@@ -114,59 +130,73 @@ module Google
|
|
114
130
|
# between the starting and requested states.
|
115
131
|
#
|
116
132
|
# @return [Boolean]
|
133
|
+
#
|
117
134
|
def resizing?
|
118
135
|
state == :RESIZING
|
119
136
|
end
|
120
137
|
|
138
|
+
##
|
121
139
|
# The cluster has no backing nodes. The data (tables) still
|
122
140
|
# exist, but no operations can be performed on the cluster.
|
123
141
|
#
|
124
142
|
# @return [Boolean]
|
143
|
+
#
|
125
144
|
def disabled?
|
126
145
|
state == :DISABLED
|
127
146
|
end
|
128
147
|
|
148
|
+
##
|
129
149
|
# The number of nodes allocated to this cluster.
|
130
150
|
#
|
131
151
|
# @return [Integer]
|
152
|
+
#
|
132
153
|
def nodes
|
133
154
|
@grpc.serve_nodes
|
134
155
|
end
|
135
156
|
|
157
|
+
##
|
136
158
|
# The number of nodes allocated to this cluster. More nodes enable higher
|
137
159
|
# throughput and more consistent performance.
|
138
160
|
#
|
139
161
|
# @param serve_nodes [Integer] Number of nodes
|
162
|
+
#
|
140
163
|
def nodes= serve_nodes
|
141
164
|
@grpc.serve_nodes = serve_nodes
|
142
165
|
end
|
143
166
|
|
167
|
+
##
|
144
168
|
# The type of storage used by this cluster to serve its
|
145
169
|
# parent instance's tables, unless explicitly overridden.
|
146
170
|
# Valid values are `:SSD`(Flash (SSD) storage should be used),
|
147
171
|
# `:HDD`(Magnetic drive (HDD) storage should be used)
|
148
172
|
#
|
149
173
|
# @return [Symbol]
|
174
|
+
#
|
150
175
|
def storage_type
|
151
176
|
@grpc.default_storage_type
|
152
177
|
end
|
153
178
|
|
179
|
+
##
|
154
180
|
# Cluster location.
|
155
181
|
# For example, "us-east1-b"
|
156
182
|
#
|
157
183
|
# @return [String]
|
184
|
+
#
|
158
185
|
def location
|
159
186
|
@grpc.location.split("/")[3]
|
160
187
|
end
|
161
188
|
|
189
|
+
##
|
162
190
|
# Cluster location path in form of
|
163
191
|
# `projects/<project_id>/locations/<zone>`
|
164
192
|
#
|
165
193
|
# @return [String]
|
194
|
+
#
|
166
195
|
def location_path
|
167
196
|
@grpc.location
|
168
197
|
end
|
169
198
|
|
199
|
+
##
|
170
200
|
# Update cluster.
|
171
201
|
#
|
172
202
|
# `serve_nodes` is the only updatable field
|
@@ -199,25 +229,22 @@ module Google
|
|
199
229
|
#
|
200
230
|
def save
|
201
231
|
ensure_service!
|
202
|
-
grpc = service.update_cluster
|
203
|
-
|
204
|
-
cluster_id,
|
205
|
-
location_path,
|
206
|
-
nodes
|
207
|
-
)
|
208
|
-
Cluster::Job.from_grpc(grpc, service)
|
232
|
+
grpc = service.update_cluster instance_id, cluster_id, location_path, nodes
|
233
|
+
Cluster::Job.from_grpc grpc, service
|
209
234
|
end
|
210
235
|
alias update save
|
211
236
|
|
237
|
+
##
|
212
238
|
# Reloads cluster information.
|
213
239
|
#
|
214
240
|
# @return [Google::Cloud::Bigtable::Cluster]
|
215
|
-
|
241
|
+
#
|
216
242
|
def reload!
|
217
|
-
@grpc = service.get_cluster
|
243
|
+
@grpc = service.get_cluster instance_id, cluster_id
|
218
244
|
self
|
219
245
|
end
|
220
246
|
|
247
|
+
##
|
221
248
|
# Permanently deletes the cluster.
|
222
249
|
#
|
223
250
|
# @return [Boolean] Returns `true` if the cluster was deleted.
|
@@ -233,7 +260,7 @@ module Google
|
|
233
260
|
#
|
234
261
|
def delete
|
235
262
|
ensure_service!
|
236
|
-
service.delete_cluster
|
263
|
+
service.delete_cluster instance_id, cluster_id
|
237
264
|
true
|
238
265
|
end
|
239
266
|
|
@@ -246,7 +273,7 @@ module Google
|
|
246
273
|
# @param service [Google::Cloud::Bigtable::Service]
|
247
274
|
# @return [Google::Cloud::Bigtable::Cluster]
|
248
275
|
def self.from_grpc grpc, service
|
249
|
-
new
|
276
|
+
new grpc, service
|
250
277
|
end
|
251
278
|
|
252
279
|
protected
|