grumlin 0.22.0 → 0.22.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +6 -6
- data/README.md +1 -0
- data/lib/grumlin/repository/instance_methods.rb +24 -2
- data/lib/grumlin/request_error_factory.rb +16 -2
- data/lib/grumlin/version.rb +1 -1
- data/lib/grumlin.rb +3 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdd374421192255c1b8a9eb86bd3be6247992f5d480c87dfff44be0d03c81171
|
4
|
+
data.tar.gz: 0daa84321a8c03711739d3f236c4c3c99cc91d7366aa1c3be7cc9f504d1e4f47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80ab5b7c904b4fc5bffd9904ca0a07f8eecb278475b080ba0b2d9916c9c0e58a8dee3399ecbf34ab59ea8a93fa426e0edcfe31e8ad5a721262108db71cf8b4c2
|
7
|
+
data.tar.gz: c7c3fa75552675a033044e3afc7144cf435df7a7ddcc0d9c611ae926633057fd968d9cd1f41aa54d6f7c7c937cf41ebaacb39c748859742bb9939edb696238a5
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
grumlin (0.22.
|
4
|
+
grumlin (0.22.3)
|
5
5
|
async-pool (~> 0.3)
|
6
6
|
async-websocket (~> 0.19)
|
7
7
|
oj (~> 3.13)
|
@@ -21,17 +21,17 @@ GEM
|
|
21
21
|
console (~> 1.10)
|
22
22
|
nio4r (~> 2.3)
|
23
23
|
timers (~> 4.1)
|
24
|
-
async-http (0.
|
24
|
+
async-http (0.59.1)
|
25
25
|
async (>= 1.25)
|
26
26
|
async-io (>= 1.28)
|
27
27
|
async-pool (>= 0.2)
|
28
28
|
protocol-http (~> 0.23.1)
|
29
29
|
protocol-http1 (~> 0.14.0)
|
30
30
|
protocol-http2 (~> 0.14.0)
|
31
|
-
traces (
|
31
|
+
traces (>= 0.4.0)
|
32
32
|
async-io (1.33.0)
|
33
33
|
async
|
34
|
-
async-pool (0.3.
|
34
|
+
async-pool (0.3.11)
|
35
35
|
async (>= 1.25)
|
36
36
|
async-rspec (1.16.1)
|
37
37
|
rspec (~> 3.0)
|
@@ -81,7 +81,7 @@ GEM
|
|
81
81
|
parser (3.1.2.0)
|
82
82
|
ast (~> 2.4.1)
|
83
83
|
protocol-hpack (1.4.2)
|
84
|
-
protocol-http (0.23.
|
84
|
+
protocol-http (0.23.4)
|
85
85
|
protocol-http1 (0.14.4)
|
86
86
|
protocol-http (~> 0.22)
|
87
87
|
protocol-http2 (0.14.2)
|
@@ -157,7 +157,7 @@ GEM
|
|
157
157
|
thor (1.2.1)
|
158
158
|
tilt (2.0.10)
|
159
159
|
timers (4.3.3)
|
160
|
-
traces (0.
|
160
|
+
traces (0.6.0)
|
161
161
|
tzinfo (2.0.4)
|
162
162
|
concurrent-ruby (~> 1.0)
|
163
163
|
unicode-display_width (2.1.0)
|
data/README.md
CHANGED
@@ -249,6 +249,7 @@ Each `return_mode` is mapped to a particular termination step:
|
|
249
249
|
- `add_edge(label, id = nil, from:, to:, start: g, **properties)`
|
250
250
|
- `drop_vertex(id, start: g)`
|
251
251
|
- `drop_edge(id = nil, from: nil, to: nil, label: nil, start: g)`
|
252
|
+
- `drop_in_batches(traversal, batch_size: 10_000)`
|
252
253
|
|
253
254
|
and a few methods that emulate upserts:
|
254
255
|
- `upsert_vertex(label, id, create_properties: {}, update_properties: {}, on_failure: :retry, start: g, **params)`
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Grumlin
|
4
4
|
module Repository
|
5
|
-
module InstanceMethods
|
5
|
+
module InstanceMethods # rubocop:disable Metrics/ModuleLength
|
6
6
|
include Grumlin::Expressions
|
7
7
|
|
8
8
|
extend Forwardable
|
@@ -10,7 +10,7 @@ module Grumlin
|
|
10
10
|
UPSERT_RETRY_PARAMS = {
|
11
11
|
on: [Grumlin::AlreadyExistsError, Grumlin::ConcurrentModificationError],
|
12
12
|
sleep_method: ->(n) { Async::Task.current.sleep(n) },
|
13
|
-
tries:
|
13
|
+
tries: 5,
|
14
14
|
sleep: ->(n) { (n**2) + 1 + rand }
|
15
15
|
}.freeze
|
16
16
|
|
@@ -26,6 +26,28 @@ module Grumlin
|
|
26
26
|
start.V(id).drop.iterate
|
27
27
|
end
|
28
28
|
|
29
|
+
def drop_in_batches(traversal, batch_size: 10_000) # rubocop:disable Metrics/AbcSize
|
30
|
+
total_count = traversal.count.next
|
31
|
+
|
32
|
+
batches = (total_count / batch_size) + 1
|
33
|
+
|
34
|
+
Console.logger.info(self) do
|
35
|
+
"drop_in_batches: total_count: #{total_count}, batch_size: #{batch_size}, batches: #{batches}"
|
36
|
+
end
|
37
|
+
|
38
|
+
batches.times do |batch|
|
39
|
+
Console.logger.info(self) { "drop_in_batches: deleting batch #{batch + 1}/#{batches}..." }
|
40
|
+
traversal.limit(batch_size).drop.iterate
|
41
|
+
Console.logger.info(self) { "drop_in_batches: batch #{batch + 1}/#{batches} deleted" }
|
42
|
+
end
|
43
|
+
|
44
|
+
return if traversal.count.next.zero?
|
45
|
+
|
46
|
+
drop_in_batches(traversal, batch_size: batch_size)
|
47
|
+
|
48
|
+
Console.logger.info(self) { "drop_in_batches: finished." }
|
49
|
+
end
|
50
|
+
|
29
51
|
def drop_edge(id = nil, from: nil, to: nil, label: nil, start: g) # rubocop:disable Metrics/AbcSize
|
30
52
|
raise ArgumentError, "either id or from:, to: and label: must be passed" if [id, from, to, label].all?(&:nil?)
|
31
53
|
return start.E(id).drop.iterate unless id.nil?
|
@@ -18,11 +18,19 @@ module Grumlin
|
|
18
18
|
# {"detailedMessage":"",
|
19
19
|
# "requestId":"UUID",
|
20
20
|
# "code":"ConcurrentModificationException"}
|
21
|
-
#
|
21
|
+
# Currently we simply search for substrings to identify the exact error
|
22
22
|
# TODO: parse json and use `code` instead
|
23
|
+
|
23
24
|
VERTEX_ALREADY_EXISTS = "Vertex with id already exists:"
|
24
25
|
EDGE_ALREADY_EXISTS = "Edge with id already exists:"
|
26
|
+
|
25
27
|
CONCURRENT_VERTEX_INSERT_FAILED = "Failed to complete Insert operation for a Vertex due to conflicting concurrent"
|
28
|
+
|
29
|
+
CONCURRENT_VERTEX_PROPERTY_INSERT_FAILED =
|
30
|
+
"Failed to complete Insert operation for a VertexProperty due to conflicting concurrent"
|
31
|
+
CONCURRENT_EDGE_PROPERTY_INSERT_FAILED =
|
32
|
+
"Failed to complete Insert operation for a EdgeProperty due to conflicting concurrent"
|
33
|
+
|
26
34
|
CONCURRENT_EDGE_INSERT_FAILED = "Failed to complete Insert operation for an Edge due to conflicting concurrent"
|
27
35
|
CONCURRENCT_MODIFICATION_FAILED = "Failed to complete operation due to conflicting concurrent"
|
28
36
|
|
@@ -49,9 +57,15 @@ module Grumlin
|
|
49
57
|
return EdgeAlreadyExistsError if status[:message]&.include?(EDGE_ALREADY_EXISTS)
|
50
58
|
end
|
51
59
|
|
52
|
-
def concurrent_modification_error(status)
|
60
|
+
def concurrent_modification_error(status) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
53
61
|
return ConcurrentVertexInsertFailedError if status[:message]&.include?(CONCURRENT_VERTEX_INSERT_FAILED)
|
62
|
+
if status[:message]&.include?(CONCURRENT_VERTEX_PROPERTY_INSERT_FAILED)
|
63
|
+
return ConcurrentVertexPropertyInsertFailedError
|
64
|
+
end
|
54
65
|
return ConcurrentEdgeInsertFailedError if status[:message]&.include?(CONCURRENT_EDGE_INSERT_FAILED)
|
66
|
+
if status[:message]&.include?(CONCURRENT_EDGE_PROPERTY_INSERT_FAILED)
|
67
|
+
return ConcurrentEdgePropertyInsertFailedError
|
68
|
+
end
|
55
69
|
return ConcurrentModificationError if status[:message]&.include?(CONCURRENCT_MODIFICATION_FAILED)
|
56
70
|
end
|
57
71
|
end
|
data/lib/grumlin/version.rb
CHANGED
data/lib/grumlin.rb
CHANGED
@@ -107,6 +107,9 @@ module Grumlin
|
|
107
107
|
class ConcurrentVertexInsertFailedError < ConcurrentInsertFailedError; end
|
108
108
|
class ConcurrentEdgeInsertFailedError < ConcurrentInsertFailedError; end
|
109
109
|
|
110
|
+
class ConcurrentVertexPropertyInsertFailedError < ConcurrentInsertFailedError; end
|
111
|
+
class ConcurrentEdgePropertyInsertFailedError < ConcurrentInsertFailedError; end
|
112
|
+
|
110
113
|
class ServerSerializationError < ServerSideError; end
|
111
114
|
|
112
115
|
class ServerTimeoutError < ServerSideError; end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grumlin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.22.
|
4
|
+
version: 0.22.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gleb Sinyavskiy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: async-pool
|