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,398 @@
|
|
|
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::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use bytes::Buf;
|
|
23
|
+
use http::header::CONTENT_LENGTH;
|
|
24
|
+
use http::header::CONTENT_TYPE;
|
|
25
|
+
use http::Request;
|
|
26
|
+
use http::Response;
|
|
27
|
+
use http::StatusCode;
|
|
28
|
+
use serde::Deserialize;
|
|
29
|
+
use tokio::sync::OnceCell;
|
|
30
|
+
|
|
31
|
+
use super::error::parse_error;
|
|
32
|
+
use crate::raw::*;
|
|
33
|
+
use crate::*;
|
|
34
|
+
|
|
35
|
+
pub struct WebhdfsCore {
|
|
36
|
+
pub info: Arc<AccessorInfo>,
|
|
37
|
+
pub root: String,
|
|
38
|
+
pub endpoint: String,
|
|
39
|
+
pub user_name: Option<String>,
|
|
40
|
+
pub auth: Option<String>,
|
|
41
|
+
pub root_checker: OnceCell<()>,
|
|
42
|
+
|
|
43
|
+
pub atomic_write_dir: Option<String>,
|
|
44
|
+
pub disable_list_batch: bool,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
impl Debug for WebhdfsCore {
|
|
48
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
49
|
+
f.debug_struct("WebhdfsCore")
|
|
50
|
+
.field("root", &self.root)
|
|
51
|
+
.field("endpoint", &self.endpoint)
|
|
52
|
+
.finish()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
impl WebhdfsCore {
|
|
57
|
+
pub async fn webhdfs_create_dir(&self, path: &str) -> Result<Response<Buffer>> {
|
|
58
|
+
let p = build_abs_path(&self.root, path);
|
|
59
|
+
|
|
60
|
+
let mut url = format!(
|
|
61
|
+
"{}/webhdfs/v1/{}?op=MKDIRS&overwrite=true&noredirect=true",
|
|
62
|
+
self.endpoint,
|
|
63
|
+
percent_encode_path(&p),
|
|
64
|
+
);
|
|
65
|
+
if let Some(user) = &self.user_name {
|
|
66
|
+
url += format!("&user.name={user}").as_str();
|
|
67
|
+
}
|
|
68
|
+
if let Some(auth) = &self.auth {
|
|
69
|
+
url += format!("&{auth}").as_str();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let req = Request::put(&url);
|
|
73
|
+
|
|
74
|
+
let req = req
|
|
75
|
+
.extension(Operation::CreateDir)
|
|
76
|
+
.body(Buffer::new())
|
|
77
|
+
.map_err(new_request_build_error)?;
|
|
78
|
+
|
|
79
|
+
self.info.http_client().send(req).await
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// create object
|
|
83
|
+
pub async fn webhdfs_create_object(
|
|
84
|
+
&self,
|
|
85
|
+
path: &str,
|
|
86
|
+
size: Option<u64>,
|
|
87
|
+
args: &OpWrite,
|
|
88
|
+
body: Buffer,
|
|
89
|
+
) -> Result<Response<Buffer>> {
|
|
90
|
+
let p = build_abs_path(&self.root, path);
|
|
91
|
+
|
|
92
|
+
let mut url = format!(
|
|
93
|
+
"{}/webhdfs/v1/{}?op=CREATE&overwrite=true&noredirect=true",
|
|
94
|
+
self.endpoint,
|
|
95
|
+
percent_encode_path(&p),
|
|
96
|
+
);
|
|
97
|
+
if let Some(user) = &self.user_name {
|
|
98
|
+
url += format!("&user.name={user}").as_str();
|
|
99
|
+
}
|
|
100
|
+
if let Some(auth) = &self.auth {
|
|
101
|
+
url += format!("&{auth}").as_str();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let req = Request::put(&url);
|
|
105
|
+
|
|
106
|
+
let req = req
|
|
107
|
+
.extension(Operation::Write)
|
|
108
|
+
.body(Buffer::new())
|
|
109
|
+
.map_err(new_request_build_error)?;
|
|
110
|
+
|
|
111
|
+
let resp = self.info.http_client().send(req).await?;
|
|
112
|
+
|
|
113
|
+
let status = resp.status();
|
|
114
|
+
|
|
115
|
+
if status != StatusCode::CREATED && status != StatusCode::OK {
|
|
116
|
+
return Err(parse_error(resp));
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let bs = resp.into_body();
|
|
120
|
+
|
|
121
|
+
let resp: LocationResponse =
|
|
122
|
+
serde_json::from_reader(bs.reader()).map_err(new_json_deserialize_error)?;
|
|
123
|
+
|
|
124
|
+
let mut req = Request::put(&resp.location);
|
|
125
|
+
|
|
126
|
+
if let Some(size) = size {
|
|
127
|
+
req = req.header(CONTENT_LENGTH, size);
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
if let Some(content_type) = args.content_type() {
|
|
131
|
+
req = req.header(CONTENT_TYPE, content_type);
|
|
132
|
+
};
|
|
133
|
+
let req = req
|
|
134
|
+
.extension(Operation::Write)
|
|
135
|
+
.body(body)
|
|
136
|
+
.map_err(new_request_build_error)?;
|
|
137
|
+
|
|
138
|
+
self.info.http_client().send(req).await
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
pub async fn webhdfs_rename_object(&self, from: &str, to: &str) -> Result<Response<Buffer>> {
|
|
142
|
+
let from = build_abs_path(&self.root, from);
|
|
143
|
+
let to = build_rooted_abs_path(&self.root, to);
|
|
144
|
+
|
|
145
|
+
let mut url = format!(
|
|
146
|
+
"{}/webhdfs/v1/{}?op=RENAME&destination={}",
|
|
147
|
+
self.endpoint,
|
|
148
|
+
percent_encode_path(&from),
|
|
149
|
+
percent_encode_path(&to)
|
|
150
|
+
);
|
|
151
|
+
if let Some(user) = &self.user_name {
|
|
152
|
+
url += format!("&user.name={user}").as_str();
|
|
153
|
+
}
|
|
154
|
+
if let Some(auth) = &self.auth {
|
|
155
|
+
url += &format!("&{auth}");
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
let req = Request::put(&url)
|
|
159
|
+
.body(Buffer::new())
|
|
160
|
+
.map_err(new_request_build_error)?;
|
|
161
|
+
|
|
162
|
+
self.info.http_client().send(req).await
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
async fn webhdfs_init_append(&self, path: &str) -> Result<String> {
|
|
166
|
+
let p = build_abs_path(&self.root, path);
|
|
167
|
+
let mut url = format!(
|
|
168
|
+
"{}/webhdfs/v1/{}?op=APPEND&noredirect=true",
|
|
169
|
+
self.endpoint,
|
|
170
|
+
percent_encode_path(&p),
|
|
171
|
+
);
|
|
172
|
+
if let Some(user) = &self.user_name {
|
|
173
|
+
url += format!("&user.name={user}").as_str();
|
|
174
|
+
}
|
|
175
|
+
if let Some(auth) = &self.auth {
|
|
176
|
+
url += &format!("&{auth}");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
let req = Request::post(url)
|
|
180
|
+
.extension(Operation::Write)
|
|
181
|
+
.body(Buffer::new())
|
|
182
|
+
.map_err(new_request_build_error)?;
|
|
183
|
+
|
|
184
|
+
let resp = self.info.http_client().send(req).await?;
|
|
185
|
+
|
|
186
|
+
let status = resp.status();
|
|
187
|
+
|
|
188
|
+
match status {
|
|
189
|
+
StatusCode::OK => {
|
|
190
|
+
let bs = resp.into_body();
|
|
191
|
+
let resp: LocationResponse =
|
|
192
|
+
serde_json::from_reader(bs.reader()).map_err(new_json_deserialize_error)?;
|
|
193
|
+
|
|
194
|
+
Ok(resp.location)
|
|
195
|
+
}
|
|
196
|
+
_ => Err(parse_error(resp)),
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
pub async fn webhdfs_append(
|
|
201
|
+
&self,
|
|
202
|
+
path: &str,
|
|
203
|
+
size: u64,
|
|
204
|
+
body: Buffer,
|
|
205
|
+
) -> Result<Response<Buffer>> {
|
|
206
|
+
let mut url = self.webhdfs_init_append(path).await?;
|
|
207
|
+
if let Some(user) = &self.user_name {
|
|
208
|
+
url += format!("&user.name={user}").as_str();
|
|
209
|
+
}
|
|
210
|
+
if let Some(auth) = &self.auth {
|
|
211
|
+
url += &format!("&{auth}");
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
let mut req = Request::post(&url);
|
|
215
|
+
|
|
216
|
+
req = req.header(CONTENT_LENGTH, size.to_string());
|
|
217
|
+
|
|
218
|
+
let req = req
|
|
219
|
+
.extension(Operation::Write)
|
|
220
|
+
.body(body)
|
|
221
|
+
.map_err(new_request_build_error)?;
|
|
222
|
+
|
|
223
|
+
self.info.http_client().send(req).await
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/// CONCAT will concat sources to the path
|
|
227
|
+
pub async fn webhdfs_concat(
|
|
228
|
+
&self,
|
|
229
|
+
path: &str,
|
|
230
|
+
sources: Vec<String>,
|
|
231
|
+
) -> Result<Response<Buffer>> {
|
|
232
|
+
let p = build_abs_path(&self.root, path);
|
|
233
|
+
|
|
234
|
+
let sources = sources
|
|
235
|
+
.iter()
|
|
236
|
+
.map(|p| build_rooted_abs_path(&self.root, p))
|
|
237
|
+
.collect::<Vec<String>>()
|
|
238
|
+
.join(",");
|
|
239
|
+
|
|
240
|
+
let mut url = format!(
|
|
241
|
+
"{}/webhdfs/v1/{}?op=CONCAT&sources={}",
|
|
242
|
+
self.endpoint,
|
|
243
|
+
percent_encode_path(&p),
|
|
244
|
+
percent_encode_path(&sources),
|
|
245
|
+
);
|
|
246
|
+
if let Some(user) = &self.user_name {
|
|
247
|
+
url += format!("&user.name={user}").as_str();
|
|
248
|
+
}
|
|
249
|
+
if let Some(auth) = &self.auth {
|
|
250
|
+
url += &format!("&{auth}");
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
let req = Request::post(url);
|
|
254
|
+
|
|
255
|
+
let req = req
|
|
256
|
+
.extension(Operation::Write)
|
|
257
|
+
.body(Buffer::new())
|
|
258
|
+
.map_err(new_request_build_error)?;
|
|
259
|
+
|
|
260
|
+
self.info.http_client().send(req).await
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
pub async fn webhdfs_list_status(&self, path: &str) -> Result<Response<Buffer>> {
|
|
264
|
+
let p = build_abs_path(&self.root, path);
|
|
265
|
+
let mut url = format!(
|
|
266
|
+
"{}/webhdfs/v1/{}?op=LISTSTATUS",
|
|
267
|
+
self.endpoint,
|
|
268
|
+
percent_encode_path(&p),
|
|
269
|
+
);
|
|
270
|
+
if let Some(user) = &self.user_name {
|
|
271
|
+
url += format!("&user.name={user}").as_str();
|
|
272
|
+
}
|
|
273
|
+
if let Some(auth) = &self.auth {
|
|
274
|
+
url += format!("&{auth}").as_str();
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
let req = Request::get(&url)
|
|
278
|
+
.body(Buffer::new())
|
|
279
|
+
.map_err(new_request_build_error)?;
|
|
280
|
+
self.info.http_client().send(req).await
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
pub async fn webhdfs_list_status_batch(
|
|
284
|
+
&self,
|
|
285
|
+
path: &str,
|
|
286
|
+
start_after: &str,
|
|
287
|
+
) -> Result<Response<Buffer>> {
|
|
288
|
+
let p = build_abs_path(&self.root, path);
|
|
289
|
+
|
|
290
|
+
let mut url = format!(
|
|
291
|
+
"{}/webhdfs/v1/{}?op=LISTSTATUS_BATCH",
|
|
292
|
+
self.endpoint,
|
|
293
|
+
percent_encode_path(&p),
|
|
294
|
+
);
|
|
295
|
+
if !start_after.is_empty() {
|
|
296
|
+
url += format!("&startAfter={start_after}").as_str();
|
|
297
|
+
}
|
|
298
|
+
if let Some(user) = &self.user_name {
|
|
299
|
+
url += format!("&user.name={user}").as_str();
|
|
300
|
+
}
|
|
301
|
+
if let Some(auth) = &self.auth {
|
|
302
|
+
url += format!("&{auth}").as_str();
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
let req = Request::get(&url)
|
|
306
|
+
.body(Buffer::new())
|
|
307
|
+
.map_err(new_request_build_error)?;
|
|
308
|
+
self.info.http_client().send(req).await
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
fn webhdfs_open_request(&self, path: &str, range: &BytesRange) -> Result<Request<Buffer>> {
|
|
312
|
+
let p = build_abs_path(&self.root, path);
|
|
313
|
+
let mut url = format!(
|
|
314
|
+
"{}/webhdfs/v1/{}?op=OPEN",
|
|
315
|
+
self.endpoint,
|
|
316
|
+
percent_encode_path(&p),
|
|
317
|
+
);
|
|
318
|
+
if let Some(user) = &self.user_name {
|
|
319
|
+
url += format!("&user.name={user}").as_str();
|
|
320
|
+
}
|
|
321
|
+
if let Some(auth) = &self.auth {
|
|
322
|
+
url += &format!("&{auth}");
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if !range.is_full() {
|
|
326
|
+
url += &format!("&offset={}", range.offset());
|
|
327
|
+
if let Some(size) = range.size() {
|
|
328
|
+
url += &format!("&length={size}")
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
let req = Request::get(&url)
|
|
333
|
+
.extension(Operation::Read)
|
|
334
|
+
.body(Buffer::new())
|
|
335
|
+
.map_err(new_request_build_error)?;
|
|
336
|
+
|
|
337
|
+
Ok(req)
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
pub async fn webhdfs_read_file(
|
|
341
|
+
&self,
|
|
342
|
+
path: &str,
|
|
343
|
+
range: BytesRange,
|
|
344
|
+
) -> Result<Response<HttpBody>> {
|
|
345
|
+
let req = self.webhdfs_open_request(path, &range)?;
|
|
346
|
+
self.info.http_client().fetch(req).await
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
pub(super) async fn webhdfs_get_file_status(&self, path: &str) -> Result<Response<Buffer>> {
|
|
350
|
+
let p = build_abs_path(&self.root, path);
|
|
351
|
+
let mut url = format!(
|
|
352
|
+
"{}/webhdfs/v1/{}?op=GETFILESTATUS",
|
|
353
|
+
self.endpoint,
|
|
354
|
+
percent_encode_path(&p),
|
|
355
|
+
);
|
|
356
|
+
if let Some(user) = &self.user_name {
|
|
357
|
+
url += format!("&user.name={user}").as_str();
|
|
358
|
+
}
|
|
359
|
+
if let Some(auth) = &self.auth {
|
|
360
|
+
url += format!("&{auth}").as_str();
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
let req = Request::get(&url)
|
|
364
|
+
.extension(Operation::Stat)
|
|
365
|
+
.body(Buffer::new())
|
|
366
|
+
.map_err(new_request_build_error)?;
|
|
367
|
+
|
|
368
|
+
self.info.http_client().send(req).await
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
pub async fn webhdfs_delete(&self, path: &str) -> Result<Response<Buffer>> {
|
|
372
|
+
let p = build_abs_path(&self.root, path);
|
|
373
|
+
let mut url = format!(
|
|
374
|
+
"{}/webhdfs/v1/{}?op=DELETE&recursive=false",
|
|
375
|
+
self.endpoint,
|
|
376
|
+
percent_encode_path(&p),
|
|
377
|
+
);
|
|
378
|
+
if let Some(user) = &self.user_name {
|
|
379
|
+
url += format!("&user.name={user}").as_str();
|
|
380
|
+
}
|
|
381
|
+
if let Some(auth) = &self.auth {
|
|
382
|
+
url += format!("&{auth}").as_str();
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
let req = Request::delete(&url)
|
|
386
|
+
.extension(Operation::Delete)
|
|
387
|
+
.body(Buffer::new())
|
|
388
|
+
.map_err(new_request_build_error)?;
|
|
389
|
+
|
|
390
|
+
self.info.http_client().send(req).await
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
#[derive(Debug, Deserialize)]
|
|
395
|
+
#[serde(rename_all = "PascalCase")]
|
|
396
|
+
pub(super) struct LocationResponse {
|
|
397
|
+
pub location: String,
|
|
398
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use http::StatusCode;
|
|
21
|
+
|
|
22
|
+
use super::core::WebhdfsCore;
|
|
23
|
+
use super::error::parse_error;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
pub struct WebhdfsDeleter {
|
|
28
|
+
core: Arc<WebhdfsCore>,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
impl WebhdfsDeleter {
|
|
32
|
+
pub fn new(core: Arc<WebhdfsCore>) -> Self {
|
|
33
|
+
Self { core }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
impl oio::OneShotDelete for WebhdfsDeleter {
|
|
38
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
39
|
+
let resp = self.core.webhdfs_delete(&path).await?;
|
|
40
|
+
|
|
41
|
+
match resp.status() {
|
|
42
|
+
StatusCode::OK => Ok(()),
|
|
43
|
+
_ => Err(parse_error(resp)),
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
There two implementations of WebHDFS REST API:
|
|
2
|
+
|
|
3
|
+
- Native via HDFS Namenode and Datanode, data are transferred between nodes directly.
|
|
4
|
+
- [HttpFS](https://hadoop.apache.org/docs/stable/hadoop-hdfs-httpfs/index.html) is a gateway before hdfs nodes, data are proxied.
|
|
5
|
+
|
|
6
|
+
## Capabilities
|
|
7
|
+
|
|
8
|
+
This service can be used to:
|
|
9
|
+
|
|
10
|
+
- [x] stat
|
|
11
|
+
- [x] read
|
|
12
|
+
- [x] write
|
|
13
|
+
- [x] create_dir
|
|
14
|
+
- [x] delete
|
|
15
|
+
- [ ] copy
|
|
16
|
+
- [ ] rename
|
|
17
|
+
- [x] list
|
|
18
|
+
- [ ] ~~presign~~
|
|
19
|
+
- [ ] blocking
|
|
20
|
+
|
|
21
|
+
## Differences with HDFS
|
|
22
|
+
|
|
23
|
+
[Hdfs][crate::services::Hdfs] is powered by HDFS's native java client. Users need to set up the HDFS services correctly. But webhdfs can access from HTTP API and no extra setup needed.
|
|
24
|
+
|
|
25
|
+
## WebHDFS Compatibility Guidelines
|
|
26
|
+
|
|
27
|
+
### File Creation and Write
|
|
28
|
+
|
|
29
|
+
For [File creation and write](https://hadoop.apache.org/docs/r3.1.3/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Create_and_Write_to_a_File) operations,
|
|
30
|
+
OpenDAL WebHDFS is optimized for Hadoop Distributed File System (HDFS) versions 2.9 and later.
|
|
31
|
+
This involves two API calls in webhdfs, where the initial `put` call to the namenode is redirected to the datanode handling the file data.
|
|
32
|
+
The optional `noredirect` flag can be set to prevent redirection. If used, the API response body contains the datanode URL, which is then utilized for the subsequent `put` call with the actual file data.
|
|
33
|
+
OpenDAL automatically sets the `noredirect` flag with the first `put` call. This feature is supported starting from HDFS version 2.9.
|
|
34
|
+
|
|
35
|
+
### Multi-Write Support
|
|
36
|
+
|
|
37
|
+
OpenDAL WebHDFS supports multi-write operations by creating temporary files in the specified `atomic_write_dir`.
|
|
38
|
+
The final concatenation of these temporary files occurs when the writer is closed.
|
|
39
|
+
However, it's essential to be aware of HDFS concat restrictions for earlier versions,
|
|
40
|
+
where the target file must not be empty, and its last block must be full. Due to these constraints, the concat operation might fail for HDFS 2.6.
|
|
41
|
+
This issue, identified as [HDFS-6641](https://issues.apache.org/jira/browse/HDFS-6641), has been addressed in later versions of HDFS.
|
|
42
|
+
|
|
43
|
+
In summary, OpenDAL WebHDFS is designed for optimal compatibility with HDFS, specifically versions 2.9 and later.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
## Configurations
|
|
48
|
+
|
|
49
|
+
- `root`: The root path of the WebHDFS service.
|
|
50
|
+
- `endpoint`: The endpoint of the WebHDFS service.
|
|
51
|
+
- `delegation`: The delegation token for WebHDFS.
|
|
52
|
+
- `atomic_write_dir`: The tmp write dir of multi write for WebHDFS.Needs to be configured for multi write support.
|
|
53
|
+
|
|
54
|
+
Refer to [`Builder`]'s public API docs for more information.
|
|
55
|
+
|
|
56
|
+
## Examples
|
|
57
|
+
|
|
58
|
+
### Via Builder
|
|
59
|
+
|
|
60
|
+
```rust,no_run
|
|
61
|
+
use std::sync::Arc;
|
|
62
|
+
|
|
63
|
+
use anyhow::Result;
|
|
64
|
+
use opendal::services::Webhdfs;
|
|
65
|
+
use opendal::Operator;
|
|
66
|
+
|
|
67
|
+
#[tokio::main]
|
|
68
|
+
async fn main() -> Result<()> {
|
|
69
|
+
let mut builder = Webhdfs::default()
|
|
70
|
+
// set the root for WebHDFS, all operations will happen under this root
|
|
71
|
+
//
|
|
72
|
+
// Note:
|
|
73
|
+
// if the root exists, the builder will automatically create the
|
|
74
|
+
// root directory for you
|
|
75
|
+
// if the root exists and is a directory, the builder will continue working
|
|
76
|
+
// if the root exists and is a file, the builder will fail on building backend
|
|
77
|
+
.root("/path/to/dir")
|
|
78
|
+
// set the endpoint of webhdfs namenode, controlled by dfs.namenode.http-address
|
|
79
|
+
// default is http://127.0.0.1:9870
|
|
80
|
+
.endpoint("http://127.0.0.1:9870")
|
|
81
|
+
// set the delegation_token for builder
|
|
82
|
+
.delegation("delegation_token")
|
|
83
|
+
// set atomic_write_dir for builder
|
|
84
|
+
.atomic_write_dir(".opendal_tmp/");
|
|
85
|
+
|
|
86
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
87
|
+
|
|
88
|
+
Ok(())
|
|
89
|
+
}
|
|
90
|
+
```
|
|
@@ -0,0 +1,126 @@
|
|
|
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 http::response::Parts;
|
|
19
|
+
use http::Response;
|
|
20
|
+
use http::StatusCode;
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
|
|
23
|
+
use crate::raw::*;
|
|
24
|
+
use crate::*;
|
|
25
|
+
|
|
26
|
+
#[derive(Debug, Deserialize)]
|
|
27
|
+
#[serde(rename_all = "PascalCase")]
|
|
28
|
+
struct WebHdfsErrorWrapper {
|
|
29
|
+
pub remote_exception: WebHdfsError,
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// WebHdfsError is the error message returned by WebHdfs service
|
|
33
|
+
#[derive(Debug, Deserialize)]
|
|
34
|
+
#[serde(rename_all = "camelCase")]
|
|
35
|
+
#[allow(dead_code)]
|
|
36
|
+
struct WebHdfsError {
|
|
37
|
+
exception: String,
|
|
38
|
+
message: String,
|
|
39
|
+
java_class_name: String,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
|
|
43
|
+
let (parts, body) = resp.into_parts();
|
|
44
|
+
let bs = body.to_bytes();
|
|
45
|
+
let s = String::from_utf8_lossy(&bs);
|
|
46
|
+
parse_error_msg(parts, &s)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
pub(super) fn parse_error_msg(parts: Parts, body: &str) -> Error {
|
|
50
|
+
let (kind, retryable) = match parts.status {
|
|
51
|
+
StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
|
|
52
|
+
StatusCode::UNAUTHORIZED | StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
|
|
53
|
+
// passing invalid arguments will return BAD_REQUEST
|
|
54
|
+
// should be un-retryable
|
|
55
|
+
StatusCode::BAD_REQUEST => (ErrorKind::Unexpected, false),
|
|
56
|
+
StatusCode::INTERNAL_SERVER_ERROR
|
|
57
|
+
| StatusCode::BAD_GATEWAY
|
|
58
|
+
| StatusCode::SERVICE_UNAVAILABLE
|
|
59
|
+
| StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
|
|
60
|
+
_ => (ErrorKind::Unexpected, false),
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
let message = match serde_json::from_str::<WebHdfsErrorWrapper>(body) {
|
|
64
|
+
Ok(wh_error) => format!("{:?}", wh_error.remote_exception),
|
|
65
|
+
Err(_) => body.to_owned(),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
let mut err = Error::new(kind, message);
|
|
69
|
+
|
|
70
|
+
err = with_error_response_context(err, parts);
|
|
71
|
+
|
|
72
|
+
if retryable {
|
|
73
|
+
err = err.set_temporary();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
err
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#[cfg(test)]
|
|
80
|
+
mod tests {
|
|
81
|
+
use bytes::Buf;
|
|
82
|
+
use serde_json::from_reader;
|
|
83
|
+
|
|
84
|
+
use super::*;
|
|
85
|
+
|
|
86
|
+
/// Error response example from https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html#Error%20Responses
|
|
87
|
+
#[tokio::test]
|
|
88
|
+
async fn test_parse_error() -> Result<()> {
|
|
89
|
+
let ill_args = bytes::Bytes::from(
|
|
90
|
+
r#"
|
|
91
|
+
{
|
|
92
|
+
"RemoteException":
|
|
93
|
+
{
|
|
94
|
+
"exception" : "IllegalArgumentException",
|
|
95
|
+
"javaClassName": "java.lang.IllegalArgumentException",
|
|
96
|
+
"message" : "Invalid value for webhdfs parameter \"permission\": ..."
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
"#,
|
|
100
|
+
);
|
|
101
|
+
let body = Buffer::from(ill_args.clone());
|
|
102
|
+
let resp = Response::builder()
|
|
103
|
+
.status(StatusCode::BAD_REQUEST)
|
|
104
|
+
.body(body)
|
|
105
|
+
.unwrap();
|
|
106
|
+
|
|
107
|
+
let err = parse_error(resp);
|
|
108
|
+
assert_eq!(err.kind(), ErrorKind::Unexpected);
|
|
109
|
+
assert!(!err.is_temporary());
|
|
110
|
+
|
|
111
|
+
let err_msg: WebHdfsError = from_reader::<_, WebHdfsErrorWrapper>(ill_args.reader())
|
|
112
|
+
.expect("must success")
|
|
113
|
+
.remote_exception;
|
|
114
|
+
assert_eq!(err_msg.exception, "IllegalArgumentException");
|
|
115
|
+
assert_eq!(
|
|
116
|
+
err_msg.java_class_name,
|
|
117
|
+
"java.lang.IllegalArgumentException"
|
|
118
|
+
);
|
|
119
|
+
assert_eq!(
|
|
120
|
+
err_msg.message,
|
|
121
|
+
"Invalid value for webhdfs parameter \"permission\": ..."
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
Ok(())
|
|
125
|
+
}
|
|
126
|
+
}
|