use std::chrono::seconds or enum for lease duration (#1432)

* use std::chrono::seconds for duration

* changelog

* add enum for lease duration in response

* changelog

* fix build error

* fix build error

* fix build error
This commit is contained in:
JinmingHu 2021-01-22 16:28:14 +08:00 committed by GitHub
parent cc1aeb4d3f
commit c4d89ac5c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 72 additions and 38 deletions

View File

@ -12,6 +12,7 @@
- `AccessType` in `CreateBlobContainerOptions` was changed to non-nullable.
- `ListType` in `GetBlockListOptions` was changed to non-nullable.
- Added `BlobLeaseClient`, all lease related APIs are moved to `BlobLeaseClient`.
- Type for lease duration in requests was changed to `std::chrono::seconds`, in response was changed to enum.
## 12.0.0-beta.6 (2020-01-14)

View File

@ -3,6 +3,8 @@
#pragma once
#include <chrono>
#include "azure/storage/blobs/blob_client.hpp"
#include "azure/storage/blobs/blob_container_client.hpp"
@ -46,7 +48,7 @@ namespace Azure { namespace Storage { namespace Blobs {
/**
* @brief A value representing infinite lease duration.
*/
constexpr static int32_t InfiniteLeaseDuration = -1;
AZ_STORAGE_BLOBS_DLLEXPORT const static std::chrono::seconds InfiniteLeaseDuration;
/**
* @brief Get lease id of this lease client.
@ -67,7 +69,7 @@ namespace Azure { namespace Storage { namespace Blobs {
* @return A AcquireBlobLeaseResult describing the lease.
*/
Azure::Core::Response<Models::AcquireBlobLeaseResult> Acquire(
int32_t duration,
std::chrono::seconds duration,
const AcquireBlobLeaseOptions& options = AcquireBlobLeaseOptions());
/**

View File

@ -3,6 +3,7 @@
#pragma once
#include <chrono>
#include <cstdint>
#include <memory>
#include <string>
@ -774,7 +775,7 @@ namespace Azure { namespace Storage { namespace Blobs {
* available before the break period has expired, but the lease may be held for longer than the
* break period.
*/
Azure::Core::Nullable<int32_t> BreakPeriod;
Azure::Core::Nullable<std::chrono::seconds> BreakPeriod;
/**
* @brief Optional conditions that must be met to perform this operation.

View File

@ -3,8 +3,6 @@
#pragma once
#include "azure/storage/blobs/dll_import_export.hpp"
#include <cstring>
#include <limits>
#include <map>
@ -26,6 +24,8 @@
#include <azure/storage/common/storage_exception.hpp>
#include <azure/storage/common/xml_wrapper.hpp>
#include "azure/storage/blobs/dll_import_export.hpp"
namespace Azure { namespace Storage { namespace Blobs {
namespace Details {
@ -152,6 +152,20 @@ namespace Azure { namespace Storage { namespace Blobs {
std::string m_value;
}; // extensible enum BlobGeoReplicationStatus
class BlobLeaseDurationType {
public:
BlobLeaseDurationType() = default;
explicit BlobLeaseDurationType(std::string value) : m_value(std::move(value)) {}
bool operator==(const BlobLeaseDurationType& other) const { return m_value == other.m_value; }
bool operator!=(const BlobLeaseDurationType& other) const { return !(*this == other); }
const std::string& Get() const { return m_value; }
AZ_STORAGE_BLOBS_DLLEXPORT const static BlobLeaseDurationType Infinite;
AZ_STORAGE_BLOBS_DLLEXPORT const static BlobLeaseDurationType Fixed;
private:
std::string m_value;
}; // extensible enum BlobLeaseDurationType
class BlobLeaseState {
public:
BlobLeaseState() = default;
@ -740,7 +754,7 @@ namespace Azure { namespace Storage { namespace Blobs {
PublicAccessType AccessType = PublicAccessType::Private;
bool HasImmutabilityPolicy = false;
bool HasLegalHold = false;
Azure::Core::Nullable<std::string> LeaseDuration;
Azure::Core::Nullable<BlobLeaseDurationType> LeaseDuration;
BlobLeaseState LeaseState = BlobLeaseState::Available;
BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
std::string DefaultEncryptionScope;
@ -800,7 +814,7 @@ namespace Azure { namespace Storage { namespace Blobs {
PublicAccessType AccessType = PublicAccessType::Private;
bool HasImmutabilityPolicy = false;
bool HasLegalHold = false;
Azure::Core::Nullable<std::string> LeaseDuration;
Azure::Core::Nullable<BlobLeaseDurationType> LeaseDuration;
BlobLeaseState LeaseState = BlobLeaseState::Available;
BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
std::string DefaultEncryptionScope;
@ -1017,7 +1031,7 @@ namespace Azure { namespace Storage { namespace Blobs {
Azure::Core::Nullable<bool> IsAccessTierInferred;
BlobLeaseStatus LeaseStatus = BlobLeaseStatus::Unlocked;
BlobLeaseState LeaseState = BlobLeaseState::Available;
Azure::Core::Nullable<std::string> LeaseDuration;
Azure::Core::Nullable<BlobLeaseDurationType> LeaseDuration;
bool IsServerEncrypted = false;
Azure::Core::Nullable<std::vector<uint8_t>> EncryptionKeySha256;
Azure::Core::Nullable<std::string> EncryptionScope;
@ -1045,7 +1059,7 @@ namespace Azure { namespace Storage { namespace Blobs {
Azure::Core::Nullable<bool> IsSealed; // only for append blob
Models::BlobType BlobType;
Azure::Core::Nullable<ContentHash> TransactionalContentHash; // hash for the downloaded range
Azure::Core::Nullable<std::string> LeaseDuration;
Azure::Core::Nullable<BlobLeaseDurationType> LeaseDuration;
Azure::Core::Nullable<BlobLeaseState> LeaseState;
Azure::Core::Nullable<BlobLeaseStatus> LeaseStatus;
bool IsServerEncrypted = false;
@ -1068,7 +1082,7 @@ namespace Azure { namespace Storage { namespace Blobs {
Azure::Core::Nullable<Azure::Core::DateTime> LastAccessedOn;
Storage::Metadata Metadata;
Models::BlobType BlobType;
Azure::Core::Nullable<std::string> LeaseDuration;
Azure::Core::Nullable<BlobLeaseDurationType> LeaseDuration;
Azure::Core::Nullable<BlobLeaseState> LeaseState;
Azure::Core::Nullable<BlobLeaseStatus> LeaseStatus;
int64_t ContentLength = 0;
@ -2238,7 +2252,7 @@ namespace Azure { namespace Storage { namespace Blobs {
path.size() == 2 && path[0] == XmlTagName::k_Properties
&& path[1] == XmlTagName::k_LeaseDuration)
{
ret.LeaseDuration = node.Value;
ret.LeaseDuration = BlobLeaseDurationType(node.Value);
}
else if (
path.size() == 2 && path[0] == XmlTagName::k_Properties
@ -3297,7 +3311,7 @@ namespace Azure { namespace Storage { namespace Blobs {
= httpResponse.GetHeaders().find("x-ms-lease-duration");
if (x_ms_lease_duration__iterator != httpResponse.GetHeaders().end())
{
response.LeaseDuration = x_ms_lease_duration__iterator->second;
response.LeaseDuration = BlobLeaseDurationType(x_ms_lease_duration__iterator->second);
}
response.DefaultEncryptionScope
= httpResponse.GetHeaders().at("x-ms-default-encryption-scope");
@ -3644,7 +3658,7 @@ namespace Azure { namespace Storage { namespace Blobs {
struct AcquireBlobContainerLeaseOptions
{
Azure::Core::Nullable<int32_t> Timeout;
int32_t LeaseDuration = -1;
std::chrono::seconds LeaseDuration;
Azure::Core::Nullable<std::string> ProposedLeaseId;
Azure::Core::Nullable<Azure::Core::DateTime> IfModifiedSince;
Azure::Core::Nullable<Azure::Core::DateTime> IfUnmodifiedSince;
@ -3668,7 +3682,7 @@ namespace Azure { namespace Storage { namespace Blobs {
request.GetUrl().AppendQueryParameter("restype", "container");
request.GetUrl().AppendQueryParameter("comp", "lease");
request.AddHeader("x-ms-lease-action", "acquire");
request.AddHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration));
request.AddHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration.count()));
if (options.ProposedLeaseId.HasValue())
{
request.AddHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
@ -3894,7 +3908,7 @@ namespace Azure { namespace Storage { namespace Blobs {
struct BreakBlobContainerLeaseOptions
{
Azure::Core::Nullable<int32_t> Timeout;
Azure::Core::Nullable<int32_t> BreakPeriod;
Azure::Core::Nullable<std::chrono::seconds> BreakPeriod;
Azure::Core::Nullable<Azure::Core::DateTime> IfModifiedSince;
Azure::Core::Nullable<Azure::Core::DateTime> IfUnmodifiedSince;
}; // struct BreakBlobContainerLeaseOptions
@ -3920,7 +3934,7 @@ namespace Azure { namespace Storage { namespace Blobs {
if (options.BreakPeriod.HasValue())
{
request.AddHeader(
"x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
"x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue().count()));
}
if (options.IfModifiedSince.HasValue())
{
@ -4579,7 +4593,7 @@ namespace Azure { namespace Storage { namespace Blobs {
path.size() == 2 && path[0] == XmlTagName::k_Properties
&& path[1] == XmlTagName::k_LeaseDuration)
{
ret.LeaseDuration = node.Value;
ret.LeaseDuration = BlobLeaseDurationType(node.Value);
}
else if (
path.size() == 2 && path[0] == XmlTagName::k_Properties
@ -5083,7 +5097,7 @@ namespace Azure { namespace Storage { namespace Blobs {
= httpResponse.GetHeaders().find("x-ms-lease-duration");
if (x_ms_lease_duration__iterator != httpResponse.GetHeaders().end())
{
response.LeaseDuration = x_ms_lease_duration__iterator->second;
response.LeaseDuration = BlobLeaseDurationType(x_ms_lease_duration__iterator->second);
}
response.CreatedOn = Azure::Core::DateTime::Parse(
httpResponse.GetHeaders().at("x-ms-creation-time"),
@ -5489,7 +5503,7 @@ namespace Azure { namespace Storage { namespace Blobs {
= httpResponse.GetHeaders().find("x-ms-lease-duration");
if (x_ms_lease_duration__iterator != httpResponse.GetHeaders().end())
{
response.LeaseDuration = x_ms_lease_duration__iterator->second;
response.LeaseDuration = BlobLeaseDurationType(x_ms_lease_duration__iterator->second);
}
response.ContentLength = std::stoll(httpResponse.GetHeaders().at("content-length"));
auto content_type__iterator = httpResponse.GetHeaders().find("content-type");
@ -6353,7 +6367,7 @@ namespace Azure { namespace Storage { namespace Blobs {
struct AcquireBlobLeaseOptions
{
Azure::Core::Nullable<int32_t> Timeout;
int32_t LeaseDuration = -1;
std::chrono::seconds LeaseDuration;
Azure::Core::Nullable<std::string> ProposedLeaseId;
Azure::Core::Nullable<Azure::Core::DateTime> IfModifiedSince;
Azure::Core::Nullable<Azure::Core::DateTime> IfUnmodifiedSince;
@ -6379,7 +6393,7 @@ namespace Azure { namespace Storage { namespace Blobs {
}
request.GetUrl().AppendQueryParameter("comp", "lease");
request.AddHeader("x-ms-lease-action", "acquire");
request.AddHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration));
request.AddHeader("x-ms-lease-duration", std::to_string(options.LeaseDuration.count()));
if (options.ProposedLeaseId.HasValue())
{
request.AddHeader("x-ms-proposed-lease-id", options.ProposedLeaseId.GetValue());
@ -6665,7 +6679,7 @@ namespace Azure { namespace Storage { namespace Blobs {
struct BreakBlobLeaseOptions
{
Azure::Core::Nullable<int32_t> Timeout;
Azure::Core::Nullable<int32_t> BreakPeriod;
Azure::Core::Nullable<std::chrono::seconds> BreakPeriod;
Azure::Core::Nullable<Azure::Core::DateTime> IfModifiedSince;
Azure::Core::Nullable<Azure::Core::DateTime> IfUnmodifiedSince;
Azure::Core::Nullable<std::string> IfMatch;
@ -6693,7 +6707,7 @@ namespace Azure { namespace Storage { namespace Blobs {
if (options.BreakPeriod.HasValue())
{
request.AddHeader(
"x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue()));
"x-ms-lease-break-period", std::to_string(options.BreakPeriod.GetValue().count()));
}
if (options.IfModifiedSince.HasValue())
{

View File

@ -7,13 +7,15 @@
namespace Azure { namespace Storage { namespace Blobs {
const std::chrono::seconds BlobLeaseClient::InfiniteLeaseDuration{-1};
std::string BlobLeaseClient::CreateUniqueLeaseId()
{
return Azure::Core::Uuid::CreateUuid().GetUuidString();
}
Azure::Core::Response<Models::AcquireBlobLeaseResult> BlobLeaseClient::Acquire(
int32_t duration,
std::chrono::seconds duration,
const AcquireBlobLeaseOptions& options)
{
if (m_blobClient.HasValue())

View File

@ -36,6 +36,9 @@ namespace Azure { namespace Storage { namespace Blobs { namespace Models {
const BlobGeoReplicationStatus BlobGeoReplicationStatus::Bootstrap("bootstrap");
const BlobGeoReplicationStatus BlobGeoReplicationStatus::Unavailable("unavailable");
const BlobLeaseDurationType BlobLeaseDurationType::Infinite("infinite");
const BlobLeaseDurationType BlobLeaseDurationType::Fixed("fixed");
const BlobLeaseState BlobLeaseState::Available("available");
const BlobLeaseState BlobLeaseState::Leased("leased");
const BlobLeaseState BlobLeaseState::Expired("expired");

View File

@ -3,6 +3,8 @@
#include "append_blob_client_test.hpp"
#include <azure/storage/blobs/blob_lease_client.hpp>
namespace Azure { namespace Storage { namespace Test {
std::shared_ptr<Azure::Storage::Blobs::AppendBlobClient> AppendBlobClientTest::m_appendBlobClient;
@ -194,7 +196,7 @@ namespace Azure { namespace Storage { namespace Test {
std::string leaseId = Blobs::BlobLeaseClient::CreateUniqueLeaseId();
Blobs::BlobLeaseClient leaseClient(appendBlobClient, leaseId);
leaseClient.Acquire(30);
leaseClient.Acquire(std::chrono::seconds(30));
EXPECT_THROW(appendBlobClient.Delete(), StorageException);
Blobs::DeleteBlobOptions options;
options.AccessConditions.LeaseId = leaseId;

View File

@ -420,7 +420,7 @@ namespace Azure { namespace Storage { namespace Test {
containerClient.Create();
std::string leaseId1 = Blobs::BlobLeaseClient::CreateUniqueLeaseId();
int32_t leaseDuration = 20;
auto leaseDuration = std::chrono::seconds(20);
Blobs::BlobLeaseClient leaseClient(containerClient, leaseId1);
auto aLease = *leaseClient.Acquire(leaseDuration);
EXPECT_FALSE(aLease.RequestId.empty());
@ -437,7 +437,7 @@ namespace Azure { namespace Storage { namespace Test {
auto properties = *containerClient.GetProperties();
EXPECT_EQ(properties.LeaseState, Blobs::Models::BlobLeaseState::Leased);
EXPECT_EQ(properties.LeaseStatus, Blobs::Models::BlobLeaseStatus::Locked);
EXPECT_FALSE(properties.LeaseDuration.GetValue().empty());
EXPECT_EQ(properties.LeaseDuration.GetValue(), Blobs::Models::BlobLeaseDurationType::Fixed);
auto rLease = *leaseClient.Renew();
EXPECT_FALSE(rLease.RequestId.empty());
@ -463,7 +463,7 @@ namespace Azure { namespace Storage { namespace Test {
= Blobs::BlobLeaseClient(containerClient, Blobs::BlobLeaseClient::CreateUniqueLeaseId());
aLease = *leaseClient.Acquire(Blobs::BlobLeaseClient::InfiniteLeaseDuration);
properties = *containerClient.GetProperties();
EXPECT_FALSE(properties.LeaseDuration.GetValue().empty());
EXPECT_EQ(properties.LeaseDuration.GetValue(), Blobs::Models::BlobLeaseDurationType::Infinite);
auto brokenLease = *leaseClient.Break();
EXPECT_FALSE(brokenLease.ETag.empty());
EXPECT_TRUE(IsValidTime(brokenLease.LastModified));
@ -478,7 +478,7 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NE(brokenLease.LeaseTime, 0);
Blobs::BreakBlobLeaseOptions options;
options.BreakPeriod = 0;
options.BreakPeriod = std::chrono::seconds(0);
leaseClient.Break(options);
containerClient.Delete();
}
@ -716,7 +716,7 @@ namespace Azure { namespace Storage { namespace Test {
std::string leaseId = Blobs::BlobLeaseClient::CreateUniqueLeaseId();
auto leaseClient = Blobs::BlobLeaseClient(containerClient, leaseId);
leaseClient.Acquire(30);
leaseClient.Acquire(std::chrono::seconds(30));
EXPECT_THROW(containerClient.Delete(), StorageException);
Blobs::DeleteBlobContainerOptions options;
options.AccessConditions.LeaseId = leaseId;
@ -918,9 +918,9 @@ namespace Azure { namespace Storage { namespace Test {
Blobs::AcquireBlobLeaseOptions options;
options.AccessConditions.TagConditions = failWhereExpression;
auto leaseClient = Blobs::BlobLeaseClient(appendBlobClient, leaseId);
EXPECT_THROW(leaseClient.Acquire(60, options), StorageException);
EXPECT_THROW(leaseClient.Acquire(std::chrono::seconds(60), options), StorageException);
options.AccessConditions.TagConditions = successWhereExpression;
EXPECT_NO_THROW(leaseClient.Acquire(60, options));
EXPECT_NO_THROW(leaseClient.Acquire(std::chrono::seconds(60), options));
Blobs::BreakBlobLeaseOptions options2;
options2.AccessConditions.TagConditions = failWhereExpression;

View File

@ -6,6 +6,7 @@
#include <future>
#include <vector>
#include <azure/storage/blobs/blob_lease_client.hpp>
#include <azure/storage/common/crypt.hpp>
#include <azure/storage/common/file_io.hpp>
@ -161,7 +162,7 @@ namespace Azure { namespace Storage { namespace Test {
TEST_F(PageBlobClientTest, Lease)
{
std::string leaseId1 = Blobs::BlobLeaseClient::CreateUniqueLeaseId();
int32_t leaseDuration = 20;
auto leaseDuration = std::chrono::seconds(20);
auto leaseClient = Blobs::BlobLeaseClient(*m_pageBlobClient, leaseId1);
auto aLease = *leaseClient.Acquire(leaseDuration);
EXPECT_FALSE(aLease.RequestId.empty());
@ -177,7 +178,7 @@ namespace Azure { namespace Storage { namespace Test {
auto properties = *m_pageBlobClient->GetProperties();
EXPECT_EQ(properties.LeaseState.GetValue(), Blobs::Models::BlobLeaseState::Leased);
EXPECT_EQ(properties.LeaseStatus.GetValue(), Blobs::Models::BlobLeaseStatus::Locked);
EXPECT_FALSE(properties.LeaseDuration.GetValue().empty());
EXPECT_EQ(properties.LeaseDuration.GetValue(), Blobs::Models::BlobLeaseDurationType::Fixed);
auto rLease = *leaseClient.Renew();
EXPECT_FALSE(rLease.RequestId.empty());
@ -203,7 +204,7 @@ namespace Azure { namespace Storage { namespace Test {
= Blobs::BlobLeaseClient(*m_pageBlobClient, Blobs::BlobLeaseClient::CreateUniqueLeaseId());
aLease = *leaseClient.Acquire(Blobs::BlobLeaseClient::InfiniteLeaseDuration);
properties = *m_pageBlobClient->GetProperties();
EXPECT_FALSE(properties.LeaseDuration.GetValue().empty());
EXPECT_EQ(properties.LeaseDuration.GetValue(), Blobs::Models::BlobLeaseDurationType::Infinite);
auto brokenLease = *leaseClient.Break();
EXPECT_FALSE(brokenLease.ETag.empty());
EXPECT_TRUE(IsValidTime(brokenLease.LastModified));
@ -218,7 +219,7 @@ namespace Azure { namespace Storage { namespace Test {
EXPECT_NE(brokenLease.LeaseTime, 0);
Blobs::BreakBlobLeaseOptions options;
options.BreakPeriod = 0;
options.BreakPeriod = std::chrono::seconds(0);
leaseClient.Break(options);
}

View File

@ -331,7 +331,11 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
ret.TransactionalContentHash = std::move(result->TransactionalContentHash);
ret.ETag = std::move(result->ETag);
ret.LastModified = std::move(result->LastModified);
ret.LeaseDuration = std::move(result->LeaseDuration);
// FIXME
if (result->LeaseDuration.HasValue())
{
ret.LeaseDuration = result->LeaseDuration.GetValue().Get();
}
ret.LeaseState = result->LeaseState.HasValue()
? FromBlobLeaseState(result->LeaseState.GetValue())
: ret.LeaseState;

View File

@ -359,7 +359,11 @@ namespace Azure { namespace Storage { namespace Files { namespace DataLake {
ret.LastModified = std::move(result->LastModified);
ret.CreatedOn = std::move(result->CreatedOn);
ret.Metadata = std::move(result->Metadata);
ret.LeaseDuration = std::move(result->LeaseDuration);
// FIXME
if (result->LeaseDuration.HasValue())
{
ret.LeaseDuration = result->LeaseDuration.GetValue().Get();
}
ret.LeaseState = result->LeaseState.HasValue()
? FromBlobLeaseState(result->LeaseState.GetValue())
: ret.LeaseState;