Skip to content

Commit 6b8c5ee

Browse files
authored
Add db_operation_timeout BOSH property for locket (#1141)
Companion change for cloudfoundry/locket#40 (context detach fix). Adds diego.locket.sql.db_operation_timeout property (default: 10s) that controls the independent timeout for handler-initiated DB operations. This allows operators to tune the timeout without recompiling the locket binary. Also adds locket_template_spec.rb covering timeout configuration rendering — no such spec existed previously.
1 parent 5f377ab commit 6b8c5ee

3 files changed

Lines changed: 102 additions & 1 deletion

File tree

jobs/locket/spec

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ properties:
6464
diego.locket.sql.db_read_timeout:
6565
description: "Timeout in seconds for a db client to wait for data to be received from the server"
6666
default: "60"
67-
diego.locket.sql.db_write_timeout:
67+
diego.locket.sql.db_write_timeout:
6868
description: "Timeout in seconds for a db client to wait for data to be sent to the server"
6969
default: "60"
70+
diego.locket.sql.db_operation_timeout:
71+
description: "Timeout in seconds for handler-initiated DB operations (Lock, Release, Fetch). Independent of gRPC client deadline."
72+
default: "10"
7073
diego.locket.sql.require_ssl:
7174
description: "Whether to require SSL for Locket communication to the SQL backend"
7275
default: false

jobs/locket/templates/locket.json.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ end
8080
config[:db_write_timeout] = "#{value}s" # add time unit
8181
end
8282

83+
if_p("diego.locket.sql.db_operation_timeout") do |value|
84+
config[:db_operation_timeout] = "#{value}s" # add time unit
85+
8386
if_p("diego.locket.health_check_timeout") do |value|
8487
config[:health_check_timeout] = "#{value}s" # add time unit
8588
end

spec/locket_template_spec.rb

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# frozen_string_literal: true
2+
3+
require 'rspec'
4+
require 'json'
5+
require 'bosh/template/test'
6+
7+
describe 'locket' do
8+
let(:release_path) { File.join(File.dirname(__FILE__), '..') }
9+
let(:release) { Bosh::Template::Test::ReleaseDir.new(release_path) }
10+
let(:job) { release.job('locket') }
11+
12+
describe 'locket.json.erb' do
13+
let(:deployment_manifest_fragment) do
14+
{
15+
'diego' => {
16+
'locket' => {
17+
'listen_addr' => '0.0.0.0:8891',
18+
'debug_addr' => '127.0.0.1:17018',
19+
'log_level' => 'info',
20+
'sql' => {
21+
'db_host' => 'sql-db.service.cf.internal',
22+
'db_port' => 5432,
23+
'db_schema' => 'locket',
24+
'db_username' => 'locket',
25+
'db_password' => 'locket_pw',
26+
'db_driver' => 'postgres',
27+
'require_ssl' => false
28+
}
29+
}
30+
},
31+
'database' => {
32+
'max_open_connections' => 200,
33+
'tls' => {
34+
'enable_identity_verification' => true
35+
}
36+
},
37+
'tls' => {
38+
'ca_cert' => 'CA CERT',
39+
'cert' => 'SERVER CERT',
40+
'key' => 'SERVER KEY'
41+
},
42+
'loggregator' => {
43+
'v2_api_port' => 3458,
44+
'ca_cert' => 'LOGGREGATOR CA',
45+
'cert' => 'LOGGREGATOR CERT',
46+
'key' => 'LOGGREGATOR KEY'
47+
},
48+
'set_kernel_parameters' => true
49+
}
50+
end
51+
52+
let(:template) { job.template('config/locket.json') }
53+
let(:rendered_template) { template.render(deployment_manifest_fragment) }
54+
55+
describe 'Database timeout configurations' do
56+
it 'includes db_operation_timeout when specified' do
57+
deployment_manifest_fragment['diego']['locket']['sql']['db_operation_timeout'] = '15'
58+
rendered_template_json = JSON.parse(rendered_template)
59+
expect(rendered_template_json['db_operation_timeout']).to eq('15s')
60+
end
61+
62+
it 'uses default db_operation_timeout of 10s when not overridden' do
63+
rendered_template_json = JSON.parse(rendered_template)
64+
expect(rendered_template_json['db_operation_timeout']).to eq('10s')
65+
end
66+
67+
it 'includes db_connection_timeout when specified' do
68+
deployment_manifest_fragment['diego']['locket']['sql']['db_connection_timeout'] = '30'
69+
rendered_template_json = JSON.parse(rendered_template)
70+
expect(rendered_template_json['db_connection_timeout']).to eq('30s')
71+
end
72+
73+
it 'includes db_read_timeout when specified' do
74+
deployment_manifest_fragment['diego']['locket']['sql']['db_read_timeout'] = '60'
75+
rendered_template_json = JSON.parse(rendered_template)
76+
expect(rendered_template_json['db_read_timeout']).to eq('60s')
77+
end
78+
79+
it 'includes db_write_timeout when specified' do
80+
deployment_manifest_fragment['diego']['locket']['sql']['db_write_timeout'] = '60'
81+
rendered_template_json = JSON.parse(rendered_template)
82+
expect(rendered_template_json['db_write_timeout']).to eq('60s')
83+
end
84+
end
85+
86+
describe 'basic configuration' do
87+
it 'renders a valid JSON config' do
88+
rendered_template_json = JSON.parse(rendered_template)
89+
expect(rendered_template_json['listen_address']).to eq('0.0.0.0:8891')
90+
expect(rendered_template_json['database_driver']).to eq('postgres')
91+
expect(rendered_template_json['max_open_database_connections']).to eq(200)
92+
end
93+
end
94+
end
95+
end

0 commit comments

Comments
 (0)