forked from hugegraph/hugegraph-sync
Compare commits
392 Commits
docker-1.0
...
master
| Author | SHA1 | Date |
|---|---|---|
|
|
0b794c9ab9 | |
|
|
7be8e6b1dd | |
|
|
0b24aca3cd | |
|
|
f88fad4711 | |
|
|
a767d73182 | |
|
|
0a0f2c3bfa | |
|
|
7dc6a86a7d | |
|
|
b087f085c1 | |
|
|
58f58ee094 | |
|
|
ba5b89e374 | |
|
|
1c577de9ba | |
|
|
4f0e4442ab | |
|
|
a038d2341c | |
|
|
df921e915d | |
|
|
7df736a77c | |
|
|
c231a6fddb | |
|
|
2e27c583b4 | |
|
|
459d4413b4 | |
|
|
dc3070f45b | |
|
|
162a104ebd | |
|
|
91f5b33bac | |
|
|
53f0e18216 | |
|
|
3427f42b81 | |
|
|
24ebe9da26 | |
|
|
7b9fd21d2a | |
|
|
d36e05ece8 | |
|
|
9baef8b255 | |
|
|
86e1003c16 | |
|
|
edb59ebaeb | |
|
|
73a4c9d028 | |
|
|
d6bc24e0f2 | |
|
|
5dfcc3f694 | |
|
|
899dc8e0f0 | |
|
|
85e096698a | |
|
|
bd83741f24 | |
|
|
882f3b7d65 | |
|
|
03b40a5244 | |
|
|
cedc000215 | |
|
|
9f89afc39a | |
|
|
37e71c4858 | |
|
|
e82a91ca1a | |
|
|
1e9752109e | |
|
|
506850caea | |
|
|
1a8959575c | |
|
|
ac93deebc6 | |
|
|
93c2e08780 | |
|
|
b056c5facd | |
|
|
c1e8ea5aba | |
|
|
253b8d38b8 | |
|
|
2b3bc4f28b | |
|
|
43cae1d2e3 | |
|
|
b4bc1f066a | |
|
|
7d335b2c72 | |
|
|
543bbfeb74 | |
|
|
906112c080 | |
|
|
6be756919b | |
|
|
3783247c74 | |
|
|
1228dec04d | |
|
|
d0a3ccc045 | |
|
|
6c72ca5f63 | |
|
|
f0d9d12ca7 | |
|
|
e605f732e2 | |
|
|
52f3d64b6a | |
|
|
3a1618faa2 | |
|
|
bd1d9db77b | |
|
|
b5d9dd2f02 | |
|
|
a560a6efee | |
|
|
37e4405c04 | |
|
|
483bca52ef | |
|
|
27cf52b007 | |
|
|
6a4041e21c | |
|
|
713d88d1fd | |
|
|
ef8f6128a3 | |
|
|
277f76ef03 | |
|
|
7b33574fd0 | |
|
|
c883f56a4e | |
|
|
0cfd8daed3 | |
|
|
c09982b0df | |
|
|
eb6570c992 | |
|
|
6861ed5e94 | |
|
|
3f127f01f1 | |
|
|
2e3adcde02 | |
|
|
47a68f098a | |
|
|
d0f63c8ac3 | |
|
|
dfee5bf6aa | |
|
|
eef3b355f6 | |
|
|
bc421bb197 | |
|
|
f6da2ee6cb | |
|
|
e79f1a5e73 | |
|
|
5cb9aad6ee | |
|
|
0b70e897f0 | |
|
|
0ee9a9b788 | |
|
|
75867796b7 | |
|
|
3f7dc2a8b2 | |
|
|
1d4532cd62 | |
|
|
b980df8697 | |
|
|
1dd0580d30 | |
|
|
de5904a600 | |
|
|
57cd0e8dd7 | |
|
|
7965aac70d | |
|
|
cf9ba8b310 | |
|
|
7635c67865 | |
|
|
965d6c137a | |
|
|
cb4427d9f1 | |
|
|
33fa9ed45d | |
|
|
4346b44f80 | |
|
|
2c6fcdc719 | |
|
|
44f99e968c | |
|
|
b52517cc47 | |
|
|
bd5d68f0f2 | |
|
|
bfe9fae150 | |
|
|
c997f35b04 | |
|
|
47aa8be850 | |
|
|
e8fb2696d6 | |
|
|
dcf3752515 | |
|
|
10f0a87c7b | |
|
|
20d1e5228e | |
|
|
8c93652de7 | |
|
|
ed493f3093 | |
|
|
d376b02dc5 | |
|
|
197e8a00ed | |
|
|
0c01475843 | |
|
|
c0ea21eed6 | |
|
|
5ad55fb82f | |
|
|
12b4940563 | |
|
|
25301f6228 | |
|
|
a6e1f232c2 | |
|
|
a7ad7ea100 | |
|
|
a9445ca3c3 | |
|
|
bce6d058f5 | |
|
|
69e6b461ad | |
|
|
4d5f4195db | |
|
|
70ab14e3e6 | |
|
|
e90489f361 | |
|
|
8db0a9b195 | |
|
|
b43526da60 | |
|
|
d4b95ca323 | |
|
|
73329ce4f5 | |
|
|
869fc81811 | |
|
|
45636a0489 | |
|
|
fc9bc2866e | |
|
|
30ef2f7c6b | |
|
|
d7c1c2149c | |
|
|
b49be05171 | |
|
|
4ceef1ab0c | |
|
|
8e99d85d33 | |
|
|
1d0969dede | |
|
|
aaf67cf81c | |
|
|
8a515f20db | |
|
|
77c76124af | |
|
|
4d7ad86776 | |
|
|
d12f5734e6 | |
|
|
b02c2bdaa7 | |
|
|
7927335303 | |
|
|
c922b10c31 | |
|
|
c31a53641f | |
|
|
5df28fa2ca | |
|
|
23776a7686 | |
|
|
8ee3d32b4f | |
|
|
5227248799 | |
|
|
80a4cd6877 | |
|
|
324cbb2c1f | |
|
|
258d1812ff | |
|
|
b836426db0 | |
|
|
b4e67e1dfb | |
|
|
b8c7743616 | |
|
|
bcf2a395cf | |
|
|
a946ad1de4 | |
|
|
e1d9607410 | |
|
|
f23c648937 | |
|
|
0f2faf48dc | |
|
|
297e491232 | |
|
|
267ff6d3a8 | |
|
|
7b6a4bd136 | |
|
|
6997a87d0c | |
|
|
9e4fb9647e | |
|
|
4b74ab6cec | |
|
|
6409d9277d | |
|
|
82c7e78a8c | |
|
|
901da45e59 | |
|
|
31c6c6df13 | |
|
|
a0f34d5973 | |
|
|
d968deb124 | |
|
|
6c0d596eac | |
|
|
76fa64498a | |
|
|
1d524760eb | |
|
|
271d72c9f3 | |
|
|
614d47159d | |
|
|
82f2a6539f | |
|
|
f9593d494b | |
|
|
6aa01af49e | |
|
|
6f9493a517 | |
|
|
e1cb3eb16c | |
|
|
8724b12032 | |
|
|
1f64e8afb0 | |
|
|
c28f8c8977 | |
|
|
e339fed6c9 | |
|
|
e400e4d22b | |
|
|
0239a1e174 | |
|
|
9463119a67 | |
|
|
a40774e484 | |
|
|
c86e38a8ac | |
|
|
37e221a712 | |
|
|
5bc993fe79 | |
|
|
4dbe157ecb | |
|
|
caa4b26a98 | |
|
|
952975a3c7 | |
|
|
7347b17a47 | |
|
|
16602cc839 | |
|
|
4361a51d9d | |
|
|
dc3e9e2bbd | |
|
|
ae54f28308 | |
|
|
b783da5bde | |
|
|
be72d20f8a | |
|
|
e85ab38c6b | |
|
|
3b1bcb1a99 | |
|
|
42ef9c4d95 | |
|
|
09b18191ed | |
|
|
745bd861af | |
|
|
4af14a9998 | |
|
|
589ee2ca10 | |
|
|
db84121d5d | |
|
|
deac513c43 | |
|
|
f2e838443d | |
|
|
d0e5971c7e | |
|
|
88d2f897ed | |
|
|
05fe7a4c92 | |
|
|
4b21e94ad2 | |
|
|
d695bd494d | |
|
|
922a4f6334 | |
|
|
8f0f2ba012 | |
|
|
4a1926fe40 | |
|
|
fbb743afeb | |
|
|
3b8933c3d3 | |
|
|
f5383d5541 | |
|
|
ee08712120 | |
|
|
24c3390379 | |
|
|
0789b1c8c1 | |
|
|
c572c2bedd | |
|
|
1d27452994 | |
|
|
53c6503cde | |
|
|
3881b86697 | |
|
|
49e8599d8f | |
|
|
535ae072f4 | |
|
|
efa8e97c4f | |
|
|
9101842200 | |
|
|
27dfd9d5a2 | |
|
|
74b954acf2 | |
|
|
f72fac400f | |
|
|
185a926a94 | |
|
|
aecaf4e86a | |
|
|
fe190141cc | |
|
|
d51efb6120 | |
|
|
6c800388a1 | |
|
|
159143c04d | |
|
|
265f74bb5f | |
|
|
98844d8c2a | |
|
|
3914813fb8 | |
|
|
1114e94924 | |
|
|
42e5260ba5 | |
|
|
ccc4d3bd6a | |
|
|
cde7763cc2 | |
|
|
c80f959579 | |
|
|
f4e861b3a8 | |
|
|
37de7be0ee | |
|
|
9962e0c9c9 | |
|
|
2d4a8eebf8 | |
|
|
630e19f8bc | |
|
|
9f329f5f3a | |
|
|
544599e316 | |
|
|
b4fb1f7443 | |
|
|
034e1a2513 | |
|
|
c2c5ba4689 | |
|
|
0d90ae4331 | |
|
|
fffccf1b2f | |
|
|
0a71d120f9 | |
|
|
4bd64ce8b5 | |
|
|
24b8a33e9c | |
|
|
8268b755ef | |
|
|
d78b728aa2 | |
|
|
49bff5eadc | |
|
|
4eda6313eb | |
|
|
0ff4b0e234 | |
|
|
41bc25ce85 | |
|
|
f8e65f83bd | |
|
|
cc463411ea | |
|
|
0436a14591 | |
|
|
ce75fb96e0 | |
|
|
88d8838209 | |
|
|
b525aef026 | |
|
|
85a6b7e24d | |
|
|
48a39fcef8 | |
|
|
2f453c0af9 | |
|
|
64bd1543e8 | |
|
|
1a66a60897 | |
|
|
0822dd93f6 | |
|
|
5ea077f13e | |
|
|
194ed53b85 | |
|
|
1eb2414134 | |
|
|
87c5826480 | |
|
|
306b4f1829 | |
|
|
95530cc4b3 | |
|
|
5bac575b29 | |
|
|
5f6012cbe4 | |
|
|
bbbc8e70f5 | |
|
|
6f20cb8bdc | |
|
|
476bb78315 | |
|
|
146e4bc362 | |
|
|
904f4260b9 | |
|
|
16fbcb354d | |
|
|
591d3f3834 | |
|
|
07793f9971 | |
|
|
1c7c839d45 | |
|
|
a4121451ce | |
|
|
553cd60b8f | |
|
|
1db56cfd86 | |
|
|
9db431015a | |
|
|
eed956d931 | |
|
|
50c7738056 | |
|
|
92ad62a9fb | |
|
|
4aae65cd4d | |
|
|
8c76d5b0cf | |
|
|
daa967d74d | |
|
|
544b94c919 | |
|
|
140cf845b5 | |
|
|
9346717bde | |
|
|
d6d92e4896 | |
|
|
aa222c4893 | |
|
|
c2db8f55d6 | |
|
|
887a4d5a9a | |
|
|
5183fb054a | |
|
|
1bf8d9e4c0 | |
|
|
56a60dca53 | |
|
|
12c65918b3 | |
|
|
cb33bbd436 | |
|
|
154e03054e | |
|
|
8d8333980c | |
|
|
fde9c72a0f | |
|
|
749a2d9d1f | |
|
|
2ae8e1571b | |
|
|
8219a10e74 | |
|
|
9f994b33de | |
|
|
fe8b51d072 | |
|
|
24ff820174 | |
|
|
8a44989e32 | |
|
|
7789bc87d8 | |
|
|
65032356e9 | |
|
|
1804fa7ee1 | |
|
|
3d3da162de | |
|
|
b01f3a35df | |
|
|
094f8bb56b | |
|
|
d8d4b3eba5 | |
|
|
5e003a7f2f | |
|
|
5195740642 | |
|
|
12c53cc17b | |
|
|
4d6c421358 | |
|
|
281aab85f2 | |
|
|
ca0a9832a6 | |
|
|
b4a6cc9ab4 | |
|
|
c24069ee26 | |
|
|
504069e17f | |
|
|
705c27b986 | |
|
|
f6cdc8a3ca | |
|
|
8bdac2c758 | |
|
|
a200deab56 | |
|
|
5cda854e8d | |
|
|
f33c09385d | |
|
|
dec8fe9a84 | |
|
|
dfd3190392 | |
|
|
b76e0eaeab | |
|
|
6052985c15 | |
|
|
e05d13098a | |
|
|
9faea02296 | |
|
|
5252a7e481 | |
|
|
0c580690cc | |
|
|
315000a600 | |
|
|
d3960c1da4 | |
|
|
9778a8b4b3 | |
|
|
171e723f50 | |
|
|
9a1417f3dc | |
|
|
9cc9cad29a | |
|
|
e88f54a21e | |
|
|
ec2599db9a | |
|
|
d592690cf7 | |
|
|
36959044a1 | |
|
|
7bdf878dd4 | |
|
|
5603b9c6a3 | |
|
|
cccef5d575 | |
|
|
db55e237a5 | |
|
|
3e5f626d11 | |
|
|
5f305526d7 | |
|
|
a5fa9016ec |
24
.asf.yaml
24
.asf.yaml
|
|
@ -34,23 +34,27 @@ github:
|
||||||
protected_branches:
|
protected_branches:
|
||||||
master:
|
master:
|
||||||
required_status_checks:
|
required_status_checks:
|
||||||
# strict means "Require branches to be up-to-date before merging".
|
# strict means "Require PR to be up-to-date before merging". (enable when branch unstable)
|
||||||
strict: true
|
strict: false
|
||||||
# contexts are the names of checks that must pass (now only enable the basic check)
|
# contexts are the names of checks that must pass (now only enable the basic check)
|
||||||
contexts:
|
contexts:
|
||||||
- Analyze (java)
|
- Analyze (java)
|
||||||
- CodeQL
|
- CodeQL
|
||||||
- build (memory, 8)
|
- check-license
|
||||||
- build (memory, 11)
|
- build-server (memory, 11)
|
||||||
|
- build-commons (11)
|
||||||
required_pull_request_reviews:
|
required_pull_request_reviews:
|
||||||
dismiss_stale_reviews: true
|
dismiss_stale_reviews: true
|
||||||
require_code_owner_reviews: false
|
require_code_owner_reviews: false
|
||||||
required_approving_review_count: 2
|
required_approving_review_count: 2
|
||||||
|
|
||||||
|
# refer https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features#Git.asf.yamlfeatures-Notificationsettingsforrepositories
|
||||||
notifications:
|
notifications:
|
||||||
pullrequests_status: dev@hugegraph.apache.org
|
# use https://selfserve.apache.org to manage it
|
||||||
# before use the config, we should ensure the "mail" address has set well (exist)
|
pullrequests_status: issues@hugegraph.apache.org
|
||||||
#pullrequests_comment: issues@hugegraph.apache.org
|
pullrequests_comment: issues@hugegraph.apache.org
|
||||||
#issues: issues@hugegraph.apache.org
|
pullrequests_bot_dependabot: issues@hugegraph.apache.org
|
||||||
#discussions: issues@hugegraph.apache.org
|
issues: issues@hugegraph.apache.org
|
||||||
|
issues_status: dev@hugegraph.apache.org
|
||||||
|
issues_comment: issues@hugegraph.apache.org
|
||||||
|
discussions: dev@hugegraph.apache.org
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,79 @@ root = true
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
end_of_line = lf
|
end_of_line = lf
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
|
max_line_length = 100
|
||||||
|
ij_wrap_on_typing = true
|
||||||
|
ij_visual_guides = 100
|
||||||
|
|
||||||
|
|
||||||
[*.{java,xml,py}]
|
[*.{java,xml,py}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
|
[*.{java,xml}]
|
||||||
|
# Ignore the IDEA unsupported warning & it works well (indeed)
|
||||||
|
continuation_indent_size = 8
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
max_line_length = off
|
||||||
|
|
||||||
|
[*.java]
|
||||||
|
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||||
|
ij_java_doc_do_not_wrap_if_one_line = true
|
||||||
|
ij_java_annotation_parameter_wrap = normal
|
||||||
|
ij_java_align_multiline_annotation_parameters = true
|
||||||
|
ij_java_class_count_to_use_import_on_demand = 100
|
||||||
|
ij_java_names_count_to_use_import_on_demand = 100
|
||||||
|
ij_java_imports_layout = $*, |, java.**, |, javax.**, |, org.**, |, com.**, |, *
|
||||||
|
|
||||||
|
ij_java_line_comment_at_first_column = false
|
||||||
|
ij_java_align_multiline_chained_methods = true
|
||||||
|
ij_java_align_multiline_parameters_in_calls = true
|
||||||
|
ij_java_align_multiline_binary_operation = true
|
||||||
|
ij_java_align_multiline_assignment = true
|
||||||
|
ij_java_align_multiline_ternary_operation = true
|
||||||
|
ij_java_align_multiline_throws_list = true
|
||||||
|
ij_java_align_multiline_extends_list = true
|
||||||
|
ij_java_align_multiline_array_initializer_expression = true
|
||||||
|
|
||||||
|
ij_java_call_parameters_wrap = normal
|
||||||
|
ij_java_method_parameters_wrap = normal
|
||||||
|
ij_java_resource_list_wrap = normal
|
||||||
|
ij_java_extends_list_wrap = normal
|
||||||
|
ij_java_throws_list_wrap = normal
|
||||||
|
ij_java_method_call_chain_wrap = normal
|
||||||
|
ij_java_binary_operation_wrap = normal
|
||||||
|
ij_java_ternary_operation_wrap = normal
|
||||||
|
ij_java_for_statement_wrap = normal
|
||||||
|
ij_java_array_initializer_wrap = normal
|
||||||
|
ij_java_assignment_wrap = normal
|
||||||
|
ij_java_assert_statement_wrap = normal
|
||||||
|
ij_java_if_brace_force = if_multiline
|
||||||
|
ij_java_do_while_brace_force = always
|
||||||
|
ij_java_while_brace_force = if_multiline
|
||||||
|
ij_java_for_brace_force = if_multiline
|
||||||
|
ij_java_wrap_long_lines = true
|
||||||
|
ij_java_parameter_annotation_wrap = normal
|
||||||
|
ij_java_enum_constants_wrap = split_into_lines
|
||||||
|
|
||||||
|
ij_java_keep_blank_lines_in_declarations = 1
|
||||||
|
ij_java_keep_blank_lines_in_code = 1
|
||||||
|
ij_java_keep_blank_lines_between_package_declaration_and_header = 1
|
||||||
|
ij_java_keep_blank_lines_before_right_brace = 1
|
||||||
|
ij_java_blank_lines_around_class = 1
|
||||||
|
ij_java_blank_lines_after_class_header = 1
|
||||||
|
|
||||||
|
ij_smart_tabs = true
|
||||||
|
|
||||||
|
[*.xml]
|
||||||
|
max_line_length = 120
|
||||||
|
ij_visual_guides = 120
|
||||||
|
ij_xml_text_wrap = off
|
||||||
|
ij_xml_space_inside_empty_tag = true
|
||||||
|
|
||||||
|
[.yaml]
|
||||||
|
ij_yaml_spaces_within_braces = false
|
||||||
|
ij_yaml_spaces_within_brackets = false
|
||||||
|
|
||||||
|
[.properties]
|
||||||
|
ij_properties_keep_blank_lines = true
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,12 @@
|
||||||
apache-release.sh export-ignore
|
apache-release.sh export-ignore
|
||||||
.licenserc.yaml export-ignore
|
.licenserc.yaml export-ignore
|
||||||
.editorconfig export-ignore
|
.editorconfig export-ignore
|
||||||
|
hugegraph-store/hg-store-dist/src/assembly/static/bin/libjemalloc.so export-ignore
|
||||||
|
hugegraph-store/hg-store-dist/src/assembly/static/bin/libjemalloc_aarch64.so export-ignore
|
||||||
|
|
||||||
# ignored directory
|
# ignored directory
|
||||||
.github/ export-ignore
|
.github/ export-ignore
|
||||||
hugegraph-dist/scripts/ export-ignore
|
.idea/ export-ignore
|
||||||
#assembly/ export-ignore
|
install-dist/scripts/ export-ignore
|
||||||
|
hugegraph-commons/hugegraph-dist/ export-ignore
|
||||||
|
docker/ export-ignore
|
||||||
|
|
|
||||||
|
|
@ -10,18 +10,18 @@ body:
|
||||||
value: >-
|
value: >-
|
||||||
### Note (特别注意) :
|
### Note (特别注意) :
|
||||||
|
|
||||||
> 1. 请先**搜索**现有的[Issues](https://github.com/hugegraph/hugegraph/issues) 与
|
> 1. 请先**搜索**现有的[Issues](https://github.com/apache/hugegraph/issues) 与
|
||||||
[FAQ](https://hugegraph.github.io/hugegraph-doc/guides/faq.html) 中没有与您相同
|
[FAQ](https://hugegraph.apache.org/docs/guides/faq/) 中没有与您相同
|
||||||
/ 相关的问题 (请勿重复提交)
|
/ 相关的问题 (请勿重复提交)
|
||||||
|
|
||||||
> 2. 我们需要尽可能**详细**的信息来**复现**问题, 越详细的信息 (包括**日志 / 截图 / 配置**等)
|
> 2. 我们需要尽可能**详细**的信息来**复现**问题, 越详细的信息 (包括**日志 / 截图 / 配置**等)
|
||||||
会**越快**被响应和处理
|
会**越快**被响应和处理
|
||||||
|
|
||||||
> 3. Issue 标题请保持原有模板分类(例如:`[Bug]`), 长段描述之间可以增加`空行`或使用`序号`标记, 保持排版清晰
|
> 3. Issue 标题请保留原有分类标签 (例如:`[Bug]`), 长段描述请增加`空行`并使用`序号`标记, 保持排版清晰
|
||||||
|
|
||||||
> 4. 请在对应的模块提交 issue, 缺乏有效信息 / 长时间 (> 14 天) 没有回复的 issue 可能会被 **关闭**
|
> 4. 请在对应的模块提交 issue, 缺乏有效信息 / 长时间 (> 14 天) 没有回复的 issue 可能会被 **关闭**
|
||||||
(更新时会再开启)
|
(更新时会再开启)
|
||||||
|
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
attributes:
|
attributes:
|
||||||
label: Bug Type (问题类型)
|
label: Bug Type (问题类型)
|
||||||
|
|
@ -31,36 +31,38 @@ body:
|
||||||
- other exception / error (其他异常报错)
|
- other exception / error (其他异常报错)
|
||||||
- server status (启动/运行异常)
|
- server status (启动/运行异常)
|
||||||
- logic (逻辑设计问题)
|
- logic (逻辑设计问题)
|
||||||
- performence (性能下降)
|
- performance (性能下降)
|
||||||
- others (please edit later)
|
- others (please edit later)
|
||||||
|
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Before submit
|
label: Before submit
|
||||||
options:
|
options:
|
||||||
- label: 我已经确认现有的 [Issues](https://github.com/hugegraph/hugegraph/issues) 与 [FAQ](https://hugegraph.github.io/hugegraph-doc/guides/faq.html) 中没有相同 / 重复问题
|
- label: '我已经确认现有的 [Issues](https://github.com/apache/hugegraph/issues) 与
|
||||||
|
[FAQ](https://hugegraph.apache.org/docs/guides/faq/) 中没有相同 / 重复问题 (I have confirmed
|
||||||
|
and searched that there are no similar problems in the historical issue and documents)'
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Environment (环境信息)
|
label: Environment (环境信息)
|
||||||
description: |
|
description: |
|
||||||
> server version could get from [rest-api](https://hugegraph.github.io/hugegraph-doc/clients/restful-api/other.html) (http://localhost:8080/versions)
|
> server version could get from [rest-api](https://hugegraph.apache.org/docs/clients/restful-api/) (http://localhost:8080/versions)
|
||||||
value: |
|
value: |
|
||||||
- Server Version: v0.11.x
|
- Server Version: 1.0.0 (Apache Release Version)
|
||||||
- Backend: RocksDB x nodes, HDD or SSD
|
- Backend: RocksDB x nodes, HDD or SSD
|
||||||
- OS: xx CPUs, xx G RAM, Centos 7.x
|
- OS: xx CPUs, xx G RAM, Ubuntu 2x.x / CentOS 7.x
|
||||||
- Data Size: xx vertices, xx edges <!-- (like 1000W 点, 9000W 边) -->
|
- Data Size: xx vertices, xx edges <!-- (like 1000W 点, 9000W 边) -->
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Expected & Actual behavior (期望与实际表现)
|
label: Expected & Actual behavior (期望与实际表现)
|
||||||
description: |
|
description: |
|
||||||
> we can refer [How to create a minimal reproducible Example](https://stackoverflow.com/help/minimal-reproducible-example) (如何提供最简的可复现用例)
|
> we can refer [How to create a minimal reproducible Example](https://stackoverflow.com/help/minimal-reproducible-example) (如何提供最简的可复现用例)
|
||||||
> if possible, please provide screenshots or GIF (请提供清晰的截图, 动图录屏更佳)
|
> if possible, please provide **screenshots** / Pic or `GIF` (请提供清晰的截图, 动图录屏更佳)
|
||||||
placeholder: |
|
placeholder: |
|
||||||
type the main problem here
|
type the main problem here
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
@ -69,7 +71,7 @@ body:
|
||||||
```
|
```
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Vertex/Edge example (问题点 / 边数据举例)
|
label: Vertex/Edge example (问题点 / 边数据举例)
|
||||||
|
|
@ -84,7 +86,7 @@ body:
|
||||||
"vertex": { "id": "xxx" }
|
"vertex": { "id": "xxx" }
|
||||||
}
|
}
|
||||||
render: javascript
|
render: javascript
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)
|
label: Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,9 @@ blank_issues_enabled: false
|
||||||
|
|
||||||
# 设置提 issue 前的参考文档
|
# 设置提 issue 前的参考文档
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: HugeGraph Server Doc
|
- name: HugeGraph Server Doc (EN/CN)
|
||||||
url: https://hugegraph.github.io/hugegraph-doc/quickstart/hugegraph-server.html
|
url: https://hugegraph.apache.org/docs/quickstart/hugegraph-server/
|
||||||
about: Please search question here before opening a new issue
|
about: Please search question here before opening a new issue
|
||||||
- name: HugeGraph API Doc
|
- name: HugeGraph API Doc (EN/CN)
|
||||||
url: https://hugegraph.github.io/hugegraph-doc/clients/hugegraph-api.html
|
url: https://hugegraph.apache.org/docs/clients/
|
||||||
about: Please search usage here before opening a new issue
|
about: Please search usage here before opening a new issue
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,6 @@ body:
|
||||||
label: Feature Description (功能描述)
|
label: Feature Description (功能描述)
|
||||||
description: |
|
description: |
|
||||||
> 请简要描述新功能 / 需求的使用场景或上下文, 最好能给个具体的例子说明
|
> 请简要描述新功能 / 需求的使用场景或上下文, 最好能给个具体的例子说明
|
||||||
placeholder: type the feature description here
|
placeholder: type the feature description here
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
|
||||||
|
|
@ -8,18 +8,18 @@ body:
|
||||||
value: >-
|
value: >-
|
||||||
### Note (特别注意) :
|
### Note (特别注意) :
|
||||||
|
|
||||||
> 1. 请先**搜索**现有的[Issues](https://github.com/hugegraph/hugegraph/issues) 与
|
> 1. 请先**搜索**现有的[Issues](https://github.com/apache/hugegraph/issues) 与
|
||||||
[FAQ](https://hugegraph.github.io/hugegraph-doc/guides/faq.html) 中没有与您相同
|
[FAQ](https://hugegraph.apache.org/docs/guides/faq/) 中没有与您相同
|
||||||
/ 相关的问题 (请勿重复提交)
|
/ 相关的问题 (请勿重复提交)
|
||||||
|
|
||||||
> 2. 我们需要尽可能**详细**的信息来**复现**问题, 越详细的信息 (包括**日志 / 截图 / 配置**等)
|
> 2. 我们需要尽可能**详细**的信息来**复现**问题, 越详细的信息 (包括**日志 / 截图 / 配置**等)
|
||||||
会**越快**被响应和处理
|
会**越快**被响应和处理
|
||||||
|
|
||||||
> 3. Issue 标题请保持原有模板分类(例如:`[Bug]`), 长段描述之间可以增加`空行`或使用`序号`标记, 保持排版清晰
|
> 3. Issue 标题请保留原有分类标签 (例如:`[Bug]`), 长段描述请增加`空行`并使用`序号`标记, 保持排版清晰
|
||||||
|
|
||||||
> 4. 请在对应的模块提交 issue, 缺乏有效信息 / 长时间 (> 14 天) 没有回复的 issue 可能会被 **关闭**
|
> 4. 请在对应的模块提交 issue, 缺乏有效信息 / 长时间 (> 14 天) 没有回复的 issue 可能会被 **关闭**
|
||||||
(更新时会再开启)
|
(更新时会再开启)
|
||||||
|
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
attributes:
|
attributes:
|
||||||
label: Problem Type (问题类型)
|
label: Problem Type (问题类型)
|
||||||
|
|
@ -29,37 +29,40 @@ body:
|
||||||
- server status (启动/运行异常)
|
- server status (启动/运行异常)
|
||||||
- configs (配置项 / 文档相关)
|
- configs (配置项 / 文档相关)
|
||||||
- struct / logic (架构 / 逻辑设计问题)
|
- struct / logic (架构 / 逻辑设计问题)
|
||||||
- performence (性能优化)
|
- performance (性能优化)
|
||||||
- other exception / error (其他异常报错)
|
- other exception / error (其他异常报错)
|
||||||
- others (please edit later)
|
- others (please edit later)
|
||||||
|
|
||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Before submit
|
label: Before submit
|
||||||
options:
|
options:
|
||||||
- label: 我已经确认现有的 [Issues](https://github.com/hugegraph/hugegraph/issues) 与 [FAQ](https://hugegraph.github.io/hugegraph-doc/guides/faq.html) 中没有相同 / 重复问题
|
- label: '我已经确认现有的 [Issues](https://github.com/apache/hugegraph/issues) 与
|
||||||
|
[FAQ](https://hugegraph.apache.org/docs/guides/faq/) 中没有相同 / 重复问题 (I have confirmed
|
||||||
|
and searched that there are no similar problems in the historical issue and documents)'
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Environment (环境信息)
|
label: Environment (环境信息)
|
||||||
description: |
|
description: |
|
||||||
> server version could get from [rest-api](https://hugegraph.github.io/hugegraph-doc/clients/restful-api/other.html) (http://localhost:8080/versions)
|
> server version could get from [rest-api](https://hugegraph.apache.org/docs/clients/restful-api/) (http://localhost:8080/versions)
|
||||||
value: |
|
value: |
|
||||||
- Server Version: v0.11.x
|
- Server Version: 1.0.0 (Apache Release Version)
|
||||||
- Backend: RocksDB x nodes, HDD or SSD
|
- Backend: RocksDB x nodes, HDD or SSD
|
||||||
- OS: xx CPUs, xx G RAM, Centos 7.x
|
- OS: xx CPUs, xx G RAM, Ubuntu 2x.x / CentOS 7.x
|
||||||
- Data Size: xx vertices, xx edges <!-- (like 1000W 点, 9000W 边) -->
|
- Data Size: xx vertices, xx edges <!-- (like 1000W 点, 9000W 边) -->
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Your Question (问题描述)
|
label: Your Question (问题描述)
|
||||||
description: |
|
description: |
|
||||||
> 图使用 / 配置相关问题,请优先参考 [REST-API 文档](https://hugegraph.github.io/hugegraph-doc/clients/hugegraph-api.html), 以及 [Server 配置文档](https://hugegraph.github.io/hugegraph-doc/config/config-option.html)
|
> 图使用 / 配置相关问题,请优先参考 [REST-API 文档](https://hugegraph.apache.org/docs/clients/restful-api/),
|
||||||
> if possible, please provide screenshots or GIF (请提供清晰的截图, 动图录屏更佳)
|
> 以及 [Server 配置文档](https://hugegraph.apache.org/docs/config/)
|
||||||
placeholder: |
|
> if possible, please provide **screenshots** / Pic or `GIF` (请提供清晰的截图, 动图录屏更佳)
|
||||||
|
placeholder: |
|
||||||
type the main problem here
|
type the main problem here
|
||||||
|
|
||||||
```java
|
```java
|
||||||
|
|
@ -68,7 +71,7 @@ body:
|
||||||
```
|
```
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Vertex/Edge example (问题点 / 边数据举例)
|
label: Vertex/Edge example (问题点 / 边数据举例)
|
||||||
|
|
@ -83,7 +86,7 @@ body:
|
||||||
"vertex": { "id": "xxx" }
|
"vertex": { "id": "xxx" }
|
||||||
}
|
}
|
||||||
render: javascript
|
render: javascript
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)
|
label: Schema [VertexLabel, EdgeLabel, IndexLabel] (元数据结构)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
<!--
|
||||||
|
Thank you very much for contributing to Apache HugeGraph, we are happy that you want to help us improve it!
|
||||||
|
|
||||||
|
Here are some tips for you:
|
||||||
|
1. If this is your first time, please read the [contributing guidelines](https://github.com/apache/hugegraph/blob/master/CONTRIBUTING.md)
|
||||||
|
|
||||||
|
2. If a PR fix/close an issue, type the message "close xxx" (xxx is the link of related
|
||||||
|
issue) in the content, GitHub will auto link it (Required)
|
||||||
|
|
||||||
|
3. Name the PR title in "Google Commit Format", start with "feat | fix | perf | refactor | doc | chore",
|
||||||
|
such like: "feat(core): support the PageRank algorithm" or "fix: wrong break in the compute loop" (module is optional)
|
||||||
|
skip it if you are unsure about which is the best component.
|
||||||
|
|
||||||
|
4. One PR address one issue, better not to mix up multiple issues.
|
||||||
|
|
||||||
|
5. Put an `x` in the `[ ]` to mark the item as CHECKED. `[x]` (or click it directly after
|
||||||
|
published)
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Purpose of the PR
|
||||||
|
|
||||||
|
- close #xxx <!-- or use "fix #xxx", "xxx" is the ID-link of related issue, e.g: close #1024 -->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Please explain more context in this section, clarify why the changes are needed.
|
||||||
|
e.g:
|
||||||
|
- If you propose a new API, clarify the use case for a new API.
|
||||||
|
- If you fix a bug, you can clarify why it is a bug, and should be associated with an issue.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Main Changes
|
||||||
|
|
||||||
|
<!-- Please clarify what changes you are proposing. The purpose of this section is to outline the changes and how this PR fixes the issue. These change logs are helpful for better and faster reviews.)
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
- If you introduce a new feature, please show detailed design here or add the link of design documentation.
|
||||||
|
- If you refactor some codes with changing classes, showing the class hierarchy will help reviewers.
|
||||||
|
- If there is a discussion in the mailing list, please add the link. -->
|
||||||
|
|
||||||
|
## Verifying these changes
|
||||||
|
|
||||||
|
<!-- Please pick the proper options below -->
|
||||||
|
|
||||||
|
- [ ] Trivial rework / code cleanup without any test coverage. (No Need)
|
||||||
|
- [ ] Already covered by existing tests, such as *(please modify tests here)*.
|
||||||
|
- [ ] Need tests and can be verified as follows:
|
||||||
|
- xxx
|
||||||
|
|
||||||
|
## Does this PR potentially affect the following parts?
|
||||||
|
|
||||||
|
<!-- DO NOT REMOVE THIS SECTION. CHECK THE PROPER BOX ONLY. -->
|
||||||
|
|
||||||
|
- [ ] Dependencies ([add/update license](https://hugegraph.apache.org/docs/contribution-guidelines/contribute/#321-check-licenses) info & [regenerate_dependencies](../hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh)) <!-- Don't forget to add/update the info in "LICENSE" & "NOTICE" files (both in root & dist module) -->
|
||||||
|
- [ ] Modify configurations
|
||||||
|
- [ ] The public API
|
||||||
|
- [ ] Other affects (typed here)
|
||||||
|
- [ ] Nope
|
||||||
|
|
||||||
|
|
||||||
|
## Documentation Status
|
||||||
|
|
||||||
|
<!-- DO NOT REMOVE THIS SECTION. CHECK THE PROPER BOX ONLY. -->
|
||||||
|
|
||||||
|
- [ ] `Doc - TODO` <!-- Your PR changes impact docs and you will update later -->
|
||||||
|
- [ ] `Doc - Done` <!-- Related docs have been already added or updated -->
|
||||||
|
- [ ] `Doc - No Need` <!-- Your PR changes don't impact/need docs -->
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||||
|
<servers>
|
||||||
|
<server>
|
||||||
|
<id>github</id>
|
||||||
|
<username>${env.GITHUB_ACTOR}</username>
|
||||||
|
<password>${env.GITHUB_TOKEN}</password>
|
||||||
|
</server>
|
||||||
|
</servers>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>local-repo</id>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>central</id>
|
||||||
|
<url>https://repo.maven.apache.org/maven2</url>
|
||||||
|
<releases>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>staged-releases</id>
|
||||||
|
<url>https://repository.apache.org/content/groups/staging/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
<pluginRepositories>
|
||||||
|
<pluginRepository>
|
||||||
|
<id>staged-releases</id>
|
||||||
|
<url>https://repository.apache.org/content/groups/staging/</url>
|
||||||
|
</pluginRepository>
|
||||||
|
</pluginRepositories>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
|
||||||
|
<activeProfiles>
|
||||||
|
<activeProfile>local-repo</activeProfile>
|
||||||
|
</activeProfiles>
|
||||||
|
</settings>
|
||||||
|
|
@ -115,7 +115,7 @@ env:
|
||||||
global:
|
global:
|
||||||
- RELEASE_BRANCH=^release-.*$
|
- RELEASE_BRANCH=^release-.*$
|
||||||
- RELEASE_TAG=^v[0-9]\..*$
|
- RELEASE_TAG=^v[0-9]\..*$
|
||||||
- TRAVIS_DIR=hugegraph-dist/src/assembly/travis
|
- TRAVIS_DIR=hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||||
- DEPLOYED=0
|
- DEPLOYED=0
|
||||||
- secure: dYmFTVeEtRzLNaHp9ToTV/+CkTD0/rEj+K7dRN8wsv/yg4pbqwnyWbSXcqMlj6iNFzAz3nPbmFLCvAWON9/SMN9iJIT6x/xfcf+LqCT8QWczo2nc9xeX144ij2VHX1Drvtk5fRTMaTXRfWEQIrjqx2yrJTIdrXWzWSaZLFv1CRCUizEiGGCePnzUWxx9dBypNyC6IaH6lIv8uN5E6+10SYhb7UJGjWUMDg1bCeW9X7X2wg4QpsGDzlGFXT2EBPU/dAb5attTAtW8dKxrCZqZJTPWe0BarXDBR4PO15BC+a0V1g8LwexedtDjJeFRcGPaJ5NN4d3jDSusCzt5Jf4U0Wa1gDRMVTU3jT+KYkm5eoV4wOZMySobjh6VpQH/LyL0QTDy5apRPAxw+wO+tc91P+nkJmnlr3pN8abtMZ6NciZizUBYQRgR/m2Ir0stvtbZxBQOATuPtBgNDKiDgVdSYcRJzSqYEMFOn35AvsDZ9aUsyC8k29PCUZ0gQO2Is6cV1ClFBnM52hfU9XX0gu+NviSnYNGvcokod8z9VjGtnM7V3LYjqXSFqO9kkMbOmkME1tD2Bh/klw2/OM+2tBBZiAgxB89st5jSUHI4a2hpUyaQBezJUcU9t2vVT/zAVEIqzw2PDxkMU7t0n6L1x+qUIUTG/WynfIni5msxuR7HoiU=
|
- secure: dYmFTVeEtRzLNaHp9ToTV/+CkTD0/rEj+K7dRN8wsv/yg4pbqwnyWbSXcqMlj6iNFzAz3nPbmFLCvAWON9/SMN9iJIT6x/xfcf+LqCT8QWczo2nc9xeX144ij2VHX1Drvtk5fRTMaTXRfWEQIrjqx2yrJTIdrXWzWSaZLFv1CRCUizEiGGCePnzUWxx9dBypNyC6IaH6lIv8uN5E6+10SYhb7UJGjWUMDg1bCeW9X7X2wg4QpsGDzlGFXT2EBPU/dAb5attTAtW8dKxrCZqZJTPWe0BarXDBR4PO15BC+a0V1g8LwexedtDjJeFRcGPaJ5NN4d3jDSusCzt5Jf4U0Wa1gDRMVTU3jT+KYkm5eoV4wOZMySobjh6VpQH/LyL0QTDy5apRPAxw+wO+tc91P+nkJmnlr3pN8abtMZ6NciZizUBYQRgR/m2Ir0stvtbZxBQOATuPtBgNDKiDgVdSYcRJzSqYEMFOn35AvsDZ9aUsyC8k29PCUZ0gQO2Is6cV1ClFBnM52hfU9XX0gu+NviSnYNGvcokod8z9VjGtnM7V3LYjqXSFqO9kkMbOmkME1tD2Bh/klw2/OM+2tBBZiAgxB89st5jSUHI4a2hpUyaQBezJUcU9t2vVT/zAVEIqzw2PDxkMU7t0n6L1x+qUIUTG/WynfIni5msxuR7HoiU=
|
||||||
- secure: XbX6AX5zDPc2PcWYAMW+6fazqRRUqpgQkt4eXUugLuVIYZBmJ0WqncEhJ4+mdwOGPIhnP2HsOaSeK2eE/O+iLY2XpBFbugoBgm9VaZlCC4CY1gRNHaanYg64Lrm3NPY3n08IHRMazHqMpJwUqNO+OG/6QwkepULQLj5Rluf716AoXHa7IEJhAIrwr+OXQvdEaJdUXlS1lRycXVeYtOewl7qYxCO4dD4RMhPlNykh9KEK7fd5wnPkiUsp1SwF4g5XsaLvGXmT/qQ1nj8oa9Caej/iaj6HMKG3BO057mq4KK5JDxTPWhBueNpEkUwldAnrMhYWLRnNf4IyjUsaB/Pmi6HspzcaiORPLYwPmdvLGGSnYwbtO+fAHebgpgOnj/vGmRmY4YtIkYdFtbPBI0HpbGB77tqNRFCe/5deLrjx0hXJBfoKTy7d42SI1eBhNR0svZYUHkSfuXwly6hMTlH1DN/bumMFxfXDkY9PFHlzV1Mn3vb9BxKTaP88hJsWk7JqgniqUF7EWAc0EhHMbJct2gC0pDc95z4Yy9391n7/XWJErhIdYon1Ukds5+a43xFXoy76gR4LuMDpzzCnutMjhC2yDuGaZx/DfkPBb5JFU7SHtTKj05zb73Moogi7qqbH8jwcwoSfogAKyrIAWTcAgvJ2LVnRzwdsiLTc6MEagiM=
|
- secure: XbX6AX5zDPc2PcWYAMW+6fazqRRUqpgQkt4eXUugLuVIYZBmJ0WqncEhJ4+mdwOGPIhnP2HsOaSeK2eE/O+iLY2XpBFbugoBgm9VaZlCC4CY1gRNHaanYg64Lrm3NPY3n08IHRMazHqMpJwUqNO+OG/6QwkepULQLj5Rluf716AoXHa7IEJhAIrwr+OXQvdEaJdUXlS1lRycXVeYtOewl7qYxCO4dD4RMhPlNykh9KEK7fd5wnPkiUsp1SwF4g5XsaLvGXmT/qQ1nj8oa9Caej/iaj6HMKG3BO057mq4KK5JDxTPWhBueNpEkUwldAnrMhYWLRnNf4IyjUsaB/Pmi6HspzcaiORPLYwPmdvLGGSnYwbtO+fAHebgpgOnj/vGmRmY4YtIkYdFtbPBI0HpbGB77tqNRFCe/5deLrjx0hXJBfoKTy7d42SI1eBhNR0svZYUHkSfuXwly6hMTlH1DN/bumMFxfXDkY9PFHlzV1Mn3vb9BxKTaP88hJsWk7JqgniqUF7EWAc0EhHMbJct2gC0pDc95z4Yy9391n7/XWJErhIdYon1Ukds5+a43xFXoy76gR4LuMDpzzCnutMjhC2yDuGaZx/DfkPBb5JFU7SHtTKj05zb73Moogi7qqbH8jwcwoSfogAKyrIAWTcAgvJ2LVnRzwdsiLTc6MEagiM=
|
||||||
|
|
|
||||||
|
|
@ -1,31 +1,56 @@
|
||||||
name: third-party dependencies check
|
name: "3rd-party"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
|
||||||
- /^release-.*$/
|
- /^release-.*$/
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
dependency-check:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
SCRIPT_DEPENDENCY: hugegraph-dist/scripts/dependency
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
SCRIPT_DEPENDENCY: install-dist/scripts/dependency
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout source
|
- name: Checkout source
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Set up JDK 8
|
- name: Set up JDK 11
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
java-version: '11'
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
|
|
||||||
|
- name: use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||||
|
|
||||||
- name: mvn install
|
- name: mvn install
|
||||||
run: |
|
run: |
|
||||||
mvn install -DskipTests=true
|
mvn install -Dmaven.test.skip=true -ntp
|
||||||
- name: generate current dependencies
|
- name: generate current dependencies
|
||||||
run: |
|
run: |
|
||||||
bash $SCRIPT_DEPENDENCY/regenerate_known_dependencies.sh current-dependencies.txt
|
bash $SCRIPT_DEPENDENCY/regenerate_known_dependencies.sh current-dependencies.txt
|
||||||
- name: check third dependencies
|
- name: check third dependencies
|
||||||
run: |
|
run: |
|
||||||
bash $SCRIPT_DEPENDENCY/check_dependencies.sh
|
bash $SCRIPT_DEPENDENCY/check_dependencies.sh
|
||||||
|
|
||||||
|
dependency-review:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: 'Checkout Repository'
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: 'Dependency Review'
|
||||||
|
uses: actions/dependency-review-action@v3
|
||||||
|
# Refer: https://github.com/actions/dependency-review-action
|
||||||
|
with:
|
||||||
|
# TODO: reset critical to low before releasing
|
||||||
|
fail-on-severity: critical
|
||||||
|
# Action will fail if dependencies don't match the list
|
||||||
|
#allow-licenses: Apache-2.0, MIT
|
||||||
|
#deny-licenses: GPL-3.0, AGPL-1.0, AGPL-3.0, LGPL-2.0, CC-BY-3.0
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,18 @@
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
|
||||||
# or to provide custom queries or build logic.
|
|
||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ master, release-*, v*.* ]
|
branches: [ master, release-* ]
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
# branches: [ master ] # enable in all PR
|
# branches: [ master ] # enable in all PRs
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '33 0 * * 5'
|
- cron: '33 0 * * 5'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
|
env:
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
name: Analyze
|
name: Analyze
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
|
|
@ -27,13 +27,19 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup Java JDK
|
- name: Setup Java JDK
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: 'zulu'
|
||||||
java-version: '8'
|
java-version: '11'
|
||||||
|
|
||||||
|
- name: use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
name: "HugeGraph-Commons CI"
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- /^release-.*$/
|
||||||
|
- /^test-.*$/
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-commons:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
# TODO: reset use stage to false later
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
JAVA_VERSION: ['11']
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: ${{ matrix.JAVA_VERSION }}
|
||||||
|
distribution: 'zulu'
|
||||||
|
|
||||||
|
- name: Cache Maven packages
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.m2
|
||||||
|
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: ${{ runner.os }}-m2
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 2
|
||||||
|
|
||||||
|
- name: Use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
cp -vf .github/configs/settings.xml $HOME/.m2/settings.xml && cat $HOME/.m2/settings.xml
|
||||||
|
|
||||||
|
- name: Compile
|
||||||
|
run: |
|
||||||
|
mvn compile -Dmaven.javadoc.skip=true -ntp
|
||||||
|
|
||||||
|
- name: Run common test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-commons/hugegraph-common -Dtest=UnitTestSuite
|
||||||
|
|
||||||
|
- name: Run rpc test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-commons/hugegraph-rpc -Dtest=UnitTestSuite
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3.0.0
|
||||||
|
with:
|
||||||
|
file: target/jacoco.xml
|
||||||
|
|
@ -1,17 +1,19 @@
|
||||||
name: License checker
|
name: "License Checker"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- /^v[0-9]\..*$/
|
- 'release-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-license:
|
check-license:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Check License Header
|
- name: Check License Header
|
||||||
uses: apache/skywalking-eyes@main
|
uses: apache/skywalking-eyes@main
|
||||||
|
|
@ -19,4 +21,11 @@ jobs:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
log: info
|
log: info
|
||||||
|
token: ${{ github.token }}
|
||||||
config: .licenserc.yaml
|
config: .licenserc.yaml
|
||||||
|
|
||||||
|
- name: License Check (RAT)
|
||||||
|
run: |
|
||||||
|
mvn apache-rat:check -ntp
|
||||||
|
find ./ -name rat.txt -print0 | xargs -0 -I file cat file > merged-rat.txt
|
||||||
|
grep "Binaries" merged-rat.txt -C 3 && cat merged-rat.txt
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,219 @@
|
||||||
|
name: "HugeGraph-PD & Store & Hstore CI"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- 'release-*'
|
||||||
|
- 'test-*'
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
# TODO: consider merge to one ci.yml file
|
||||||
|
jobs:
|
||||||
|
pd:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
# TODO: avoid duplicated env setup in pd & store
|
||||||
|
# TODO: reset use stage to false later
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
# TODO: remove outdated env
|
||||||
|
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||||
|
REPORT_DIR: target/site/jacoco
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install JDK 11
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '11'
|
||||||
|
distribution: 'zulu'
|
||||||
|
|
||||||
|
- name: Cache Maven packages
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.m2
|
||||||
|
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: ${{ runner.os }}-m2
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 5
|
||||||
|
|
||||||
|
- name: use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||||
|
|
||||||
|
- name: Run common test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-common-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run core test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-core-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
# The above tests do not require starting a PD instance.
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
run: |
|
||||||
|
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||||
|
|
||||||
|
- name: Prepare env and service
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/start-pd.sh
|
||||||
|
|
||||||
|
- name: Run client test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-client-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run rest test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-rest-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3.0.0
|
||||||
|
with:
|
||||||
|
file: ${{ env.REPORT_DIR }}/*.xml
|
||||||
|
|
||||||
|
store:
|
||||||
|
# TODO: avoid duplicated env setup
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
# TODO: remove outdated env
|
||||||
|
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||||
|
REPORT_DIR: target/site/jacoco
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install JDK 11
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '11'
|
||||||
|
distribution: 'zulu'
|
||||||
|
|
||||||
|
- name: Cache Maven packages
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.m2
|
||||||
|
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: ${{ runner.os }}-m2
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 5
|
||||||
|
|
||||||
|
- name: use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
run: |
|
||||||
|
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||||
|
|
||||||
|
- name: Prepare env and service
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/start-pd.sh
|
||||||
|
$TRAVIS_DIR/start-store.sh
|
||||||
|
|
||||||
|
- name: Run common test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-common-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run client test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-client-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run core test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-core-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run rocksdb test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-rocksdb-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run server test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-server-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Run raft-core test
|
||||||
|
run: |
|
||||||
|
mvn test -pl hugegraph-store/hg-store-test -am -P store-raftcore-test -DskipCommonsTests=true
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3.0.0
|
||||||
|
with:
|
||||||
|
file: ${{ env.REPORT_DIR }}/*.xml
|
||||||
|
|
||||||
|
hstore:
|
||||||
|
# TODO: avoid duplicated env setup
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||||
|
REPORT_DIR: target/site/jacoco
|
||||||
|
BACKEND: hstore
|
||||||
|
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') || startsWith(github.base_ref, 'release-') }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Install JDK 11
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '11'
|
||||||
|
distribution: 'zulu'
|
||||||
|
|
||||||
|
- name: Cache Maven packages
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ~/.m2
|
||||||
|
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: ${{ runner.os }}-m2
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 2
|
||||||
|
|
||||||
|
- name: use staged maven repo settings
|
||||||
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
|
run: |
|
||||||
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
|
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||||
|
|
||||||
|
- name: Package
|
||||||
|
run: |
|
||||||
|
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||||
|
|
||||||
|
- name: Prepare env and service
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/install-backend.sh $BACKEND
|
||||||
|
|
||||||
|
- name: Run unit test
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
||||||
|
|
||||||
|
- name: Run core test
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/run-core-test.sh $BACKEND
|
||||||
|
|
||||||
|
- name: Run api test
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
|
||||||
|
|
||||||
|
- name: Run raft test
|
||||||
|
if: ${{ env.BACKEND == 'rocksdb' }}
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/run-api-test-for-raft.sh $BACKEND $REPORT_DIR
|
||||||
|
|
||||||
|
- name: Run TinkerPop test
|
||||||
|
if: ${{ env.RELEASE_BRANCH == 'true' }}
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/run-tinkerpop-test.sh $BACKEND tinkerpop
|
||||||
|
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3.0.0
|
||||||
|
with:
|
||||||
|
file: ${{ env.REPORT_DIR }}/*.xml
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
name: hugegraph-ci
|
name: "HugeGraph-Server CI"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
|
@ -7,30 +7,48 @@ on:
|
||||||
- 'release-*'
|
- 'release-*'
|
||||||
- 'test-*'
|
- 'test-*'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
|
||||||
- '**'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build-server:
|
||||||
|
# TODO: we need test & replace it to ubuntu-24.04 or ubuntu-latest
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
TRAVIS_DIR: hugegraph-dist/src/assembly/travis
|
# TODO: reset use stage to false later
|
||||||
|
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||||
|
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||||
REPORT_DIR: target/site/jacoco
|
REPORT_DIR: target/site/jacoco
|
||||||
BACKEND: ${{ matrix.BACKEND }}
|
BACKEND: ${{ matrix.BACKEND }}
|
||||||
TRIGGER_BRANCH_NAME: ${{ github.ref_name }}
|
TRIGGER_BRANCH_NAME: ${{ github.ref_name }}
|
||||||
HEAD_BRANCH_NAME: ${{ github.head_ref }}
|
HEAD_BRANCH_NAME: ${{ github.head_ref }}
|
||||||
BASE_BRANCH_NAME: ${{ github.base_ref }}
|
BASE_BRANCH_NAME: ${{ github.base_ref }}
|
||||||
TARGET_BRANCH_NAME: ${{ github.base_ref != '' && github.base_ref || github.ref_name }}
|
TARGET_BRANCH_NAME: ${{ github.base_ref != '' && github.base_ref || github.ref_name }}
|
||||||
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') || startsWith(github.base_ref, 'release-') }}
|
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') }}
|
||||||
|
RAFT_MODE: ${{ startsWith(github.head_ref, 'test') || startsWith(github.head_ref, 'raft') }}
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
BACKEND: [ memory, cassandra, scylladb, hbase, rocksdb, mysql, postgresql ]
|
BACKEND: [ memory, rocksdb, hbase, cassandra, mysql, postgresql, scylladb ]
|
||||||
JAVA_VERSION: [ '8', '11' ]
|
JAVA_VERSION: [ '11' ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 5
|
||||||
|
|
||||||
|
# TODO: Remove this step after install-backend.sh updated
|
||||||
|
- name: Install Java8 for backend
|
||||||
|
uses: actions/setup-java@v3
|
||||||
|
with:
|
||||||
|
java-version: '8'
|
||||||
|
distribution: 'zulu'
|
||||||
|
|
||||||
|
- name: Prepare backend environment
|
||||||
|
run: |
|
||||||
|
$TRAVIS_DIR/install-backend.sh $BACKEND && jps -l
|
||||||
|
|
||||||
|
- name: Install Java ${{ matrix.JAVA_VERSION }}
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
java-version: ${{ matrix.JAVA_VERSION }}
|
java-version: ${{ matrix.JAVA_VERSION }}
|
||||||
|
|
@ -43,36 +61,16 @@ jobs:
|
||||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||||
restore-keys: ${{ runner.os }}-m2
|
restore-keys: ${{ runner.os }}-m2
|
||||||
|
|
||||||
- name: Checkout
|
- name: Use staged maven repo settings
|
||||||
uses: actions/checkout@v3
|
if: ${{ env.USE_STAGE == 'true' }}
|
||||||
with:
|
|
||||||
fetch-depth: 2
|
|
||||||
|
|
||||||
- name: License check(RAT)
|
|
||||||
run: |
|
run: |
|
||||||
mvn apache-rat:check -ntp
|
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||||
find ./ -name rat.txt -print0 | xargs -0 -I file cat file > merged-rat.txt
|
cp -vf .github/configs/settings.xml $HOME/.m2/settings.xml && cat $HOME/.m2/settings.xml
|
||||||
grep "Binaries" merged-rat.txt -C 3 && cat merged-rat.txt
|
|
||||||
|
|
||||||
- name: Compile
|
- name: Compile
|
||||||
run: |
|
run: |
|
||||||
mvn clean compile -U -Dmaven.javadoc.skip=true -ntp
|
mvn clean compile -U -Dmaven.javadoc.skip=true -ntp
|
||||||
|
|
||||||
- name: Install JDK 8
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: '8'
|
|
||||||
distribution: 'zulu'
|
|
||||||
- name: Prepare env and service
|
|
||||||
run: |
|
|
||||||
$TRAVIS_DIR/install-backend.sh $BACKEND
|
|
||||||
|
|
||||||
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: ${{ matrix.JAVA_VERSION }}
|
|
||||||
distribution: 'zulu'
|
|
||||||
|
|
||||||
- name: Run unit test
|
- name: Run unit test
|
||||||
run: |
|
run: |
|
||||||
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
||||||
|
|
@ -85,8 +83,9 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
$TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
|
$TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
|
||||||
|
|
||||||
|
# TODO: disable raft test in normal PR due to the always timeout problem
|
||||||
- name: Run raft test
|
- name: Run raft test
|
||||||
if: ${{ env.BACKEND == 'rocksdb' }}
|
if: ${{ env.RAFT_MODE == 'true' && env.BACKEND == 'rocksdb' }}
|
||||||
run: |
|
run: |
|
||||||
$TRAVIS_DIR/run-api-test-for-raft.sh $BACKEND $REPORT_DIR
|
$TRAVIS_DIR/run-api-test-for-raft.sh $BACKEND $REPORT_DIR
|
||||||
|
|
||||||
|
|
@ -96,6 +95,7 @@ jobs:
|
||||||
$TRAVIS_DIR/run-tinkerpop-test.sh $BACKEND tinkerpop
|
$TRAVIS_DIR/run-tinkerpop-test.sh $BACKEND tinkerpop
|
||||||
|
|
||||||
- name: Upload coverage to Codecov
|
- name: Upload coverage to Codecov
|
||||||
uses: codecov/codecov-action@v3.0.0
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
file: ${{ env.REPORT_DIR }}/*.xml
|
file: ${{ env.REPORT_DIR }}/*.xml
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
name: Mark stale issues and pull requests
|
name: "Mark stale issues and pull requests"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
|
|
@ -29,7 +29,7 @@ jobs:
|
||||||
days-before-pr-stale: 30
|
days-before-pr-stale: 30
|
||||||
days-before-pr-close: 180
|
days-before-pr-close: 180
|
||||||
operations-per-run: 10
|
operations-per-run: 10
|
||||||
start-date: '2017-10-01T00:00:00Z'
|
start-date: '2016-10-01T00:00:00Z'
|
||||||
|
|
||||||
exempt-all-assignees: true
|
exempt-all-assignees: true
|
||||||
remove-stale-when-updated: true
|
remove-stale-when-updated: true
|
||||||
|
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
name: Validate Apache Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
release_version:
|
|
||||||
required: true
|
|
||||||
default: '1.0.0'
|
|
||||||
deploy:
|
|
||||||
required: true
|
|
||||||
default: false
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
SCRIPT_PATH: hugegraph-dist/scripts/
|
|
||||||
steps:
|
|
||||||
- name: Checkout source
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Install JDK ${{ matrix.java_version }}
|
|
||||||
uses: actions/setup-java@v3
|
|
||||||
with:
|
|
||||||
java-version: ${{ matrix.java_version }}
|
|
||||||
distribution: 'adopt'
|
|
||||||
- name: Cache Maven packages
|
|
||||||
uses: actions/cache@v3
|
|
||||||
with:
|
|
||||||
path: ~/.m2
|
|
||||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
|
||||||
restore-keys: ${{ runner.os }}-m2
|
|
||||||
- name: Get Yarn path
|
|
||||||
id: yarn-cache-dir-path
|
|
||||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
|
||||||
- name: Cache Yarn packages
|
|
||||||
uses: actions/cache@v3
|
|
||||||
# use id to check `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
|
||||||
id: yarn-cache
|
|
||||||
with:
|
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
|
||||||
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-yarn-
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: do we need svn & gpg environment?
|
|
||||||
- name: Test Building Source & Running
|
|
||||||
run: |
|
|
||||||
bash $SCRIPT_PATH/validate-release.sh ${{ inputs.release_version }} ${{ matrix.java_version }}
|
|
||||||
- name: Test Running Binary
|
|
||||||
run: |
|
|
||||||
echo "TODO: separate script to test binary"
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
java_version: [ '8', '11' ]
|
|
||||||
|
|
@ -19,8 +19,9 @@ gen-java
|
||||||
.svn
|
.svn
|
||||||
|
|
||||||
### IntelliJ IDEA ###
|
### IntelliJ IDEA ###
|
||||||
.idea
|
.idea/*
|
||||||
.idea/
|
!.idea/vcs.xml
|
||||||
|
!.idea/icon.png
|
||||||
*.iws
|
*.iws
|
||||||
*.iml
|
*.iml
|
||||||
*.ipr
|
*.ipr
|
||||||
|
|
@ -56,7 +57,7 @@ build/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
|
||||||
# maven ignore
|
# maven ignore
|
||||||
apache-hugegraph-incubating-*/
|
apache-hugegraph-*/
|
||||||
output/
|
output/
|
||||||
*.war
|
*.war
|
||||||
*.zip
|
*.zip
|
||||||
|
|
@ -83,3 +84,6 @@ hs_err_pid*
|
||||||
.mtj.tmp/
|
.mtj.tmp/
|
||||||
# blueJ files
|
# blueJ files
|
||||||
*.ctxt
|
*.ctxt
|
||||||
|
|
||||||
|
# docker volumes ignore
|
||||||
|
hugegraph-server/hugegraph-dist/docker/data/
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project version="4">
|
||||||
|
<component name="IssueNavigationConfiguration">
|
||||||
|
<option name="links">
|
||||||
|
<list>
|
||||||
|
<IssueNavigationLink>
|
||||||
|
<option name="issueRegexp" value="#(\d+)" />
|
||||||
|
<!--
|
||||||
|
GitHub share the sequence number of issues and pull requests, and it will redirect to
|
||||||
|
the right place when the the sequence number not match kind.
|
||||||
|
-->
|
||||||
|
<option name="linkRegexp" value="https://github.com/apache/hugegraph/pull/$1" />
|
||||||
|
</IssueNavigationLink>
|
||||||
|
</list>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
|
|
@ -26,7 +26,9 @@ header: # `header` section is configurations for source codes license header.
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
(the "License"); you may not use this file except in compliance with
|
(the "License"); you may not use this file except in compliance with
|
||||||
the License. You may obtain a copy of the License at
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
|
@ -34,20 +36,20 @@ header: # `header` section is configurations for source codes license header.
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
# `pattern` is optional regexp if all the file headers are the same as `license` or the license of `spdx-id` and `copyright-owner`.
|
# `pattern` is optional regexp if all the file headers are the same as `license` or the license of `spdx-id` and `copyright-owner`.
|
||||||
pattern: |
|
pattern: |
|
||||||
Licensed to the Apache Software Foundation under one or more contributor
|
Licensed to the Apache Software Foundation \(ASF\) under one or more
|
||||||
license agreements. See the NOTICE file distributed with
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
this work for additional information regarding copyright
|
this work for additional information regarding copyright ownership.
|
||||||
ownership. The Apache Software Foundation licenses this file to you under
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
the Apache License, Version 2.0 \(the "License"\); you may
|
\(the "License"\); you may not use this file except in compliance with
|
||||||
not use this file except in compliance with the License.
|
the License. You may obtain a copy of the License at
|
||||||
You may obtain a copy of the License at
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
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
|
Unless required by applicable law or agreed to in writing, software
|
||||||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
KIND, either express or implied. See the License for the
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
specific language governing permissions and limitations
|
See the License for the specific language governing permissions and
|
||||||
under the License.
|
limitations under the License.
|
||||||
paths: # `paths` are the path list that will be checked (and fixed) by license-eye, default is ['**'].
|
paths: # `paths` are the path list that will be checked (and fixed) by license-eye, default is ['**'].
|
||||||
- '**'
|
- '**'
|
||||||
|
|
||||||
|
|
@ -68,7 +70,7 @@ header: # `header` section is configurations for source codes license header.
|
||||||
- '**/*.properties'
|
- '**/*.properties'
|
||||||
- '**/RaftRequests.java'
|
- '**/RaftRequests.java'
|
||||||
- 'dist/**/*'
|
- 'dist/**/*'
|
||||||
- 'hugegraph-dist'
|
- 'hugegraph-server/hugegraph-dist'
|
||||||
- '**/assembly/static/bin/hugegraph.service'
|
- '**/assembly/static/bin/hugegraph.service'
|
||||||
- 'scripts/dev/reviewers'
|
- 'scripts/dev/reviewers'
|
||||||
- 'scripts/dev/reviewers'
|
- 'scripts/dev/reviewers'
|
||||||
|
|
@ -89,11 +91,15 @@ header: # `header` section is configurations for source codes license header.
|
||||||
- '**/META-INF/MANIFEST.MF'
|
- '**/META-INF/MANIFEST.MF'
|
||||||
- '.repository/**'
|
- '.repository/**'
|
||||||
- '**/.flattened-pom.xml'
|
- '**/.flattened-pom.xml'
|
||||||
- 'hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java'
|
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java'
|
||||||
- '**/optimize/HugeScriptTraversal.java'
|
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java'
|
||||||
- '**/type/Nameable.java'
|
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java'
|
||||||
- '**/define/Cardinality.java'
|
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java'
|
||||||
- '**/util/StringEncoding.java'
|
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java'
|
||||||
|
- 'hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java'
|
||||||
|
- 'hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java'
|
||||||
|
- 'hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java'
|
||||||
|
- 'hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java'
|
||||||
comment: on-failure # on what condition license-eye will comment on the pull request, `on-failure`, `always`, `never`.
|
comment: on-failure # on what condition license-eye will comment on the pull request, `on-failure`, `always`, `never`.
|
||||||
|
|
||||||
# license-location-threshold specifies the index threshold where the license header can be located,
|
# license-location-threshold specifies the index threshold where the license header can be located,
|
||||||
|
|
|
||||||
37
BUILDING.md
37
BUILDING.md
|
|
@ -1,28 +1,35 @@
|
||||||
Building hugegraph
|
Building HugeGraph
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Required:
|
Required:
|
||||||
|
|
||||||
* Java 8/11
|
* Java 11
|
||||||
* Maven
|
* Maven 3.5+
|
||||||
|
|
||||||
|
To build without executing tests: `mvn clean package -Dmaven.test.skip=true`
|
||||||
|
|
||||||
|
## Building in IDEA
|
||||||
|
|
||||||
To build without executing tests:
|
To build without executing tests:
|
||||||
|
|
||||||
```
|
1. Click on "File" -> "Open", choose your project location.
|
||||||
mvn clean
|
2. Open maven view by click "View" -> "Tool Windows" -> "Maven Projects".
|
||||||
mvn package -DskipTests
|
3. Choose root module "hugegraph: Distributed Graph Database", unfold the menu of "Lifecycle".
|
||||||
```
|
4. Click the "Toggle 'Skip Tests' Mode" button which is located on the top navibar of "Maven Projects" window to skip tests.
|
||||||
|
5. Double click "package" or "install" to build a project.
|
||||||
|
|
||||||
## Building on Eclipse IDE
|
Could also refer [Dev-In-IDEA](https://hugegraph.apache.org/docs/contribution-guidelines/hugegraph-server-idea-setup/) for more details.
|
||||||
Note that this has only been tested on Eclipse Neon.2 Release (4.6.2) with m2e (1.7.0.20160603-1933) and m2e-wtp (1.3.1.20160831-1005) plugin.
|
|
||||||
|
|
||||||
|
## Building in Eclipse
|
||||||
|
|
||||||
|
> Note: this has only been tested on Eclipse Neon.2 Release (4.6.2) with m2e (1.7.0.20160603-1933) and m2e-wtp (1.3.1.20160831-1005) plugin.
|
||||||
|
|
||||||
To build without executing tests:
|
To build without executing tests:
|
||||||
|
|
||||||
1. Right-click on your project -> "Run As..." -> "Run Configurations..."
|
1. Right-click on your project -> "Run As..." -> "Run Configurations..."
|
||||||
2. On "Goals", populate with `install`
|
2. On "Goals", populate with `install`
|
||||||
3. Select the options `Update Snapshots` and `Skip Tests`
|
3. Select the options `Update Snapshots` and `Skip Tests`
|
||||||
4. Before clicking "Run", make sure that Eclipse knows where `JAVA_HOME` is. On same window, go to "Environment" tab and click "New".
|
4. Before clicking "Run", make sure that Eclipse knows where `JAVA_HOME` is. In the same window, go to "Environment" tab and click "New".
|
||||||
5. Under "Name:", add `JAVA_HOME`
|
5. Under "Name:", add `JAVA_HOME`
|
||||||
6. Under "Value:", add the path where `java` is located
|
6. Under "Value:", add the path where `java` is located
|
||||||
7. Click "OK"
|
7. Click "OK"
|
||||||
|
|
@ -32,13 +39,3 @@ To find the Java binary in your environment, run the appropriate command for you
|
||||||
* Linux/macOS: `which java`
|
* Linux/macOS: `which java`
|
||||||
* Windows: `for %i in (java.exe) do @echo. %~$PATH:i`
|
* Windows: `for %i in (java.exe) do @echo. %~$PATH:i`
|
||||||
|
|
||||||
## Building on IDEA
|
|
||||||
|
|
||||||
To build without executing tests:
|
|
||||||
|
|
||||||
1. Click on "File" -> "Open", choose your project location.
|
|
||||||
2. Open maven view by click "View" -> "Tool Windows" -> "Maven Projects".
|
|
||||||
3. Choose root module "hugegraph: Distributed Graph Database", unfold the menu of "Lifecycle".
|
|
||||||
4. Click the "Toggle 'Skip Tests' Mode" button which is located on the top
|
|
||||||
navibar of "Maven Projects" window to skip tests.
|
|
||||||
5. Double click "package" or "install" to build project.
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
# How to Contribute to HugeGraph
|
# How to Contribute to HugeGraph
|
||||||
|
|
||||||
Thanks for taking the time to contribute! As an open source project, HugeGraph is looking forward to be contributed from everyone, and we are also grateful to all of the contributors.
|
> Refer [website-doc](https://hugegraph.apache.org/docs/contribution-guidelines/) for the latest information.
|
||||||
|
|
||||||
|
Thanks for taking the time to contribute!
|
||||||
|
As an open source project, HugeGraph is looking forward to being contributed from everyone, and we are also grateful to all the contributors.
|
||||||
|
|
||||||
The following is a contribution guide for HugeGraph:
|
The following is a contribution guide for HugeGraph:
|
||||||
|
|
||||||
|
|
@ -8,11 +11,13 @@ The following is a contribution guide for HugeGraph:
|
||||||
|
|
||||||
## 1. Preparation
|
## 1. Preparation
|
||||||
|
|
||||||
|
**Recommended**: You can use [GitHub desktop](https://desktop.github.com/) to greatly simplify the PR process.
|
||||||
|
|
||||||
We can contribute by reporting issues, submitting code patches or any other feedback.
|
We can contribute by reporting issues, submitting code patches or any other feedback.
|
||||||
|
|
||||||
Before submitting the code, we need to do some preparation:
|
Before submitting the code, we need to do some preparation:
|
||||||
|
|
||||||
1. Sign up or login to GitHub: [https://github.com](https://github.com)
|
1. Sign up or login to GitHub: [https://github.com](https://github.com)
|
||||||
|
|
||||||
2. Fork HugeGraph repo from GitHub: [https://github.com/apache/incubator-hugegraph/fork](https://github.com/apache/incubator-hugegraph/fork)
|
2. Fork HugeGraph repo from GitHub: [https://github.com/apache/incubator-hugegraph/fork](https://github.com/apache/incubator-hugegraph/fork)
|
||||||
|
|
||||||
|
|
@ -36,8 +41,6 @@ Before submitting the code, we need to do some preparation:
|
||||||
git config user.email "{email-address-of-github}" # like "jermy@apache.org"
|
git config user.email "{email-address-of-github}" # like "jermy@apache.org"
|
||||||
```
|
```
|
||||||
|
|
||||||
Optional: You can use [GitHub desktop](https://desktop.github.com/) to greatly simplify the commit and update process.
|
|
||||||
|
|
||||||
## 2. Create an Issue on GitHub
|
## 2. Create an Issue on GitHub
|
||||||
|
|
||||||
If you encounter bugs or have any questions, please go to [GitHub Issues](https://github.com/apache/incubator-hugegraph/issues) to report them and feel free to [create an issue](https://github.com/apache/incubator-hugegraph/issues/new).
|
If you encounter bugs or have any questions, please go to [GitHub Issues](https://github.com/apache/incubator-hugegraph/issues) to report them and feel free to [create an issue](https://github.com/apache/incubator-hugegraph/issues/new).
|
||||||
|
|
@ -46,7 +49,7 @@ If you encounter bugs or have any questions, please go to [GitHub Issues](https:
|
||||||
|
|
||||||
#### 3.1 Create a new branch
|
#### 3.1 Create a new branch
|
||||||
|
|
||||||
Please don't use master branch for development. Instead we should create a new branch:
|
Please don't use master branch for development. Instead, we should create a new branch:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# checkout master branch
|
# checkout master branch
|
||||||
|
|
@ -63,12 +66,26 @@ Assume that we need to modify some files like "HugeGraph.java" and "HugeFactory.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# modify code to fix a bug
|
# modify code to fix a bug
|
||||||
vim hugegraph-core/src/main/java/com/baidu/hugegraph/HugeGraph.java
|
vim hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||||
vim hugegraph-core/src/main/java/com/baidu/hugegraph/HugeFactory.java
|
vim hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||||
# run test locally (optional)
|
# run test locally (optional)
|
||||||
mvn test -Pcore-test,memory
|
mvn test -Pcore-test,memory
|
||||||
```
|
```
|
||||||
Note: In order to be consistent with the code style easily, if you use [IDEA](https://www.jetbrains.com/idea/) as your IDE, you can directly [import](https://www.jetbrains.com/help/idea/configuring-code-style.html) our code style [configuration file](./hugegraph-style.xml).
|
Note: To be consistent with the code style easily, if you use [IDEA](https://www.jetbrains.com/idea/) as your IDE, you can directly [import](https://www.jetbrains.com/help/idea/configuring-code-style.html) our code style [configuration file](./hugegraph-style.xml).
|
||||||
|
|
||||||
|
##### 3.2.1 Check licenses
|
||||||
|
If we want to add new third-party dependencies to the `HugeGraph` project, we need to do the following things:
|
||||||
|
1. Find the third-party dependent repository, put the dependent `license` file into [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) path.
|
||||||
|
2. Declare the dependency in [./hugegraph-server/hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) `LICENSE` information.
|
||||||
|
3. Find the NOTICE file in the repository and append it to [./hugegraph-server/hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file).
|
||||||
|
4. Execute locally [./hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/known-dependencies.txt) (or manually update).
|
||||||
|
|
||||||
|
**Example**: A new third-party dependency is introduced into the project -> `ant-1.9.1.jar`
|
||||||
|
- The project source code is located at: https://github.com/apache/ant/tree/rel/1.9.1
|
||||||
|
- LICENSE file: https://github.com/apache/ant/blob/rel/1.9.1/LICENSE
|
||||||
|
- NOTICE file: https://github.com/apache/ant/blob/rel/1.9.1/NOTICE
|
||||||
|
|
||||||
|
The license information of `ant-1.9.1.jar` needs to be specified in the LICENSE file, and the notice information needs to be specified in the NOTICE file. The detailed LICENSE file corresponding to ant-1.9.1.jar needs to be copied to our licenses/ directory. Finally, update the known-dependencies.txt file.
|
||||||
|
|
||||||
#### 3.3 Commit changes to git repo
|
#### 3.3 Commit changes to git repo
|
||||||
|
|
||||||
|
|
@ -76,8 +93,8 @@ After the code has been completed, we submit them to the local git repo:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# add files to local git index
|
# add files to local git index
|
||||||
git add hugegraph-core/src/main/java/com/baidu/hugegraph/HugeGraph.java
|
git add hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||||
git add hugegraph-core/src/main/java/com/baidu/hugegraph/HugeFactory.java
|
git add hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||||
# commit to local git repo
|
# commit to local git repo
|
||||||
git commit
|
git commit
|
||||||
```
|
```
|
||||||
|
|
@ -90,7 +107,7 @@ Fix bug: run deploy multiple times
|
||||||
fix #ISSUE_ID
|
fix #ISSUE_ID
|
||||||
```
|
```
|
||||||
|
|
||||||
> Please remember to fill in the issue id, which was generated by GitHub after issue creation.
|
> Please remember to fill in the issue id, which GitHub generated after issue creation.
|
||||||
|
|
||||||
#### 3.4 Push commit to GitHub fork repo
|
#### 3.4 Push commit to GitHub fork repo
|
||||||
|
|
||||||
|
|
@ -106,11 +123,7 @@ Note that since GitHub requires submitting code through `username + token` (inst
|
||||||
|
|
||||||
## 4. Create a Pull Request
|
## 4. Create a Pull Request
|
||||||
|
|
||||||
Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, just click button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message.
|
Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, click the button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message.
|
||||||
|
|
||||||
Please sign the HugeGraph CLA when contributing code for the first time. You can sign the CLA by just posting a Pull Request Comment same as the below format:
|
|
||||||
|
|
||||||
`I have read the CLA Document and I hereby sign the CLA`
|
|
||||||
|
|
||||||
Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to https://github.com/settings/emails:
|
Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to https://github.com/settings/emails:
|
||||||
<img width="1280" alt="image" src="https://user-images.githubusercontent.com/9625821/163522445-2a50a72a-dea2-434f-9868-3a0d40d0d037.png">
|
<img width="1280" alt="image" src="https://user-images.githubusercontent.com/9625821/163522445-2a50a72a-dea2-434f-9868-3a0d40d0d037.png">
|
||||||
|
|
@ -120,7 +133,7 @@ Note: please make sure the email address you used to submit the code is bound to
|
||||||
Maintainers will start the code review after all the **automatic** checks are passed:
|
Maintainers will start the code review after all the **automatic** checks are passed:
|
||||||
|
|
||||||
- Check: Contributor License Agreement is signed
|
- Check: Contributor License Agreement is signed
|
||||||
- Check: Travis CI builds is passed (automatically Test and Deploy)
|
- Check: Travis CI builds are passed (automatically Test and Deploy)
|
||||||
|
|
||||||
The commit will be accepted and merged if there is no problem after review.
|
The commit will be accepted and merged if there is no problem after review.
|
||||||
|
|
||||||
|
|
@ -160,8 +173,8 @@ And push it to GitHub fork repo again:
|
||||||
git push -f origin bugfix-branch:bugfix-branch
|
git push -f origin bugfix-branch:bugfix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
GitHub will automatically update the Pull Request after we push it, just wait for code review.
|
GitHub will automatically update the Pull Request after we push it, wait for code review.
|
||||||
|
|
||||||
Any question please contact to us through [hugegraph@googlegroups.com](mailto:hugegraph@googlegroups.com) or [other contact information](https://hugegraph.github.io/hugegraph-doc/).
|
For Any question, please contact us through [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
68
Dockerfile
68
Dockerfile
|
|
@ -1,68 +0,0 @@
|
||||||
#
|
|
||||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
# contributor license agreements. See the NOTICE file distributed with
|
|
||||||
# this work for additional information regarding copyright ownership.
|
|
||||||
# The ASF licenses this file to You 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.
|
|
||||||
#
|
|
||||||
|
|
||||||
FROM ubuntu:xenial
|
|
||||||
|
|
||||||
LABEL maintainer="HugeGraph Docker Maintainers <hugegraph@googlegroups.com>"
|
|
||||||
|
|
||||||
ENV PKG_URL https://github.com/hugegraph
|
|
||||||
|
|
||||||
# 1. Install needed dependencies of GraphServer & RocksDB
|
|
||||||
RUN set -x \
|
|
||||||
&& apt-get -q update \
|
|
||||||
&& apt-get -q install -y --no-install-recommends --no-install-suggests \
|
|
||||||
curl \
|
|
||||||
lsof \
|
|
||||||
g++ \
|
|
||||||
gcc \
|
|
||||||
openjdk-8-jdk \
|
|
||||||
&& apt-get clean
|
|
||||||
# && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# 2. Init HugeGraph Sever
|
|
||||||
# (Optional) You can set the ip of github to speed up the local build
|
|
||||||
# && echo "192.30.253.112 github.com\n151.101.44.249 github.global.ssl.fastly.net" >> /etc/hosts \
|
|
||||||
ENV SERVER_VERSION 0.12.0
|
|
||||||
RUN set -e \
|
|
||||||
&& mkdir -p /root/hugegraph-server \
|
|
||||||
&& curl -L -S ${PKG_URL}/hugegraph/releases/download/v${SERVER_VERSION}/hugegraph-${SERVER_VERSION}.tar.gz -o /root/server.tar.gz \
|
|
||||||
&& tar xzf /root/server.tar.gz --strip-components 1 -C /root/hugegraph-server \
|
|
||||||
&& rm /root/server.tar.gz \
|
|
||||||
&& cd /root/hugegraph-server/ \
|
|
||||||
&& sed -i "s/^restserver.url.*$/restserver.url=http:\/\/0.0.0.0:8080/g" ./conf/rest-server.properties \
|
|
||||||
&& sed -n '65p' ./bin/start-hugegraph.sh | grep "&" > /dev/null && sed -i 65{s/\&$/#/g} ./bin/start-hugegraph.sh \
|
|
||||||
&& sed -n '75p' ./bin/start-hugegraph.sh | grep "exit" > /dev/null && sed -i 75{s/^/#/g} ./bin/start-hugegraph.sh \
|
|
||||||
&& ./bin/init-store.sh
|
|
||||||
|
|
||||||
# 3. Prepare for HugeGraph Studio
|
|
||||||
ENV STUDIO_VERSION 0.10.0
|
|
||||||
# (Optional) You can set the ip of github to speed up the local build
|
|
||||||
# && echo "192.30.253.112 github.com\n151.101.44.249 github.global.ssl.fastly.net" >> /etc/hosts \
|
|
||||||
RUN set -e \
|
|
||||||
&& mkdir -p /root/hugegraph-studio \
|
|
||||||
&& curl -L -S ${PKG_URL}/hugegraph-studio/releases/download/v${STUDIO_VERSION}/hugegraph-studio-${STUDIO_VERSION}.tar.gz -o /root/studio.tar.gz \
|
|
||||||
&& tar xzf /root/studio.tar.gz --strip-components 1 -C /root/hugegraph-studio \
|
|
||||||
&& rm /root/studio.tar.gz \
|
|
||||||
&& cd /root/hugegraph-studio/ \
|
|
||||||
&& sed -i "s/^studio.server.host.*$/studio.server.host=0.0.0.0/g" ./conf/hugegraph-studio.properties \
|
|
||||||
&& sed -i "s/^graph.server.host.*$/graph.server.host=0.0.0.0/g" ./conf/hugegraph-studio.properties
|
|
||||||
|
|
||||||
EXPOSE 8080 8088
|
|
||||||
WORKDIR /root
|
|
||||||
VOLUME /root
|
|
||||||
|
|
||||||
ENTRYPOINT ["./hugegraph-server/bin/start-hugegraph.sh"]
|
|
||||||
16
LICENSE
16
LICENSE
|
|
@ -207,10 +207,12 @@ Apache 2.0 licenses
|
||||||
The following components are provided under the Apache License. See project link for details.
|
The following components are provided under the Apache License. See project link for details.
|
||||||
The text of each license is the standard Apache 2.0 license.
|
The text of each license is the standard Apache 2.0 license.
|
||||||
|
|
||||||
hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java from https://github.com/apache/tinkerpop
|
hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java from https://github.com/apache/tinkerpop
|
||||||
hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java from https://github.com/apache/tinkerpop
|
hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java from https://github.com/apache/tinkerpop
|
||||||
hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java from https://github.com/twitter-archive/snowflake
|
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java from https://github.com/twitter-archive/snowflake
|
||||||
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java from https://github.com/apache/tinkerpop
|
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java from https://github.com/apache/tinkerpop
|
||||||
hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java from https://github.com/JanusGraph/janusgraph
|
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java from https://github.com/JanusGraph/janusgraph
|
||||||
hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java from https://github.com/JanusGraph/janusgraph
|
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java from https://github.com/JanusGraph/janusgraph
|
||||||
hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java from https://github.com/JanusGraph/janusgraph
|
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java from https://github.com/JanusGraph/janusgraph
|
||||||
|
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java from https://github.com/opencypher/cypher-for-gremlin
|
||||||
|
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java from https://github.com/opencypher/cypher-for-gremlin
|
||||||
|
|
|
||||||
40
NOTICE
40
NOTICE
|
|
@ -1,5 +1,5 @@
|
||||||
Apache HugeGraph(incubating)
|
Apache HugeGraph(incubating)
|
||||||
Copyright 2022-2023 The Apache Software Foundation
|
Copyright 2022-2024 The Apache Software Foundation
|
||||||
|
|
||||||
This product includes software developed at
|
This product includes software developed at
|
||||||
The Apache Software Foundation (http://www.apache.org/).
|
The Apache Software Foundation (http://www.apache.org/).
|
||||||
|
|
@ -13,9 +13,6 @@ This product contains code form the Apache TinkerPop Project:
|
||||||
Apache TinkerPop
|
Apache TinkerPop
|
||||||
Copyright 2015-2022 The Apache Software Foundation.
|
Copyright 2015-2022 The Apache Software Foundation.
|
||||||
|
|
||||||
This product includes software developed at
|
|
||||||
The Apache Software Foundation (http://www.apache.org/).
|
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
Activiti
|
Activiti
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
@ -42,7 +39,7 @@ This product contains code form the JanusGraph Project:
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
==============================================================
|
==============================================================
|
||||||
JanusGraph: Distributed Graph Database
|
JanusGraph: Distributed Graph Database
|
||||||
Copyright 2012 and onwards JanusGraph Authors
|
Copyright 2012 with JanusGraph Authors
|
||||||
==============================================================
|
==============================================================
|
||||||
|
|
||||||
This product includes software developed by JanusGraph contributors listed
|
This product includes software developed by JanusGraph contributors listed
|
||||||
|
|
@ -56,36 +53,3 @@ DataStax) and the following individuals:
|
||||||
* Marko A. Rodriguez
|
* Marko A. Rodriguez
|
||||||
* Stephen Mallette
|
* Stephen Mallette
|
||||||
* Pavel Yaskevich
|
* Pavel Yaskevich
|
||||||
|
|
||||||
It also includes software from other open source projects including, but not limited to (check pom.xml for complete listing):
|
|
||||||
|
|
||||||
* Apache Cassandra [https://cassandra.apache.org/]
|
|
||||||
* Apache Commons [https://commons.apache.org/]
|
|
||||||
* Apache Groovy [http://groovy-lang.org/]
|
|
||||||
* Apache HBase [https://hbase.apache.org/]
|
|
||||||
* Apache Hadoop [https://hadoop.apache.org/]
|
|
||||||
* Apache Kerby [https://github.com/apache/directory-kerby]
|
|
||||||
* Apache Log4j [https://logging.apache.org/log4j]
|
|
||||||
* Apache Lucene [https://lucene.apache.org/]
|
|
||||||
* Apache Solr [https://lucene.apache.org/solr/]
|
|
||||||
* Apache TinkerPop [https://tinkerpop.apache.org/]
|
|
||||||
* Astyanax [https://github.com/Netflix/astyanax]
|
|
||||||
* DataStax Driver for Apache Cassandra [https://github.com/datastax/java-driver]
|
|
||||||
* EasyMock [http://easymock.org/]
|
|
||||||
* Elasticsearch [https://www.elastic.co/]
|
|
||||||
* Google Cloud Bigtable [https://github.com/googlecloudplatform/cloud-bigtable-client]
|
|
||||||
* Google Guava [https://github.com/google/guava]
|
|
||||||
* HPPC [https://labs.carrotsearch.com/hppc.html]
|
|
||||||
* JUnit [https://www.junit.org/]
|
|
||||||
* Jackson [https://github.com/FasterXML/jackson]
|
|
||||||
* Kryo [https://github.com/EsotericSoftware/kryo]
|
|
||||||
* Metrics [https://metrics.dropwizard.io]
|
|
||||||
* Mockito [https://site.mockito.org/]
|
|
||||||
* Noggit [https://github.com/yonik/noggit]
|
|
||||||
* OpenRDF [http://rdf4j.org/]
|
|
||||||
* Oracle BerkeleyDB Java Edition [https://www.oracle.com/technetwork/products/berkeleydb/] (see license below)
|
|
||||||
* Project Lombok [https://projectlombok.org/]
|
|
||||||
* Reflections8 [https://github.com/aschoerk/reflections8]
|
|
||||||
* SLF4J [https://www.slf4j.org/]
|
|
||||||
* Spatial4j [https://github.com/locationtech/spatial4j]
|
|
||||||
* Vavr [https://www.vavr.io/]
|
|
||||||
|
|
|
||||||
100
README.md
100
README.md
|
|
@ -1,48 +1,98 @@
|
||||||
<div align="center">
|
<h1 align="center">
|
||||||
<img width="720" alt="hugegraph-logo" src="https://user-images.githubusercontent.com/17706099/149281100-c296db08-2861-4174-a31f-e2a92ebeeb72.png" style="zoom:100%;" />
|
<img width="720" alt="hugegraph-logo" src="https://github.com/apache/incubator-hugegraph/assets/38098239/e02ffaed-4562-486b-ba8f-e68d02bb0ea6" style="zoom:100%;" />
|
||||||
</div>
|
</h1>
|
||||||
|
|
||||||
<p align="center">
|
<h3 align="center">A graph database that supports more than 10 billion data, high performance and scalability</h3>
|
||||||
A graph database that supports more than 10+ billion data, high performance and scalability
|
|
||||||
</p>
|
<div align="center">
|
||||||
<hr/>
|
|
||||||
|
|
||||||
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||||
[](https://github.com/hugegraph/hugegraph/actions/workflows/ci.yml)
|
[](https://github.com/apache/incubator-hugegraph/actions/workflows/ci.yml)
|
||||||
[](https://codecov.io/gh/hugegraph/hugegraph)
|
[](https://github.com/apache/incubator-hugegraph/actions/workflows/licence-checker.yml)
|
||||||
[](https://github.com/hugegraph/hugegraph/releases)
|
[](https://github.com/apache/hugegraph/releases)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## What is Apache HugeGraph?
|
||||||
|
|
||||||
|
[HugeGraph](https://hugegraph.apache.org/) is a fast-speed and highly-scalable [graph database](https://en.wikipedia.org/wiki/Graph_database).
|
||||||
|
Billions of vertices and edges can be easily stored into and queried from HugeGraph due to its excellent OLTP ability.
|
||||||
|
As compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/) framework, various complicated graph queries can be
|
||||||
|
achieved through [Gremlin](https://tinkerpop.apache.org/gremlin.html)(a powerful graph traversal language).
|
||||||
|
|
||||||
[HugeGraph](https://hugegraph.apache.org/) is a fast-speed and highly-scalable [graph database](https://en.wikipedia.org/wiki/Graph_database). Billions of vertices and edges can be easily stored into and queried from HugeGraph due to its excellent OLTP ability. As compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/) framework, various complicated graph queries can be accomplished through [Gremlin](https://tinkerpop.apache.org/gremlin.html)(a powerful graph traversal language).
|
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/), supporting [Gremlin](https://tinkerpop.apache.org/gremlin.html)
|
- Compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/), support [Gremlin](https://tinkerpop.apache.org/gremlin.html) & [Cypher](https://en.wikipedia.org/wiki/Cypher) language
|
||||||
- Schema Metadata Management, including VertexLabel, EdgeLabel, PropertyKey and IndexLabel
|
- Schema Metadata Management, including VertexLabel, EdgeLabel, PropertyKey and IndexLabel
|
||||||
- Multi-type Indexes, supporting exact query, range query and complex conditions combination query
|
- Multi-type Indexes, supporting exact query, range query and complex conditions combination query
|
||||||
- Plug-in Backend Store Driver Framework, supporting RocksDB, Cassandra, ScyllaDB, HBase and MySQL now and easy to add other backend store driver if needed
|
- Plug-in Backend Store Driver Framework, support `RocksDB`, `Cassandra`, `HBase`, `ScyllaDB`, and `MySQL/Postgre` now and easy to add another backend store driver if needed
|
||||||
- Integration with Hadoop/Spark
|
- Integration with `Flink/Spark/HDFS`, and friendly to connect other big data platforms
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
The project [homepage](https://hugegraph.apache.org/docs/) contains more information on HugeGraph and provides links to **documentation**, getting-started guides and release downloads.
|
## Quick Start
|
||||||
|
|
||||||
And here are links of other repositories:
|
### 1. Docker Way (Convenient for Test)
|
||||||
1. [hugegraph-toolchain](https://github.com/apache/incubator-hugegraph-toolchain) (include loader/dashboard/tool/client)
|
|
||||||
2. [hugegraph-computer](https://github.com/apache/incubator-hugegraph-computer) (graph computing system)
|
|
||||||
3. [hugegraph-commons](https://github.com/apache/incubator-hugegraph-commons) (include common & rpc module)
|
|
||||||
4. [hugegraph-website](https://github.com/apache/incubator-hugegraph-doc) (include doc & website code)
|
|
||||||
|
|
||||||
## Contributing
|
We can use `docker run -itd --name=graph -p 8080:8080 hugegraph/hugegraph` to quickly start an inner
|
||||||
|
HugeGraph server with `RocksDB` (in backgrounds) for **test/dev**.
|
||||||
|
You can visit [doc page](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#3-deploy) or
|
||||||
|
the [README](hugegraph-server/hugegraph-dist/docker/README.md) for more details. ([Docker Compose](./hugegraph-server/hugegraph-dist/docker/example))
|
||||||
|
|
||||||
Welcome to contribute to HugeGraph, please see [`How to Contribute`](CONTRIBUTING.md) for more information.
|
> Note:
|
||||||
|
>
|
||||||
|
> 1. The docker image of hugegraph is a convenience release, but not **official distribution** artifacts. You can find more details from [ASF Release Distribution Policy](https://infra.apache.org/release-distribution.html#dockerhub).
|
||||||
|
>
|
||||||
|
> 2. Recommend to use `release tag`(like `1.2.0`) for the stable version. Use `latest` tag to experience the newest functions in development.
|
||||||
|
|
||||||
|
### 2. Download Way
|
||||||
|
|
||||||
|
Visit [Download Page](https://hugegraph.apache.org/docs/download/download/) and refer the [doc](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#32-download-the-binary-tar-tarball)
|
||||||
|
to download the latest release package and start the server.
|
||||||
|
|
||||||
|
### 3. Source Building Way
|
||||||
|
|
||||||
|
Visit [Source Building Page](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#33-source-code-compilation) and follow the
|
||||||
|
steps to build the source code and start the server.
|
||||||
|
|
||||||
|
The project [doc page](https://hugegraph.apache.org/docs/) contains more information on HugeGraph
|
||||||
|
and provides detailed documentation for users. (Structure / Usage / API / Configs...)
|
||||||
|
|
||||||
|
And here are links of other **HugeGraph** component/repositories:
|
||||||
|
1. [hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain) (graph tools **[loader](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-loader)/[dashboard](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-hubble)/[tool](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-tools)/[client](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-client)**)
|
||||||
|
2. [hugegraph-computer](https://github.com/apache/hugegraph-computer) (integrated **graph computing** system)
|
||||||
|
3. [hugegraph-commons](https://github.com/apache/hugegraph-commons) (**common & rpc** libs)
|
||||||
|
4. [hugegraph-website](https://github.com/apache/hugegraph-doc) (**doc & website** code)
|
||||||
|
5. [hugegraph-ai](https://github.com/apache/incubator-hugegraph-ai) (integrated **Graph AI/LLM/KG** system)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
HugeGraph is licensed under Apache 2.0 License.
|
HugeGraph is licensed under [Apache 2.0 License](LICENSE).
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
- Welcome to contribute to HugeGraph, please see [`How to Contribute`](CONTRIBUTING.md) & [Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/) for more information.
|
||||||
|
- Note: It's recommended to use [GitHub Desktop](https://desktop.github.com/) to greatly simplify the PR and commit process.
|
||||||
|
- Thank you to all the people who already contributed to HugeGraph!
|
||||||
|
|
||||||
|
[](https://github.com/apache/incubator-hugegraph/graphs/contributors)
|
||||||
|
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
|
|
||||||
HugeGraph relies on the [TinkerPop](http://tinkerpop.apache.org) framework, we refer to the storage structure of Titan and the schema definition of DataStax.
|
HugeGraph relies on the [TinkerPop](http://tinkerpop.apache.org) framework, we refer to the storage structure of Titan and the schema definition of DataStax.
|
||||||
Thanks to TinkerPop, thanks to Titan, thanks to DataStax. Thanks to all other organizations or authors who contributed to the project.
|
Thanks to TinkerPop, thanks to Titan, thanks to DataStax. Thanks to all other organizations or authors who contributed to the project.
|
||||||
|
|
||||||
You are welcome to contribute to HugeGraph, and we are looking forward to working with you to build an excellent open source community.
|
You are welcome to contribute to HugeGraph,
|
||||||
|
and we are looking forward to working with you to build an excellent open-source community.
|
||||||
|
|
||||||
|
|
||||||
|
## Contact Us
|
||||||
|
|
||||||
|
- [GitHub Issues](https://github.com/apache/incubator-hugegraph/issues): Feedback on usage issues and functional requirements (quick response)
|
||||||
|
- Feedback Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
|
||||||
|
- WeChat public account: Apache HugeGraph, welcome to scan this QR code to follow us.
|
||||||
|
|
||||||
|
<img src="https://github.com/apache/incubator-hugegraph-doc/blob/master/assets/images/wechat.png?raw=true" alt="QR png" width="300"/>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: hugegraph-pd
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
license:
|
||||||
|
verify-path: ./conf/verify-license.json
|
||||||
|
license-path: ./conf/hugegraph.license
|
||||||
|
grpc:
|
||||||
|
port: 8686
|
||||||
|
host: 127.0.0.1
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8620
|
||||||
|
|
||||||
|
pd:
|
||||||
|
data-path: ./pd_data
|
||||||
|
patrol-interval: 1800
|
||||||
|
initial-store-count: 3
|
||||||
|
initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
|
||||||
|
|
||||||
|
raft:
|
||||||
|
address: 127.0.0.1:8610
|
||||||
|
peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
|
||||||
|
|
||||||
|
store:
|
||||||
|
max-down-time: 172800
|
||||||
|
monitor_data_enabled: true
|
||||||
|
monitor_data_interval: 1 minute
|
||||||
|
monitor_data_retention: 1 day
|
||||||
|
initial-store-count: 1
|
||||||
|
|
||||||
|
partition:
|
||||||
|
default-shard-count: 1
|
||||||
|
store-max-shard-count: 12
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: hugegraph-pd
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
license:
|
||||||
|
verify-path: ./conf/verify-license.json
|
||||||
|
license-path: ./conf/hugegraph.license
|
||||||
|
grpc:
|
||||||
|
port: 8687
|
||||||
|
host: 127.0.0.1
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8621
|
||||||
|
|
||||||
|
pd:
|
||||||
|
data-path: ./pd_data
|
||||||
|
patrol-interval: 1800
|
||||||
|
initial-store-count: 3
|
||||||
|
initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
|
||||||
|
|
||||||
|
raft:
|
||||||
|
address: 127.0.0.1:8611
|
||||||
|
peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
|
||||||
|
|
||||||
|
store:
|
||||||
|
max-down-time: 172800
|
||||||
|
monitor_data_enabled: true
|
||||||
|
monitor_data_interval: 1 minute
|
||||||
|
monitor_data_retention: 1 day
|
||||||
|
initial-store-count: 1
|
||||||
|
|
||||||
|
partition:
|
||||||
|
default-shard-count: 1
|
||||||
|
store-max-shard-count: 12
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: hugegraph-pd
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
license:
|
||||||
|
verify-path: ./conf/verify-license.json
|
||||||
|
license-path: ./conf/hugegraph.license
|
||||||
|
grpc:
|
||||||
|
port: 8688
|
||||||
|
host: 127.0.0.1
|
||||||
|
|
||||||
|
server:
|
||||||
|
port: 8622
|
||||||
|
|
||||||
|
pd:
|
||||||
|
data-path: ./pd_data
|
||||||
|
patrol-interval: 1800
|
||||||
|
initial-store-count: 3
|
||||||
|
initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
|
||||||
|
|
||||||
|
raft:
|
||||||
|
address: 127.0.0.1:8612
|
||||||
|
peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
|
||||||
|
|
||||||
|
store:
|
||||||
|
max-down-time: 172800
|
||||||
|
monitor_data_enabled: true
|
||||||
|
monitor_data_interval: 1 minute
|
||||||
|
monitor_data_retention: 1 day
|
||||||
|
initial-store-count: 1
|
||||||
|
|
||||||
|
partition:
|
||||||
|
default-shard-count: 1
|
||||||
|
store-max-shard-count: 12
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
pdserver:
|
||||||
|
address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
grpc:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8500
|
||||||
|
netty-server:
|
||||||
|
max-inbound-message-size: 1000MB
|
||||||
|
raft:
|
||||||
|
disruptorBufferSize: 1024
|
||||||
|
address: 127.0.0.1:8510
|
||||||
|
max-log-file-size: 600000000000
|
||||||
|
snapshotInterval: 1800
|
||||||
|
server:
|
||||||
|
port: 8520
|
||||||
|
|
||||||
|
app:
|
||||||
|
data-path: ./storage
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: store-node-grpc-server
|
||||||
|
profiles:
|
||||||
|
active: default
|
||||||
|
include: pd
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
level:
|
||||||
|
root: info
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
pdserver:
|
||||||
|
address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
grpc:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8501
|
||||||
|
netty-server:
|
||||||
|
max-inbound-message-size: 1000MB
|
||||||
|
raft:
|
||||||
|
disruptorBufferSize: 1024
|
||||||
|
address: 127.0.0.1:8511
|
||||||
|
max-log-file-size: 600000000000
|
||||||
|
snapshotInterval: 1800
|
||||||
|
server:
|
||||||
|
port: 8521
|
||||||
|
|
||||||
|
app:
|
||||||
|
data-path: ./storage
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: store-node-grpc-server
|
||||||
|
profiles:
|
||||||
|
active: default
|
||||||
|
include: pd
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
level:
|
||||||
|
root: info
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
pdserver:
|
||||||
|
address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
management:
|
||||||
|
metrics:
|
||||||
|
export:
|
||||||
|
prometheus:
|
||||||
|
enabled: true
|
||||||
|
endpoints:
|
||||||
|
web:
|
||||||
|
exposure:
|
||||||
|
include: "*"
|
||||||
|
|
||||||
|
grpc:
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8502
|
||||||
|
netty-server:
|
||||||
|
max-inbound-message-size: 1000MB
|
||||||
|
raft:
|
||||||
|
disruptorBufferSize: 1024
|
||||||
|
address: 127.0.0.1:8512
|
||||||
|
max-log-file-size: 600000000000
|
||||||
|
snapshotInterval: 1800
|
||||||
|
server:
|
||||||
|
port: 8522
|
||||||
|
|
||||||
|
app:
|
||||||
|
data-path: ./storage
|
||||||
|
|
||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: store-node-grpc-server
|
||||||
|
profiles:
|
||||||
|
active: default
|
||||||
|
include: pd
|
||||||
|
|
||||||
|
logging:
|
||||||
|
config: 'file:./conf/log4j2.xml'
|
||||||
|
level:
|
||||||
|
root: info
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
|
||||||
|
gremlin.graph=org.apache.hugegraph.HugeFactory
|
||||||
|
|
||||||
|
# cache config
|
||||||
|
vertex.cache_type=l2
|
||||||
|
edge.cache_type=l2
|
||||||
|
|
||||||
|
store=hugegraph
|
||||||
|
backend=hstore
|
||||||
|
serializer=binary
|
||||||
|
|
||||||
|
# pd config
|
||||||
|
pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
# task config
|
||||||
|
task.scheduler_type=local
|
||||||
|
task.schedule_period=10
|
||||||
|
task.retry=0
|
||||||
|
task.wait_timeout=10
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8181
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,127 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8181
|
||||||
|
|
||||||
|
# timeout in ms of gremlin query
|
||||||
|
evaluationTimeout: 30000
|
||||||
|
|
||||||
|
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
|
||||||
|
# don't set graph at here, this happens after support for dynamically adding graph
|
||||||
|
graphs: {
|
||||||
|
}
|
||||||
|
scriptEngines: {
|
||||||
|
gremlin-groovy: {
|
||||||
|
staticImports: [
|
||||||
|
org.opencypher.gremlin.process.traversal.CustomPredicates.*',
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions.*
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
|
||||||
|
classImports: [
|
||||||
|
java.lang.Math,
|
||||||
|
org.apache.hugegraph.backend.id.IdGenerator,
|
||||||
|
org.apache.hugegraph.type.define.Directions,
|
||||||
|
org.apache.hugegraph.type.define.NodeRole,
|
||||||
|
org.apache.hugegraph.masterelection.GlobalMasterInfo,
|
||||||
|
org.apache.hugegraph.util.DateUtil,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CountTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.HugeTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KoutTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.optimize.ConditionP,
|
||||||
|
org.apache.hugegraph.traversal.optimize.Text,
|
||||||
|
org.apache.hugegraph.traversal.optimize.TraversalUtil,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate
|
||||||
|
],
|
||||||
|
methodImports: [
|
||||||
|
java.lang.Math#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions#*
|
||||||
|
]
|
||||||
|
},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
|
||||||
|
files: [scripts/empty-sample.groovy]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
serializers:
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
metrics: {
|
||||||
|
consoleReporter: {enabled: false, interval: 180000},
|
||||||
|
csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
|
||||||
|
jmxReporter: {enabled: false},
|
||||||
|
slf4jReporter: {enabled: false, interval: 180000},
|
||||||
|
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
|
||||||
|
graphiteReporter: {enabled: false, interval: 180000}
|
||||||
|
}
|
||||||
|
maxInitialLineLength: 4096
|
||||||
|
maxHeaderSize: 8192
|
||||||
|
maxChunkSize: 8192
|
||||||
|
maxContentLength: 65536
|
||||||
|
maxAccumulationBufferComponents: 1024
|
||||||
|
resultIterationBatchSize: 64
|
||||||
|
writeBufferLowWaterMark: 32768
|
||||||
|
writeBufferHighWaterMark: 65536
|
||||||
|
ssl: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
|
@ -1,19 +1,19 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--
|
<!--
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with this
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
work for additional information regarding copyright ownership. The ASF
|
this work for additional information regarding copyright ownership.
|
||||||
licenses this file to You under the Apache License, Version 2.0 (the
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
"License"); you may not use this file except in compliance with the License.
|
(the "License"); you may not use this file except in compliance with
|
||||||
You may obtain a copy of the License at
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
License for the specific language governing permissions and limitations
|
See the License for the specific language governing permissions and
|
||||||
under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<!-- Config will be auto loaded every 60s -->
|
<!-- Config will be auto loaded every 60s -->
|
||||||
<configuration status="error" monitorInterval="60">
|
<configuration status="error" monitorInterval="60">
|
||||||
|
|
@ -30,14 +30,14 @@
|
||||||
|
|
||||||
<!-- Normal server log config -->
|
<!-- Normal server log config -->
|
||||||
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||||
immediateFlush="false">
|
immediateFlush="false">
|
||||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
<!-- Trigger after exceeding 1day or 50MB -->
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
<Policies>
|
<Policies>
|
||||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
</Policies>
|
</Policies>
|
||||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
<DefaultRolloverStrategy max="5">
|
<DefaultRolloverStrategy max="5">
|
||||||
|
|
@ -45,8 +45,8 @@
|
||||||
<IfFileName glob="*/*.log"/>
|
<IfFileName glob="*/*.log"/>
|
||||||
<!-- Limit log amount & size -->
|
<!-- Limit log amount & size -->
|
||||||
<IfAny>
|
<IfAny>
|
||||||
<IfAccumulatedFileSize exceeds="2GB" />
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
<IfAccumulatedFileCount exceeds="100" />
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
</IfAny>
|
</IfAny>
|
||||||
</Delete>
|
</Delete>
|
||||||
</DefaultRolloverStrategy>
|
</DefaultRolloverStrategy>
|
||||||
|
|
@ -54,15 +54,15 @@
|
||||||
|
|
||||||
<!-- Separate & compress audit log, buffer size is 512KB -->
|
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||||
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||||
bufferSize="524288" immediateFlush="false">
|
bufferSize="524288" immediateFlush="false">
|
||||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
<!-- Use simple format for audit log to speed up -->
|
<!-- Use simple format for audit log to speed up -->
|
||||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||||
<!-- Trigger after exceeding 1hour or 500MB -->
|
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||||
<Policies>
|
<Policies>
|
||||||
<SizeBasedTriggeringPolicy size="500MB"/>
|
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||||
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
</Policies>
|
</Policies>
|
||||||
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||||
<DefaultRolloverStrategy max="2">
|
<DefaultRolloverStrategy max="2">
|
||||||
|
|
@ -70,8 +70,32 @@
|
||||||
<IfFileName glob="*/*.gz"/>
|
<IfFileName glob="*/*.gz"/>
|
||||||
<IfLastModified age="60d"/>
|
<IfLastModified age="60d"/>
|
||||||
<IfAny>
|
<IfAny>
|
||||||
<IfAccumulatedFileSize exceeds="5GB" />
|
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||||
<IfAccumulatedFileCount exceeds="500" />
|
<IfAccumulatedFileCount exceeds="500"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<!-- Slow query log config -->
|
||||||
|
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||||
|
immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
|
<DefaultRolloverStrategy max="5">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.log"/>
|
||||||
|
<!-- Limit log amount & size -->
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
</IfAny>
|
</IfAny>
|
||||||
</Delete>
|
</Delete>
|
||||||
</DefaultRolloverStrategy>
|
</DefaultRolloverStrategy>
|
||||||
|
|
@ -113,5 +137,8 @@
|
||||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||||
<appender-ref ref="audit"/>
|
<appender-ref ref="audit"/>
|
||||||
</AsyncLogger>
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="slowQueryLog"/>
|
||||||
|
</AsyncLogger>
|
||||||
</loggers>
|
</loggers>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8181
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
# The duplication of HugeGraphIoRegistry is meant to fix a bug in the
|
||||||
|
# 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
|
||||||
|
ioRegistries: [
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry,
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8181
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
# bind url
|
||||||
|
restserver.url=http://127.0.0.1:8081
|
||||||
|
# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
|
||||||
|
gremlinserver.url=http://127.0.0.1:8181
|
||||||
|
|
||||||
|
graphs=./conf/graphs
|
||||||
|
|
||||||
|
# configuration of arthas
|
||||||
|
arthas.telnet_port=8562
|
||||||
|
arthas.http_port=8561
|
||||||
|
arthas.ip=127.0.0.1
|
||||||
|
arthas.disabled_commands=jad
|
||||||
|
|
||||||
|
# authentication configs
|
||||||
|
# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
|
||||||
|
# 'org.apache.hugegraph.auth.ConfigAuthenticator'
|
||||||
|
#auth.authenticator=
|
||||||
|
|
||||||
|
# rpc server configs for multi graph-servers or raft-servers
|
||||||
|
rpc.server_host=127.0.0.1
|
||||||
|
rpc.server_port=8091
|
||||||
|
|
||||||
|
# lightweight load balancing (beta)
|
||||||
|
server.id=server-1
|
||||||
|
server.role=master
|
||||||
|
|
||||||
|
# slow query log
|
||||||
|
log.slow_query_threshold=1000
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
|
||||||
|
gremlin.graph=org.apache.hugegraph.HugeFactory
|
||||||
|
|
||||||
|
# cache config
|
||||||
|
vertex.cache_type=l2
|
||||||
|
edge.cache_type=l2
|
||||||
|
|
||||||
|
store=hugegraph
|
||||||
|
backend=hstore
|
||||||
|
serializer=binary
|
||||||
|
|
||||||
|
# pd config
|
||||||
|
pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
# task config
|
||||||
|
task.scheduler_type=local
|
||||||
|
task.schedule_period=10
|
||||||
|
task.retry=0
|
||||||
|
task.wait_timeout=10
|
||||||
|
|
@ -0,0 +1,127 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8182
|
||||||
|
|
||||||
|
# timeout in ms of gremlin query
|
||||||
|
evaluationTimeout: 30000
|
||||||
|
|
||||||
|
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
|
||||||
|
# don't set graph at here, this happens after support for dynamically adding graph
|
||||||
|
graphs: {
|
||||||
|
}
|
||||||
|
scriptEngines: {
|
||||||
|
gremlin-groovy: {
|
||||||
|
staticImports: [
|
||||||
|
org.opencypher.gremlin.process.traversal.CustomPredicates.*',
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions.*
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
|
||||||
|
classImports: [
|
||||||
|
java.lang.Math,
|
||||||
|
org.apache.hugegraph.backend.id.IdGenerator,
|
||||||
|
org.apache.hugegraph.type.define.Directions,
|
||||||
|
org.apache.hugegraph.type.define.NodeRole,
|
||||||
|
org.apache.hugegraph.masterelection.GlobalMasterInfo,
|
||||||
|
org.apache.hugegraph.util.DateUtil,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CountTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.HugeTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KoutTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.optimize.ConditionP,
|
||||||
|
org.apache.hugegraph.traversal.optimize.Text,
|
||||||
|
org.apache.hugegraph.traversal.optimize.TraversalUtil,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate
|
||||||
|
],
|
||||||
|
methodImports: [
|
||||||
|
java.lang.Math#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions#*
|
||||||
|
]
|
||||||
|
},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
|
||||||
|
files: [scripts/empty-sample.groovy]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
serializers:
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
metrics: {
|
||||||
|
consoleReporter: {enabled: false, interval: 180000},
|
||||||
|
csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
|
||||||
|
jmxReporter: {enabled: false},
|
||||||
|
slf4jReporter: {enabled: false, interval: 180000},
|
||||||
|
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
|
||||||
|
graphiteReporter: {enabled: false, interval: 180000}
|
||||||
|
}
|
||||||
|
maxInitialLineLength: 4096
|
||||||
|
maxHeaderSize: 8192
|
||||||
|
maxChunkSize: 8192
|
||||||
|
maxContentLength: 65536
|
||||||
|
maxAccumulationBufferComponents: 1024
|
||||||
|
resultIterationBatchSize: 64
|
||||||
|
writeBufferLowWaterMark: 32768
|
||||||
|
writeBufferHighWaterMark: 65536
|
||||||
|
ssl: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,144 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You 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.
|
||||||
|
-->
|
||||||
|
<!-- Config will be auto loaded every 60s -->
|
||||||
|
<configuration status="error" monitorInterval="60">
|
||||||
|
<properties>
|
||||||
|
<property name="LOG_PATH">logs</property>
|
||||||
|
<property name="FILE_NAME">hugegraph-server</property>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<appenders>
|
||||||
|
<Console name="console" target="SYSTEM_OUT">
|
||||||
|
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
</Console>
|
||||||
|
|
||||||
|
<!-- Normal server log config -->
|
||||||
|
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||||
|
immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
|
<DefaultRolloverStrategy max="5">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.log"/>
|
||||||
|
<!-- Limit log amount & size -->
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||||
|
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||||
|
bufferSize="524288" immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<!-- Use simple format for audit log to speed up -->
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||||
|
<DefaultRolloverStrategy max="2">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.gz"/>
|
||||||
|
<IfLastModified age="60d"/>
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="500"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<!-- Slow query log config -->
|
||||||
|
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||||
|
immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
|
<DefaultRolloverStrategy max="5">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.log"/>
|
||||||
|
<!-- Limit log amount & size -->
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
</appenders>
|
||||||
|
|
||||||
|
<loggers>
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</root>
|
||||||
|
<logger name="org.apache.cassandra" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.hadoop" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.zookeeper" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="com.datastax.driver" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="com.alipay.sofa" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="io.netty" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.commons" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<!-- Use mixed async way to output logs -->
|
||||||
|
<AsyncLogger name="org.apache.hugegraph" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.auth" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="audit"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="audit"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="slowQueryLog"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
</loggers>
|
||||||
|
</configuration>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8182
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
# The duplication of HugeGraphIoRegistry is meant to fix a bug in the
|
||||||
|
# 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
|
||||||
|
ioRegistries: [
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry,
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
# bind url
|
||||||
|
restserver.url=http://127.0.0.1:8082
|
||||||
|
# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
|
||||||
|
gremlinserver.url=http://127.0.0.1:8182
|
||||||
|
|
||||||
|
graphs=./conf/graphs
|
||||||
|
|
||||||
|
# configuration of arthas
|
||||||
|
arthas.telnet_port=8572
|
||||||
|
arthas.http_port=8571
|
||||||
|
arthas.ip=127.0.0.1
|
||||||
|
arthas.disabled_commands=jad
|
||||||
|
|
||||||
|
# authentication configs
|
||||||
|
# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
|
||||||
|
# 'org.apache.hugegraph.auth.ConfigAuthenticator'
|
||||||
|
#auth.authenticator=
|
||||||
|
|
||||||
|
# rpc server configs for multi graph-servers or raft-servers
|
||||||
|
rpc.server_host=127.0.0.1
|
||||||
|
rpc.server_port=8092
|
||||||
|
#rpc.server_timeout=30
|
||||||
|
|
||||||
|
# lightweight load balancing (beta)
|
||||||
|
server.id=server-2
|
||||||
|
server.role=worker
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
|
||||||
|
gremlin.graph=org.apache.hugegraph.HugeFactory
|
||||||
|
|
||||||
|
# cache config
|
||||||
|
vertex.cache_type=l2
|
||||||
|
edge.cache_type=l2
|
||||||
|
|
||||||
|
store=hugegraph
|
||||||
|
backend=hstore
|
||||||
|
serializer=binary
|
||||||
|
|
||||||
|
# pd config
|
||||||
|
pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
|
||||||
|
|
||||||
|
# task config
|
||||||
|
task.scheduler_type=local
|
||||||
|
task.schedule_period=10
|
||||||
|
task.retry=0
|
||||||
|
task.wait_timeout=10
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8183
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,127 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 8183
|
||||||
|
|
||||||
|
# timeout in ms of gremlin query
|
||||||
|
evaluationTimeout: 30000
|
||||||
|
|
||||||
|
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
|
||||||
|
# don't set graph at here, this happens after support for dynamically adding graph
|
||||||
|
graphs: {
|
||||||
|
}
|
||||||
|
scriptEngines: {
|
||||||
|
gremlin-groovy: {
|
||||||
|
staticImports: [
|
||||||
|
org.opencypher.gremlin.process.traversal.CustomPredicates.*',
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions.*
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
|
||||||
|
classImports: [
|
||||||
|
java.lang.Math,
|
||||||
|
org.apache.hugegraph.backend.id.IdGenerator,
|
||||||
|
org.apache.hugegraph.type.define.Directions,
|
||||||
|
org.apache.hugegraph.type.define.NodeRole,
|
||||||
|
org.apache.hugegraph.masterelection.GlobalMasterInfo,
|
||||||
|
org.apache.hugegraph.util.DateUtil,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CountTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.HugeTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.KoutTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
|
||||||
|
org.apache.hugegraph.traversal.optimize.ConditionP,
|
||||||
|
org.apache.hugegraph.traversal.optimize.Text,
|
||||||
|
org.apache.hugegraph.traversal.optimize.TraversalUtil,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate
|
||||||
|
],
|
||||||
|
methodImports: [
|
||||||
|
java.lang.Math#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomPredicate#*,
|
||||||
|
org.opencypher.gremlin.traversal.CustomFunctions#*
|
||||||
|
]
|
||||||
|
},
|
||||||
|
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
|
||||||
|
files: [scripts/empty-sample.groovy]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
serializers:
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
metrics: {
|
||||||
|
consoleReporter: {enabled: false, interval: 180000},
|
||||||
|
csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
|
||||||
|
jmxReporter: {enabled: false},
|
||||||
|
slf4jReporter: {enabled: false, interval: 180000},
|
||||||
|
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
|
||||||
|
graphiteReporter: {enabled: false, interval: 180000}
|
||||||
|
}
|
||||||
|
maxInitialLineLength: 4096
|
||||||
|
maxHeaderSize: 8192
|
||||||
|
maxChunkSize: 8192
|
||||||
|
maxContentLength: 65536
|
||||||
|
maxAccumulationBufferComponents: 1024
|
||||||
|
resultIterationBatchSize: 64
|
||||||
|
writeBufferLowWaterMark: 32768
|
||||||
|
writeBufferHighWaterMark: 65536
|
||||||
|
ssl: {
|
||||||
|
enabled: false
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,144 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You 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.
|
||||||
|
-->
|
||||||
|
<!-- Config will be auto loaded every 60s -->
|
||||||
|
<configuration status="error" monitorInterval="60">
|
||||||
|
<properties>
|
||||||
|
<property name="LOG_PATH">logs</property>
|
||||||
|
<property name="FILE_NAME">hugegraph-server</property>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<appenders>
|
||||||
|
<Console name="console" target="SYSTEM_OUT">
|
||||||
|
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
</Console>
|
||||||
|
|
||||||
|
<!-- Normal server log config -->
|
||||||
|
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||||
|
immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
|
<DefaultRolloverStrategy max="5">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.log"/>
|
||||||
|
<!-- Limit log amount & size -->
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||||
|
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||||
|
bufferSize="524288" immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<!-- Use simple format for audit log to speed up -->
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||||
|
<DefaultRolloverStrategy max="2">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.gz"/>
|
||||||
|
<IfLastModified age="60d"/>
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="500"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
|
||||||
|
<!-- Slow query log config -->
|
||||||
|
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||||
|
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||||
|
immediateFlush="false">
|
||||||
|
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||||
|
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||||
|
<!-- Trigger after exceeding 1day or 50MB -->
|
||||||
|
<Policies>
|
||||||
|
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||||
|
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||||
|
</Policies>
|
||||||
|
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||||
|
<DefaultRolloverStrategy max="5">
|
||||||
|
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||||
|
<IfFileName glob="*/*.log"/>
|
||||||
|
<!-- Limit log amount & size -->
|
||||||
|
<IfAny>
|
||||||
|
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||||
|
<IfAccumulatedFileCount exceeds="100"/>
|
||||||
|
</IfAny>
|
||||||
|
</Delete>
|
||||||
|
</DefaultRolloverStrategy>
|
||||||
|
</RollingRandomAccessFile>
|
||||||
|
</appenders>
|
||||||
|
|
||||||
|
<loggers>
|
||||||
|
<root level="INFO">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</root>
|
||||||
|
<logger name="org.apache.cassandra" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.hadoop" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.zookeeper" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="com.datastax.driver" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="com.alipay.sofa" level="WARN" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="io.netty" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<logger name="org.apache.commons" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</logger>
|
||||||
|
<!-- Use mixed async way to output logs -->
|
||||||
|
<AsyncLogger name="org.apache.hugegraph" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="file"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.auth" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="audit"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="audit"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="slowQueryLog"/>
|
||||||
|
</AsyncLogger>
|
||||||
|
</loggers>
|
||||||
|
</configuration>
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8183
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
# The duplication of HugeGraphIoRegistry is meant to fix a bug in the
|
||||||
|
# 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
|
||||||
|
ioRegistries: [
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry,
|
||||||
|
org.apache.hugegraph.io.HugeGraphIoRegistry
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
hosts: [localhost]
|
||||||
|
port: 8183
|
||||||
|
serializer: {
|
||||||
|
className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
|
||||||
|
config: {
|
||||||
|
serializeResultToString: false,
|
||||||
|
ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# bind url
|
||||||
|
restserver.url=http://127.0.0.1:8083
|
||||||
|
# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
|
||||||
|
gremlinserver.url=http://127.0.0.1:8183
|
||||||
|
|
||||||
|
graphs=./conf/graphs
|
||||||
|
|
||||||
|
# configuration of arthas
|
||||||
|
arthas.telnet_port=8582
|
||||||
|
arthas.http_port=8581
|
||||||
|
arthas.ip=127.0.0.1
|
||||||
|
arthas.disabled_commands=jad
|
||||||
|
|
||||||
|
# authentication configs
|
||||||
|
# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
|
||||||
|
# 'org.apache.hugegraph.auth.ConfigAuthenticator'
|
||||||
|
#auth.authenticator=
|
||||||
|
|
||||||
|
# rpc server configs for multi graph-servers or raft-servers
|
||||||
|
rpc.server_host=127.0.0.1
|
||||||
|
rpc.server_port=8093
|
||||||
|
|
||||||
|
# lightweight load balancing (beta)
|
||||||
|
server.id=server-3
|
||||||
|
server.role=worker
|
||||||
|
|
@ -0,0 +1,180 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
# TODO: reuse the configs for same type containers
|
||||||
|
# User could modify the node nums and the port by themselves
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
pd0:
|
||||||
|
image: hugegraph/pd
|
||||||
|
container_name: pd0
|
||||||
|
hostname: pd0
|
||||||
|
network_mode: host
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8620"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-pd0.yml:/hugegraph-pd/conf/application.yml
|
||||||
|
|
||||||
|
pd1:
|
||||||
|
image: hugegraph/pd
|
||||||
|
container_name: pd1
|
||||||
|
hostname: pd1
|
||||||
|
network_mode: host
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8621"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-pd1.yml:/hugegraph-pd/conf/application.yml
|
||||||
|
|
||||||
|
pd2:
|
||||||
|
image: hugegraph/pd
|
||||||
|
container_name: pd2
|
||||||
|
hostname: pd2
|
||||||
|
network_mode: host
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8622"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-pd2.yml:/hugegraph-pd/conf/application.yml
|
||||||
|
|
||||||
|
store0:
|
||||||
|
image: hugegraph/store
|
||||||
|
container_name: store0
|
||||||
|
hostname: store0
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
pd0:
|
||||||
|
condition: service_healthy
|
||||||
|
pd1:
|
||||||
|
condition: service_healthy
|
||||||
|
pd2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8520"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-store0.yml:/hugegraph-store/conf/application.yml
|
||||||
|
|
||||||
|
store1:
|
||||||
|
image: hugegraph/store
|
||||||
|
container_name: store1
|
||||||
|
hostname: store1
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
pd0:
|
||||||
|
condition: service_healthy
|
||||||
|
pd1:
|
||||||
|
condition: service_healthy
|
||||||
|
pd2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8521"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-store1.yml:/hugegraph-store/conf/application.yml
|
||||||
|
|
||||||
|
store2:
|
||||||
|
image: hugegraph/store
|
||||||
|
container_name: store2
|
||||||
|
hostname: store2
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
pd0:
|
||||||
|
condition: service_healthy
|
||||||
|
pd1:
|
||||||
|
condition: service_healthy
|
||||||
|
pd2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8522"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/application-store2.yml:/hugegraph-store/conf/application.yml
|
||||||
|
|
||||||
|
server1:
|
||||||
|
image: hugegraph/server
|
||||||
|
container_name: server1
|
||||||
|
hostname: server1
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
store0:
|
||||||
|
condition: service_healthy
|
||||||
|
store1:
|
||||||
|
condition: service_healthy
|
||||||
|
store2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8081"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/server1-conf:/hugegraph-server/conf
|
||||||
|
|
||||||
|
server2:
|
||||||
|
image: hugegraph/server
|
||||||
|
container_name: server2
|
||||||
|
hostname: server2
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
store0:
|
||||||
|
condition: service_healthy
|
||||||
|
store1:
|
||||||
|
condition: service_healthy
|
||||||
|
store2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8082"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/server2-conf:/hugegraph-server/conf
|
||||||
|
|
||||||
|
server3:
|
||||||
|
image: hugegraph/server
|
||||||
|
container_name: server3
|
||||||
|
hostname: server3
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
store0:
|
||||||
|
condition: service_healthy
|
||||||
|
store1:
|
||||||
|
condition: service_healthy
|
||||||
|
store2:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8083"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
volumes:
|
||||||
|
- ./configs/server3-conf:/hugegraph-server/conf
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
pd:
|
||||||
|
image: hugegraph/pd
|
||||||
|
container_name: pd
|
||||||
|
hostname: pd
|
||||||
|
network_mode: host
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8620"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
store:
|
||||||
|
image: hugegraph/store
|
||||||
|
container_name: store
|
||||||
|
hostname: store
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
pd:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8520"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
server:
|
||||||
|
image: hugegraph/server
|
||||||
|
container_name: server
|
||||||
|
hostname: server
|
||||||
|
network_mode: host
|
||||||
|
depends_on:
|
||||||
|
store:
|
||||||
|
condition: service_healthy
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 3
|
||||||
|
|
@ -1,111 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.api.gremlin;
|
|
||||||
|
|
||||||
import org.opencypher.gremlin.translation.TranslationFacade;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.api.filter.CompressInterceptor.Compress;
|
|
||||||
import org.apache.hugegraph.util.E;
|
|
||||||
import org.apache.hugegraph.util.Log;
|
|
||||||
import com.codahale.metrics.annotation.Timed;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
import jakarta.inject.Singleton;
|
|
||||||
import jakarta.ws.rs.Consumes;
|
|
||||||
import jakarta.ws.rs.GET;
|
|
||||||
import jakarta.ws.rs.POST;
|
|
||||||
import jakarta.ws.rs.Path;
|
|
||||||
import jakarta.ws.rs.PathParam;
|
|
||||||
import jakarta.ws.rs.Produces;
|
|
||||||
import jakarta.ws.rs.QueryParam;
|
|
||||||
import jakarta.ws.rs.core.Context;
|
|
||||||
import jakarta.ws.rs.core.HttpHeaders;
|
|
||||||
import jakarta.ws.rs.core.Response;
|
|
||||||
|
|
||||||
@Path("graphs/{graph}/cypher")
|
|
||||||
@Singleton
|
|
||||||
@Tag(name = "CypherAPI")
|
|
||||||
public class CypherAPI extends GremlinQueryAPI {
|
|
||||||
|
|
||||||
private static final Logger LOG = Log.logger(CypherAPI.class);
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Compress(buffer = (1024 * 40))
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
public Response query(@PathParam("graph") String graph,
|
|
||||||
@Context HttpHeaders headers,
|
|
||||||
@QueryParam("cypher") String cypher) {
|
|
||||||
LOG.debug("Graph [{}] query by cypher: {}", graph, cypher);
|
|
||||||
|
|
||||||
return this.queryByCypher(graph, headers, cypher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Timed
|
|
||||||
@Compress
|
|
||||||
@Consumes(APPLICATION_JSON)
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
public Response post(@PathParam("graph") String graph,
|
|
||||||
@Context HttpHeaders headers,
|
|
||||||
String cypher) {
|
|
||||||
LOG.debug("Graph [{}] query by cypher: {}", graph, cypher);
|
|
||||||
return this.queryByCypher(graph, headers, cypher);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Response queryByCypher(String graph,
|
|
||||||
HttpHeaders headers,
|
|
||||||
String cypher) {
|
|
||||||
E.checkArgument(cypher != null && !cypher.isEmpty(),
|
|
||||||
"The cypher parameter can't be null or empty");
|
|
||||||
|
|
||||||
String gremlin = this.translateCpyher2Gremlin(graph, cypher);
|
|
||||||
LOG.debug("translated gremlin is {}", gremlin);
|
|
||||||
|
|
||||||
String auth = headers.getHeaderString(HttpHeaders.AUTHORIZATION);
|
|
||||||
String request = "{" +
|
|
||||||
"\"gremlin\":\"" + gremlin + "\"," +
|
|
||||||
"\"bindings\":{}," +
|
|
||||||
"\"language\":\"gremlin-groovy\"," +
|
|
||||||
"\"aliases\":{\"g\":\"__g_" + graph + "\"}}";
|
|
||||||
|
|
||||||
Response response = this.client().doPostRequest(auth, request);
|
|
||||||
return transformResponseIfNeeded(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String translateCpyher2Gremlin(String graph, String cypher) {
|
|
||||||
TranslationFacade translator = new TranslationFacade();
|
|
||||||
String gremlin = translator.toGremlinGroovy(cypher);
|
|
||||||
gremlin = this.buildQueryableGremlin(graph, gremlin);
|
|
||||||
return gremlin;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String buildQueryableGremlin(String graph, String gremlin) {
|
|
||||||
/*
|
|
||||||
* `CREATE (a:person { name : 'test', age: 20) return a`
|
|
||||||
* would be translated to:
|
|
||||||
* `g.addV('person').as('a').property(single, 'name', 'test') ...`,
|
|
||||||
* but hugegraph don't support `.property(single, k, v)`,
|
|
||||||
* so we replace it to `.property(k, v)` here
|
|
||||||
*/
|
|
||||||
gremlin = gremlin.replace(".property(single,", ".property(");
|
|
||||||
|
|
||||||
return gremlin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.api.gremlin;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import jakarta.ws.rs.client.Entity;
|
|
||||||
import jakarta.ws.rs.client.WebTarget;
|
|
||||||
import jakarta.ws.rs.core.HttpHeaders;
|
|
||||||
import jakarta.ws.rs.core.MediaType;
|
|
||||||
import jakarta.ws.rs.core.MultivaluedMap;
|
|
||||||
import jakarta.ws.rs.core.Response;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.api.filter.CompressInterceptor;
|
|
||||||
import org.apache.hugegraph.rest.AbstractRestClient;
|
|
||||||
import org.apache.hugegraph.testutil.Whitebox;
|
|
||||||
import org.apache.hugegraph.util.E;
|
|
||||||
|
|
||||||
public class GremlinClient extends AbstractRestClient {
|
|
||||||
|
|
||||||
private final WebTarget webTarget;
|
|
||||||
|
|
||||||
public GremlinClient(String url, int timeout,
|
|
||||||
int maxTotal, int maxPerRoute) {
|
|
||||||
super(url, timeout, maxTotal, maxPerRoute);
|
|
||||||
this.webTarget = Whitebox.getInternalState(this, "target");
|
|
||||||
E.checkNotNull(this.webTarget, "target");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void checkStatus(Response response, Response.Status... statuses) {
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
|
|
||||||
public Response doPostRequest(String auth, String req) {
|
|
||||||
Entity<?> body = Entity.entity(req, MediaType.APPLICATION_JSON);
|
|
||||||
return this.webTarget.request()
|
|
||||||
.header(HttpHeaders.AUTHORIZATION, auth)
|
|
||||||
.accept(MediaType.APPLICATION_JSON)
|
|
||||||
.acceptEncoding(CompressInterceptor.GZIP)
|
|
||||||
.post(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Response doGetRequest(String auth,
|
|
||||||
MultivaluedMap<String, String> params) {
|
|
||||||
WebTarget target = this.webTarget;
|
|
||||||
for (Map.Entry<String, List<String>> entry : params.entrySet()) {
|
|
||||||
E.checkArgument(entry.getValue().size() == 1,
|
|
||||||
"Invalid query param '%s', can only accept " +
|
|
||||||
"one value, but got %s",
|
|
||||||
entry.getKey(), entry.getValue());
|
|
||||||
target = target.queryParam(entry.getKey(), entry.getValue().get(0));
|
|
||||||
}
|
|
||||||
return target.request()
|
|
||||||
.header(HttpHeaders.AUTHORIZATION, auth)
|
|
||||||
.accept(MediaType.APPLICATION_JSON)
|
|
||||||
.acceptEncoding(CompressInterceptor.GZIP)
|
|
||||||
.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,161 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.api.metrics;
|
|
||||||
|
|
||||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
|
||||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
|
||||||
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
import jakarta.annotation.security.RolesAllowed;
|
|
||||||
import jakarta.inject.Singleton;
|
|
||||||
import jakarta.ws.rs.GET;
|
|
||||||
import jakarta.ws.rs.Path;
|
|
||||||
import jakarta.ws.rs.Produces;
|
|
||||||
import jakarta.ws.rs.core.Context;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.core.GraphManager;
|
|
||||||
import org.apache.hugegraph.metrics.MetricsModule;
|
|
||||||
import org.apache.hugegraph.metrics.ServerReporter;
|
|
||||||
import org.apache.hugegraph.metrics.SystemMetrics;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.HugeGraph;
|
|
||||||
import org.apache.hugegraph.api.API;
|
|
||||||
import org.apache.hugegraph.backend.store.BackendMetrics;
|
|
||||||
import org.apache.hugegraph.util.InsertionOrderUtil;
|
|
||||||
import org.apache.hugegraph.util.JsonUtil;
|
|
||||||
import org.apache.hugegraph.util.Log;
|
|
||||||
import com.codahale.metrics.Metric;
|
|
||||||
import com.codahale.metrics.annotation.Timed;
|
|
||||||
|
|
||||||
@Singleton
|
|
||||||
@Path("metrics")
|
|
||||||
@Tag(name = "MetricsAPI")
|
|
||||||
public class MetricsAPI extends API {
|
|
||||||
|
|
||||||
private static final Logger LOG = Log.logger(MetricsAPI.class);
|
|
||||||
|
|
||||||
private SystemMetrics systemMetrics;
|
|
||||||
|
|
||||||
static {
|
|
||||||
JsonUtil.registerModule(new MetricsModule(SECONDS, MILLISECONDS, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
public MetricsAPI() {
|
|
||||||
this.systemMetrics = new SystemMetrics();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("system")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String system() {
|
|
||||||
return JsonUtil.toJson(this.systemMetrics.metrics());
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("backend")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String backend(@Context GraphManager manager) {
|
|
||||||
Map<String, Map<String, Object>> results = InsertionOrderUtil.newMap();
|
|
||||||
for (String graph : manager.graphs()) {
|
|
||||||
HugeGraph g = manager.graph(graph);
|
|
||||||
Map<String, Object> metrics = InsertionOrderUtil.newMap();
|
|
||||||
metrics.put(BackendMetrics.BACKEND, g.backend());
|
|
||||||
try {
|
|
||||||
metrics.putAll(g.metadata(null, "metrics"));
|
|
||||||
} catch (Throwable e) {
|
|
||||||
metrics.put(BackendMetrics.EXCEPTION, e.toString());
|
|
||||||
LOG.debug("Failed to get backend metrics", e);
|
|
||||||
}
|
|
||||||
results.put(graph, metrics);
|
|
||||||
}
|
|
||||||
return JsonUtil.toJson(results);
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String all() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
Map<String, Map<String, ? extends Metric>> result = new LinkedHashMap<>();
|
|
||||||
result.put("gauges", reporter.gauges());
|
|
||||||
result.put("counters", reporter.counters());
|
|
||||||
result.put("histograms", reporter.histograms());
|
|
||||||
result.put("meters", reporter.meters());
|
|
||||||
result.put("timers", reporter.timers());
|
|
||||||
return JsonUtil.toJson(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("gauges")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String gauges() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
return JsonUtil.toJson(reporter.gauges());
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("counters")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String counters() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
return JsonUtil.toJson(reporter.counters());
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("histograms")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String histograms() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
return JsonUtil.toJson(reporter.histograms());
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("meters")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String meters() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
return JsonUtil.toJson(reporter.meters());
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Path("timers")
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
|
||||||
public String timers() {
|
|
||||||
ServerReporter reporter = ServerReporter.instance();
|
|
||||||
return JsonUtil.toJson(reporter.timers());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,82 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.api.traversers;
|
|
||||||
|
|
||||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_ELEMENTS_LIMIT;
|
|
||||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_MAX_DEGREE;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
||||||
import jakarta.inject.Singleton;
|
|
||||||
import jakarta.ws.rs.DefaultValue;
|
|
||||||
import jakarta.ws.rs.GET;
|
|
||||||
import jakarta.ws.rs.Path;
|
|
||||||
import jakarta.ws.rs.PathParam;
|
|
||||||
import jakarta.ws.rs.Produces;
|
|
||||||
import jakarta.ws.rs.QueryParam;
|
|
||||||
import jakarta.ws.rs.core.Context;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.HugeGraph;
|
|
||||||
import org.apache.hugegraph.api.API;
|
|
||||||
import org.apache.hugegraph.api.graph.EdgeAPI;
|
|
||||||
import org.apache.hugegraph.api.graph.VertexAPI;
|
|
||||||
import org.apache.hugegraph.backend.id.Id;
|
|
||||||
import org.apache.hugegraph.core.GraphManager;
|
|
||||||
import org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser;
|
|
||||||
import org.apache.hugegraph.type.define.Directions;
|
|
||||||
import org.apache.hugegraph.util.Log;
|
|
||||||
import com.codahale.metrics.annotation.Timed;
|
|
||||||
|
|
||||||
@Path("graphs/{graph}/traversers/sameneighbors")
|
|
||||||
@Singleton
|
|
||||||
@Tag(name = "SameNeighborsAPI")
|
|
||||||
public class SameNeighborsAPI extends API {
|
|
||||||
|
|
||||||
private static final Logger LOG = Log.logger(SameNeighborsAPI.class);
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Timed
|
|
||||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
|
||||||
public String get(@Context GraphManager manager,
|
|
||||||
@PathParam("graph") String graph,
|
|
||||||
@QueryParam("vertex") String vertex,
|
|
||||||
@QueryParam("other") String other,
|
|
||||||
@QueryParam("direction") String direction,
|
|
||||||
@QueryParam("label") String edgeLabel,
|
|
||||||
@QueryParam("max_degree")
|
|
||||||
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
|
|
||||||
@QueryParam("limit")
|
|
||||||
@DefaultValue(DEFAULT_ELEMENTS_LIMIT) int limit) {
|
|
||||||
LOG.debug("Graph [{}] get same neighbors between '{}' and '{}' with " +
|
|
||||||
"direction {}, edge label {}, max degree '{}' and limit '{}'",
|
|
||||||
graph, vertex, other, direction, edgeLabel, maxDegree, limit);
|
|
||||||
|
|
||||||
Id sourceId = VertexAPI.checkAndParseVertexId(vertex);
|
|
||||||
Id targetId = VertexAPI.checkAndParseVertexId(other);
|
|
||||||
Directions dir = Directions.convert(EdgeAPI.parseDirection(direction));
|
|
||||||
|
|
||||||
HugeGraph g = graph(manager, graph);
|
|
||||||
SameNeighborTraverser traverser = new SameNeighborTraverser(g);
|
|
||||||
Set<Id> neighbors = traverser.sameNeighbors(sourceId, targetId, dir,
|
|
||||||
edgeLabel, maxDegree, limit);
|
|
||||||
return manager.serializer(g).writeList("same_neighbors", neighbors);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.api.traversers;
|
|
||||||
|
|
||||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_MAX_DEGREE;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.HugeGraph;
|
|
||||||
import org.apache.hugegraph.api.API;
|
|
||||||
import org.apache.hugegraph.traversal.algorithm.steps.EdgeStep;
|
|
||||||
import org.apache.hugegraph.type.define.Directions;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonAlias;
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
|
|
||||||
public class TraverserAPI extends API {
|
|
||||||
|
|
||||||
protected static EdgeStep step(HugeGraph graph, Step step) {
|
|
||||||
return new EdgeStep(graph, step.direction, step.labels, step.properties,
|
|
||||||
step.maxDegree, step.skipDegree);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static class Step {
|
|
||||||
|
|
||||||
@JsonProperty("direction")
|
|
||||||
public Directions direction;
|
|
||||||
@JsonProperty("labels")
|
|
||||||
public List<String> labels;
|
|
||||||
@JsonProperty("properties")
|
|
||||||
public Map<String, Object> properties;
|
|
||||||
@JsonAlias("degree")
|
|
||||||
@JsonProperty("max_degree")
|
|
||||||
public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
|
|
||||||
@JsonProperty("skip_degree")
|
|
||||||
public long skipDegree = 0L;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return String.format("Step{direction=%s,labels=%s,properties=%s," +
|
|
||||||
"maxDegree=%s,skipDegree=%s}",
|
|
||||||
this.direction, this.labels, this.properties,
|
|
||||||
this.maxDegree, this.skipDegree);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,333 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.auth;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.Modifier;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.apache.hugegraph.HugeException;
|
|
||||||
import org.apache.hugegraph.HugeFactory;
|
|
||||||
import org.apache.hugegraph.HugeGraph;
|
|
||||||
import org.apache.hugegraph.StandardHugeGraph;
|
|
||||||
import org.apache.hugegraph.backend.cache.CacheManager;
|
|
||||||
import org.apache.hugegraph.backend.tx.AbstractTransaction;
|
|
||||||
import org.apache.hugegraph.concurrent.LockManager;
|
|
||||||
import org.apache.hugegraph.metrics.ServerReporter;
|
|
||||||
import org.apache.hugegraph.schema.SchemaElement;
|
|
||||||
import org.apache.hugegraph.schema.SchemaManager;
|
|
||||||
import org.apache.hugegraph.backend.tx.GraphTransaction;
|
|
||||||
import org.apache.hugegraph.backend.tx.IndexableTransaction;
|
|
||||||
import org.apache.hugegraph.schema.builder.EdgeLabelBuilder;
|
|
||||||
import org.apache.hugegraph.schema.builder.IndexLabelBuilder;
|
|
||||||
import org.apache.hugegraph.schema.builder.PropertyKeyBuilder;
|
|
||||||
import org.apache.hugegraph.schema.builder.VertexLabelBuilder;
|
|
||||||
import org.apache.hugegraph.serializer.JsonSerializer;
|
|
||||||
import org.apache.hugegraph.structure.HugeEdge;
|
|
||||||
import org.apache.hugegraph.structure.HugeProperty;
|
|
||||||
import org.apache.hugegraph.structure.HugeVertex;
|
|
||||||
import org.apache.hugegraph.task.HugeTask;
|
|
||||||
import org.apache.hugegraph.task.StandardTaskScheduler;
|
|
||||||
import org.apache.hugegraph.task.TaskCallable;
|
|
||||||
import org.apache.hugegraph.task.TaskCallable.SysTaskCallable;
|
|
||||||
import org.apache.hugegraph.task.TaskManager;
|
|
||||||
import org.apache.hugegraph.schema.builder.AbstractBuilder;
|
|
||||||
import org.apache.hugegraph.structure.HugeElement;
|
|
||||||
import org.apache.hugegraph.traversal.optimize.HugeCountStepStrategy;
|
|
||||||
import org.apache.hugegraph.traversal.optimize.HugeGraphStepStrategy;
|
|
||||||
import org.apache.hugegraph.traversal.optimize.HugeVertexStepStrategy;
|
|
||||||
import org.apache.hugegraph.util.Reflection;
|
|
||||||
import org.apache.hugegraph.variables.HugeVariables;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
|
||||||
import org.apache.commons.configuration2.Configuration;
|
|
||||||
|
|
||||||
public final class HugeFactoryAuthProxy {
|
|
||||||
|
|
||||||
public static final String GRAPH_FACTORY =
|
|
||||||
"gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy";
|
|
||||||
|
|
||||||
private static final Set<String> PROTECT_METHODS = ImmutableSet.of(
|
|
||||||
"instance");
|
|
||||||
|
|
||||||
private static final Map<HugeGraph, HugeGraph> GRAPHS = new HashMap<>();
|
|
||||||
|
|
||||||
static {
|
|
||||||
HugeGraphAuthProxy.setContext(HugeGraphAuthProxy.Context.admin());
|
|
||||||
HugeFactoryAuthProxy.registerPrivateActions();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static synchronized HugeGraph open(Configuration config) {
|
|
||||||
/*
|
|
||||||
* Inject authentication (replace HugeGraph with HugeGraphAuthProxy)
|
|
||||||
* TODO: Add verify to StandardHugeGraph() to prevent dynamic creation
|
|
||||||
*/
|
|
||||||
HugeGraph graph = HugeFactory.open(config);
|
|
||||||
HugeGraph proxy = GRAPHS.get(graph);
|
|
||||||
if (proxy == null) {
|
|
||||||
proxy = new HugeGraphAuthProxy(graph);
|
|
||||||
GRAPHS.put(graph, proxy);
|
|
||||||
}
|
|
||||||
return proxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void registerPrivateActions() {
|
|
||||||
// Thread
|
|
||||||
Reflection.registerFieldsToFilter(java.lang.Thread.class, "name", "priority", "threadQ", "eetop", "single_step", "daemon", "stillborn", "target", "group", "contextClassLoader", "inheritedAccessControlContext", "threadInitNumber", "threadLocals", "inheritableThreadLocals", "stackSize", "nativeParkEventPointer", "tid", "threadSeqNumber", "threadStatus", "parkBlocker", "blocker", "blockerLock", "EMPTY_STACK_TRACE", "SUBCLASS_IMPLEMENTATION_PERMISSION", "uncaughtExceptionHandler", "defaultUncaughtExceptionHandler", "threadLocalRandomSeed", "threadLocalRandomSecondarySeed");
|
|
||||||
Reflection.registerMethodsToFilter(java.lang.Thread.class, "exit", "dispatchUncaughtException", "clone", "isInterrupted", "registerNatives", "init", "init", "nextThreadNum", "nextThreadID", "blockedOn", "start0", "isCCLOverridden", "auditSubclass", "dumpThreads", "getThreads", "processQueue", "setPriority0", "stop0", "suspend0", "resume0", "interrupt0", "setNativeName");
|
|
||||||
Reflection.registerFieldsToFilter(java.lang.ThreadLocal.class, "threadLocalHashCode", "nextHashCode", "HASH_INCREMENT");
|
|
||||||
Reflection.registerMethodsToFilter(java.lang.ThreadLocal.class, "access$400", "createInheritedMap", "nextHashCode", "initialValue", "setInitialValue", "getMap", "createMap", "childValue");
|
|
||||||
Reflection.registerMethodsToFilter(java.lang.InheritableThreadLocal.class, "getMap", "createMap", "childValue");
|
|
||||||
|
|
||||||
// HugeGraph
|
|
||||||
Reflection.registerFieldsToFilter(StandardAuthenticator.class, "graph");
|
|
||||||
Reflection.registerMethodsToFilter(StandardAuthenticator.class, "initAdminUser", "inputPassword", "graph");
|
|
||||||
Reflection.registerFieldsToFilter(ConfigAuthenticator.class, "tokens");
|
|
||||||
Reflection.registerFieldsToFilter(HugeFactoryAuthProxy.class, "PROTECT_METHODS");
|
|
||||||
Reflection.registerMethodsToFilter(HugeFactoryAuthProxy.class, "genRegisterPrivateActions", "registerClass", "registerPrivateActions", "registerPrivateActions", "c");
|
|
||||||
Reflection.registerFieldsToFilter(HugeAuthenticator.User.class, "role", "client");
|
|
||||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser.class, "name");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.class, "LOG", "hugegraph", "taskScheduler", "authManager", "contexts", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.class, "lambda$0", "access$3", "access$4", "access$2", "access$5", "resetContext", "logUser", "verifyAdminPermission", "verifyStatusPermission", "verifyPermission", "verifySchemaPermission", "verifySchemaPermission", "verifySchemaPermission", "verifySchemaPermission", "verifyNamePermission", "verifyNameExistsPermission", "verifyElemPermission", "verifyElemPermission", "verifyElemPermission", "verifyElemPermission", "verifyResPermission", "verifyResPermission", "verifyUserPermission", "verifyUserPermission", "verifyUserPermission", "getContextString", "access$6", "access$7", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "lambda$8", "lambda$9", "lambda$10", "lambda$11", "lambda$12", "lambda$13", "lambda$14", "lambda$15", "lambda$16", "lambda$17", "lambda$18", "lambda$19", "lambda$20", "lambda$21", "lambda$22", "lambda$23", "lambda$24", "access$8", "access$9", "access$10", "setContext", "getContext");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.AuthManagerProxy.class, "authManager", "this$0");
|
|
||||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.AuthManagerProxy.class, "currentUsername", "updateCreator");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.TaskSchedulerProxy.class, "taskScheduler", "this$0");
|
|
||||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.TaskSchedulerProxy.class, "lambda$0", "lambda$1", "lambda$2", "verifyTaskPermission", "verifyTaskPermission", "verifyTaskPermission", "verifyTaskPermission", "hasTaskPermission");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.GraphTraversalSourceProxy.class, "this$0");
|
|
||||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource.class, "connection", "graph", "strategies", "bytecode");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.TraversalStrategiesProxy.class, "REST_WOEKER", "serialVersionUID", "strategies", "this$0");
|
|
||||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.TraversalStrategiesProxy.class, "translate");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.VariablesProxy.class, "variables", "this$0");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.Context.class, "ADMIN", "user");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.ContextTask.class, "runner", "context");
|
|
||||||
Reflection.registerFieldsToFilter(StandardHugeGraph.class, "LOG", "started", "closed", "mode", "variables", "name", "params", "configuration", "schemaEventHub", "graphEventHub", "indexEventHub", "writeRateLimiter", "readRateLimiter", "taskManager", "authManager", "features", "storeProvider", "tx", "ramtable", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(StandardHugeGraph.class, "lambda$0", "access$3", "access$4", "access$2", "access$5", "access$6", "access$7", "waitUntilAllTasksCompleted", "access$8", "loadStoreProvider", "graphTransaction", "schemaTransaction", "openSchemaTransaction", "checkGraphNotClosed", "openSystemTransaction", "openGraphTransaction", "systemTransaction", "access$9", "access$10", "access$11", "access$12", "access$13", "access$14", "access$15", "access$16", "access$17", "access$18", "serializer", "loadSchemaStore", "loadSystemStore", "loadGraphStore", "closeTx", "analyzer", "serverInfoManager", "reloadRamtable", "reloadRamtable", "access$19", "access$20", "access$21");
|
|
||||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$StandardHugeGraphParams"), "graph", "this$0");
|
|
||||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$StandardHugeGraphParams"), "access$1", "graph");
|
|
||||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$TinkerPopTransaction"), "refs", "opened", "transactions", "this$0", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$TinkerPopTransaction"), "lambda$0", "access$3", "access$2", "lambda$1", "graphTransaction", "schemaTransaction", "systemTransaction", "access$1", "setOpened", "doCommit", "verifyOpened", "doRollback", "doClose", "destroyTransaction", "doOpen", "setClosed", "getOrNewTransaction", "access$0", "resetState");
|
|
||||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractThreadLocalTransaction.class, "readWriteConsumerInternal", "closeConsumerInternal", "transactionListeners");
|
|
||||||
Reflection.registerMethodsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractThreadLocalTransaction.class, "doClose", "fireOnCommit", "fireOnRollback", "doReadWrite", "lambda$fireOnRollback$1", "lambda$fireOnCommit$0");
|
|
||||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction.class, "g");
|
|
||||||
Reflection.registerMethodsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction.class, "doCommit", "doRollback", "doClose", "doOpen", "fireOnCommit", "fireOnRollback", "doReadWrite");
|
|
||||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$Txs"), "schemaTx", "systemTx", "graphTx", "openedTime", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$Txs"), "access$2", "access$1", "access$0");
|
|
||||||
Reflection.registerFieldsToFilter(GraphTransaction.class, "indexTx", "addedVertices", "removedVertices", "addedEdges", "removedEdges", "addedProps", "removedProps", "updatedVertices", "updatedEdges", "updatedOldestProps", "locksTable", "checkCustomVertexExist", "checkAdjacentVertexExist", "lazyLoadAdjacentVertex", "ignoreInvalidEntry", "commitPartOfAdjacentEdges", "batchSize", "pageSize", "verticesCapacity", "edgesCapacity", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy");
|
|
||||||
Reflection.registerMethodsToFilter(GraphTransaction.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "lambda$8", "lambda$9", "lambda$10", "lambda$11", "lambda$12", "lambda$13", "lambda$14", "lambda$15", "lambda$16", "lambda$17", "lambda$18", "lambda$19", "access$1", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "indexTransaction", "indexTransaction", "beforeWrite", "prepareCommit", "verticesInTxSize", "edgesInTxSize", "checkTxVerticesCapacity", "checkTxEdgesCapacity", "verticesInTxUpdated", "verticesInTxRemoved", "removingEdgeOwner", "prepareDeletions", "prepareDeletions", "prepareUpdates", "prepareAdditions", "checkVertexExistIfCustomizedId", "checkAggregateProperty", "checkAggregateProperty", "checkNonnullProperty", "queryEdgesFromBackend", "commitPartOfEdgeDeletions", "optimizeQueries", "checkVertexLabel", "checkId", "queryVerticesFromBackend", "joinTxVertices", "joinTxEdges", "lockForUpdateProperty", "optimizeQuery", "verifyVerticesConditionQuery", "verifyEdgesConditionQuery", "indexQuery", "joinTxRecords", "propertyUpdated", "parseEntry", "traverseByLabel", "reset", "queryVerticesByIds", "filterUnmatchedRecords", "skipOffsetOrStopLimit", "filterExpiredResultFromFromBackend", "queryEdgesByIds", "matchEdgeSortKeys", "rightResultFromIndexQuery");
|
|
||||||
Reflection.registerFieldsToFilter(IndexableTransaction.class, "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(IndexableTransaction.class, "indexTransaction", "commit2Backend", "reset");
|
|
||||||
Reflection.registerFieldsToFilter(AbstractTransaction.class, "LOG", "ownerThread", "autoCommit", "closed", "committing", "committing2Backend", "graph", "store", "mutation", "serializer", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(AbstractTransaction.class, "beforeWrite", "prepareCommit", "params", "mutation", "commit2Backend", "autoCommit", "beforeRead", "afterWrite", "afterRead", "commitMutation2Backend", "checkOwnerThread", "doAction", "store", "reset");
|
|
||||||
Reflection.registerFieldsToFilter(HugeFactory.class, "LOG", "NAME_REGEX", "graphs");
|
|
||||||
Reflection.registerMethodsToFilter(HugeFactory.class, "lambda$0");
|
|
||||||
Reflection.registerFieldsToFilter(SchemaElement.class, "graph", "id", "name", "userdata", "status");
|
|
||||||
Reflection.registerFieldsToFilter(HugeVertex.class, "EMPTY_SET", "id", "label", "edges", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys");
|
|
||||||
Reflection.registerMethodsToFilter(HugeVertex.class, "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "newProperty", "newProperty", "tx", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "checkIdLength", "onUpdateProperty", "ensureFilledProperties", "clone", "clone");
|
|
||||||
Reflection.registerFieldsToFilter(HugeElement.class, "EMPTY_MAP", "MAX_PROPERTIES", "graph", "properties", "expiredTime", "removed", "fresh", "propLoaded", "defaultValueUpdated", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Cardinality");
|
|
||||||
Reflection.registerMethodsToFilter(HugeElement.class, "removed", "addProperty", "newProperty", "tx", "onUpdateProperty", "ensureFilledProperties", "propLoaded", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Cardinality", "getIdValue", "fresh", "updateToDefaultValueIfNone", "copyProperties");
|
|
||||||
Reflection.registerFieldsToFilter(HugeEdge.class, "id", "label", "name", "sourceVertex", "targetVertex", "isOutEdge", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "$SWITCH_TABLE$org$apache$tinkerpop$gremlin$structure$Direction");
|
|
||||||
Reflection.registerMethodsToFilter(HugeEdge.class, "checkAdjacentVertexExist", "newProperty", "newProperty", "tx", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "onUpdateProperty", "ensureFilledProperties", "$SWITCH_TABLE$org$apache$tinkerpop$gremlin$structure$Direction", "clone", "clone");
|
|
||||||
Reflection.registerFieldsToFilter(HugeProperty.class, "owner", "pkey", "value");
|
|
||||||
Reflection.registerFieldsToFilter(HugeVariables.class, "LOG", "VARIABLES", "VARIABLE_KEY", "VARIABLE_TYPE", "BYTE_VALUE", "BOOLEAN_VALUE", "INTEGER_VALUE", "LONG_VALUE", "FLOAT_VALUE", "DOUBLE_VALUE", "STRING_VALUE", "LIST", "SET", "TYPES", "params", "graph");
|
|
||||||
Reflection.registerMethodsToFilter(HugeVariables.class, "createPropertyKey", "queryAllVariableVertices", "queryVariableVertex", "createVariableVertex", "removeVariableVertex", "extractSingleObject", "setProperty");
|
|
||||||
Reflection.registerFieldsToFilter(SchemaManager.class, "transaction", "graph");
|
|
||||||
Reflection.registerMethodsToFilter(SchemaManager.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "checkExists");
|
|
||||||
Reflection.registerFieldsToFilter(PropertyKeyBuilder.class, "id", "name", "dataType", "cardinality", "aggregateType", "checkExist", "userdata", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(PropertyKeyBuilder.class, "lambda$0", "checkStableVars", "checkAggregateType", "hasSameProperties");
|
|
||||||
Reflection.registerFieldsToFilter(AbstractBuilder.class, "transaction", "graph");
|
|
||||||
Reflection.registerMethodsToFilter(AbstractBuilder.class, "rebuildIndex", "graph", "checkSchemaName", "validOrGenerateId", "lockCheckAndCreateSchema", "propertyKeyOrNull", "checkSchemaIdIfRestoringMode", "vertexLabelOrNull", "edgeLabelOrNull", "indexLabelOrNull", "updateSchemaStatus");
|
|
||||||
Reflection.registerFieldsToFilter(VertexLabelBuilder.class, "id", "name", "idStrategy", "properties", "primaryKeys", "nullableKeys", "ttl", "ttlStartTime", "enableLabelIndex", "userdata", "checkExist", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy");
|
|
||||||
Reflection.registerMethodsToFilter(VertexLabelBuilder.class, "lambda$0", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "checkProperties", "checkNullableKeys", "checkIdStrategy", "checkPrimaryKeys", "hasSameProperties", "checkTtl", "checkUserdata", "mapPkId2Name", "mapPkId2Name");
|
|
||||||
Reflection.registerFieldsToFilter(EdgeLabelBuilder.class, "id", "name", "sourceLabel", "targetLabel", "frequency", "properties", "sortKeys", "nullableKeys", "ttl", "ttlStartTime", "enableLabelIndex", "userdata", "checkExist", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action");
|
|
||||||
Reflection.registerMethodsToFilter(EdgeLabelBuilder.class, "lambda$0", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "checkProperties", "checkNullableKeys", "checkSortKeys", "checkRelation", "hasSameProperties", "checkTtl", "checkUserdata", "mapPkId2Name", "mapPkId2Name");
|
|
||||||
Reflection.registerFieldsToFilter(IndexLabelBuilder.class, "id", "name", "baseType", "baseValue", "indexType", "indexFields", "userdata", "checkExist", "rebuild", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$DataType", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IndexType");
|
|
||||||
Reflection.registerMethodsToFilter(IndexLabelBuilder.class, "lambda$0", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$DataType", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IndexType", "checkBaseType", "checkIndexType", "checkFields4Range", "loadElement", "checkFields", "checkRepeatIndex", "checkRepeatIndex", "checkRepeatIndex", "checkPrimaryKeyIndex", "checkRepeatRangeIndex", "checkRepeatSearchIndex", "checkRepeatSecondaryIndex", "checkRepeatShardIndex", "checkRepeatUniqueIndex", "removeSubIndex", "hasSubIndex", "allStringIndex", "oneNumericField", "hasSameProperties");
|
|
||||||
Reflection.registerFieldsToFilter(TaskManager.class, "LOG", "SCHEDULE_PERIOD", "THREADS", "MANAGER", "schedulers", "taskExecutor", "taskDbExecutor", "serverInfoDbExecutor", "schedulerExecutor", "contexts", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(TaskManager.class, "lambda$0", "resetContext", "closeTaskTx", "setContext", "instance", "closeSchedulerTx", "notifyNewTask", "scheduleOrExecuteJob", "scheduleOrExecuteJobForGraph");
|
|
||||||
Reflection.registerFieldsToFilter(StandardTaskScheduler.class, "LOG", "graph", "serverManager", "taskExecutor", "taskDbExecutor", "eventListener", "tasks", "taskTx", "NO_LIMIT", "PAGE_SIZE", "QUERY_INTERVAL", "MAX_PENDING_TASKS", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(StandardTaskScheduler.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "tx", "listenChanges", "unlistenChanges", "submitTask", "queryTask", "queryTask", "queryTask", "call", "call", "remove", "sleep", "taskDone", "serverManager", "supportsPaging", "restore", "checkOnMasterNode", "waitUntilTaskCompleted", "scheduleTasks", "executeTasksOnWorker", "cancelTasksOnWorker");
|
|
||||||
Reflection.registerFieldsToFilter(HugeTask.class, "LOG", "DECOMPRESS_RATIO", "scheduler", "callable", "type", "name", "id", "parent", "dependencies", "description", "context", "create", "server", "load", "status", "progress", "update", "retries", "input", "result", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(HugeTask.class, "property", "scheduler", "scheduler", "asArray", "checkPropertySize", "checkPropertySize", "checkDependenciesSuccess", "toOrderSet", "done", "callable", "setException", "set", "result", "status");
|
|
||||||
Reflection.registerFieldsToFilter(TaskCallable.class, "LOG", "ERROR_COMMIT", "ERROR_MESSAGES", "task", "graph", "lastSaveTime", "saveInterval");
|
|
||||||
Reflection.registerMethodsToFilter(TaskCallable.class, "graph", "closeTx", "cancelled", "done", "task", "save", "needSaveWithEx");
|
|
||||||
Reflection.registerFieldsToFilter(TaskCallable.SysTaskCallable.class, "params");
|
|
||||||
Reflection.registerMethodsToFilter(TaskCallable.SysTaskCallable.class, "params", "params");
|
|
||||||
Reflection.registerFieldsToFilter(StandardAuthManager.class, "CACHE_EXPIRE", "graph", "eventListener", "usersCache", "users", "groups", "targets", "belong", "access", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(StandardAuthManager.class, "lambda$0", "listenChanges", "unlistenChanges", "invalidCache", "initSchemaIfNeeded", "rolePermission", "rolePermission", "rolePermission", "cache");
|
|
||||||
Reflection.registerFieldsToFilter(SchemaDefine.class, "graph", "label");
|
|
||||||
Reflection.registerMethodsToFilter(SchemaDefine.class, "schema", "createPropertyKey", "createPropertyKey", "createPropertyKey", "existEdgeLabel", "createRangeIndex", "unhideField", "hideField", "existVertexLabel", "initProperties");
|
|
||||||
Reflection.registerFieldsToFilter(EntityManager.class, "graph", "label", "deser", "NO_LIMIT", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(EntityManager.class, "toList", "graph", "tx", "commitOrRollback", "unhideLabel", "queryById", "queryEntity", "constructVertex", "save", "query");
|
|
||||||
Reflection.registerFieldsToFilter(RelationshipManager.class, "graph", "label", "deser", "NO_LIMIT", "$assertionsDisabled");
|
|
||||||
Reflection.registerMethodsToFilter(RelationshipManager.class, "lambda$0", "toList", "graph", "tx", "commitOrRollback", "unhideLabel", "queryById", "queryRelationship", "newVertex", "save");
|
|
||||||
Reflection.registerFieldsToFilter(CacheManager.class, "LOG", "INSTANCE", "TIMER_TICK_PERIOD", "LOG_TICK_COST_TIME", "caches", "timer");
|
|
||||||
Reflection.registerMethodsToFilter(CacheManager.class, "access$0", "scheduleTimer", "instance");
|
|
||||||
Reflection.registerFieldsToFilter(org.apache.hugegraph.concurrent.LockManager.class, "INSTANCE", "lockGroupMap");
|
|
||||||
Reflection.registerMethodsToFilter(org.apache.hugegraph.concurrent.LockManager.class, "instance");
|
|
||||||
Reflection.registerFieldsToFilter(ServerReporter.class, "instance", "gauges", "counters", "histograms", "meters", "timers");
|
|
||||||
Reflection.registerMethodsToFilter(ServerReporter.class, "instance", "instance");
|
|
||||||
Reflection.registerFieldsToFilter(com.codahale.metrics.ScheduledReporter.class, "LOG", "FACTORY_ID", "registry", "executor", "shutdownExecutorOnStop", "disabledMetricAttributes", "scheduledFuture", "filter", "durationFactor", "durationUnit", "rateFactor", "rateUnit");
|
|
||||||
Reflection.registerMethodsToFilter(com.codahale.metrics.ScheduledReporter.class, "convertDuration", "convertRate", "getRateUnit", "getDurationUnit", "isShutdownExecutorOnStop", "getDisabledMetricAttributes", "calculateRateUnit", "createDefaultExecutor", "lambda$start$0", "start");
|
|
||||||
Reflection.registerFieldsToFilter(JsonSerializer.class, "LBUF_SIZE", "INSTANCE");
|
|
||||||
Reflection.registerMethodsToFilter(JsonSerializer.class, "writeIterator", "instance");
|
|
||||||
Reflection.registerFieldsToFilter(HugeVertexStepStrategy.class, "serialVersionUID", "INSTANCE");
|
|
||||||
Reflection.registerMethodsToFilter(HugeVertexStepStrategy.class, "instance");
|
|
||||||
Reflection.registerFieldsToFilter(HugeGraphStepStrategy.class, "serialVersionUID", "INSTANCE");
|
|
||||||
Reflection.registerMethodsToFilter(HugeGraphStepStrategy.class, "instance");
|
|
||||||
Reflection.registerFieldsToFilter(HugeCountStepStrategy.class, "serialVersionUID", "INSTANCE");
|
|
||||||
Reflection.registerMethodsToFilter(HugeCountStepStrategy.class, "lambda$0", "instance");
|
|
||||||
|
|
||||||
// Enable this line to generate registration statement
|
|
||||||
//genRegisterPrivateActions();
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
private static void genRegisterPrivateActions() {
|
|
||||||
registerPrivateActions(Thread.class);
|
|
||||||
registerPrivateActions(ThreadLocal.class);
|
|
||||||
registerPrivateActions(InheritableThreadLocal.class);
|
|
||||||
|
|
||||||
registerPrivateActions(StandardAuthenticator.class);
|
|
||||||
registerPrivateActions(ConfigAuthenticator.class);
|
|
||||||
registerPrivateActions(HugeFactoryAuthProxy.class);
|
|
||||||
registerPrivateActions(HugeAuthenticator.User.class);
|
|
||||||
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.AuthManagerProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.TaskSchedulerProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.GraphTraversalSourceProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.TraversalStrategiesProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.VariablesProxy.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.Context.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.ContextThreadPoolExecutor.class);
|
|
||||||
registerPrivateActions(HugeGraphAuthProxy.ContextTask.class);
|
|
||||||
|
|
||||||
for (Class<?> clazz : StandardHugeGraph.PROTECT_CLASSES) {
|
|
||||||
registerPrivateActions(clazz);
|
|
||||||
}
|
|
||||||
|
|
||||||
registerPrivateActions(HugeFactory.class);
|
|
||||||
registerPrivateActions(AbstractTransaction.class);
|
|
||||||
|
|
||||||
registerPrivateActions(SchemaElement.class);
|
|
||||||
registerPrivateActions(HugeVertex.class);
|
|
||||||
registerPrivateActions(HugeEdge.class);
|
|
||||||
registerPrivateActions(HugeProperty.class);
|
|
||||||
registerPrivateActions(HugeVariables.class);
|
|
||||||
|
|
||||||
registerPrivateActions(SchemaManager.class);
|
|
||||||
registerPrivateActions(PropertyKeyBuilder.class);
|
|
||||||
registerPrivateActions(VertexLabelBuilder.class);
|
|
||||||
registerPrivateActions(EdgeLabelBuilder.class);
|
|
||||||
registerPrivateActions(IndexLabelBuilder.class);
|
|
||||||
|
|
||||||
registerPrivateActions(TaskManager.class);
|
|
||||||
registerPrivateActions(StandardTaskScheduler.class);
|
|
||||||
registerPrivateActions(HugeTask.class);
|
|
||||||
registerPrivateActions(TaskCallable.class);
|
|
||||||
registerPrivateActions(SysTaskCallable.class);
|
|
||||||
|
|
||||||
registerPrivateActions(StandardAuthManager.class);
|
|
||||||
registerPrivateActions(SchemaDefine.class);
|
|
||||||
registerPrivateActions(EntityManager.class);
|
|
||||||
registerPrivateActions(RelationshipManager.class);
|
|
||||||
|
|
||||||
// Don't shield them because need to access by auth RPC
|
|
||||||
//registerPrivateActions(HugeUser.class);
|
|
||||||
//registerPrivateActions(RolePermission.class);
|
|
||||||
//registerPrivateActions(HugeResource.class);
|
|
||||||
|
|
||||||
registerPrivateActions(CacheManager.class);
|
|
||||||
registerPrivateActions(LockManager.class);
|
|
||||||
registerPrivateActions(ServerReporter.class);
|
|
||||||
registerPrivateActions(JsonSerializer.class);
|
|
||||||
registerPrivateActions(HugeVertexStepStrategy.class);
|
|
||||||
registerPrivateActions(HugeGraphStepStrategy.class);
|
|
||||||
registerPrivateActions(HugeCountStepStrategy.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void registerPrivateActions(Class<?> clazz) {
|
|
||||||
while (clazz != Object.class) {
|
|
||||||
List<String> fields = new ArrayList<>();
|
|
||||||
for (Field field : clazz.getDeclaredFields()) {
|
|
||||||
if (!Modifier.isPublic(field.getModifiers())) {
|
|
||||||
fields.add(field.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
List<String> methods = new ArrayList<>();
|
|
||||||
for (Method method : clazz.getDeclaredMethods()) {
|
|
||||||
if (!Modifier.isPublic(method.getModifiers()) ||
|
|
||||||
PROTECT_METHODS.contains(method.getName())) {
|
|
||||||
methods.add(method.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
registerClass(clazz, fields, methods);
|
|
||||||
clazz = clazz.getSuperclass();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean registerClass(Class<?> clazz,
|
|
||||||
List<String> fields,
|
|
||||||
List<String> methods) {
|
|
||||||
if (clazz.getName().startsWith("java") ||
|
|
||||||
fields.isEmpty() && methods.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
final String[] array = new String[fields.size()];
|
|
||||||
try {
|
|
||||||
Reflection.registerFieldsToFilter(clazz, fields.toArray(array));
|
|
||||||
Reflection.registerMethodsToFilter(clazz, methods.toArray(array));
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
if (e.getMessage().contains("Filter already registered: class")) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
String code;
|
|
||||||
code = String.format("Reflection.registerFieldsToFilter(%s.class, \"%s\");",
|
|
||||||
clazz.getCanonicalName(), String.join("\", \"", fields));
|
|
||||||
if (!fields.isEmpty()) {
|
|
||||||
// CHECKSTYLE:OFF
|
|
||||||
System.out.println(code);
|
|
||||||
// CHECKSTYLE:ON
|
|
||||||
}
|
|
||||||
|
|
||||||
code = String.format("Reflection.registerMethodsToFilter(%s.class, \"%s\");",
|
|
||||||
clazz.getCanonicalName(), String.join("\", \"", methods));
|
|
||||||
if (!methods.isEmpty()) {
|
|
||||||
// CHECKSTYLE:OFF
|
|
||||||
System.out.println(code);
|
|
||||||
// CHECKSTYLE:ON
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<?> loadClass(String clazz) {
|
|
||||||
try {
|
|
||||||
return Class.forName(clazz);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
throw new HugeException(e.getMessage(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
||||||
* contributor license agreements. See the NOTICE file distributed with this
|
|
||||||
* work for additional information regarding copyright ownership. The ASF
|
|
||||||
* licenses this file to You 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.apache.hugegraph.metrics;
|
|
||||||
|
|
||||||
import org.apache.tinkerpop.gremlin.server.util.MetricManager;
|
|
||||||
|
|
||||||
import com.codahale.metrics.Counter;
|
|
||||||
import com.codahale.metrics.Gauge;
|
|
||||||
import com.codahale.metrics.Histogram;
|
|
||||||
import com.codahale.metrics.Meter;
|
|
||||||
import com.codahale.metrics.MetricRegistry;
|
|
||||||
import com.codahale.metrics.Timer;
|
|
||||||
|
|
||||||
public class MetricsUtil {
|
|
||||||
|
|
||||||
private static final MetricRegistry REGISTRY =
|
|
||||||
MetricManager.INSTANCE.getRegistry();
|
|
||||||
|
|
||||||
public static <T> Gauge<T> registerGauge(Class<?> clazz, String name,
|
|
||||||
Gauge<T> gauge) {
|
|
||||||
return REGISTRY.register(MetricRegistry.name(clazz, name), gauge);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Counter registerCounter(Class<?> clazz, String name) {
|
|
||||||
return REGISTRY.counter(MetricRegistry.name(clazz, name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Histogram registerHistogram(Class<?> clazz, String name) {
|
|
||||||
return REGISTRY.histogram(MetricRegistry.name(clazz, name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Meter registerMeter(Class<?> clazz, String name) {
|
|
||||||
return REGISTRY.meter(MetricRegistry.name(clazz, name));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Timer registerTimer(Class<?> clazz, String name) {
|
|
||||||
return REGISTRY.timer(MetricRegistry.name(clazz, name));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
# hugegraph-commons
|
||||||
|
|
||||||
|
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||||
|
[](https://codecov.io/gh/hugegraph/hugegraph-common)
|
||||||
|
[](https://mvnrepository.com/artifact/org.apache.hugegraph/hugegraph-common)
|
||||||
|
[](https://github.com/apache/incubator-hugegraph-commons/actions/workflows/codeql-analysis.yml)
|
||||||
|
[](https://github.com/apache/incubator-hugegraph-commons/actions/workflows/ci.yml)
|
||||||
|
|
||||||
|
|
||||||
|
hugegraph-commons is a common module for [HugeGraph](https://github.com/apache/hugegraph) and its peripheral components.
|
||||||
|
hugegraph-commons encapsulates locks, configurations, events, iterators, rest and some
|
||||||
|
numeric or collection util classes to simplify the development of HugeGraph and its components.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
- Lock: atomic lock, key lock, lock group and lock manger
|
||||||
|
- Config: register and load config option with security check
|
||||||
|
- Event: listening and notification, do something asynchronously
|
||||||
|
- Iterator: some iterators with extra functions, map, filter, extend, etc.
|
||||||
|
- Rest: RESTful client implemented on OkHttp, POST, PUT, GET and DELETE
|
||||||
|
- Util: performance analyzer, version checker, numeric and Collection utils, log and exception utils, etc.
|
||||||
|
- Rpc: rpc component for inner module communication, currently it's based on [Sofa-RPC](https://github.com/sofastack/sofa-rpc)
|
||||||
|
|
||||||
|
You could use import the dependencies in `maven` like this:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.hugegraph</groupId>
|
||||||
|
<artifactId>hugegraph-common</artifactId>
|
||||||
|
<version>1.2.0</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Learn More
|
||||||
|
|
||||||
|
The [doc page](https://hugegraph.apache.org/docs/) contains more information about hugegraph modules.
|
||||||
|
|
||||||
|
And here are links of other repositories:
|
||||||
|
1. [hugegraph-server](https://github.com/apache/hugegraph) (graph's core component - OLTP server)
|
||||||
|
2. [hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain) (include loader/dashboard/tool/client)
|
||||||
|
3. [hugegraph-computer](https://github.com/apache/hugegraph-computer) (graph processing system - OLAP)
|
||||||
|
4. [hugegraph-website/doc](https://github.com/apache/hugegraph-doc) (include doc & website code)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
- Welcome to contribute to HugeGraph, please see [How to Contribute](https://hugegraph.apache.org/docs/contribution-guidelines/contribute/) for more information.
|
||||||
|
- Note: It's recommended to use [GitHub Desktop](https://desktop.github.com/) to greatly simplify the PR and commit process.
|
||||||
|
- Thank you to all the people who already contributed to HugeGraph!
|
||||||
|
|
||||||
|
[](https://github.com/apache/incubator-hugegraph-commons/graphs/contributors)
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
|
||||||
|
Same as HugeGraph, hugegraph-commons are also licensed under [Apache 2.0](./LICENSE) License.
|
||||||
|
|
||||||
|
### Contact Us
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- [GitHub Issues](https://github.com/apache/incubator-hugegraph-commons/issues): Feedback on usage issues and functional requirements (quick response)
|
||||||
|
- Feedback Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
|
||||||
|
- WeChat public account: Apache HugeGraph, welcome to scan this QR code to follow us.
|
||||||
|
|
||||||
|
<img src="https://raw.githubusercontent.com/apache/incubator-hugegraph-doc/master/assets/images/wechat.png" alt="QR png" width="350"/>
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
# hugegraph-common
|
||||||
|
|
||||||
|
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||||
|
[](https://travis-ci.org/hugegraph/hugegraph-common)
|
||||||
|
[](https://codecov.io/gh/hugegraph/hugegraph-common)
|
||||||
|
[](https://mvnrepository.com/artifact/org.apache.hugegraph/hugegraph-common)
|
||||||
|
|
||||||
|
hugegraph-common is a common module for [HugeGraph](https://github.com/hugegraph/hugegraph) and its peripheral components.
|
||||||
|
hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
|
||||||
|
numeric or collection util classes to simplify the development of HugeGraph and
|
||||||
|
its components.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
- Lock: atomic lock, key lock, lock group and lock manger
|
||||||
|
- Config: register and load config option with security check
|
||||||
|
- Event: listening and notification, do something asynchronously
|
||||||
|
- Iterator: some iterators with extra functions, map, filter, extend, etc.
|
||||||
|
- Rest: RESTful client implemented on Jersey, POST, PUT, GET and DELETE
|
||||||
|
- Util: Performance analyzer, version checker, numeric and Collection utils, log and exception utils, etc.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
The same as HugeGraph, hugegraph-common is also licensed under Apache 2.0 License.
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
export MAVEN_HOME=/home/scmtools/buildkit/maven/apache-maven-3.3.9/
|
||||||
|
export JAVA_HOME=/home/scmtools/buildkit/java/jdk1.8.0_25/
|
||||||
|
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
|
||||||
|
|
||||||
|
mvn clean test -Dtest=UnitTestSuite
|
||||||
|
|
@ -0,0 +1,302 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You 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.
|
||||||
|
-->
|
||||||
|
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.hugegraph</groupId>
|
||||||
|
<artifactId>hugegraph-commons</artifactId>
|
||||||
|
<version>${revision}</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<artifactId>hugegraph-common</artifactId>
|
||||||
|
<name>${project.artifactId}</name>
|
||||||
|
<url>https://github.com/apache/incubator-hugegraph-commons/tree/master/hugegraph-common</url>
|
||||||
|
<description>
|
||||||
|
hugegraph-common is a common module for HugeGraph and its peripheral components.
|
||||||
|
hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
|
||||||
|
numeric or collection util classes to simplify the development of HugeGraph and its
|
||||||
|
components.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<!-- Use parent params -->
|
||||||
|
<lombok.version>1.18.8</lombok.version>
|
||||||
|
<okhttp.version>4.10.0</okhttp.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Test -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<version>${mockito.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Logging -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-api</artifactId>
|
||||||
|
<version>${log4j2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-core</artifactId>
|
||||||
|
<version>${log4j2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>log4j-slf4j-impl</artifactId>
|
||||||
|
<version>${log4j2.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Utility -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.glassfish</groupId>
|
||||||
|
<artifactId>javax.json</artifactId>
|
||||||
|
<version>${javax.json.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-configuration</groupId>
|
||||||
|
<artifactId>commons-configuration</artifactId>
|
||||||
|
<version>${commons.configuration.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-configuration2</artifactId>
|
||||||
|
<version>${commons.configuration2.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>${commons.lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-beanutils</groupId>
|
||||||
|
<artifactId>commons-beanutils</artifactId>
|
||||||
|
<version>${commons.beanutils.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>${commons.io.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-collections</groupId>
|
||||||
|
<artifactId>commons-collections</artifactId>
|
||||||
|
<version>${commons.collections.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-codec</groupId>
|
||||||
|
<artifactId>commons-codec</artifactId>
|
||||||
|
<version>${commons.codec.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.guava</groupId>
|
||||||
|
<artifactId>guava</artifactId>
|
||||||
|
<version>${guava.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>jsr305</artifactId>
|
||||||
|
<groupId>com.google.code.findbugs</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.findbugs</groupId>
|
||||||
|
<artifactId>jsr305</artifactId>
|
||||||
|
<version>${jsr305.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>joda-time</groupId>
|
||||||
|
<artifactId>joda-time</artifactId>
|
||||||
|
<version>2.10.8</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- javassist -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.javassist</groupId>
|
||||||
|
<artifactId>javassist</artifactId>
|
||||||
|
<version>${javassist.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- jackson -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-annotations</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-core</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.module</groupId>
|
||||||
|
<artifactId>jackson-module-jaxb-annotations</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||||
|
<groupId>jakarta.xml.bind</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.jaxrs</groupId>
|
||||||
|
<artifactId>jackson-jaxrs-base</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.jaxrs</groupId>
|
||||||
|
<artifactId>jackson-jaxrs-json-provider</artifactId>
|
||||||
|
<version>${jackson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.sun.xml.bind</groupId>
|
||||||
|
<artifactId>jaxb-impl</artifactId>
|
||||||
|
<version>${sun.xml.version}</version>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||||
|
<groupId>jakarta.xml.bind</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
<artifactId>okhttp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
<artifactId>logging-interceptor</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.squareup.okhttp3</groupId>
|
||||||
|
<artifactId>okhttp-bom</artifactId>
|
||||||
|
<version>${okhttp.version}</version>
|
||||||
|
<type>pom</type>
|
||||||
|
<scope>import</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jacoco</groupId>
|
||||||
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
|
<version>0.8.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>pre-unit-test</id>
|
||||||
|
<goals>
|
||||||
|
<goal>prepare-agent</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>post-unit-test</id>
|
||||||
|
<phase>test</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>report</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<outputDirectory>${project.parent.build.directory}</outputDirectory>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>apache-release</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class AtomicLock {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(LockManager.class);
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private AtomicReference<Thread> sign;
|
||||||
|
|
||||||
|
public AtomicLock(String name) {
|
||||||
|
this.name = name;
|
||||||
|
this.sign = new AtomicReference<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tryLock() {
|
||||||
|
Thread current = Thread.currentThread();
|
||||||
|
return this.sign.compareAndSet(null, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unlock() {
|
||||||
|
if (this.sign.get() == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Thread current = Thread.currentThread();
|
||||||
|
if (!this.sign.compareAndSet(current, null)) {
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"Thread '%s' trying to unlock '%s' " +
|
||||||
|
"which is held by other threads now.",
|
||||||
|
current.getName(), this.name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean lock(int retries) {
|
||||||
|
// The interval between retries is exponential growth, most wait
|
||||||
|
// interval is 2^(retries-1)s. If retries=0, don't retry.
|
||||||
|
if (retries < 0 || retries > 10) {
|
||||||
|
throw new IllegalArgumentException(String.format(
|
||||||
|
"Locking retry times should be in [0, 10], but got %d",
|
||||||
|
retries));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isLocked = false;
|
||||||
|
try {
|
||||||
|
for (int i = 0; !(isLocked = this.tryLock()) && i < retries; i++) {
|
||||||
|
Thread.sleep(1000 * (1L << i));
|
||||||
|
}
|
||||||
|
} catch (InterruptedException ignored) {
|
||||||
|
LOG.info("Thread sleep is interrupted.");
|
||||||
|
}
|
||||||
|
return isLocked;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.locks.Condition;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class BarrierEvent {
|
||||||
|
|
||||||
|
private final Lock lock = new ReentrantLock();
|
||||||
|
private final Condition cond = lock.newCondition();
|
||||||
|
private volatile boolean signaled = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait forever until the signal is received.
|
||||||
|
* @throws InterruptedException if interrupted.
|
||||||
|
*/
|
||||||
|
public void await() throws InterruptedException {
|
||||||
|
this.lock.lock();
|
||||||
|
try {
|
||||||
|
while (!this.signaled) {
|
||||||
|
this.cond.await();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
this.lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait specified time in milliseconds.
|
||||||
|
* @param timeout: the time in millisecond to wait.
|
||||||
|
* @return true if signal is received, false if time out.
|
||||||
|
* @throws InterruptedException if interrupted.
|
||||||
|
*/
|
||||||
|
public boolean await(long timeout) throws InterruptedException {
|
||||||
|
E.checkArgument(timeout >= 0L,
|
||||||
|
"The time must be >= 0, but got '%d'.",
|
||||||
|
timeout);
|
||||||
|
long deadline = System.currentTimeMillis() + timeout;
|
||||||
|
this.lock.lock();
|
||||||
|
try {
|
||||||
|
while (!this.signaled) {
|
||||||
|
timeout = deadline - System.currentTimeMillis();
|
||||||
|
if (timeout > 0) {
|
||||||
|
this.cond.await(timeout, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
if (System.currentTimeMillis() >= deadline) {
|
||||||
|
return this.signaled;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
this.lock.unlock();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
this.lock.lock();
|
||||||
|
try {
|
||||||
|
this.signaled = false;
|
||||||
|
} finally {
|
||||||
|
this.lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void signal() {
|
||||||
|
this.lock.lock();
|
||||||
|
try {
|
||||||
|
this.signaled = true;
|
||||||
|
this.cond.signal();
|
||||||
|
} finally {
|
||||||
|
this.lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void signalAll() {
|
||||||
|
this.lock.lock();
|
||||||
|
try {
|
||||||
|
this.signaled = true;
|
||||||
|
this.cond.signalAll();
|
||||||
|
} finally {
|
||||||
|
this.lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,144 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.util.concurrent.Striped;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* KeyLock provide an interface of segment lock
|
||||||
|
*/
|
||||||
|
public class KeyLock {
|
||||||
|
|
||||||
|
private Striped<Lock> locks;
|
||||||
|
|
||||||
|
public KeyLock() {
|
||||||
|
// The default size is availableProcessors() * 4
|
||||||
|
this(Runtime.getRuntime().availableProcessors() << 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyLock(int size) {
|
||||||
|
this.locks = Striped.lock(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int indexOf(Lock lock) {
|
||||||
|
for (int i = 0; i < this.locks.size(); i++) {
|
||||||
|
if (this.locks.getAt(i) == lock) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock an object
|
||||||
|
* @param key The object to lock
|
||||||
|
* @return The lock(locked) of passed key
|
||||||
|
*/
|
||||||
|
public final Lock lock(Object key) {
|
||||||
|
E.checkArgument(key != null, "Lock key can't be null");
|
||||||
|
Lock lock = this.locks.get(key);
|
||||||
|
lock.lock();
|
||||||
|
return lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock an object
|
||||||
|
* @param key The object to unlock
|
||||||
|
*/
|
||||||
|
public final void unlock(Object key) {
|
||||||
|
E.checkArgument(key != null, "Unlock key can't be null");
|
||||||
|
this.locks.get(key).unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock a list of object with sorted order
|
||||||
|
* @param keys The objects to lock
|
||||||
|
* @return The locks(locked) of keys
|
||||||
|
*/
|
||||||
|
public final List<Lock> lockAll(Object... keys) {
|
||||||
|
E.checkArgument(keys != null && keys.length > 0,
|
||||||
|
"Lock keys can't be null or empty");
|
||||||
|
List<Lock> locks = new ArrayList<>(keys.length);
|
||||||
|
for (Object key : keys) {
|
||||||
|
E.checkArgument(key != null, "Lock key can't be null");
|
||||||
|
Lock lock = this.locks.get(key);
|
||||||
|
locks.add(lock);
|
||||||
|
}
|
||||||
|
locks.sort((a, b) -> {
|
||||||
|
int diff = a.hashCode() - b.hashCode();
|
||||||
|
if (diff == 0 && a != b) {
|
||||||
|
diff = this.indexOf(a) - this.indexOf(b);
|
||||||
|
assert diff != 0;
|
||||||
|
}
|
||||||
|
return diff;
|
||||||
|
});
|
||||||
|
for (Lock lock : locks) {
|
||||||
|
lock.lock();
|
||||||
|
}
|
||||||
|
return Collections.unmodifiableList(locks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock two objects with sorted order
|
||||||
|
* NOTE: This is to optimize the performance of lockAll(keys)
|
||||||
|
* @param key1 The first object
|
||||||
|
* @param key2 The second object
|
||||||
|
* @return locks for the two objects
|
||||||
|
*/
|
||||||
|
public List<Lock> lockAll(Object key1, Object key2) {
|
||||||
|
E.checkArgument(key1 != null, "Lock key can't be null");
|
||||||
|
E.checkArgument(key2 != null, "Lock key can't be null");
|
||||||
|
Lock lock1 = this.locks.get(key1);
|
||||||
|
Lock lock2 = this.locks.get(key2);
|
||||||
|
|
||||||
|
int diff = lock1.hashCode() - lock2.hashCode();
|
||||||
|
if (diff == 0 && lock1 != lock2) {
|
||||||
|
diff = this.indexOf(lock1) - this.indexOf(lock2);
|
||||||
|
assert diff != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Lock> locks = diff > 0 ?
|
||||||
|
ImmutableList.of(lock2, lock1) :
|
||||||
|
ImmutableList.of(lock1, lock2);
|
||||||
|
|
||||||
|
for (Lock lock : locks) {
|
||||||
|
lock.lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
return locks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unlock a list of object
|
||||||
|
* @param locks The locks to unlock
|
||||||
|
*/
|
||||||
|
public final void unlockAll(List<Lock> locks) {
|
||||||
|
E.checkArgument(locks != null, "Unlock locks can't be null");
|
||||||
|
for (int i = locks.size(); i > 0; i--) {
|
||||||
|
assert this.indexOf(locks.get(i - 1)) != -1;
|
||||||
|
locks.get(i - 1).unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
|
public class LockGroup {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final Map<String, Object> locksMap;
|
||||||
|
|
||||||
|
public LockGroup(String lockGroup) {
|
||||||
|
this.name = lockGroup;
|
||||||
|
this.locksMap = new ConcurrentHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Lock lock(String lockName) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new ReentrantLock());
|
||||||
|
}
|
||||||
|
return (Lock) this.locksMap.get(lockName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AtomicLock atomicLock(String lockName) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new AtomicLock(lockName));
|
||||||
|
}
|
||||||
|
return (AtomicLock) this.locksMap.get(lockName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ReadWriteLock readWriteLock(String lockName) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new ReentrantReadWriteLock());
|
||||||
|
}
|
||||||
|
return (ReadWriteLock) this.locksMap.get(lockName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyLock keyLock(String lockName) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new KeyLock());
|
||||||
|
}
|
||||||
|
return (KeyLock) this.locksMap.get(lockName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public KeyLock keyLock(String lockName, int size) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new KeyLock(size));
|
||||||
|
}
|
||||||
|
return (KeyLock) this.locksMap.get(lockName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <K extends Comparable<K>> RowLock<K> rowLock(String lockName) {
|
||||||
|
if (!this.locksMap.containsKey(lockName)) {
|
||||||
|
this.locksMap.putIfAbsent(lockName, new RowLock<>());
|
||||||
|
}
|
||||||
|
Object value = this.locksMap.get(lockName);
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
RowLock<K> lock = (RowLock<K>) value;
|
||||||
|
return lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class LockManager {
|
||||||
|
|
||||||
|
private static final LockManager INSTANCE = new LockManager();
|
||||||
|
|
||||||
|
public static LockManager instance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, LockGroup> lockGroupMap;
|
||||||
|
|
||||||
|
private LockManager() {
|
||||||
|
this.lockGroupMap = new ConcurrentHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean exists(String group) {
|
||||||
|
return this.lockGroupMap.containsKey(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LockGroup create(String group) {
|
||||||
|
if (exists(group)) {
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"LockGroup '%s' already exists", group));
|
||||||
|
}
|
||||||
|
LockGroup lockGroup = new LockGroup(group);
|
||||||
|
LockGroup previous = this.lockGroupMap.putIfAbsent(group, lockGroup);
|
||||||
|
if (previous != null) {
|
||||||
|
return previous;
|
||||||
|
}
|
||||||
|
return lockGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LockGroup get(String group) {
|
||||||
|
LockGroup lockGroup = this.lockGroupMap.get(group);
|
||||||
|
if (lockGroup == null) {
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"LockGroup '%s' does not exists", group));
|
||||||
|
}
|
||||||
|
return lockGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void destroy(String group) {
|
||||||
|
if (this.exists(group)) {
|
||||||
|
this.lockGroupMap.remove(group);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"LockGroup '%s' does not exists", group));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class PausableScheduledThreadPool extends ScheduledThreadPoolExecutor {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(PausableScheduledThreadPool.class);
|
||||||
|
|
||||||
|
private volatile boolean paused = false;
|
||||||
|
|
||||||
|
public PausableScheduledThreadPool(int corePoolSize,
|
||||||
|
ThreadFactory factory) {
|
||||||
|
super(corePoolSize, factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void pauseSchedule() {
|
||||||
|
this.paused = true;
|
||||||
|
LOG.info("PausableScheduledThreadPool was paused");
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void resumeSchedule() {
|
||||||
|
this.paused = false;
|
||||||
|
this.notifyAll();
|
||||||
|
LOG.info("PausableScheduledThreadPool was resumed");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void beforeExecute(Thread t, Runnable r) {
|
||||||
|
synchronized (this) {
|
||||||
|
while (this.paused) {
|
||||||
|
try {
|
||||||
|
this.wait();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOG.warn("PausableScheduledThreadPool was interrupted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.beforeExecute(t, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void shutdown() {
|
||||||
|
if (this.paused) {
|
||||||
|
this.resumeSchedule();
|
||||||
|
}
|
||||||
|
super.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Runnable> shutdownNow() {
|
||||||
|
if (this.paused) {
|
||||||
|
this.resumeSchedule();
|
||||||
|
}
|
||||||
|
return super.shutdownNow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.concurrent;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class RowLock<K extends Comparable<K>> {
|
||||||
|
|
||||||
|
private final Map<K, Lock> locks = new ConcurrentHashMap<>();
|
||||||
|
private final ThreadLocal<Map<K, LocalLock>> localLocks =
|
||||||
|
ThreadLocal.withInitial(HashMap::new);
|
||||||
|
|
||||||
|
public void lock(K key) {
|
||||||
|
E.checkArgument(key != null, "Lock key can't be null");
|
||||||
|
LocalLock localLock = this.localLocks.get().get(key);
|
||||||
|
if (localLock != null) {
|
||||||
|
localLock.lockCount++;
|
||||||
|
} else {
|
||||||
|
Lock current = new ReentrantLock();
|
||||||
|
Lock previous = this.locks.putIfAbsent(key, current);
|
||||||
|
if (previous != null) {
|
||||||
|
current = previous;
|
||||||
|
}
|
||||||
|
current.lock();
|
||||||
|
this.localLocks.get().put(key, new LocalLock(current));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unlock(K key) {
|
||||||
|
E.checkArgument(key != null, "Unlock key can't be null");
|
||||||
|
LocalLock localLock = this.localLocks.get().get(key);
|
||||||
|
if (localLock == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (--localLock.lockCount == 0) {
|
||||||
|
this.locks.remove(key, localLock.current);
|
||||||
|
this.localLocks.get().remove(key);
|
||||||
|
localLock.current.unlock();
|
||||||
|
}
|
||||||
|
E.checkState(localLock.lockCount >= 0,
|
||||||
|
"The lock count must be >= 0, but got %s",
|
||||||
|
localLock.lockCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lockAll(Set<K> keys) {
|
||||||
|
E.checkArgument(keys != null && keys.size() > 0,
|
||||||
|
"Lock keys can't be null or empty");
|
||||||
|
List<K> list = new ArrayList<>(keys);
|
||||||
|
Collections.sort(list);
|
||||||
|
for (K key : list) {
|
||||||
|
this.lock(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unlockAll(Set<K> keys) {
|
||||||
|
E.checkArgument(keys != null && keys.size() > 0,
|
||||||
|
"Unlock keys can't be null or empty");
|
||||||
|
for (K key : keys) {
|
||||||
|
this.unlock(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class LocalLock {
|
||||||
|
|
||||||
|
private final Lock current;
|
||||||
|
private int lockCount;
|
||||||
|
|
||||||
|
private LocalLock(Lock current) {
|
||||||
|
this.current = current;
|
||||||
|
this.lockCount = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
public class ConfigConvOption<T, R> extends TypedOption<T, R> {
|
||||||
|
|
||||||
|
private final Function<T, R> converter;
|
||||||
|
|
||||||
|
public ConfigConvOption(String name, String desc, Predicate<T> pred,
|
||||||
|
Function<T, R> convert, T value) {
|
||||||
|
this(name, false, desc, pred, convert, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigConvOption(String name, boolean required, String desc,
|
||||||
|
Predicate<T> pred, Function<T, R> convert,
|
||||||
|
T value) {
|
||||||
|
super(name, required, desc, pred, (Class<T>) value.getClass(), value);
|
||||||
|
E.checkNotNull(convert, "convert");
|
||||||
|
this.converter = convert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R convert(T value) {
|
||||||
|
return this.converter.apply(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,23 +15,25 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hugegraph.exception;
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
import org.apache.hugegraph.HugeException;
|
public class ConfigException extends RuntimeException {
|
||||||
|
|
||||||
public class NotFoundException extends HugeException {
|
private static final long serialVersionUID = -8711375282196157058L;
|
||||||
|
|
||||||
private static final long serialVersionUID = -5912665926327173032L;
|
public ConfigException(String message) {
|
||||||
|
|
||||||
public NotFoundException(String message) {
|
|
||||||
super(message);
|
super(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NotFoundException(String message, Object... args) {
|
public ConfigException(String message, Throwable cause) {
|
||||||
super(message, args);
|
super(message, cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NotFoundException(String message, Throwable cause, Object... args) {
|
public ConfigException(String message, Object... args) {
|
||||||
super(message, cause, args);
|
super(String.format(message, args));
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigException(String message, Throwable cause, Object... args) {
|
||||||
|
super(String.format(message, args), cause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
public class ConfigListConvOption<T, R> extends TypedOption<List<T>, List<R>> {
|
||||||
|
|
||||||
|
private final Class<T> elemClass;
|
||||||
|
private final Function<T, R> converter;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigListConvOption(String name, String desc,
|
||||||
|
Predicate<List<T>> pred, Function<T, R> convert,
|
||||||
|
T... values) {
|
||||||
|
this(name, false, desc, pred, convert, null, Arrays.asList(values));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigListConvOption(String name, boolean required, String desc,
|
||||||
|
Predicate<List<T>> pred, Function<T, R> convert,
|
||||||
|
Class<T> clazz, List<T> values) {
|
||||||
|
super(name, required, desc, pred,
|
||||||
|
(Class<List<T>>) values.getClass(), values);
|
||||||
|
E.checkNotNull(convert, "convert");
|
||||||
|
if (clazz == null && values.size() > 0) {
|
||||||
|
clazz = (Class<T>) values.get(0).getClass();
|
||||||
|
}
|
||||||
|
E.checkArgumentNotNull(clazz, "Element class can't be null");
|
||||||
|
this.elemClass = clazz;
|
||||||
|
this.converter = convert;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean forList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<T> parse(String value) {
|
||||||
|
return ConfigListOption.convert(value, part -> {
|
||||||
|
return this.parse(part, this.elemClass);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<R> convert(List<T> values) {
|
||||||
|
List<R> results = new ArrayList<>(values.size());
|
||||||
|
for (T value : values) {
|
||||||
|
results.add(this.converter.apply(value));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
public class ConfigListOption<T> extends ConfigOption<List<T>> {
|
||||||
|
|
||||||
|
private final Class<T> elemClass;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigListOption(String name, String desc,
|
||||||
|
Predicate<List<T>> pred, T... values) {
|
||||||
|
this(name, false, desc, pred, null, Arrays.asList(values));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigListOption(String name, boolean required, String desc,
|
||||||
|
Predicate<List<T>> pred, Class<T> clazz,
|
||||||
|
List<T> values) {
|
||||||
|
super(name, required, desc, pred,
|
||||||
|
(Class<List<T>>) values.getClass(), values);
|
||||||
|
if (clazz == null && values.size() > 0) {
|
||||||
|
clazz = (Class<T>) values.get(0).getClass();
|
||||||
|
}
|
||||||
|
E.checkArgumentNotNull(clazz, "Element class can't be null");
|
||||||
|
this.elemClass = clazz;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean forList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<T> parse(String value) {
|
||||||
|
return convert(value, part -> this.parse(part, this.elemClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> List<T> convert(Object value, Function<String, ?> conv) {
|
||||||
|
if (value instanceof List) {
|
||||||
|
return (List<T>) value;
|
||||||
|
}
|
||||||
|
// If target data type is List, parse it as a list
|
||||||
|
String str = (String) value;
|
||||||
|
if (str.startsWith("[") && str.endsWith("]")) {
|
||||||
|
str = str.substring(1, str.length() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] parts = str.split(",");
|
||||||
|
List<T> results = new ArrayList<>(parts.length);
|
||||||
|
for (String part : parts) {
|
||||||
|
results.add((T) conv.apply(part.trim()));
|
||||||
|
}
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
public class ConfigOption<T> extends TypedOption<T, T> {
|
||||||
|
|
||||||
|
public ConfigOption(String name, String desc, T value) {
|
||||||
|
this(name, desc, null, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public ConfigOption(String name, String desc, Predicate<T> pred, T value) {
|
||||||
|
this(name, false, desc, pred, (Class<T>) value.getClass(), value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConfigOption(String name, boolean required, String desc,
|
||||||
|
Predicate<T> pred, Class<T> type, T value) {
|
||||||
|
super(name, required, desc, pred, type, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.apache.commons.configuration2.Configuration;
|
||||||
|
import org.apache.commons.configuration2.FileBasedConfiguration;
|
||||||
|
import org.apache.commons.configuration2.PropertiesConfiguration;
|
||||||
|
import org.apache.commons.configuration2.YAMLConfiguration;
|
||||||
|
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
|
||||||
|
import org.apache.commons.configuration2.builder.fluent.Configurations;
|
||||||
|
import org.apache.commons.configuration2.builder.fluent.Parameters;
|
||||||
|
import org.apache.commons.configuration2.ex.ConfigurationException;
|
||||||
|
import org.apache.commons.configuration2.io.FileHandler;
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class HugeConfig extends PropertiesConfiguration {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(HugeConfig.class);
|
||||||
|
|
||||||
|
private String configPath;
|
||||||
|
|
||||||
|
public HugeConfig(Configuration config) {
|
||||||
|
loadConfig(config);
|
||||||
|
this.configPath = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HugeConfig(String configFile) {
|
||||||
|
loadConfig(loadConfigFile(configFile));
|
||||||
|
this.configPath = configFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public HugeConfig(Map<String, Object> propertyMap) {
|
||||||
|
if (propertyMap == null) {
|
||||||
|
throw new ConfigException("The property map is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, Object> kv : propertyMap.entrySet()) {
|
||||||
|
this.addProperty(kv.getKey(), kv.getValue());
|
||||||
|
}
|
||||||
|
this.checkRequiredOptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadConfig(Configuration config) {
|
||||||
|
if (config == null) {
|
||||||
|
throw new ConfigException("The config object is null");
|
||||||
|
}
|
||||||
|
this.setLayoutIfNeeded(config);
|
||||||
|
|
||||||
|
this.append(config);
|
||||||
|
this.checkRequiredOptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setLayoutIfNeeded(Configuration conf) {
|
||||||
|
if (!(conf instanceof PropertiesConfiguration)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PropertiesConfiguration propConf = (PropertiesConfiguration) conf;
|
||||||
|
this.setLayout(propConf.getLayout());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <T, R> R get(TypedOption<T, R> option) {
|
||||||
|
Object value = this.getProperty(option.name());
|
||||||
|
if (value == null) {
|
||||||
|
return option.defaultValue();
|
||||||
|
}
|
||||||
|
return (R) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getMap(ConfigListOption<String> option) {
|
||||||
|
List<String> values = this.get(option);
|
||||||
|
Map<String, String> result = new HashMap<>();
|
||||||
|
for (String value : values) {
|
||||||
|
String[] pair = value.split(":", 2);
|
||||||
|
E.checkState(pair.length == 2,
|
||||||
|
"Invalid option format for '%s': %s(expect KEY:VALUE)",
|
||||||
|
option.name(), value);
|
||||||
|
result.put(pair[0].trim(), pair[1].trim());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addPropertyDirect(String key, Object value) {
|
||||||
|
TypedOption<?, ?> option = OptionSpace.get(key);
|
||||||
|
if (option == null) {
|
||||||
|
LOG.warn("The config option '{}' is redundant, " +
|
||||||
|
"please ensure it has been registered", key);
|
||||||
|
} else {
|
||||||
|
// The input value is String(parsed by PropertiesConfiguration)
|
||||||
|
value = this.validateOption(key, value);
|
||||||
|
}
|
||||||
|
if (this.containsKey(key) && value instanceof List) {
|
||||||
|
for (Object item : (List<?>) value) {
|
||||||
|
super.addPropertyDirect(key, item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
super.addPropertyDirect(key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addPropertyInternal(String key, Object value) {
|
||||||
|
this.addPropertyDirect(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object validateOption(String key, Object value) {
|
||||||
|
TypedOption<?, ?> option = OptionSpace.get(key);
|
||||||
|
|
||||||
|
if (value instanceof String) {
|
||||||
|
return option.parseConvert((String) value);
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> dataType = option.dataType();
|
||||||
|
if (dataType.isInstance(value)) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("Invalid value for key '%s': '%s'", key, value));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkRequiredOptions() {
|
||||||
|
// TODO: Check required options must be contained in this map
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(File copiedFile) throws ConfigurationException {
|
||||||
|
FileHandler fileHandler = new FileHandler(this);
|
||||||
|
fileHandler.save(copiedFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public File file() {
|
||||||
|
if (StringUtils.isEmpty(this.configPath)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new File(this.configPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void file(String path) {
|
||||||
|
this.configPath = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Configuration loadConfigFile(String path) {
|
||||||
|
E.checkNotNull(path, "config path");
|
||||||
|
E.checkArgument(!path.isEmpty(),
|
||||||
|
"The config path can't be empty");
|
||||||
|
|
||||||
|
File file = new File(path);
|
||||||
|
return loadConfigFile(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Configuration loadConfigFile(File configFile) {
|
||||||
|
E.checkArgument(configFile.exists() &&
|
||||||
|
configFile.isFile() &&
|
||||||
|
configFile.canRead(),
|
||||||
|
"Please specify a proper config file rather than: '%s'",
|
||||||
|
configFile.toString());
|
||||||
|
|
||||||
|
try {
|
||||||
|
String fileName = configFile.getName();
|
||||||
|
String fileExtension = FilenameUtils.getExtension(fileName);
|
||||||
|
|
||||||
|
Configuration config;
|
||||||
|
Configurations configs = new Configurations();
|
||||||
|
|
||||||
|
switch (fileExtension) {
|
||||||
|
case "yml":
|
||||||
|
case "yaml":
|
||||||
|
Parameters params = new Parameters();
|
||||||
|
FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
|
||||||
|
new FileBasedConfigurationBuilder(YAMLConfiguration.class)
|
||||||
|
.configure(params.fileBased().setFile(configFile));
|
||||||
|
config = builder.getConfiguration();
|
||||||
|
break;
|
||||||
|
case "xml":
|
||||||
|
config = configs.xml(configFile);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
config = configs.properties(configFile);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return config;
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
throw new ConfigException("Unable to load config: '%s'",
|
||||||
|
e, configFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
|
||||||
|
public final class OptionChecker {
|
||||||
|
|
||||||
|
public static <O> Predicate<O> disallowEmpty() {
|
||||||
|
return o -> {
|
||||||
|
if (o == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (o instanceof String) {
|
||||||
|
return StringUtils.isNotBlank((String) o);
|
||||||
|
}
|
||||||
|
if (o.getClass().isArray() && (Array.getLength(o) == 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !(o instanceof Iterable) || ((Iterable<?>) o).iterator().hasNext();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <O> Predicate<O> allowValues(O... values) {
|
||||||
|
return o -> o != null && Arrays.asList(values).contains(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <O> Predicate<List<O>> inValues(O... values) {
|
||||||
|
return o -> o != null && new HashSet<>(Arrays.asList(values)).containsAll(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <N extends Number> Predicate<N> positiveInt() {
|
||||||
|
return number -> number != null && number.longValue() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <N extends Number> Predicate<N> nonNegativeInt() {
|
||||||
|
return number -> number != null && number.longValue() >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <N extends Number> Predicate<N> rangeInt(N min, N max) {
|
||||||
|
return number -> {
|
||||||
|
if (number == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
long value = number.longValue();
|
||||||
|
return value >= min.longValue() && value <= max.longValue();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <N extends Number> Predicate<N> rangeDouble(N min, N max) {
|
||||||
|
return number -> {
|
||||||
|
if (number == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
double value = number.doubleValue();
|
||||||
|
return value >= min.doubleValue() && value <= max.doubleValue();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public class OptionHolder {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(HugeConfig.class);
|
||||||
|
|
||||||
|
protected Map<String, TypedOption<?, ?>> options;
|
||||||
|
|
||||||
|
public OptionHolder() {
|
||||||
|
this.options = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void registerOptions() {
|
||||||
|
for (Field field : this.getClass().getFields()) {
|
||||||
|
if (!TypedOption.class.isAssignableFrom(field.getType())) {
|
||||||
|
// Skip if not option
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
TypedOption<?, ?> option = (TypedOption<?, ?>) field.get(this);
|
||||||
|
// Fields of subclass first, don't overwrite by superclass
|
||||||
|
this.options.putIfAbsent(option.name(), option);
|
||||||
|
} catch (Exception e) {
|
||||||
|
LOG.error("Failed to register option: {}", field, e);
|
||||||
|
throw new ConfigException(
|
||||||
|
"Failed to register option: %s", field);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, TypedOption<?, ?>> options() {
|
||||||
|
return Collections.unmodifiableMap(this.options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.Modifier;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
public final class OptionSpace {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(OptionSpace.class);
|
||||||
|
|
||||||
|
private static final Map<String, Class<? extends OptionHolder>> HOLDERS;
|
||||||
|
private static final Map<String, TypedOption<?, ?>> OPTIONS;
|
||||||
|
private static final String INSTANCE_METHOD = "instance";
|
||||||
|
|
||||||
|
static {
|
||||||
|
HOLDERS = new ConcurrentHashMap<>();
|
||||||
|
OPTIONS = new ConcurrentHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(String module, String holder) {
|
||||||
|
ClassLoader classLoader = OptionSpace.class.getClassLoader();
|
||||||
|
Class<?> clazz;
|
||||||
|
try {
|
||||||
|
clazz = classLoader.loadClass(holder);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new ConfigException(
|
||||||
|
"Failed to load class of option holder '%s'", e, holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check subclass
|
||||||
|
if (!OptionHolder.class.isAssignableFrom(clazz)) {
|
||||||
|
throw new ConfigException(
|
||||||
|
"Class '%s' is not a subclass of OptionHolder", holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionHolder instance = null;
|
||||||
|
Exception exception = null;
|
||||||
|
try {
|
||||||
|
Method method = clazz.getMethod(INSTANCE_METHOD);
|
||||||
|
if (!Modifier.isStatic(method.getModifiers())) {
|
||||||
|
throw new NoSuchMethodException(INSTANCE_METHOD);
|
||||||
|
}
|
||||||
|
instance = (OptionHolder) method.invoke(null);
|
||||||
|
if (instance == null) {
|
||||||
|
exception = new ConfigException(
|
||||||
|
"Returned null from %s() method",
|
||||||
|
INSTANCE_METHOD);
|
||||||
|
}
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
LOG.warn("Class {} does not has static method {}.",
|
||||||
|
holder, INSTANCE_METHOD);
|
||||||
|
exception = e;
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
LOG.warn("Can't call static method {} from class {}.",
|
||||||
|
INSTANCE_METHOD, holder);
|
||||||
|
exception = e;
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
LOG.warn("Illegal access while calling method {} from class {}.",
|
||||||
|
INSTANCE_METHOD, holder);
|
||||||
|
exception = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exception != null) {
|
||||||
|
throw new ConfigException("Failed to instantiate option holder: %s",
|
||||||
|
exception, holder);
|
||||||
|
}
|
||||||
|
|
||||||
|
register(module, instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(String module, OptionHolder holder) {
|
||||||
|
// Check exists
|
||||||
|
if (HOLDERS.containsKey(module)) {
|
||||||
|
LOG.warn("Already registered option holder: {} ({})",
|
||||||
|
module, HOLDERS.get(module));
|
||||||
|
}
|
||||||
|
E.checkArgumentNotNull(holder, "OptionHolder can't be null");
|
||||||
|
HOLDERS.put(module, holder.getClass());
|
||||||
|
OPTIONS.putAll(holder.options());
|
||||||
|
LOG.debug("Registered options for OptionHolder: {}",
|
||||||
|
holder.getClass().getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<String> keys() {
|
||||||
|
return Collections.unmodifiableSet(OPTIONS.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean containKey(String key) {
|
||||||
|
return OPTIONS.containsKey(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TypedOption<?, ?> get(String key) {
|
||||||
|
return OPTIONS.get(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.config;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.apache.commons.configuration.PropertyConverter;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import com.google.common.base.Joiner;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
public class TypedOption<T, R> {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(TypedOption.class);
|
||||||
|
|
||||||
|
private static final Set<Class<?>> ACCEPTED_DATA_TYPES;
|
||||||
|
private static final String ACCEPTED_DATA_TYPES_STRING;
|
||||||
|
|
||||||
|
static {
|
||||||
|
ACCEPTED_DATA_TYPES = ImmutableSet.of(
|
||||||
|
Boolean.class,
|
||||||
|
Short.class,
|
||||||
|
Integer.class,
|
||||||
|
Byte.class,
|
||||||
|
Long.class,
|
||||||
|
Float.class,
|
||||||
|
Double.class,
|
||||||
|
String.class,
|
||||||
|
String[].class,
|
||||||
|
Class.class,
|
||||||
|
List.class
|
||||||
|
);
|
||||||
|
|
||||||
|
ACCEPTED_DATA_TYPES_STRING = Joiner.on(", ").join(ACCEPTED_DATA_TYPES);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String desc;
|
||||||
|
private final boolean required;
|
||||||
|
private final Class<T> dataType;
|
||||||
|
private final T defaultValue;
|
||||||
|
private final Predicate<T> checkFunc;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public TypedOption(String name, boolean required, String desc,
|
||||||
|
Predicate<T> pred, Class<T> type, T value) {
|
||||||
|
E.checkNotNull(name, "name");
|
||||||
|
E.checkNotNull(type, "dataType");
|
||||||
|
|
||||||
|
this.name = name;
|
||||||
|
this.dataType = (Class<T>) this.checkAndAssignDataType(type);
|
||||||
|
this.defaultValue = value;
|
||||||
|
this.required = required;
|
||||||
|
this.desc = desc;
|
||||||
|
this.checkFunc = pred;
|
||||||
|
|
||||||
|
this.check(this.defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Class<?> checkAndAssignDataType(Class<T> dataType) {
|
||||||
|
for (Class<?> clazz : ACCEPTED_DATA_TYPES) {
|
||||||
|
if (clazz.isAssignableFrom(dataType)) {
|
||||||
|
return clazz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String msg = String.format("Input data type '%s' doesn't belong " +
|
||||||
|
"to acceptable type set: [%s]",
|
||||||
|
dataType, ACCEPTED_DATA_TYPES_STRING);
|
||||||
|
throw new IllegalArgumentException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Class<T> dataType() {
|
||||||
|
return this.dataType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String desc() {
|
||||||
|
return this.desc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean required() {
|
||||||
|
return this.required;
|
||||||
|
}
|
||||||
|
|
||||||
|
public R defaultValue() {
|
||||||
|
return this.convert(this.defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public R parseConvert(String value) {
|
||||||
|
T parsed = this.parse(value);
|
||||||
|
this.check(parsed);
|
||||||
|
return this.convert(parsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected T parse(String value) {
|
||||||
|
return (T) this.parse(value, this.dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object parse(String value, Class<?> dataType) {
|
||||||
|
if (dataType.equals(String.class)) {
|
||||||
|
return value;
|
||||||
|
} else if (dataType.equals(Class.class)) {
|
||||||
|
try {
|
||||||
|
if (value.startsWith("class")) {
|
||||||
|
value = value.substring("class".length()).trim();
|
||||||
|
}
|
||||||
|
return Class.forName(value);
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
throw new ConfigException(
|
||||||
|
"Failed to parse Class from String '%s'", e, value);
|
||||||
|
}
|
||||||
|
} else if (List.class.isAssignableFrom(dataType)) {
|
||||||
|
E.checkState(this.forList(),
|
||||||
|
"List option can't be registered with class %s",
|
||||||
|
this.getClass().getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use PropertyConverter method `toXXX` convert value
|
||||||
|
String methodTo = "to" + dataType.getSimpleName();
|
||||||
|
try {
|
||||||
|
Method method = PropertyConverter.class.getMethod(
|
||||||
|
methodTo, Object.class);
|
||||||
|
return method.invoke(null, value);
|
||||||
|
} catch (ReflectiveOperationException e) {
|
||||||
|
LOG.error("Invalid type of value '{}' for option '{}'",
|
||||||
|
value, this.name, e);
|
||||||
|
throw new ConfigException(
|
||||||
|
"Invalid type of value '%s' for option '%s', " +
|
||||||
|
"expect '%s' type",
|
||||||
|
value, this.name, dataType.getSimpleName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void check(Object value) {
|
||||||
|
E.checkNotNull(value, "value", this.name);
|
||||||
|
if (!this.dataType.isInstance(value)) {
|
||||||
|
throw new ConfigException(
|
||||||
|
"Invalid type of value '%s' for option '%s', " +
|
||||||
|
"expect type %s but got %s", value, this.name,
|
||||||
|
this.dataType.getSimpleName(),
|
||||||
|
value.getClass().getSimpleName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.checkFunc != null) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
T result = (T) value;
|
||||||
|
if (!this.checkFunc.apply(result)) {
|
||||||
|
throw new ConfigException("Invalid option value for '%s': %s",
|
||||||
|
this.name, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected R convert(T value) {
|
||||||
|
return (R) value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean forList() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[%s]%s=%s", this.dataType.getSimpleName(),
|
||||||
|
this.name, this.defaultValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.date;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import org.joda.time.DateTimeZone;
|
||||||
|
import org.joda.time.format.DateTimeFormat;
|
||||||
|
import org.joda.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SafeDateFormat actually is a proxy for joda DateTimeFormatter
|
||||||
|
*/
|
||||||
|
public class SafeDateFormat {
|
||||||
|
|
||||||
|
private static final int ONE_HOUR_MS = 3600 * 1000;
|
||||||
|
|
||||||
|
private final String pattern;
|
||||||
|
private DateTimeFormatter formatter;
|
||||||
|
|
||||||
|
public SafeDateFormat(String pattern) {
|
||||||
|
this.pattern = pattern;
|
||||||
|
this.formatter = DateTimeFormat.forPattern(pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void setTimeZone(String zoneId) {
|
||||||
|
int hoursOffset = TimeZone.getTimeZone(zoneId).getRawOffset() /
|
||||||
|
ONE_HOUR_MS;
|
||||||
|
DateTimeZone zone = DateTimeZone.forOffsetHours(hoursOffset);
|
||||||
|
this.formatter = this.formatter.withZone(zone);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeZone getTimeZone() {
|
||||||
|
return this.formatter.getZone().toTimeZone();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date parse(String source) {
|
||||||
|
return this.formatter.parseDateTime(source).toDate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String format(Date date) {
|
||||||
|
return this.formatter.print(date.getTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object toPattern() {
|
||||||
|
return this.pattern;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.event;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class Event extends java.util.EventObject {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1625973849208342813L;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private Object[] args;
|
||||||
|
|
||||||
|
public Event(Object source, String event) {
|
||||||
|
this(source, event, Collections.emptyList().toArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event(Object source, String event, Object... args) {
|
||||||
|
super(source);
|
||||||
|
this.name = event;
|
||||||
|
this.args = args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] args() {
|
||||||
|
return this.args;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkArgs(Class<?>... classes) throws IllegalArgumentException {
|
||||||
|
E.checkArgument(this.args.length == classes.length,
|
||||||
|
"The args count of event '%s' should be %s(actual %s)",
|
||||||
|
this.name, classes.length, this.args.length);
|
||||||
|
int i = 0;
|
||||||
|
for (Class<?> c : classes) {
|
||||||
|
Object arg = this.args[i++];
|
||||||
|
if (arg == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
E.checkArgument(c.isAssignableFrom(arg.getClass()),
|
||||||
|
"The arg '%s'(%s) can't match %s",
|
||||||
|
arg, arg.getClass(), c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("Event{name='%s', args=%s}",
|
||||||
|
this.name, Arrays.asList(this.args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,197 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.event;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import org.apache.hugegraph.util.ExecutorUtil;
|
||||||
|
import org.apache.hugegraph.util.Log;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.iterator.ExtendableIterator;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
public class EventHub {
|
||||||
|
|
||||||
|
private static final Logger LOG = Log.logger(EventHub.class);
|
||||||
|
|
||||||
|
public static final String EVENT_WORKER = "event-worker-%d";
|
||||||
|
public static final String ANY_EVENT = "*";
|
||||||
|
|
||||||
|
private static final List<EventListener> EMPTY = ImmutableList.of();
|
||||||
|
|
||||||
|
// Event executor
|
||||||
|
private static ExecutorService executor = null;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private Map<String, List<EventListener>> listeners;
|
||||||
|
|
||||||
|
public EventHub() {
|
||||||
|
this("hub");
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventHub(String name) {
|
||||||
|
this(name, 1, Runtime.getRuntime().availableProcessors() << 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventHub(String name, int threadSize) {
|
||||||
|
LOG.debug("Create new EventHub {},threadSize {}", name, threadSize);
|
||||||
|
this.name = name;
|
||||||
|
this.listeners = new ConcurrentHashMap<>();
|
||||||
|
EventHub.init(threadSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventHub(String name, int corePoolSize, int maximumPoolSize) {
|
||||||
|
LOG.debug("Create new EventHub {},corePoolSize {}, maximumPoolSize {}", name, corePoolSize, maximumPoolSize);
|
||||||
|
this.name = name;
|
||||||
|
this.listeners = new ConcurrentHashMap<>();
|
||||||
|
EventHub.init(corePoolSize, maximumPoolSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void init(int poolSize) {
|
||||||
|
if (executor != null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
LOG.debug("Init pool(size {}) for EventHub", poolSize);
|
||||||
|
executor = ExecutorUtil.newFixedThreadPool(poolSize, EVENT_WORKER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized void init(int corePoolSize, int maximumPoolSize) {
|
||||||
|
LOG.debug("Init corePoolSize {}, maximumPoolSize {} for EventHub", corePoolSize, maximumPoolSize);
|
||||||
|
if (executor != null) {
|
||||||
|
LOG.debug("EventHub executor already initialized");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
executor = ExecutorUtil.newDynamicThreadExecutor(EVENT_WORKER, corePoolSize, maximumPoolSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized boolean destroy(long timeout)
|
||||||
|
throws InterruptedException {
|
||||||
|
E.checkState(executor != null, "EventHub has not been initialized");
|
||||||
|
LOG.debug("Destroy pool for EventHub");
|
||||||
|
executor.shutdown();
|
||||||
|
return executor.awaitTermination(timeout, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ExecutorService executor() {
|
||||||
|
ExecutorService e = executor;
|
||||||
|
E.checkState(e != null, "The event executor has been destroyed");
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean containsListener(String event) {
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
return ls != null && ls.size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<EventListener> listeners(String event) {
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
return ls == null ? EMPTY : Collections.unmodifiableList(ls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void listen(String event, EventListener listener) {
|
||||||
|
E.checkNotNull(event, "event");
|
||||||
|
E.checkNotNull(listener, "event listener");
|
||||||
|
|
||||||
|
if (!this.listeners.containsKey(event)) {
|
||||||
|
this.listeners.putIfAbsent(event, new CopyOnWriteArrayList<>());
|
||||||
|
}
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
assert ls != null : this.listeners;
|
||||||
|
ls.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<EventListener> unlisten(String event) {
|
||||||
|
List<EventListener> ls = this.listeners.remove(event);
|
||||||
|
return ls == null ? EMPTY : Collections.unmodifiableList(ls);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int unlisten(String event, EventListener listener) {
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
if (ls == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
while (ls.remove(listener)) {
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Future<Integer> notify(String event, @Nullable Object... args) {
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
ExtendableIterator<EventListener> all = new ExtendableIterator<>();
|
||||||
|
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
if (ls != null && !ls.isEmpty()) {
|
||||||
|
all.extend(ls.iterator());
|
||||||
|
}
|
||||||
|
List<EventListener> lsAny = this.listeners.get(ANY_EVENT);
|
||||||
|
if (lsAny != null && !lsAny.isEmpty()) {
|
||||||
|
all.extend(lsAny.iterator());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!all.hasNext()) {
|
||||||
|
return CompletableFuture.completedFuture(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Event ev = new Event(this, event, args);
|
||||||
|
|
||||||
|
// The submit will catch params: `all`(Listeners) and `ev`(Event)
|
||||||
|
return executor().submit(() -> {
|
||||||
|
int count = 0;
|
||||||
|
// Notify all listeners, and ignore the results
|
||||||
|
while (all.hasNext()) {
|
||||||
|
try {
|
||||||
|
all.next().event(ev);
|
||||||
|
count++;
|
||||||
|
} catch (Throwable e) {
|
||||||
|
LOG.warn("Failed to handle event: {}", ev, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object call(String event, @Nullable Object... args) {
|
||||||
|
List<EventListener> ls = this.listeners.get(event);
|
||||||
|
if (ls == null) {
|
||||||
|
throw new RuntimeException("Not found listener for: " + event);
|
||||||
|
} else if (ls.size() != 1) {
|
||||||
|
throw new RuntimeException("Too many listeners for: " + event);
|
||||||
|
}
|
||||||
|
EventListener listener = ls.get(0);
|
||||||
|
return listener.event(new Event(this, event, args));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,13 +15,13 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hugegraph.auth;
|
package org.apache.hugegraph.event;
|
||||||
|
|
||||||
public interface AuthConstant {
|
public interface EventListener extends java.util.EventListener {
|
||||||
|
/**
|
||||||
/*
|
* The event callback
|
||||||
* Fields in token
|
* @param event object
|
||||||
|
* @return event result
|
||||||
*/
|
*/
|
||||||
String TOKEN_USER_NAME = "user_name";
|
Object event(Event event);
|
||||||
String TOKEN_USER_ID = "user_id";
|
|
||||||
}
|
}
|
||||||
|
|
@ -15,10 +15,9 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hugegraph.type;
|
package org.apache.hugegraph.func;
|
||||||
|
|
||||||
public interface Typeable {
|
public interface TriFunction<T1, T2, T3, R> {
|
||||||
|
|
||||||
// Return schema/data type
|
R apply(T1 v1, T2 v2, T3 v3);
|
||||||
HugeType type();
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
public class BatchMapperIterator<T, R> extends WrappedIterator<R> {
|
||||||
|
|
||||||
|
private final int batch;
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Function<List<T>, Iterator<R>> mapperCallback;
|
||||||
|
|
||||||
|
private Iterator<R> batchIterator;
|
||||||
|
|
||||||
|
public BatchMapperIterator(int batch, Iterator<T> origin,
|
||||||
|
Function<List<T>, Iterator<R>> mapper) {
|
||||||
|
E.checkArgument(batch > 0, "Expect batch > 0, but got %s", batch);
|
||||||
|
this.batch = batch;
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.mapperCallback = mapper;
|
||||||
|
this.batchIterator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetch() {
|
||||||
|
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<T> batch = this.nextBatch();
|
||||||
|
assert this.batchIterator == null;
|
||||||
|
while (!batch.isEmpty()) {
|
||||||
|
// Do fetch
|
||||||
|
this.batchIterator = this.mapperCallback.apply(batch);
|
||||||
|
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// Try next batch
|
||||||
|
batch = this.nextBatch();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final List<T> nextBatch() {
|
||||||
|
if (!this.originIterator.hasNext()) {
|
||||||
|
return ImmutableList.of();
|
||||||
|
}
|
||||||
|
List<T> list = InsertionOrderUtil.newList();
|
||||||
|
for (int i = 0; i < this.batch && this.originIterator.hasNext(); i++) {
|
||||||
|
T next = this.originIterator.next();
|
||||||
|
list.add(next);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final boolean fetchFromBatch() {
|
||||||
|
E.checkNotNull(this.batchIterator, "mapper results");
|
||||||
|
while (this.batchIterator.hasNext()) {
|
||||||
|
R result = this.batchIterator.next();
|
||||||
|
if (result != null) {
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.resetBatchIterator();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void resetBatchIterator() {
|
||||||
|
if (this.batchIterator == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
close(this.batchIterator);
|
||||||
|
this.batchIterator = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,9 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hugegraph.analyzer;
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Iterator;
|
||||||
|
|
||||||
public interface Analyzer {
|
public interface CIter<R> extends Iterator<R>, AutoCloseable, Metadatable {
|
||||||
|
|
||||||
Set<String> segment(String text);
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Deque;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class ExtendableIterator<T> extends WrappedIterator<T> {
|
||||||
|
|
||||||
|
private final Deque<Iterator<T>> itors;
|
||||||
|
|
||||||
|
private Iterator<T> currentIterator;
|
||||||
|
|
||||||
|
public ExtendableIterator() {
|
||||||
|
this.itors = new ConcurrentLinkedDeque<>();
|
||||||
|
this.currentIterator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendableIterator(Iterator<T> iter) {
|
||||||
|
this();
|
||||||
|
this.extend(iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendableIterator(Iterator<T> itor1, Iterator<T> itor2) {
|
||||||
|
this();
|
||||||
|
this.extend(itor1);
|
||||||
|
this.extend(itor2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExtendableIterator<T> extend(Iterator<T> iter) {
|
||||||
|
E.checkState(this.currentIterator == null,
|
||||||
|
"Can't extend iterator after iterating");
|
||||||
|
if (iter != null) {
|
||||||
|
this.itors.addLast(iter);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
for (Iterator<T> iter : this.itors) {
|
||||||
|
if (iter instanceof AutoCloseable) {
|
||||||
|
((AutoCloseable) iter).close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.currentIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean fetch() {
|
||||||
|
assert this.current == none();
|
||||||
|
if (this.itors.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.currentIterator != null && this.currentIterator.hasNext()) {
|
||||||
|
this.current = this.currentIterator.next();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterator<T> first;
|
||||||
|
while ((first = this.itors.peekFirst()) != null && !first.hasNext()) {
|
||||||
|
if (first == this.itors.peekLast() && this.itors.size() == 1) {
|
||||||
|
this.currentIterator = first;
|
||||||
|
// The last one
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
close(this.itors.removeFirst());
|
||||||
|
}
|
||||||
|
|
||||||
|
assert first != null && first.hasNext();
|
||||||
|
this.currentIterator = first;
|
||||||
|
this.current = this.currentIterator.next();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class FilterIterator<T> extends WrappedIterator<T> {
|
||||||
|
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Function<T, Boolean> filterCallback;
|
||||||
|
|
||||||
|
public FilterIterator(Iterator<T> origin, Function<T, Boolean> filter) {
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.filterCallback = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetch() {
|
||||||
|
while (this.originIterator.hasNext()) {
|
||||||
|
T next = this.originIterator.next();
|
||||||
|
// Do filter
|
||||||
|
if (next != null && this.filterCallback.apply(next)) {
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class FlatMapperFilterIterator<T, R> extends FlatMapperIterator<T, R> {
|
||||||
|
|
||||||
|
private final Function<R, Boolean> filterCallback;
|
||||||
|
|
||||||
|
public FlatMapperFilterIterator(Iterator<T> origin,
|
||||||
|
Function<T, Iterator<R>> mapper,
|
||||||
|
Function<R, Boolean> filter) {
|
||||||
|
super(origin, mapper);
|
||||||
|
this.filterCallback = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetchFromBatch() {
|
||||||
|
E.checkNotNull(this.batchIterator, "mapper results");
|
||||||
|
while (this.batchIterator.hasNext()) {
|
||||||
|
R result = this.batchIterator.next();
|
||||||
|
if (result != null && this.filterCallback.apply(result)) {
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.resetBatchIterator();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.E;
|
||||||
|
|
||||||
|
public class FlatMapperIterator<T, R> extends WrappedIterator<R> {
|
||||||
|
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Function<T, Iterator<R>> mapperCallback;
|
||||||
|
|
||||||
|
protected Iterator<R> batchIterator;
|
||||||
|
|
||||||
|
public FlatMapperIterator(Iterator<T> origin,
|
||||||
|
Function<T, Iterator<R>> mapper) {
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.mapperCallback = mapper;
|
||||||
|
this.batchIterator = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws Exception {
|
||||||
|
this.resetBatchIterator();
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetch() {
|
||||||
|
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (this.originIterator.hasNext()) {
|
||||||
|
T next = this.originIterator.next();
|
||||||
|
assert this.batchIterator == null;
|
||||||
|
// Do fetch
|
||||||
|
this.batchIterator = this.mapperCallback.apply(next);
|
||||||
|
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean fetchFromBatch() {
|
||||||
|
E.checkNotNull(this.batchIterator, "mapper results");
|
||||||
|
while (this.batchIterator.hasNext()) {
|
||||||
|
R result = this.batchIterator.next();
|
||||||
|
if (result != null) {
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.resetBatchIterator();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void resetBatchIterator() {
|
||||||
|
if (this.batchIterator == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
close(this.batchIterator);
|
||||||
|
this.batchIterator = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class LimitIterator<T> extends WrappedIterator<T> {
|
||||||
|
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Function<T, Boolean> filterCallback;
|
||||||
|
|
||||||
|
public LimitIterator(Iterator<T> origin, Function<T, Boolean> filter) {
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.filterCallback = filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetch() {
|
||||||
|
while (this.originIterator.hasNext()) {
|
||||||
|
T next = this.originIterator.next();
|
||||||
|
if (next == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Do filter
|
||||||
|
boolean reachLimit = this.filterCallback.apply(next);
|
||||||
|
if (reachLimit) {
|
||||||
|
this.closeOriginIterator();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = next;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void closeOriginIterator() {
|
||||||
|
if (this.originIterator == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
close(this.originIterator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||||
|
|
||||||
|
public class ListIterator<T> extends WrappedIterator<T> {
|
||||||
|
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Iterator<T> resultsIterator;
|
||||||
|
private final Collection<T> results;
|
||||||
|
|
||||||
|
public ListIterator(long capacity, Iterator<T> origin) {
|
||||||
|
List<T> results = InsertionOrderUtil.newList();
|
||||||
|
while (origin.hasNext()) {
|
||||||
|
if (capacity >= 0L && results.size() >= capacity) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"The iterator exceeded capacity " + capacity);
|
||||||
|
}
|
||||||
|
results.add(origin.next());
|
||||||
|
}
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.results = Collections.unmodifiableList(results);
|
||||||
|
this.resultsIterator = this.results.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ListIterator(Collection<T> origin) {
|
||||||
|
this.originIterator = origin.iterator();
|
||||||
|
this.results = origin instanceof List ?
|
||||||
|
Collections.unmodifiableList((List<T>) origin) :
|
||||||
|
Collections.unmodifiableCollection(origin);
|
||||||
|
this.resultsIterator = this.results.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
this.resultsIterator.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<T> list() {
|
||||||
|
return this.results;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean fetch() {
|
||||||
|
assert this.current == none();
|
||||||
|
if (!this.resultsIterator.hasNext()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
this.current = this.resultsIterator.next();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with this
|
||||||
|
* work for additional information regarding copyright ownership. The ASF
|
||||||
|
* licenses this file to You 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class MapperIterator<T, R> extends WrappedIterator<R> {
|
||||||
|
|
||||||
|
private final Iterator<T> originIterator;
|
||||||
|
private final Function<T, R> mapperCallback;
|
||||||
|
|
||||||
|
public MapperIterator(Iterator<T> origin, Function<T, R> mapper) {
|
||||||
|
this.originIterator = origin;
|
||||||
|
this.mapperCallback = mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Iterator<T> originIterator() {
|
||||||
|
return this.originIterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final boolean fetch() {
|
||||||
|
while (this.originIterator.hasNext()) {
|
||||||
|
T next = this.originIterator.next();
|
||||||
|
R result = this.mapperCallback.apply(next);
|
||||||
|
if (result != null) {
|
||||||
|
assert this.current == none();
|
||||||
|
this.current = result;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,9 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.hugegraph.job;
|
package org.apache.hugegraph.iterator;
|
||||||
|
|
||||||
public interface Job<V> {
|
public interface Metadatable {
|
||||||
|
|
||||||
String type();
|
Object metadata(String meta, Object... args);
|
||||||
|
|
||||||
V execute() throws Exception;
|
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue