blob: d7531f6f11dfcd7daf264a8d1d2ad80326efcadd [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/public/common/blob/blob_utils.h"
#include <algorithm>
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "services/network/public/cpp/features.h"
#include "third_party/blink/public/common/features.h"
namespace blink {
constexpr uint64_t BlobUtils::kUnknownSize;
namespace {
const base::Feature kBlobDataPipeTuningFeature{
"BlobDataPipeTuning", base::FEATURE_DISABLED_BY_DEFAULT};
constexpr int kBlobMinDataPipeCapacity = 1024;
// The 2MB limit was selected via a finch trial.
constexpr int kBlobDefaultDataPipeCapacity = 2 * 1024 * 1024;
constexpr base::FeatureParam<int> kBlobDataPipeCapacity{
&kBlobDataPipeTuningFeature, "capacity_bytes",
kBlobDefaultDataPipeCapacity};
constexpr int kBlobMinDataPipeChunkSize = 1024;
constexpr int kBlobDefaultDataPipeChunkSize = 64 * 1024;
constexpr base::FeatureParam<int> kBlobDataPipeChunkSize{
&kBlobDataPipeTuningFeature, "chunk_bytes", kBlobDefaultDataPipeChunkSize};
} // namespace
// static
uint32_t BlobUtils::GetDataPipeCapacity(uint64_t target_blob_size) {
static_assert(kUnknownSize > kBlobDefaultDataPipeCapacity,
"The unknown size constant must be greater than our capacity.");
uint32_t result =
std::min(base::saturated_cast<uint32_t>(target_blob_size),
base::saturated_cast<uint32_t>(kBlobDataPipeCapacity.Get()));
return std::max(result,
base::saturated_cast<uint32_t>(kBlobMinDataPipeCapacity));
}
// static
uint32_t BlobUtils::GetDataPipeChunkSize() {
// The mojo::DataPipe will allow up to 64KB to be written into it in
// a single chunk, but there may be some advantage to writing smaller
// chunks. For example, the network stack uses 32KB chunks. This could
// result in the faster delivery of the first byte of data when reading
// from a slow disk.
return std::max(kBlobDataPipeChunkSize.Get(), kBlobMinDataPipeChunkSize);
}
} // namespace blink