opendal 0.1.6.pre.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
use std::io;
|
|
21
|
+
use std::io::SeekFrom;
|
|
22
|
+
use std::path::PathBuf;
|
|
23
|
+
use std::sync::Arc;
|
|
24
|
+
|
|
25
|
+
use log::debug;
|
|
26
|
+
|
|
27
|
+
use super::delete::HdfsDeleter;
|
|
28
|
+
use super::lister::HdfsLister;
|
|
29
|
+
use super::reader::HdfsReader;
|
|
30
|
+
use super::writer::HdfsWriter;
|
|
31
|
+
use super::DEFAULT_SCHEME;
|
|
32
|
+
use crate::raw::*;
|
|
33
|
+
use crate::services::HdfsConfig;
|
|
34
|
+
use crate::*;
|
|
35
|
+
impl Configurator for HdfsConfig {
|
|
36
|
+
type Builder = HdfsBuilder;
|
|
37
|
+
fn into_builder(self) -> Self::Builder {
|
|
38
|
+
HdfsBuilder { config: self }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#[doc = include_str!("docs.md")]
|
|
43
|
+
#[derive(Default)]
|
|
44
|
+
pub struct HdfsBuilder {
|
|
45
|
+
config: HdfsConfig,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
impl Debug for HdfsBuilder {
|
|
49
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
50
|
+
f.debug_struct("HdfsBuilder")
|
|
51
|
+
.field("config", &self.config)
|
|
52
|
+
.finish()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
impl HdfsBuilder {
|
|
57
|
+
/// Set root of this backend.
|
|
58
|
+
///
|
|
59
|
+
/// All operations will happen under this root.
|
|
60
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
61
|
+
self.config.root = if root.is_empty() {
|
|
62
|
+
None
|
|
63
|
+
} else {
|
|
64
|
+
Some(root.to_string())
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
self
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// Set name_node of this backend.
|
|
71
|
+
///
|
|
72
|
+
/// Valid format including:
|
|
73
|
+
///
|
|
74
|
+
/// - `default`: using the default setting based on hadoop config.
|
|
75
|
+
/// - `hdfs://127.0.0.1:9000`: connect to hdfs cluster.
|
|
76
|
+
pub fn name_node(mut self, name_node: &str) -> Self {
|
|
77
|
+
if !name_node.is_empty() {
|
|
78
|
+
self.config.name_node = Some(name_node.to_string())
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
self
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/// Set kerberos_ticket_cache_path of this backend
|
|
85
|
+
///
|
|
86
|
+
/// This should be configured when kerberos is enabled.
|
|
87
|
+
pub fn kerberos_ticket_cache_path(mut self, kerberos_ticket_cache_path: &str) -> Self {
|
|
88
|
+
if !kerberos_ticket_cache_path.is_empty() {
|
|
89
|
+
self.config.kerberos_ticket_cache_path = Some(kerberos_ticket_cache_path.to_string())
|
|
90
|
+
}
|
|
91
|
+
self
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// Set user of this backend
|
|
95
|
+
pub fn user(mut self, user: &str) -> Self {
|
|
96
|
+
if !user.is_empty() {
|
|
97
|
+
self.config.user = Some(user.to_string())
|
|
98
|
+
}
|
|
99
|
+
self
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// Enable append capacity of this backend.
|
|
103
|
+
///
|
|
104
|
+
/// This should be disabled when HDFS runs in non-distributed mode.
|
|
105
|
+
pub fn enable_append(mut self, enable_append: bool) -> Self {
|
|
106
|
+
self.config.enable_append = enable_append;
|
|
107
|
+
self
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/// Set temp dir for atomic write.
|
|
111
|
+
///
|
|
112
|
+
/// # Notes
|
|
113
|
+
///
|
|
114
|
+
/// - When append is enabled, we will not use atomic write
|
|
115
|
+
/// to avoid data loss and performance issue.
|
|
116
|
+
pub fn atomic_write_dir(mut self, dir: &str) -> Self {
|
|
117
|
+
self.config.atomic_write_dir = if dir.is_empty() {
|
|
118
|
+
None
|
|
119
|
+
} else {
|
|
120
|
+
Some(String::from(dir))
|
|
121
|
+
};
|
|
122
|
+
self
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
impl Builder for HdfsBuilder {
|
|
127
|
+
type Config = HdfsConfig;
|
|
128
|
+
|
|
129
|
+
fn build(self) -> Result<impl Access> {
|
|
130
|
+
debug!("backend build started: {:?}", &self);
|
|
131
|
+
|
|
132
|
+
let name_node = match &self.config.name_node {
|
|
133
|
+
Some(v) => v,
|
|
134
|
+
None => {
|
|
135
|
+
return Err(Error::new(ErrorKind::ConfigInvalid, "name node is empty")
|
|
136
|
+
.with_context("service", Scheme::Hdfs))
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
let root = normalize_root(&self.config.root.unwrap_or_default());
|
|
141
|
+
debug!("backend use root {root}");
|
|
142
|
+
|
|
143
|
+
let mut builder = hdrs::ClientBuilder::new(name_node);
|
|
144
|
+
if let Some(ticket_cache_path) = &self.config.kerberos_ticket_cache_path {
|
|
145
|
+
builder = builder.with_kerberos_ticket_cache_path(ticket_cache_path.as_str());
|
|
146
|
+
}
|
|
147
|
+
if let Some(user) = &self.config.user {
|
|
148
|
+
builder = builder.with_user(user.as_str());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let client = builder.connect().map_err(new_std_io_error)?;
|
|
152
|
+
|
|
153
|
+
// Create root dir if not exist.
|
|
154
|
+
if let Err(e) = client.metadata(&root) {
|
|
155
|
+
if e.kind() == io::ErrorKind::NotFound {
|
|
156
|
+
debug!("root {root} is not exist, creating now");
|
|
157
|
+
|
|
158
|
+
client.create_dir(&root).map_err(new_std_io_error)?
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
let atomic_write_dir = self.config.atomic_write_dir;
|
|
163
|
+
|
|
164
|
+
// If atomic write dir is not exist, we must create it.
|
|
165
|
+
if let Some(d) = &atomic_write_dir {
|
|
166
|
+
if let Err(e) = client.metadata(d) {
|
|
167
|
+
if e.kind() == io::ErrorKind::NotFound {
|
|
168
|
+
client.create_dir(d).map_err(new_std_io_error)?
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
Ok(HdfsBackend {
|
|
174
|
+
info: {
|
|
175
|
+
let am = AccessorInfo::default();
|
|
176
|
+
am.set_scheme(DEFAULT_SCHEME)
|
|
177
|
+
.set_root(&root)
|
|
178
|
+
.set_native_capability(Capability {
|
|
179
|
+
stat: true,
|
|
180
|
+
|
|
181
|
+
read: true,
|
|
182
|
+
|
|
183
|
+
write: true,
|
|
184
|
+
write_can_append: self.config.enable_append,
|
|
185
|
+
|
|
186
|
+
create_dir: true,
|
|
187
|
+
delete: true,
|
|
188
|
+
|
|
189
|
+
list: true,
|
|
190
|
+
|
|
191
|
+
rename: true,
|
|
192
|
+
|
|
193
|
+
shared: true,
|
|
194
|
+
|
|
195
|
+
..Default::default()
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
am.into()
|
|
199
|
+
},
|
|
200
|
+
root,
|
|
201
|
+
atomic_write_dir,
|
|
202
|
+
client: Arc::new(client),
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/// Backend for hdfs services.
|
|
208
|
+
#[derive(Debug, Clone)]
|
|
209
|
+
pub struct HdfsBackend {
|
|
210
|
+
pub info: Arc<AccessorInfo>,
|
|
211
|
+
pub root: String,
|
|
212
|
+
atomic_write_dir: Option<String>,
|
|
213
|
+
pub client: Arc<hdrs::Client>,
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/// hdrs::Client is thread-safe.
|
|
217
|
+
unsafe impl Send for HdfsBackend {}
|
|
218
|
+
unsafe impl Sync for HdfsBackend {}
|
|
219
|
+
|
|
220
|
+
impl Access for HdfsBackend {
|
|
221
|
+
type Reader = HdfsReader<hdrs::AsyncFile>;
|
|
222
|
+
type Writer = HdfsWriter<hdrs::AsyncFile>;
|
|
223
|
+
type Lister = Option<HdfsLister>;
|
|
224
|
+
type Deleter = oio::OneShotDeleter<HdfsDeleter>;
|
|
225
|
+
|
|
226
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
227
|
+
self.info.clone()
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result<RpCreateDir> {
|
|
231
|
+
let p = build_rooted_abs_path(&self.root, path);
|
|
232
|
+
|
|
233
|
+
self.client.create_dir(&p).map_err(new_std_io_error)?;
|
|
234
|
+
|
|
235
|
+
Ok(RpCreateDir::default())
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
|
|
239
|
+
let p = build_rooted_abs_path(&self.root, path);
|
|
240
|
+
|
|
241
|
+
let meta = self.client.metadata(&p).map_err(new_std_io_error)?;
|
|
242
|
+
|
|
243
|
+
let mode = if meta.is_dir() {
|
|
244
|
+
EntryMode::DIR
|
|
245
|
+
} else if meta.is_file() {
|
|
246
|
+
EntryMode::FILE
|
|
247
|
+
} else {
|
|
248
|
+
EntryMode::Unknown
|
|
249
|
+
};
|
|
250
|
+
let mut m = Metadata::new(mode);
|
|
251
|
+
m.set_content_length(meta.len());
|
|
252
|
+
m.set_last_modified(meta.modified().into());
|
|
253
|
+
|
|
254
|
+
Ok(RpStat::new(m))
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
258
|
+
let p = build_rooted_abs_path(&self.root, path);
|
|
259
|
+
|
|
260
|
+
let client = self.client.clone();
|
|
261
|
+
let mut f = client
|
|
262
|
+
.open_file()
|
|
263
|
+
.read(true)
|
|
264
|
+
.async_open(&p)
|
|
265
|
+
.await
|
|
266
|
+
.map_err(new_std_io_error)?;
|
|
267
|
+
|
|
268
|
+
if args.range().offset() != 0 {
|
|
269
|
+
use futures::AsyncSeekExt;
|
|
270
|
+
|
|
271
|
+
f.seek(SeekFrom::Start(args.range().offset()))
|
|
272
|
+
.await
|
|
273
|
+
.map_err(new_std_io_error)?;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
Ok((
|
|
277
|
+
RpRead::new(),
|
|
278
|
+
HdfsReader::new(f, args.range().size().unwrap_or(u64::MAX) as _),
|
|
279
|
+
))
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async fn write(&self, path: &str, op: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
283
|
+
let target_path = build_rooted_abs_path(&self.root, path);
|
|
284
|
+
let mut initial_size = 0;
|
|
285
|
+
let target_exists = match self.client.metadata(&target_path) {
|
|
286
|
+
Ok(meta) => {
|
|
287
|
+
initial_size = meta.len();
|
|
288
|
+
true
|
|
289
|
+
}
|
|
290
|
+
Err(err) => {
|
|
291
|
+
if err.kind() != io::ErrorKind::NotFound {
|
|
292
|
+
return Err(new_std_io_error(err));
|
|
293
|
+
}
|
|
294
|
+
false
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
let should_append = op.append() && target_exists;
|
|
299
|
+
let tmp_path = self.atomic_write_dir.as_ref().and_then(|atomic_write_dir| {
|
|
300
|
+
// If the target file exists, we should append to the end of it directly.
|
|
301
|
+
(!should_append).then_some(build_rooted_abs_path(
|
|
302
|
+
atomic_write_dir,
|
|
303
|
+
&build_tmp_path_of(path),
|
|
304
|
+
))
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
if !target_exists {
|
|
308
|
+
let parent = get_parent(&target_path);
|
|
309
|
+
self.client.create_dir(parent).map_err(new_std_io_error)?;
|
|
310
|
+
}
|
|
311
|
+
if !should_append {
|
|
312
|
+
initial_size = 0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
let mut open_options = self.client.open_file();
|
|
316
|
+
open_options.create(true);
|
|
317
|
+
if should_append {
|
|
318
|
+
open_options.append(true);
|
|
319
|
+
} else {
|
|
320
|
+
open_options.write(true);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
let f = open_options
|
|
324
|
+
.async_open(tmp_path.as_ref().unwrap_or(&target_path))
|
|
325
|
+
.await
|
|
326
|
+
.map_err(new_std_io_error)?;
|
|
327
|
+
|
|
328
|
+
Ok((
|
|
329
|
+
RpWrite::new(),
|
|
330
|
+
HdfsWriter::new(
|
|
331
|
+
target_path,
|
|
332
|
+
tmp_path,
|
|
333
|
+
f,
|
|
334
|
+
Arc::clone(&self.client),
|
|
335
|
+
target_exists,
|
|
336
|
+
initial_size,
|
|
337
|
+
),
|
|
338
|
+
))
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
342
|
+
Ok((
|
|
343
|
+
RpDelete::default(),
|
|
344
|
+
oio::OneShotDeleter::new(HdfsDeleter::new(Arc::new(self.clone()))),
|
|
345
|
+
))
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
|
|
349
|
+
let p = build_rooted_abs_path(&self.root, path);
|
|
350
|
+
|
|
351
|
+
let f = match self.client.read_dir(&p) {
|
|
352
|
+
Ok(f) => f,
|
|
353
|
+
Err(e) => {
|
|
354
|
+
return if e.kind() == io::ErrorKind::NotFound {
|
|
355
|
+
Ok((RpList::default(), None))
|
|
356
|
+
} else {
|
|
357
|
+
Err(new_std_io_error(e))
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
let rd = HdfsLister::new(&self.root, f, path);
|
|
363
|
+
|
|
364
|
+
Ok((RpList::default(), Some(rd)))
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
async fn rename(&self, from: &str, to: &str, _args: OpRename) -> Result<RpRename> {
|
|
368
|
+
let from_path = build_rooted_abs_path(&self.root, from);
|
|
369
|
+
self.client.metadata(&from_path).map_err(new_std_io_error)?;
|
|
370
|
+
|
|
371
|
+
let to_path = build_rooted_abs_path(&self.root, to);
|
|
372
|
+
let result = self.client.metadata(&to_path);
|
|
373
|
+
match result {
|
|
374
|
+
Err(err) => {
|
|
375
|
+
// Early return if other error happened.
|
|
376
|
+
if err.kind() != io::ErrorKind::NotFound {
|
|
377
|
+
return Err(new_std_io_error(err));
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
let parent = PathBuf::from(&to_path)
|
|
381
|
+
.parent()
|
|
382
|
+
.ok_or_else(|| {
|
|
383
|
+
Error::new(
|
|
384
|
+
ErrorKind::Unexpected,
|
|
385
|
+
"path should have parent but not, it must be malformed",
|
|
386
|
+
)
|
|
387
|
+
.with_context("input", &to_path)
|
|
388
|
+
})?
|
|
389
|
+
.to_path_buf();
|
|
390
|
+
|
|
391
|
+
self.client
|
|
392
|
+
.create_dir(&parent.to_string_lossy())
|
|
393
|
+
.map_err(new_std_io_error)?;
|
|
394
|
+
}
|
|
395
|
+
Ok(metadata) => {
|
|
396
|
+
if metadata.is_file() {
|
|
397
|
+
self.client
|
|
398
|
+
.remove_file(&to_path)
|
|
399
|
+
.map_err(new_std_io_error)?;
|
|
400
|
+
} else {
|
|
401
|
+
return Err(Error::new(ErrorKind::IsADirectory, "path should be a file")
|
|
402
|
+
.with_context("input", &to_path));
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
self.client
|
|
408
|
+
.rename_file(&from_path, &to_path)
|
|
409
|
+
.map_err(new_std_io_error)?;
|
|
410
|
+
|
|
411
|
+
Ok(RpRename::new())
|
|
412
|
+
}
|
|
413
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
use serde::Serialize;
|
|
23
|
+
|
|
24
|
+
/// [Hadoop Distributed File System (HDFS™)](https://hadoop.apache.org/) support.
|
|
25
|
+
///
|
|
26
|
+
/// Config for Hdfs services support.
|
|
27
|
+
#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
28
|
+
#[serde(default)]
|
|
29
|
+
#[non_exhaustive]
|
|
30
|
+
pub struct HdfsConfig {
|
|
31
|
+
/// work dir of this backend
|
|
32
|
+
pub root: Option<String>,
|
|
33
|
+
/// name node of this backend
|
|
34
|
+
pub name_node: Option<String>,
|
|
35
|
+
/// kerberos_ticket_cache_path of this backend
|
|
36
|
+
pub kerberos_ticket_cache_path: Option<String>,
|
|
37
|
+
/// user of this backend
|
|
38
|
+
pub user: Option<String>,
|
|
39
|
+
/// enable the append capacity
|
|
40
|
+
pub enable_append: bool,
|
|
41
|
+
/// atomic_write_dir of this backend
|
|
42
|
+
pub atomic_write_dir: Option<String>,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
impl Debug for HdfsConfig {
|
|
46
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
47
|
+
f.debug_struct("HdfsConfig")
|
|
48
|
+
.field("root", &self.root)
|
|
49
|
+
.field("name_node", &self.name_node)
|
|
50
|
+
.field(
|
|
51
|
+
"kerberos_ticket_cache_path",
|
|
52
|
+
&self.kerberos_ticket_cache_path,
|
|
53
|
+
)
|
|
54
|
+
.field("user", &self.user)
|
|
55
|
+
.field("enable_append", &self.enable_append)
|
|
56
|
+
.field("atomic_write_dir", &self.atomic_write_dir)
|
|
57
|
+
.finish_non_exhaustive()
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::io;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use super::backend::HdfsBackend;
|
|
22
|
+
use crate::raw::*;
|
|
23
|
+
use crate::*;
|
|
24
|
+
|
|
25
|
+
pub struct HdfsDeleter {
|
|
26
|
+
core: Arc<HdfsBackend>,
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
impl HdfsDeleter {
|
|
30
|
+
pub fn new(core: Arc<HdfsBackend>) -> Self {
|
|
31
|
+
Self { core }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
impl oio::OneShotDelete for HdfsDeleter {
|
|
36
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
37
|
+
let p = build_rooted_abs_path(&self.core.root, &path);
|
|
38
|
+
|
|
39
|
+
let meta = self.core.client.metadata(&p);
|
|
40
|
+
|
|
41
|
+
if let Err(err) = meta {
|
|
42
|
+
return if err.kind() == io::ErrorKind::NotFound {
|
|
43
|
+
Ok(())
|
|
44
|
+
} else {
|
|
45
|
+
Err(new_std_io_error(err))
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Safety: Err branch has been checked, it's OK to unwrap.
|
|
50
|
+
let meta = meta.ok().unwrap();
|
|
51
|
+
|
|
52
|
+
let result = if meta.is_dir() {
|
|
53
|
+
self.core.client.remove_dir(&p)
|
|
54
|
+
} else {
|
|
55
|
+
self.core.client.remove_file(&p)
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
result.map_err(new_std_io_error)?;
|
|
59
|
+
|
|
60
|
+
Ok(())
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
A distributed file system that provides high-throughput access to application data.
|
|
2
|
+
|
|
3
|
+
## Capabilities
|
|
4
|
+
|
|
5
|
+
This service can be used to:
|
|
6
|
+
|
|
7
|
+
- [x] stat
|
|
8
|
+
- [x] read
|
|
9
|
+
- [x] write
|
|
10
|
+
- [x] create_dir
|
|
11
|
+
- [x] delete
|
|
12
|
+
- [ ] copy
|
|
13
|
+
- [x] rename
|
|
14
|
+
- [x] list
|
|
15
|
+
- [ ] ~~presign~~
|
|
16
|
+
- [x] blocking
|
|
17
|
+
- [x] append
|
|
18
|
+
|
|
19
|
+
## Differences with webhdfs
|
|
20
|
+
|
|
21
|
+
[Webhdfs][crate::services::Webhdfs] is powered by hdfs's RESTful HTTP API.
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
HDFS support needs to enable feature `services-hdfs`.
|
|
26
|
+
|
|
27
|
+
## Configuration
|
|
28
|
+
|
|
29
|
+
- `root`: Set the work dir for backend.
|
|
30
|
+
- `name_node`: Set the name node for backend.
|
|
31
|
+
- `kerberos_ticket_cache_path`: Set the kerberos ticket cache path for backend, this should be gotten by `klist` after `kinit`
|
|
32
|
+
- `user`: Set the user for backend
|
|
33
|
+
- `enable_append`: enable the append capacity. Default is false.
|
|
34
|
+
|
|
35
|
+
Refer to [`HdfsBuilder`]'s public API docs for more information.
|
|
36
|
+
|
|
37
|
+
## Environment
|
|
38
|
+
|
|
39
|
+
HDFS needs some environment set correctly.
|
|
40
|
+
|
|
41
|
+
- `JAVA_HOME`: the path to java home, could be found via `java -XshowSettings:properties -version`
|
|
42
|
+
- `HADOOP_HOME`: the path to hadoop home, opendal relays on this env to discover hadoop jars and set `CLASSPATH` automatically.
|
|
43
|
+
|
|
44
|
+
Most of the time, setting `JAVA_HOME` and `HADOOP_HOME` is enough. But there are some edge cases:
|
|
45
|
+
|
|
46
|
+
- If meeting errors like the following:
|
|
47
|
+
|
|
48
|
+
```shell
|
|
49
|
+
error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Java's lib are not including in pkg-config find path, please set `LD_LIBRARY_PATH`:
|
|
53
|
+
|
|
54
|
+
```shell
|
|
55
|
+
export LD_LIBRARY_PATH=${JAVA_HOME}/lib/server:${LD_LIBRARY_PATH}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The path of `libjvm.so` could be different, please keep an eye on it.
|
|
59
|
+
|
|
60
|
+
- If meeting errors like the following:
|
|
61
|
+
|
|
62
|
+
```shell
|
|
63
|
+
(unable to get stack trace for java.lang.NoClassDefFoundError exception: ExceptionUtils::getStackTrace error.)
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`CLASSPATH` is not set correctly or your hadoop installation is incorrect.
|
|
67
|
+
|
|
68
|
+
To set `CLASSPATH`:
|
|
69
|
+
```shell
|
|
70
|
+
export CLASSPATH=$(find $HADOOP_HOME -iname "*.jar" | xargs echo | tr ' ' ':'):${CLASSPATH}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- If HDFS has High Availability (HA) enabled with multiple available NameNodes, some configuration is required:
|
|
74
|
+
1. Obtain the entire HDFS config folder (usually located at HADOOP_HOME/etc/hadoop).
|
|
75
|
+
2. Set the environment variable HADOOP_CONF_DIR to the path of this folder.
|
|
76
|
+
```shell
|
|
77
|
+
export HADOOP_CONF_DIR=<path of the config folder>
|
|
78
|
+
```
|
|
79
|
+
3. Append the HADOOP_CONF_DIR to the `CLASSPATH`
|
|
80
|
+
```shell
|
|
81
|
+
export CLASSPATH=$HADOOP_CONF_DIR:$HADOOP_CLASSPATH:$CLASSPATH
|
|
82
|
+
```
|
|
83
|
+
4. Use the `cluster_name` specified in the `core-site.xml` file (located in the HADOOP_CONF_DIR folder) to replace namenode:port.
|
|
84
|
+
|
|
85
|
+
```ignore
|
|
86
|
+
builder.name_node("hdfs://cluster_name");
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### macOS Specific Note
|
|
90
|
+
|
|
91
|
+
If you encounter an issue during the build process on macOS with an error message similar to:
|
|
92
|
+
|
|
93
|
+
```shell
|
|
94
|
+
ld: unknown file type in $HADOOP_HOME/lib/native/libhdfs.so.0.0.0
|
|
95
|
+
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
|
96
|
+
```
|
|
97
|
+
This error is likely due to the fact that the official Hadoop build includes the libhdfs.so file for the x86-64 architecture, which is not compatible with aarch64 architecture required for MacOS.
|
|
98
|
+
|
|
99
|
+
To resolve this issue, you can add hdrs as a dependency in your Rust application's Cargo.toml file, and enable the vendored feature:
|
|
100
|
+
|
|
101
|
+
```toml
|
|
102
|
+
[dependencies]
|
|
103
|
+
hdrs = { version = "<version_number>", features = ["vendored"] }
|
|
104
|
+
```
|
|
105
|
+
Enabling the vendored feature ensures that hdrs includes the necessary libhdfs.so library built for the correct architecture.
|
|
106
|
+
|
|
107
|
+
## Example
|
|
108
|
+
|
|
109
|
+
### Via Builder
|
|
110
|
+
|
|
111
|
+
```rust,no_run
|
|
112
|
+
use std::sync::Arc;
|
|
113
|
+
|
|
114
|
+
use anyhow::Result;
|
|
115
|
+
use opendal::services::Hdfs;
|
|
116
|
+
use opendal::Operator;
|
|
117
|
+
|
|
118
|
+
#[tokio::main]
|
|
119
|
+
async fn main() -> Result<()> {
|
|
120
|
+
// Create fs backend builder.
|
|
121
|
+
let mut builder = Hdfs::default()
|
|
122
|
+
// Set the name node for hdfs.
|
|
123
|
+
// If the string starts with a protocol type such as file://, hdfs://, or gs://, this protocol type will be used.
|
|
124
|
+
.name_node("hdfs://127.0.0.1:9000")
|
|
125
|
+
// Set the root for hdfs, all operations will happen under this root.
|
|
126
|
+
//
|
|
127
|
+
// NOTE: the root must be absolute path.
|
|
128
|
+
.root("/tmp")
|
|
129
|
+
|
|
130
|
+
// Enable the append capacity for hdfs.
|
|
131
|
+
//
|
|
132
|
+
// Note: HDFS run in non-distributed mode doesn't support append.
|
|
133
|
+
.enable_append(true);
|
|
134
|
+
|
|
135
|
+
// `Accessor` provides the low level APIs, we will use `Operator` normally.
|
|
136
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
137
|
+
|
|
138
|
+
Ok(())
|
|
139
|
+
}
|
|
140
|
+
```
|