flok 0.0.80 → 0.0.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/kern/services/vm.rb +47 -1
- data/lib/flok/version.rb +1 -1
- data/spec/kern/assets/vm/config5d.rb +19 -0
- data/spec/kern/vm_service_unsynced_persist_spec.rb +253 -0
- data/spec/kern/vm_service_unsynced_spec.rb +3 -3
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34171632263d52984e5054c52cbe49a8a211a128
|
4
|
+
data.tar.gz: 864c32e073e18f76e714883b098c5fe8115b1cb7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 572ef58be4f5556a8627ebbbf9bbb5fd8e8088a435ef114bb539befd061f9790e6f39e9dc1b05134a79ed155a681c8688fe2570b45d3517cc8cbfa0f0847bf96
|
7
|
+
data.tar.gz: 479b11b9c06d97ca855c00813aaf7b5eaafa646df33b115df3e19d644c0ef90551bc59d7c6c1fdaf71ce23ce5b86c69963e5f93d2301ff2d4de513f17465a2ec
|
data/app/kern/services/vm.rb
CHANGED
@@ -29,7 +29,6 @@ service :vm do
|
|
29
29
|
<%= p[:namespace] %>: {},
|
30
30
|
<% end %>
|
31
31
|
};
|
32
|
-
|
33
32
|
////////////////////////////////////////////////////////////////////////////////////////////
|
34
33
|
|
35
34
|
//Cache
|
@@ -118,6 +117,22 @@ service :vm do
|
|
118
117
|
//Part of the persist module
|
119
118
|
//res is page
|
120
119
|
function int_per_get_res(s, ns, id, res) {
|
120
|
+
if (ns === "__reserved__") {
|
121
|
+
if (id === "vm_unsynced") {
|
122
|
+
var old_vm_unsynced = vm_unsynced;
|
123
|
+
vm_unsynced = res;
|
124
|
+
|
125
|
+
<% @options[:pagers].each do |p| %>
|
126
|
+
var old_vm_unsynced_ns = old_vm_unsynced.<%= p[:namespace] %>;
|
127
|
+
var ids = Object.keys(old_vm_unsynced_ns);
|
128
|
+
for (var i = 0; i < ids.length; ++i) {
|
129
|
+
vm_unsynced.<%= p[:namespace] %>[ids[i]] = old_vm_unsynced_ns[ids[i]];
|
130
|
+
}
|
131
|
+
<% end %>
|
132
|
+
}
|
133
|
+
return;
|
134
|
+
}
|
135
|
+
|
121
136
|
if (res !== null) {
|
122
137
|
//Write out to the cache
|
123
138
|
vm_transaction_begin();
|
@@ -517,7 +532,12 @@ service :vm do
|
|
517
532
|
<% end %>
|
518
533
|
};
|
519
534
|
|
535
|
+
//Does it need to be written to disk?
|
536
|
+
vm_unsynced_is_dirty = false;
|
537
|
+
|
520
538
|
function vm_pg_mark_needs_sync(ns, page_id) {
|
539
|
+
vm_unsynced_is_dirty = true;
|
540
|
+
|
521
541
|
//Add to list
|
522
542
|
vm_unsynced[ns][page_id] = 0;
|
523
543
|
|
@@ -538,6 +558,8 @@ service :vm do
|
|
538
558
|
}
|
539
559
|
|
540
560
|
function vm_pg_unmark_needs_sync(ns, page_id) {
|
561
|
+
vm_unsynced_is_dirty = true;
|
562
|
+
|
541
563
|
delete vm_unsynced[ns][page_id];
|
542
564
|
}
|
543
565
|
|
@@ -557,6 +579,25 @@ service :vm do
|
|
557
579
|
}
|
558
580
|
<% end %>
|
559
581
|
}
|
582
|
+
|
583
|
+
vm_unsynced_paged_in = false;
|
584
|
+
function vm_pg_sync_pagein() {
|
585
|
+
//Only pages-in if necessary
|
586
|
+
if (vm_unsynced_paged_in === false) {
|
587
|
+
vm_unsynced_paged_in = true;
|
588
|
+
|
589
|
+
//Send a disk read request
|
590
|
+
SEND("disk", "if_per_get", "vm", "__reserved__", "vm_unsynced");
|
591
|
+
}
|
592
|
+
}
|
593
|
+
|
594
|
+
function vm_pg_sync_pageout() {
|
595
|
+
//Only page-out if necessary
|
596
|
+
if (vm_unsynced_is_dirty === true) {
|
597
|
+
vm_unsynced_is_dirty = false;
|
598
|
+
SEND("disk", "if_per_set", "__reserved__", "vm_unsynced", JSON.stringify(vm_unsynced));
|
599
|
+
}
|
600
|
+
}
|
560
601
|
///////////////////////////////////////////////////////////////////////////
|
561
602
|
}
|
562
603
|
|
@@ -765,5 +806,10 @@ service :vm do
|
|
765
806
|
every 20.seconds, %{
|
766
807
|
vm_pageout();
|
767
808
|
vm_pg_sync_wakeup();
|
809
|
+
vm_pg_sync_pageout();
|
810
|
+
}
|
811
|
+
|
812
|
+
every 2.seconds, %{
|
813
|
+
vm_pg_sync_pagein();
|
768
814
|
}
|
769
815
|
end
|
data/lib/flok/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
#Simple service config that uses built-in spec service to create a instance called 'spec'
|
2
|
+
service_instance :vm, :vm, {
|
3
|
+
:pagers => [
|
4
|
+
{
|
5
|
+
:name => "pg_spec0",
|
6
|
+
:namespace => "spec",
|
7
|
+
:options => {
|
8
|
+
"hello" => "world"
|
9
|
+
}
|
10
|
+
},
|
11
|
+
{
|
12
|
+
:name => "pg_spec1",
|
13
|
+
:namespace => "spec1",
|
14
|
+
:options => {
|
15
|
+
"hello" => "world"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
]
|
19
|
+
}
|
@@ -0,0 +1,253 @@
|
|
1
|
+
#The vm service unsynced to ensure that the unsynced survives a restart
|
2
|
+
#by saving to the disk cache
|
3
|
+
|
4
|
+
Dir.chdir File.join File.dirname(__FILE__), '../../'
|
5
|
+
require './spec/env/kern.rb'
|
6
|
+
require './spec/lib/helpers.rb'
|
7
|
+
require './spec/lib/io_extensions.rb'
|
8
|
+
require './spec/lib/rspec_extensions.rb'
|
9
|
+
require 'zlib'
|
10
|
+
|
11
|
+
RSpec.describe "kern:vm_service unsynced (persist)" do
|
12
|
+
include Zlib
|
13
|
+
include_context "kern"
|
14
|
+
|
15
|
+
it "Should have called vm_pg_sync_pagein after 2 seconds" do
|
16
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5c.rb")
|
17
|
+
dump = ctx.evald %{
|
18
|
+
//Needed to initialize pagers
|
19
|
+
base = _embed("my_controller", 0, {}, null);
|
20
|
+
}
|
21
|
+
|
22
|
+
#Should not be loaded at this time
|
23
|
+
expect(ctx.eval("vm_unsynced_paged_in")).to eq(false)
|
24
|
+
|
25
|
+
#Call the timer for 2 seconds (should invoke the load for the pg_spec0_sync_request)
|
26
|
+
(2*4).times do
|
27
|
+
@driver.int "int_timer", []
|
28
|
+
end
|
29
|
+
|
30
|
+
#Should be loaded at this time
|
31
|
+
expect(ctx.eval("vm_unsynced_paged_in")).to eq(true)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "vm_pg_sync_pagein should make a disk request; and only once if called multiple times" do
|
35
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5c.rb")
|
36
|
+
dump = ctx.evald %{
|
37
|
+
//Needed to initialize pagers
|
38
|
+
base = _embed("my_controller", 0, {}, null);
|
39
|
+
|
40
|
+
vm_pg_sync_pagein();
|
41
|
+
vm_pg_sync_pagein();
|
42
|
+
|
43
|
+
int_dispatch([]);
|
44
|
+
}
|
45
|
+
|
46
|
+
#Should be loaded (manually called)
|
47
|
+
expect(ctx.eval("vm_unsynced_paged_in")).to eq(true)
|
48
|
+
|
49
|
+
#Should have made a disk request
|
50
|
+
@driver.ignore_up_to "if_per_get", 2
|
51
|
+
|
52
|
+
#Expect a request for the special page that holds vm_unsynced
|
53
|
+
res = @driver.get "if_per_get", 2
|
54
|
+
expect(res[1]).to eq("__reserved__")
|
55
|
+
expect(res[2]).to eq("vm_unsynced")
|
56
|
+
|
57
|
+
@driver.expect_not_to_contain "if_per_get"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "vm_pg_sync_pagein should write out the read to vm_unsynced" do
|
61
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5c.rb")
|
62
|
+
dump = ctx.evald %{
|
63
|
+
//Needed to initialize pagers
|
64
|
+
base = _embed("my_controller", 0, {}, null);
|
65
|
+
|
66
|
+
vm_pg_sync_pagein();
|
67
|
+
|
68
|
+
int_dispatch([]);
|
69
|
+
}
|
70
|
+
|
71
|
+
#Should be loaded (manually called)
|
72
|
+
expect(ctx.eval("vm_unsynced_paged_in")).to eq(true)
|
73
|
+
|
74
|
+
#Expect a request for the special page that holds vm_unsynced
|
75
|
+
@driver.ignore_up_to "if_per_get", 2
|
76
|
+
res = @driver.get "if_per_get", 2
|
77
|
+
expect(res[1]).to eq("__reserved__")
|
78
|
+
expect(res[2]).to eq("vm_unsynced")
|
79
|
+
|
80
|
+
#Return the vm_unsynced
|
81
|
+
@driver.int "int_per_get_res", [
|
82
|
+
"vm",
|
83
|
+
"__reserved__",
|
84
|
+
"vm_unsynced",
|
85
|
+
{
|
86
|
+
"spec" => {
|
87
|
+
"test" => 1
|
88
|
+
}
|
89
|
+
}
|
90
|
+
]
|
91
|
+
|
92
|
+
#Expect vm_unsynced to have loaded the data
|
93
|
+
res = @ctx.dump("vm_unsynced")
|
94
|
+
expect(res).to eq({
|
95
|
+
"spec" => {
|
96
|
+
"test" => 1
|
97
|
+
}
|
98
|
+
})
|
99
|
+
end
|
100
|
+
|
101
|
+
it "vm_pg_sync_pagein should write out the read to vm_unsynced and merge if there are any existing elements" do
|
102
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5d.rb")
|
103
|
+
dump = ctx.evald %{
|
104
|
+
//Needed to initialize pagers
|
105
|
+
base = _embed("my_controller", 0, {}, null);
|
106
|
+
|
107
|
+
vm_pg_sync_pagein();
|
108
|
+
|
109
|
+
vm_unsynced = {
|
110
|
+
"spec": {
|
111
|
+
"foo": 0
|
112
|
+
},
|
113
|
+
|
114
|
+
"spec1": {
|
115
|
+
"bar": 1
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
int_dispatch([]);
|
120
|
+
}
|
121
|
+
|
122
|
+
#Should be loaded (manually called)
|
123
|
+
expect(ctx.eval("vm_unsynced_paged_in")).to eq(true)
|
124
|
+
|
125
|
+
#Expect a request for the special page that holds vm_unsynced
|
126
|
+
@driver.ignore_up_to "if_per_get", 2
|
127
|
+
res = @driver.get "if_per_get", 2
|
128
|
+
expect(res[1]).to eq("__reserved__")
|
129
|
+
expect(res[2]).to eq("vm_unsynced")
|
130
|
+
|
131
|
+
#Return the vm_unsynced
|
132
|
+
@driver.int "int_per_get_res", [
|
133
|
+
"vm",
|
134
|
+
"__reserved__",
|
135
|
+
"vm_unsynced",
|
136
|
+
{
|
137
|
+
"spec" => {
|
138
|
+
"holah" => 1,
|
139
|
+
},
|
140
|
+
"spec1" => {
|
141
|
+
}
|
142
|
+
}
|
143
|
+
]
|
144
|
+
|
145
|
+
#Expect vm_unsynced to have loaded the data
|
146
|
+
res = @ctx.dump("vm_unsynced")
|
147
|
+
expect(res).to eq({
|
148
|
+
"spec" => {
|
149
|
+
"foo" => 0,
|
150
|
+
"holah" => 1,
|
151
|
+
},
|
152
|
+
"spec1" => {
|
153
|
+
"bar" => 1
|
154
|
+
}
|
155
|
+
})
|
156
|
+
end
|
157
|
+
|
158
|
+
it "vm_pg_sync_pageout should save the vm_unsynced data to disk; and only once on multiple calls" do
|
159
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5c.rb")
|
160
|
+
dump = ctx.evald %{
|
161
|
+
//Needed to initialize pagers
|
162
|
+
base = _embed("my_controller", 0, {}, null);
|
163
|
+
|
164
|
+
vm_unsynced = {
|
165
|
+
"spec": {
|
166
|
+
"foo": 0
|
167
|
+
},
|
168
|
+
|
169
|
+
"spec1": {
|
170
|
+
"bar": 1
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
//Request a save
|
175
|
+
vm_unsynced_is_dirty = true;
|
176
|
+
vm_pg_sync_pageout();
|
177
|
+
vm_pg_sync_pageout();
|
178
|
+
|
179
|
+
int_dispatch([]);
|
180
|
+
}
|
181
|
+
|
182
|
+
#Expect a write out
|
183
|
+
@driver.ignore_up_to "if_per_set", 2
|
184
|
+
res = @driver.get "if_per_set", 2
|
185
|
+
expect(res[0]).to eq("__reserved__")
|
186
|
+
expect(res[1]).to eq("vm_unsynced")
|
187
|
+
vm_unsynced_json = res[2]
|
188
|
+
expect(JSON.parse(vm_unsynced_json)).to eq({
|
189
|
+
"spec" => {
|
190
|
+
"foo" => 0
|
191
|
+
},
|
192
|
+
"spec1" => {
|
193
|
+
"bar" => 1
|
194
|
+
}
|
195
|
+
})
|
196
|
+
|
197
|
+
#Should not have two requests
|
198
|
+
@driver.expect_not_to_contain "if_per_set"
|
199
|
+
|
200
|
+
expect(ctx.eval("vm_unsynced_is_dirty")).to eq(false)
|
201
|
+
end
|
202
|
+
|
203
|
+
it "vm_pg_sync_pageout should be called periodically every 20 seconds" do
|
204
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller0.rb'), File.read("./spec/kern/assets/vm/config5c.rb")
|
205
|
+
dump = ctx.evald %{
|
206
|
+
//Needed to initialize pagers
|
207
|
+
base = _embed("my_controller", 0, {}, null);
|
208
|
+
|
209
|
+
vm_unsynced = {
|
210
|
+
"spec": {
|
211
|
+
"foo": 0
|
212
|
+
},
|
213
|
+
|
214
|
+
"spec1": {
|
215
|
+
"bar": 1
|
216
|
+
}
|
217
|
+
}
|
218
|
+
|
219
|
+
//Ensure that pageout is going to be called
|
220
|
+
vm_unsynced_is_dirty = true;
|
221
|
+
|
222
|
+
int_dispatch([]);
|
223
|
+
}
|
224
|
+
|
225
|
+
#Expect no write out yet until 20s have passed
|
226
|
+
@driver.expect_not_to_contain "if_per_set"
|
227
|
+
(20*4).times do
|
228
|
+
@driver.int "int_timer", []
|
229
|
+
end
|
230
|
+
|
231
|
+
#Now we expect a write out as 20s have passed
|
232
|
+
#And the 0s should now be 1 because we called vm_pg_sync_wakeup() right before hand
|
233
|
+
@driver.ignore_up_to "if_per_set"
|
234
|
+
res = @driver.get "if_per_set", 2
|
235
|
+
expect(JSON.parse(res[2])).to eq(
|
236
|
+
"spec" => {
|
237
|
+
"foo" => 1
|
238
|
+
},
|
239
|
+
|
240
|
+
"spec1" => {
|
241
|
+
"bar" => 1
|
242
|
+
}
|
243
|
+
)
|
244
|
+
|
245
|
+
#Wait again 20 seconds
|
246
|
+
(20*4).times do
|
247
|
+
@driver.int "int_timer", []
|
248
|
+
end
|
249
|
+
|
250
|
+
#Expect no write out as we are not dirty
|
251
|
+
@driver.expect_not_to_contain "if_per_set"
|
252
|
+
end
|
253
|
+
end
|
@@ -7,7 +7,7 @@ require './spec/lib/io_extensions.rb'
|
|
7
7
|
require './spec/lib/rspec_extensions.rb'
|
8
8
|
require 'zlib'
|
9
9
|
|
10
|
-
RSpec.describe "kern:vm_service" do
|
10
|
+
RSpec.describe "kern:vm_service unsynced" do
|
11
11
|
include Zlib
|
12
12
|
include_context "kern"
|
13
13
|
|
@@ -110,7 +110,7 @@ RSpec.describe "kern:vm_service" do
|
|
110
110
|
vm_pg_mark_needs_sync("spec", "test");
|
111
111
|
}
|
112
112
|
|
113
|
-
#Call the timer for 1 shot
|
113
|
+
#Call the timer for 1 shot of vm_sync_wakeup
|
114
114
|
(20*4).times do
|
115
115
|
@driver.int "int_timer", []
|
116
116
|
end
|
@@ -118,7 +118,7 @@ RSpec.describe "kern:vm_service" do
|
|
118
118
|
#First time, the vm_pg_sync_wakeup should not have triggered anything (vm_unsynced still set to 0)
|
119
119
|
expect(ctx.dump("pg_spec0_sync_requests")).to eq(["test"])
|
120
120
|
|
121
|
-
#Call the timer for 1 more shot
|
121
|
+
#Call the timer for 1 more shot of vm_sync_wakeup
|
122
122
|
(20*4).times do
|
123
123
|
@driver.int "int_timer", []
|
124
124
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flok
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.81
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- seo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: execjs
|
@@ -1206,6 +1206,7 @@ files:
|
|
1206
1206
|
- spec/kern/assets/vm/config5.rb
|
1207
1207
|
- spec/kern/assets/vm/config5b.rb
|
1208
1208
|
- spec/kern/assets/vm/config5c.rb
|
1209
|
+
- spec/kern/assets/vm/config5d.rb
|
1209
1210
|
- spec/kern/assets/vm/config6.rb
|
1210
1211
|
- spec/kern/assets/vm/controller0.rb
|
1211
1212
|
- spec/kern/assets/vm/controller0_diff.rb
|
@@ -1304,6 +1305,7 @@ files:
|
|
1304
1305
|
- spec/kern/vm_service_mem_pagers_spec.rb
|
1305
1306
|
- spec/kern/vm_service_net_sim_pager_spec.rb
|
1306
1307
|
- spec/kern/vm_service_spec.rb
|
1308
|
+
- spec/kern/vm_service_unsynced_persist_spec.rb
|
1307
1309
|
- spec/kern/vm_service_unsynced_spec.rb
|
1308
1310
|
- spec/kern/vm_sockio_pager_spec.rb
|
1309
1311
|
- spec/kern/vm_transaction_spec.rb
|
@@ -2156,6 +2158,7 @@ test_files:
|
|
2156
2158
|
- spec/kern/assets/vm/config5.rb
|
2157
2159
|
- spec/kern/assets/vm/config5b.rb
|
2158
2160
|
- spec/kern/assets/vm/config5c.rb
|
2161
|
+
- spec/kern/assets/vm/config5d.rb
|
2159
2162
|
- spec/kern/assets/vm/config6.rb
|
2160
2163
|
- spec/kern/assets/vm/controller0.rb
|
2161
2164
|
- spec/kern/assets/vm/controller0_diff.rb
|
@@ -2254,6 +2257,7 @@ test_files:
|
|
2254
2257
|
- spec/kern/vm_service_mem_pagers_spec.rb
|
2255
2258
|
- spec/kern/vm_service_net_sim_pager_spec.rb
|
2256
2259
|
- spec/kern/vm_service_spec.rb
|
2260
|
+
- spec/kern/vm_service_unsynced_persist_spec.rb
|
2257
2261
|
- spec/kern/vm_service_unsynced_spec.rb
|
2258
2262
|
- spec/kern/vm_sockio_pager_spec.rb
|
2259
2263
|
- spec/kern/vm_transaction_spec.rb
|