Skip to content

Commit 6740b34

Browse files
committed
prepare ccng for blobstore benchmark errand
1 parent 3fcfcae commit 6740b34

File tree

5 files changed

+132
-122
lines changed

5 files changed

+132
-122
lines changed

lib/cloud_controller/benchmark/blobstore.rb

Lines changed: 41 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,35 @@ def perform
1414
zip_output_dir = Dir.mktmpdir
1515
zip_file = zip_resources(resource_dir, zip_output_dir)
1616

17-
benchmark_packages(zip_file, resource_dir)
18-
benchmark_buildpacks(resource_dir)
19-
benchmark_droplets(zip_file, resource_dir)
20-
benchmark_big_droplets(resource_dir)
17+
package_guid, resource_timing = upload_package(zip_file)
18+
puts("package upload timing: #{resource_timing * 1000}ms")
19+
20+
resource_timing = download_package(package_guid, resource_dir)
21+
puts("package download timing: #{resource_timing * 1000}ms")
22+
23+
bytes_read, resource_timing = download_buildpacks(resource_dir)
24+
puts("downloaded #{Buildpack.count} buildpacks, total #{bytes_read} bytes read")
25+
puts("buildpack download timing: #{resource_timing * 1000}ms")
26+
27+
droplet_guid, resource_timing = upload_droplet(zip_file)
28+
puts("droplet upload timing: #{resource_timing * 1000}ms")
29+
30+
resource_timing = download_droplet(droplet_guid, resource_dir)
31+
puts("droplet download timing: #{resource_timing * 1000}ms")
32+
33+
big_droplet_file = Tempfile.new('big-droplet', resource_dir)
34+
big_droplet_file.write('abc' * 1024 * 1024 * 100)
35+
big_droplet_guid, resource_timing = upload_droplet(big_droplet_file.path)
36+
puts("big droplet upload timing: #{resource_timing * 1000}ms")
37+
38+
resource_timing = download_droplet(big_droplet_guid, resource_dir)
39+
puts("big droplet download timing: #{resource_timing * 1000}ms")
2140
ensure
22-
cleanup(resource_dir, zip_output_dir)
41+
FileUtils.remove_dir(resource_dir, true)
42+
FileUtils.remove_dir(zip_output_dir, true)
43+
package_blobstore_client.delete(package_guid) if package_guid
44+
droplet_blobstore_client.delete(droplet_guid) if droplet_guid
45+
droplet_blobstore_client.delete(big_droplet_guid) if big_droplet_guid
2346
end
2447

2548
def resource_match(dir_path)
@@ -32,125 +55,43 @@ def resource_match(dir_path)
3255
end
3356
end
3457

35-
def upload_package(package_path, client=package_blobstore_client)
36-
copy_to_blobstore(package_path, client)
58+
def upload_package(package_path)
59+
copy_to_blobstore(package_path, package_blobstore_client)
3760
end
3861

39-
def download_package(package_guid, tmp_dir, client=package_blobstore_client)
62+
def download_package(package_guid, tmp_dir)
4063
tempfile = Tempfile.new('package-download-benchmark', tmp_dir)
4164
::Benchmark.realtime do
42-
client.download_from_blobstore(package_guid, tempfile.path)
65+
package_blobstore_client.download_from_blobstore(package_guid, tempfile.path)
4366
end
4467
end
4568

46-
def download_buildpacks(tmp_dir, client=buildpack_blobstore_client)
69+
def download_buildpacks(tmp_dir)
4770
tempfile = Tempfile.new('buildpack-download-benchmark', tmp_dir)
4871
bytes_read = 0
4972

5073
timing = ::Benchmark.realtime do
5174
bytes_read = Buildpack.map do |buildpack|
52-
client.download_from_blobstore(buildpack.key, tempfile.path)
75+
buildpack_blobstore_client.download_from_blobstore(buildpack.key, tempfile.path)
5376
File.stat(tempfile.path).size
5477
end.sum
5578
end
5679

5780
[bytes_read, timing]
5881
end
5982

60-
def upload_droplet(droplet_path, client=droplet_blobstore_client)
61-
copy_to_blobstore(droplet_path, client)
83+
def upload_droplet(droplet_path)
84+
copy_to_blobstore(droplet_path, droplet_blobstore_client)
6285
end
6386

64-
def download_droplet(droplet_guid, tmp_dir, client=droplet_blobstore_client)
87+
def download_droplet(droplet_guid, tmp_dir)
6588
tempfile = Tempfile.new('droplet-download-benchmark', tmp_dir)
6689

6790
::Benchmark.realtime do
68-
client.download_from_blobstore(droplet_guid, tempfile.path)
69-
end
70-
end
71-
72-
def benchmark_packages(zip_file, resource_dir)
73-
fog_guid, fog_time = upload_package(zip_file, package_blobstore_client)
74-
cli_guid, cli_time = upload_package(zip_file, package_blobstore_client_storage_cli)
75-
76-
puts("package upload timing fog: #{fog_time * 1000}ms")
77-
puts("package upload timing storage-cli: #{cli_time * 1000}ms")
78-
79-
fog_dl = download_package(fog_guid, resource_dir, package_blobstore_client)
80-
cli_dl = download_package(cli_guid, resource_dir, package_blobstore_client_storage_cli)
81-
82-
puts("package download timing fog: #{fog_dl * 1000}ms")
83-
puts("package download timing storage-cli: #{cli_dl * 1000}ms")
84-
85-
remember_cleanup(:package, fog_guid, cli_guid)
86-
end
87-
88-
def benchmark_buildpacks(resource_dir)
89-
fog_bytes, fog_time = download_buildpacks(resource_dir, buildpack_blobstore_client)
90-
cli_bytes, cli_time = download_buildpacks(resource_dir, buildpack_blobstore_client_storage_cli)
91-
92-
puts("downloaded #{Buildpack.count} buildpacks, total fog #{fog_bytes} bytes read")
93-
puts("downloaded #{Buildpack.count} buildpacks, total storage-cli #{cli_bytes} bytes read")
94-
puts("buildpack download timing fog: #{fog_time * 1000}ms")
95-
puts("buildpack download timing storage-cli: #{cli_time * 1000}ms")
96-
end
97-
98-
def benchmark_droplets(zip_file, resource_dir)
99-
fog_guid, fog_time = upload_droplet(zip_file, droplet_blobstore_client)
100-
cli_guid, cli_time = upload_droplet(zip_file, droplet_blobstore_client_storage_cli)
101-
102-
puts("droplet upload timing fog: #{fog_time * 1000}ms")
103-
puts("droplet upload timing storage-cli: #{cli_time * 1000}ms")
104-
105-
fog_dl = download_droplet(fog_guid, resource_dir, droplet_blobstore_client)
106-
cli_dl = download_droplet(cli_guid, resource_dir, droplet_blobstore_client_storage_cli)
107-
108-
puts("droplet download timing fog: #{fog_dl * 1000}ms")
109-
puts("droplet download timing storage-cli: #{cli_dl * 1000}ms")
110-
111-
remember_cleanup(:droplet, fog_guid, cli_guid)
112-
end
113-
114-
def benchmark_big_droplets(resource_dir)
115-
fog_guid, fog_time = upload_big_droplet(resource_dir, droplet_blobstore_client)
116-
cli_guid, cli_time = upload_big_droplet(resource_dir, droplet_blobstore_client_storage_cli)
117-
118-
puts("big droplet upload timing fog: #{fog_time * 1000}ms")
119-
puts("big droplet upload timing storage-cli: #{cli_time * 1000}ms")
120-
121-
fog_dl = download_droplet(fog_guid, resource_dir, droplet_blobstore_client)
122-
cli_dl = download_droplet(cli_guid, resource_dir, droplet_blobstore_client_storage_cli)
123-
124-
puts("big droplet download timing fog: #{fog_dl * 1000}ms")
125-
puts("big droplet download timing storage-cli: #{cli_dl * 1000}ms")
126-
127-
remember_cleanup(:droplet, fog_guid, cli_guid)
128-
end
129-
130-
def remember_cleanup(type, fog_guid, cli_guid)
131-
cleanup_items << [type, fog_guid, cli_guid]
132-
end
133-
134-
def cleanup(resource_dir, zip_output_dir)
135-
FileUtils.remove_dir(resource_dir, true)
136-
FileUtils.remove_dir(zip_output_dir, true)
137-
138-
cleanup_items.each do |type, fog_guid, cli_guid|
139-
client_fog, client_cli =
140-
case type
141-
when :package then [package_blobstore_client, package_blobstore_client_storage_cli]
142-
when :droplet then [droplet_blobstore_client, droplet_blobstore_client_storage_cli]
143-
end
144-
145-
client_fog.delete(fog_guid) if fog_guid
146-
client_cli.delete(cli_guid) if cli_guid
91+
droplet_blobstore_client.download_from_blobstore(droplet_guid, tempfile.path)
14792
end
14893
end
14994

150-
def cleanup_items
151-
@cleanup_items ||= []
152-
end
153-
15495
private
15596

15697
def generate_resources
@@ -187,27 +128,15 @@ def copy_to_blobstore(path, client)
187128
end
188129

189130
def buildpack_blobstore_client
190-
@buildpack_blobstore_client ||= CloudController::DependencyLocator.instance.buildpack_blobstore(blobstore_type: 'fog')
191-
end
192-
193-
def buildpack_blobstore_client_storage_cli
194-
@buildpack_blobstore_client_storage_cli ||= CloudController::DependencyLocator.instance.buildpack_blobstore(blobstore_type: 'storage-cli')
131+
@buildpack_blobstore_client ||= CloudController::DependencyLocator.instance.buildpack_blobstore
195132
end
196133

197134
def droplet_blobstore_client
198-
@droplet_blobstore_client ||= CloudController::DependencyLocator.instance.droplet_blobstore(blobstore_type: 'fog')
199-
end
200-
201-
def droplet_blobstore_client_storage_cli
202-
@droplet_blobstore_client_storage_cli ||= CloudController::DependencyLocator.instance.droplet_blobstore(blobstore_type: 'storage-cli')
135+
@droplet_blobstore_client ||= CloudController::DependencyLocator.instance.droplet_blobstore
203136
end
204137

205138
def package_blobstore_client
206-
@package_blobstore_client ||= CloudController::DependencyLocator.instance.package_blobstore(blobstore_type: 'fog')
207-
end
208-
209-
def package_blobstore_client_storage_cli
210-
@package_blobstore_client_storage_cli ||= CloudController::DependencyLocator.instance.package_blobstore(blobstore_type: 'storage-cli')
139+
@package_blobstore_client ||= CloudController::DependencyLocator.instance.package_blobstore
211140
end
212141

213142
def resource_pool

lib/cloud_controller/config.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
require 'cloud_controller/config_schemas/worker_schema'
1313
require 'cloud_controller/config_schemas/deployment_updater_schema'
1414
require 'cloud_controller/config_schemas/rotate_database_key_schema'
15+
require 'cloud_controller/config_schemas/blobstore_benchmarks_schema'
1516
require 'utils/hash_utils'
1617

1718
module VCAP::CloudController
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
require 'vcap/config'
2+
3+
module VCAP::CloudController
4+
module ConfigSchemas
5+
class BlobstoreBenchmarksSchema < VCAP::Config
6+
# rubocop:disable Metrics/BlockLength
7+
define_schema do
8+
blobstore_section = {
9+
optional(:blobstore_type) => String,
10+
optional(:blobstore_provider) => String,
11+
12+
optional(:fog_connection) => Hash,
13+
optional(:connection_config) => Hash,
14+
optional(:webdav_config) => Hash,
15+
16+
optional(:fog_aws_storage_options) => Hash,
17+
optional(:fog_gcp_storage_options) => Hash,
18+
19+
optional(:resource_directory_key) => String,
20+
optional(:buildpack_directory_key) => String,
21+
optional(:app_package_directory_key) => String,
22+
optional(:droplet_directory_key) => String,
23+
24+
optional(:maximum_size) => Integer,
25+
optional(:minimum_size) => Integer,
26+
optional(:max_package_size) => Integer,
27+
optional(:max_valid_packages_stored) => Integer,
28+
optional(:max_staged_droplets_stored) => Integer
29+
}
30+
31+
{
32+
optional(:logging) => {
33+
optional(:level) => String,
34+
optional(:file) => String,
35+
optional(:syslog) => String,
36+
optional(:stdout_sink_enabled) => bool
37+
},
38+
39+
db: {
40+
optional(:database) => Hash,
41+
optional(:db_connection_string) => String,
42+
optional(:max_connections) => Integer,
43+
optional(:pool_timeout) => Integer,
44+
optional(:log_level) => String,
45+
optional(:log_db_queries) => bool,
46+
optional(:ssl_verify_hostname) => bool,
47+
optional(:connection_validation_timeout) => Integer,
48+
optional(:ca_cert_path) => String
49+
},
50+
optional(:storage_cli_config_file_resource_pool) => String,
51+
optional(:storage_cli_config_file_buildpacks) => String,
52+
optional(:storage_cli_config_file_packages) => String,
53+
optional(:storage_cli_config_file_droplets) => String,
54+
55+
optional(:db_encryption_key) => enum(String, NilClass),
56+
optional(:database_encryption) => {
57+
keys: Hash,
58+
current_key_label: String,
59+
optional(:pbkdf2_hmac_iterations) => Integer
60+
},
61+
62+
resource_pool: blobstore_section,
63+
buildpacks: blobstore_section,
64+
packages: blobstore_section,
65+
droplets: blobstore_section,
66+
67+
optional(:pid_filename) => String,
68+
optional(:index) => Integer,
69+
optional(:name) => String,
70+
optional(:default_app_ssh_access) => bool
71+
}
72+
end
73+
# rubocop:enable Metrics/BlockLength
74+
75+
class << self
76+
def configure_components(config)
77+
ResourcePool.instance = ResourcePool.new(config)
78+
end
79+
end
80+
end
81+
end
82+
end

lib/cloud_controller/dependency_locator.rb

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,8 @@ def index_stopper
131131
@dependencies[:index_stopper] || register(:index_stopper, IndexStopper.new(runners))
132132
end
133133

134-
def droplet_blobstore(blobstore_type: nil)
135-
options = config.get(:droplets).dup
136-
options[:blobstore_type] = blobstore_type if blobstore_type
134+
def droplet_blobstore
135+
options = config.get(:droplets)
137136

138137
Blobstore::ClientProvider.provide(
139138
options: options,
@@ -153,9 +152,8 @@ def buildpack_cache_blobstore
153152
)
154153
end
155154

156-
def package_blobstore(blobstore_type: nil)
157-
options = config.get(:packages).dup
158-
options[:blobstore_type] = blobstore_type if blobstore_type
155+
def package_blobstore
156+
options = config.get(:packages)
159157

160158
Blobstore::ClientProvider.provide(
161159
options: options,
@@ -185,9 +183,8 @@ def global_app_bits_cache
185183
)
186184
end
187185

188-
def buildpack_blobstore(blobstore_type: nil)
189-
options = config.get(:buildpacks).dup
190-
options[:blobstore_type] = blobstore_type if blobstore_type
186+
def buildpack_blobstore
187+
options = config.get(:buildpacks)
191188

192189
Blobstore::ClientProvider.provide(
193190
options: options,

lib/tasks/blobstore_benchmarks.rake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ require 'cloud_controller/benchmark/blobstore'
33
namespace :benchmarks do
44
desc 'Perform blobstore benchmark'
55
task perform_blobstore_benchmark: :environment do
6-
BackgroundJobEnvironment.new(RakeConfig.config).setup_environment do
6+
RakeConfig.context = :blobstore_benchmarks
7+
BoshErrandEnvironment.new(RakeConfig.config).setup_environment do
78
VCAP::CloudController::Benchmark::Blobstore.new.perform
89
end
910
end

0 commit comments

Comments
 (0)