Skip to content
This repository was archived by the owner on Apr 8, 2025. It is now read-only.

Commit fcd2456

Browse files
katmsftvinjiang
authored andcommitted
Updated service version to 2019-07-07 and supported previous snapshot URL
1 parent 0a0c96b commit fcd2456

File tree

6 files changed

+272
-25
lines changed

6 files changed

+272
-25
lines changed

Microsoft.WindowsAzure.Storage/includes/was/blob.h

Lines changed: 173 additions & 18 deletions
Large diffs are not rendered by default.

Microsoft.WindowsAzure.Storage/includes/wascore/constants.dat

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,10 @@ DAT(ms_header_file_last_write_time, _XPLATSTR("x-ms-file-last-write-time"))
209209
DAT(ms_header_file_change_time, _XPLATSTR("x-ms-file-change-time"))
210210
DAT(ms_header_file_id, _XPLATSTR("x-ms-file-id"))
211211
DAT(ms_header_file_parent_id, _XPLATSTR("x-ms-file-parent-id"))
212+
DAT(ms_header_previous_snapshot_url, _XPLATSTR("x-ms-previous-snapshot-url"))
212213

213214
// header values
214-
DAT(header_value_storage_version, _XPLATSTR("2019-02-02"))
215+
DAT(header_value_storage_version, _XPLATSTR("2019-07-07"))
215216
DAT(header_value_true, _XPLATSTR("true"))
216217
DAT(header_value_false, _XPLATSTR("false"))
217218
DAT(header_value_locked, _XPLATSTR("locked"))

Microsoft.WindowsAzure.Storage/includes/wascore/protocol.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ namespace azure { namespace storage { namespace protocol {
5252
web::http::http_request put_block_list(const cloud_blob_properties& properties, const cloud_metadata& metadata, const checksum& content_checksum, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
5353
web::http::http_request get_block_list(block_listing_filter listing_filter, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
5454
web::http::http_request get_page_ranges(utility::size64_t offset, utility::size64_t length, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
55-
web::http::http_request get_page_ranges_diff(utility::string_t previous_snapshort_time, utility::size64_t offset, utility::size64_t length, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
55+
web::http::http_request get_page_ranges_diff(const utility::string_t& previous_snapshot_time, const utility::string_t& previous_snapshot_url, utility::size64_t offset, utility::size64_t length, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
5656
web::http::http_request put_page(page_range range, page_write write, const checksum& content_checksum, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
5757
web::http::http_request append_block(const checksum& content_checksum, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);
5858
web::http::http_request put_block_blob(const checksum& content_checksum, const cloud_blob_properties& properties, const cloud_metadata& metadata, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context);

Microsoft.WindowsAzure.Storage/src/blob_request_factory.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,12 +330,19 @@ namespace azure { namespace storage { namespace protocol {
330330
return request;
331331
}
332332

333-
web::http::http_request get_page_ranges_diff(utility::string_t previous_snapshot_time, utility::size64_t offset, utility::size64_t length, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context)
333+
web::http::http_request get_page_ranges_diff(const utility::string_t& previous_snapshot_time, const utility::string_t& previous_snapshot_url, utility::size64_t offset, utility::size64_t length, const utility::string_t& snapshot_time, const access_condition& condition, web::http::uri_builder& uri_builder, const std::chrono::seconds& timeout, operation_context context)
334334
{
335335
add_snapshot_time(uri_builder, snapshot_time);
336-
add_previous_snapshot_time(uri_builder, previous_snapshot_time);
336+
if (!previous_snapshot_time.empty())
337+
{
338+
add_previous_snapshot_time(uri_builder, previous_snapshot_time);
339+
}
337340
uri_builder.append_query(core::make_query_parameter(uri_query_component, component_page_list, /* do_encoding */ false));
338341
web::http::http_request request(base_request(web::http::methods::GET, uri_builder, timeout, context));
342+
if (!previous_snapshot_url.empty())
343+
{
344+
request.headers().add(ms_header_previous_snapshot_url, previous_snapshot_url);
345+
}
339346
add_range(request, offset, length);
340347
add_access_condition(request, condition);
341348
return request;

Microsoft.WindowsAzure.Storage/src/cloud_page_blob.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,15 +276,15 @@ namespace azure { namespace storage {
276276
return core::executor<std::vector<page_range>>::execute_async(command, modified_options, context);
277277
}
278278

279-
pplx::task<std::vector<page_diff_range>> cloud_page_blob::download_page_ranges_diff_async(utility::string_t previous_snapshot_time, utility::size64_t offset, utility::size64_t length, const access_condition& condition, const blob_request_options& options, operation_context context, const pplx::cancellation_token& cancellation_token) const
279+
pplx::task<std::vector<page_diff_range>> cloud_page_blob::download_page_ranges_diff_async_impl(const utility::string_t& previous_snapshot_time, const utility::string_t& previous_snapshot_url, utility::size64_t offset, utility::size64_t length, const access_condition& condition, const blob_request_options& options, operation_context context, const pplx::cancellation_token& cancellation_token) const
280280
{
281281
blob_request_options modified_options(options);
282282
modified_options.apply_defaults(service_client().default_request_options(), type());
283283

284284
auto properties = m_properties;
285285

286286
auto command = std::make_shared<core::storage_command<std::vector<page_diff_range>>>(uri(), cancellation_token, modified_options.is_maximum_execution_time_customized());
287-
command->set_build_request(std::bind(protocol::get_page_ranges_diff, previous_snapshot_time, offset, length, snapshot_time(), condition, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
287+
command->set_build_request(std::bind(protocol::get_page_ranges_diff, previous_snapshot_time, previous_snapshot_url, offset, length, snapshot_time(), condition, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
288288
command->set_authentication_handler(service_client().authentication_handler());
289289
command->set_location_mode(core::command_location_mode::primary_or_secondary);
290290
command->set_preprocess_response([properties](const web::http::http_response& response, const request_result& result, operation_context context) -> std::vector<page_diff_range>

Microsoft.WindowsAzure.Storage/tests/cloud_page_blob_test.cpp

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ SUITE(Blob)
607607
m_context.set_response_received(std::function<void(web::http::http_request &, const web::http::http_response&, azure::storage::operation_context)>());
608608
}
609609

610-
TEST_FIXTURE(page_blob_test_base, page_blob_prevsnapshot)
610+
TEST_FIXTURE(page_blob_test_base, page_blob_prevsnapshot_time)
611611
{
612612
m_blob.create(2048, 0, azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
613613

@@ -686,6 +686,90 @@ SUITE(Blob)
686686
}
687687
}
688688

689+
//TEST_FIXTURE(page_blob_test_base, page_blob_prevsnapshot_url)
690+
//{
691+
// auto get_snapshot_url = [](azure::storage::cloud_page_blob& snapshot)
692+
// {
693+
// return snapshot.uri().primary_uri().to_string() + _XPLATSTR("?snapshot=") + snapshot.snapshot_time();
694+
// };
695+
696+
// m_blob.create(2048, 0, azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
697+
698+
// azure::storage::cloud_page_blob snapshot1 = m_blob.create_snapshot(azure::storage::cloud_metadata(), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
699+
// auto diff = m_blob.download_page_ranges_diff_md(get_snapshot_url(snapshot1), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
700+
// CHECK(0 == diff.size());
701+
702+
// {
703+
// utility::string_t content(2048, _XPLATSTR('A'));
704+
// auto utf8_body = utility::conversions::to_utf8string(content);
705+
// auto stream = concurrency::streams::bytestream::open_istream(std::move(utf8_body));
706+
// m_blob.upload_pages(stream, 0, _XPLATSTR(""));
707+
// diff = m_blob.download_page_ranges_diff_md(get_snapshot_url(snapshot1), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
708+
// CHECK(1 == diff.size());
709+
// CHECK_EQUAL(false, diff[0].is_cleared_rage());
710+
// CHECK(0 == diff[0].start_offset());
711+
// CHECK(2047 == diff[0].end_offset());
712+
// }
713+
714+
// azure::storage::cloud_page_blob snapshot2 = m_blob.create_snapshot(azure::storage::cloud_metadata(), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
715+
// auto diff2 = snapshot2.download_page_ranges_diff_md(get_snapshot_url(snapshot1), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
716+
// CHECK_EQUAL(false, diff[0].is_cleared_rage());
717+
// CHECK(0 == diff[0].start_offset());
718+
// CHECK(2047 == diff[0].end_offset());
719+
720+
// {
721+
// utility::string_t content(512, _XPLATSTR('B'));
722+
// auto utf8_body = utility::conversions::to_utf8string(content);
723+
// auto stream = concurrency::streams::bytestream::open_istream(std::move(utf8_body));
724+
// m_blob.upload_pages(stream, 0, _XPLATSTR(""));
725+
// m_blob.clear_pages(512, 512);
726+
// diff = m_blob.download_page_ranges_diff_md(get_snapshot_url(snapshot2), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
727+
// CHECK(2 == diff.size());
728+
// if (diff[0].is_cleared_rage() == true)
729+
// {
730+
// auto temp = diff[0];
731+
// diff[0] = diff[1];
732+
// diff[1] = temp;
733+
// }
734+
// CHECK_EQUAL(false, diff[0].is_cleared_rage());
735+
// CHECK(0 == diff[0].start_offset());
736+
// CHECK(511 == diff[0].end_offset());
737+
738+
// CHECK_EQUAL(true, diff[1].is_cleared_rage());
739+
// CHECK(512 == diff[1].start_offset());
740+
// CHECK(1023 == diff[1].end_offset());
741+
// }
742+
743+
// azure::storage::cloud_page_blob snapshot3 = m_blob.create_snapshot(azure::storage::cloud_metadata(), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
744+
// auto diff3 = snapshot3.download_page_ranges_diff_md(get_snapshot_url(snapshot2), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
745+
// CHECK(2 == diff.size());
746+
// if (diff[0].is_cleared_rage() == true)
747+
// {
748+
// auto temp = diff[0];
749+
// diff[0] = diff[1];
750+
// diff[1] = temp;
751+
// }
752+
// CHECK_EQUAL(false, diff[0].is_cleared_rage());
753+
// CHECK(0 == diff[0].start_offset());
754+
// CHECK(511 == diff[0].end_offset());
755+
756+
// CHECK_EQUAL(true, diff[1].is_cleared_rage());
757+
// CHECK(512 == diff[1].start_offset());
758+
// CHECK(1023 == diff[1].end_offset());
759+
760+
// {
761+
// utility::string_t content(2048, _XPLATSTR('A'));
762+
// auto utf8_body = utility::conversions::to_utf8string(content);
763+
// auto stream = concurrency::streams::bytestream::open_istream(std::move(utf8_body));
764+
// m_blob.upload_pages(stream, 0, _XPLATSTR(""));
765+
// diff = m_blob.download_page_ranges_diff_md(get_snapshot_url(snapshot1), azure::storage::access_condition(), azure::storage::blob_request_options(), m_context);
766+
// CHECK(1 == diff.size());
767+
// CHECK_EQUAL(false, diff[0].is_cleared_rage());
768+
// CHECK(0 == diff[0].start_offset());
769+
// CHECK(2047 == diff[0].end_offset());
770+
// }
771+
//}
772+
689773
TEST_FIXTURE(page_blob_test_base, page_blob_incremental_copy)
690774
{
691775
// get sas token for test

0 commit comments

Comments
 (0)