flok 0.0.47 → 0.0.48
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 +26 -0
- data/docs/services/vm.md +10 -0
- data/lib/flok/version.rb +1 -1
- data/spec/kern/assets/vm/controller19c.rb +29 -0
- data/spec/kern/vm_service_spec.rb +36 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34017063eb6a9e0ec5c835b31f20820df152548a
|
4
|
+
data.tar.gz: d7752b56cb6586b4a4baf5888fcfa2d6a860057b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9863c2d44654803d8bca864379b186592672e58c26b686425420a02e4fa0391779ee6358d58fe19ac271ffa0aa84b0c741c41d57da1f721f538acd838de2cc2
|
7
|
+
data.tar.gz: 5a9d6c902aa19887b2b70ce2f7df69e26a6364a85e6a60c55b073c2270d420c5d8fcd5a454af1567b0d14d1d522d55be6fb2e31a3d3697b9198caa081af3f3a7
|
data/app/kern/services/vm.rb
CHANGED
@@ -81,6 +81,13 @@ service :vm do
|
|
81
81
|
//Part of the persist module
|
82
82
|
//res is page
|
83
83
|
function int_per_get_res(s, ns, res) {
|
84
|
+
//Controller made a read_sync request, fulfull it
|
85
|
+
if (read_sync_in_progress !== undefined) {
|
86
|
+
|
87
|
+
int_event(read_sync_in_progress, "read_sync_res", {page: res, ns: ns});
|
88
|
+
read_sync_in_progress = undefined;
|
89
|
+
}
|
90
|
+
|
84
91
|
//If the key didn't exist, ignore it
|
85
92
|
if (res === null) { return; }
|
86
93
|
|
@@ -579,6 +586,25 @@ service :vm do
|
|
579
586
|
<% end %>
|
580
587
|
}
|
581
588
|
|
589
|
+
on "read_sync", %{
|
590
|
+
<% if @debug %>
|
591
|
+
if (params.id === undefined) {
|
592
|
+
throw "You need to pass an id for the page in read_sync request";
|
593
|
+
}
|
594
|
+
|
595
|
+
if (params.ns === undefined) {
|
596
|
+
throw "You need to pass an ns for the page in read_sync request";
|
597
|
+
}
|
598
|
+
<% end %>
|
599
|
+
|
600
|
+
read_sync_in_progress = bp;
|
601
|
+
var cache_entry = vm_cache[params.ns][params.id];
|
602
|
+
if (cache_entry !== undefined) {
|
603
|
+
int_event(bp, "read_sync_res", {ns: params.ns, page: cache_entry});
|
604
|
+
} else {
|
605
|
+
SEND("main", "if_per_get", "vm", params.ns, params.id);
|
606
|
+
}
|
607
|
+
}
|
582
608
|
|
583
609
|
on "unwatch", %{
|
584
610
|
<% raise "No pagers given in options for vm" unless @options[:pagers] %>
|
data/docs/services/vm.md
CHANGED
@@ -150,6 +150,16 @@ use the modification helpers. These modification helpers implement copy on write
|
|
150
150
|
* Spec helpers
|
151
151
|
* If in `@debug` mode, the variable `vm_write_list` contains an array dictionary of the last page passed to the pager (tail is latest).
|
152
152
|
|
153
|
+
###`read_sync`
|
154
|
+
Read from the disk synchronously, or memory if it exists, and return the value in `read_sync_res`. This will not watch the page.
|
155
|
+
* Parameters
|
156
|
+
* `ns` - Namespace of the page
|
157
|
+
* `id` - id of the page
|
158
|
+
* Event Responses
|
159
|
+
* `read_sync_res`
|
160
|
+
* `ns` - The namespace of the page, e.g. 'user'
|
161
|
+
* `page` - The page that was retrieved (or null if it dosen't exist)
|
162
|
+
|
153
163
|
##Cache
|
154
164
|
See below with `vm_cache_write` for how to write to the cache. Each pager can choose whether or not to cache; some pagers may cache only reads while others will cache writes. Failure to write to the cache at all will cause `watch` to never trigger. Some pagers may use a trick where writes are allowed, and go directly to the cache but nowhere else. This is to allow things like *pending* transactions where you can locally fake data until a server response is received which will both wipe the fake write and insert the new one. Cache writes will trigger `watch`; if you write to cache with `vm_cache_write` with a page that has the same `_hash` as a page that already exists in cache, no `watch` events will be triggered. Additionally, calling `vm_cache_write` with a non-modified page will result in no performance penalty. `vm_cache_write` notifies controllers asynchronously and is not effected by the `watch` flag on controllers.
|
155
165
|
|
data/lib/flok/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
controller :my_controller do
|
2
|
+
services :vm
|
3
|
+
|
4
|
+
on_entry %{
|
5
|
+
read_sync_res_params = [];
|
6
|
+
}
|
7
|
+
|
8
|
+
action :my_action do
|
9
|
+
on_entry %{
|
10
|
+
var info = {
|
11
|
+
ns: "spec",
|
12
|
+
id: "test"
|
13
|
+
}
|
14
|
+
|
15
|
+
var info2 = {
|
16
|
+
ns: "spec",
|
17
|
+
id: "test2"
|
18
|
+
}
|
19
|
+
|
20
|
+
Request("vm", "read_sync", info);
|
21
|
+
|
22
|
+
Request("vm", "read_sync", info2);
|
23
|
+
}
|
24
|
+
|
25
|
+
on "read_sync_res", %{
|
26
|
+
read_sync_res_params.push(params);
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
@@ -655,6 +655,42 @@ RSpec.describe "kern:vm_service" do
|
|
655
655
|
@driver.mexpect("if_per_get", ["vm", "spec", "test"], 2)
|
656
656
|
end
|
657
657
|
|
658
|
+
it "Does send a read request from disk cache when synchronously reading a key for the first time" do
|
659
|
+
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller19c.rb'), File.read("./spec/kern/assets/vm/config4.rb")
|
660
|
+
|
661
|
+
ctx.eval %{
|
662
|
+
base = _embed("my_controller", 1, {}, null);
|
663
|
+
|
664
|
+
//Call pageout *now*
|
665
|
+
vm_pageout();
|
666
|
+
|
667
|
+
//Drain queue
|
668
|
+
int_dispatch([]);
|
669
|
+
}
|
670
|
+
|
671
|
+
@driver.ignore_up_to "if_per_get", 0
|
672
|
+
@driver.mexpect("if_per_get", ["vm", "spec", "test"], 0)
|
673
|
+
|
674
|
+
@driver.int "int_per_get_res", ["vm", "spec", {
|
675
|
+
"_id" => "default",
|
676
|
+
"_hash" => nil,
|
677
|
+
"_next" => nil,
|
678
|
+
"entries" => [],
|
679
|
+
}]
|
680
|
+
|
681
|
+
@driver.ignore_up_to "if_per_get", 0
|
682
|
+
@driver.mexpect("if_per_get", ["vm", "spec", "test2"], 0)
|
683
|
+
|
684
|
+
dump = ctx.evald %{
|
685
|
+
dump.read_sync_in_progress = read_sync_in_progress;
|
686
|
+
dump.read_sync_res_params = read_sync_res_params;
|
687
|
+
}
|
688
|
+
|
689
|
+
expect(dump["read_sync_in_progress"]).to eq(nil)
|
690
|
+
expect(dump["read_sync_res_params"][0]["ns"]).to eq("spec")
|
691
|
+
expect(dump["read_sync_res_params"][0]["page"]["_id"]).to eq("default")
|
692
|
+
end
|
693
|
+
|
658
694
|
it "Does send a sync read request from disk cache when watching a key for the first time with sync: true" do
|
659
695
|
ctx = flok_new_user File.read('./spec/kern/assets/vm/controller19b.rb'), File.read("./spec/kern/assets/vm/config4.rb")
|
660
696
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.48
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- seo
|
@@ -1207,6 +1207,7 @@ files:
|
|
1207
1207
|
- spec/kern/assets/vm/controller18.rb
|
1208
1208
|
- spec/kern/assets/vm/controller19.rb
|
1209
1209
|
- spec/kern/assets/vm/controller19b.rb
|
1210
|
+
- spec/kern/assets/vm/controller19c.rb
|
1210
1211
|
- spec/kern/assets/vm/controller2.rb
|
1211
1212
|
- spec/kern/assets/vm/controller20.rb
|
1212
1213
|
- spec/kern/assets/vm/controller21.rb
|
@@ -2117,6 +2118,7 @@ test_files:
|
|
2117
2118
|
- spec/kern/assets/vm/controller18.rb
|
2118
2119
|
- spec/kern/assets/vm/controller19.rb
|
2119
2120
|
- spec/kern/assets/vm/controller19b.rb
|
2121
|
+
- spec/kern/assets/vm/controller19c.rb
|
2120
2122
|
- spec/kern/assets/vm/controller2.rb
|
2121
2123
|
- spec/kern/assets/vm/controller20.rb
|
2122
2124
|
- spec/kern/assets/vm/controller21.rb
|