Newer
Older
# Copyright 2019 PrivateStorage.io, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Functionality shared between the storage client and server.
"""
from base64 import (
b64encode,
)
from math import (
ceil,
)
def _message_maker(label):
def make_message(storage_index):
return u"{label} {storage_index}".format(
label=label,
storage_index=b64encode(storage_index),
)
return make_message
# Functions to construct the PrivacyPass request-binding message for pass
# construction for different Tahoe-LAFS storage operations.
allocate_buckets_message = _message_maker(u"allocate_buckets")
add_lease_message = _message_maker(u"add_lease")
renew_lease_message = _message_maker(u"renew_lease")
slot_testv_and_readv_and_writev_message = _message_maker(u"slot_testv_and_readv_and_writev")
# The number of bytes we're willing to store for a lease period for each pass
# submitted.
BYTES_PER_PASS = 128 * 1024
def required_passes(bytes_per_pass, share_nums, share_size):
"""
Calculate the number of passes that are required to store ``stored_bytes``
for one lease period.
:param int bytes_per_pass: The number of bytes the storage of which for
one lease period one pass covers.
:param set[int] share_nums: The share numbers which will be stored.
:param int share_size: THe number of bytes in a single share.
:return int: The number of passes required to cover the storage cost.
"""
return int(
ceil(
(len(share_nums) * share_size) / bytes_per_pass,
),
)