flok 0.0.70 → 0.0.71

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c9f261a2ac31edfd21f064be57fb220825ab161
4
- data.tar.gz: 8772a24eeee08c527703bd1a512bb64b73885521
3
+ metadata.gz: 3a7905b48da7599f5f6f62357affb30856c22cf7
4
+ data.tar.gz: 340d2d3ddf2cf4d564959a0b9d553dd9fb6eb7f2
5
5
  SHA512:
6
- metadata.gz: 7e192dd155ce89611416bc62c2cc375641232c0f1fb6d5b67a9e3c40c9da14e35ec38af950ce9c9b8e9054c52d5a4d7082294eb50ee9ff2642a0115826df8402
7
- data.tar.gz: 3c2b238399f9c9148980f55f2b345e9c88b3a42295c16257daf87eaf0d6f0bd27bc6187eebd9c94cecd0a2e8b876e73cbdaf9d1ddf05a57a9f21c2830efa5e1b
6
+ metadata.gz: 48ac928647f77627085badb6eb35d7b419e4bd523b9772a146476a95f6cd4571f723cd986d105643b79d4c12d2b5c1fa62c09c186bc5a3288f5402c8d5d5b682
7
+ data.tar.gz: ba8832ae43f3fa6855036ce0a273041826d7eb30db5ebd843472190da32df5db0537072487d9fbe9f1489325de891254aff6c2faf119fc54664256b44081fdc6
@@ -17,7 +17,9 @@
17
17
  }
18
18
 
19
19
  function pg_spec<%= i %>_write(page) {
20
+ vm_transaction_begin();
20
21
  vm_cache_write(pg_spec<%= i %>_ns, page);
22
+ vm_transaction_end();
21
23
  }
22
24
  <% end %>
23
25
  <% end %>
@@ -109,7 +109,8 @@ This is how you **read a page** and **request notifications for any updates to a
109
109
  Likewise, a `sync` watch request is perfectly acceptible to be called many times for a new controller needing the information. There is little
110
110
  performance benefit in locally caching the data and many drawbacks like not getting updates of changes.
111
111
  * Event Responses
112
- * `read_res` - Whenever a change occurs to a page or the first read.
112
+ * `read_res` - Whenever a change occurs to a page or the first read. If `sync` is true, the page may be `{}` which indicates that no page existed
113
+ when sync was called (really an illegal condition, you should never use sync unless it's cached)
113
114
  * Returns an immutable page in params
114
115
 
115
116
  ###`unwatch`
@@ -137,7 +138,7 @@ requested. This is because a cached page will be returned by the call stack whil
137
138
  * `id` - id of the page
138
139
  * Event Responses
139
140
  * `read_res`
140
- * `entire params` - The page that was retrieved (or null if it dosen't exist)
141
+ * `entire params` - The page that was retrieved (or `{}` if it dosen't exist)
141
142
 
142
143
  ##Cache
143
144
  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.
@@ -1,3 +1,3 @@
1
1
  module Flok
2
- VERSION = "0.0.70"
2
+ VERSION = "0.0.71"
3
3
  end
@@ -0,0 +1,46 @@
1
+ controller :my_controller do
2
+ spots "content"
3
+ services :vm
4
+
5
+ on_entry %{
6
+ read_res_params = [];
7
+ }
8
+
9
+ action :my_action do
10
+ on_entry %{
11
+ page0 = {
12
+ ns: "spec",
13
+ id: "my_key",
14
+ sync: true
15
+ };
16
+
17
+ Request("vm", "watch", page0);
18
+ }
19
+
20
+ on "read_res", %{
21
+ read_res_params.push(params);
22
+ }
23
+ end
24
+ end
25
+
26
+ controller :my_other_controller do
27
+ services "vm"
28
+
29
+ action :index do
30
+ #Make changes to page, read_res should be called a second
31
+ #time (asynchronously)
32
+ on "modify_page", %{
33
+ var p = vm_create_page("my_key");
34
+ p.entries.push({
35
+ _id: "test",
36
+ _sig: "test",
37
+ value: "test"
38
+ });
39
+ var info = {
40
+ ns: "spec",
41
+ page: p
42
+ }
43
+ Request("vm", "write", info);
44
+ }
45
+ end
46
+ end
@@ -1037,14 +1037,20 @@ RSpec.describe "kern:vm_service" do
1037
1037
  end
1038
1038
 
1039
1039
  it "A watch request with the sync flag enabled does return the page to read_res followed by all future changes being sent asynchronously" do
1040
- ctx = flok_new_user File.read('./spec/kern/assets/vm/controller8ws.rb'), File.read("./spec/kern/assets/vm/config4.rb")
1040
+ ctx = flok_new_user File.read('./spec/kern/assets/vm/controller8ws2.rb'), File.read("./spec/kern/assets/vm/config4.rb")
1041
1041
 
1042
1042
  ctx.eval %{
1043
1043
  base = _embed("my_controller", 1, {}, null);
1044
1044
 
1045
+ //We need another controller, plans to synchronously dispatch
1046
+ //changes within the same controller
1047
+ other_base = _embed("my_other_controller", base+2, {}, null);
1048
+
1045
1049
  //Drain queue
1046
1050
  int_dispatch([]);
1047
1051
  }
1052
+ base = ctx.eval("base")
1053
+ other_base = ctx.eval("other_base")
1048
1054
 
1049
1055
  @driver.ignore_up_to "if_per_get", 0
1050
1056
  @driver.mexpect("if_per_get", ["vm", "spec", "my_key"], 0)
@@ -1068,6 +1074,24 @@ RSpec.describe "kern:vm_service" do
1068
1074
  read_res_params = ctx.dump "read_res_params"
1069
1075
  expect(read_res_params[0]["_id"]).to eq("my_key")
1070
1076
  expect(read_res_params.length).to eq(1)
1077
+
1078
+ #Signal controller to modify page
1079
+ @driver.int "int_event", [other_base, "modify_page", {}]
1080
+
1081
+ #Expect nothing to show up yet (should be dispatched asynchrosouly and will show up after int_dispatch
1082
+ read_res_params = ctx.dump "read_res_params"
1083
+ expect(read_res_params.length).to eq(1)
1084
+
1085
+ #Dispatch any pending async
1086
+ #(This should trigger an additional read_res)
1087
+ @ctx.eval %{
1088
+ for (var i = 0; i < 100; ++i) {
1089
+ int_dispatch([]);
1090
+ }
1091
+ }
1092
+
1093
+ read_res_params = ctx.dump "read_res_params"
1094
+ expect(read_res_params.length).to eq(2)
1071
1095
  end
1072
1096
 
1073
1097
  it "Clears the dirty page when pageout runs" do
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.70
4
+ version: 0.0.71
5
5
  platform: ruby
6
6
  authors:
7
7
  - seo
@@ -1226,6 +1226,7 @@ files:
1226
1226
  - spec/kern/assets/vm/controller8.rb
1227
1227
  - spec/kern/assets/vm/controller8b.rb
1228
1228
  - spec/kern/assets/vm/controller8ws.rb
1229
+ - spec/kern/assets/vm/controller8ws2.rb
1229
1230
  - spec/kern/assets/vm/controller9.rb
1230
1231
  - spec/kern/assets/vm/controller_exc_2watch.rb
1231
1232
  - spec/kern/assets/vm/controller_exc_ewatch.rb
@@ -2162,6 +2163,7 @@ test_files:
2162
2163
  - spec/kern/assets/vm/controller8.rb
2163
2164
  - spec/kern/assets/vm/controller8b.rb
2164
2165
  - spec/kern/assets/vm/controller8ws.rb
2166
+ - spec/kern/assets/vm/controller8ws2.rb
2165
2167
  - spec/kern/assets/vm/controller9.rb
2166
2168
  - spec/kern/assets/vm/controller_exc_2watch.rb
2167
2169
  - spec/kern/assets/vm/controller_exc_ewatch.rb