45
45
alwaysget_keyorder :: key_order |skew_order ,
46
46
unique_size :: integer (),
47
47
unique_keyorder :: key_order |skew_order ,
48
+ postcode_indexcount = 3 :: pos_integer (),
48
49
postcodeq_count = 0 :: integer (),
49
50
postcodeq_sum = 0 :: integer (),
50
51
dobq_count = 0 :: integer (),
60
61
last_forceaae = os :timestamp () :: erlang :timestamp ()
61
62
}).
62
63
63
- -define (QUERYLOG_FREQ , 1000 ).
64
+ -define (QUERYLOG_FREQ , 10000 ).
64
65
-define (FORCEAAE_FREQ , 10 ). % Every 10 seconds
65
66
66
67
-define (POSTCODE_AREAS ,
@@ -106,27 +107,39 @@ new(Id) ->
106
107
HTTPTimeout = basho_bench_config :get (http_timeout_general , 30 * 1000 ),
107
108
FoldTimeout = basho_bench_config :get (fold_timeout_general , 60 * 60 * 1000 ),
108
109
110
+ RecordBucket =
111
+ list_to_binary (
112
+ basho_bench_config :get (record_bucket , " domainRecord" )),
113
+ DocumentBucket =
114
+ list_to_binary (
115
+ basho_bench_config :get (document_bucket , " domainDocument" )),
116
+ PostCodeIndexCount =
117
+ basho_bench_config :get (postcode_indexcount , 3 ),
118
+ RecordSyncOnWrite =
119
+ list_to_binary (
120
+ basho_bench_config :get (record_sync , " one" )),
121
+ DocumentSyncOnWrite =
122
+ list_to_binary (
123
+ basho_bench_config :get (document_sync , " backend" )),
124
+ NodeConfirms = basho_bench_config :get (node_confirms , 2 ),
125
+
109
126
% % Choose the target node using our ID as a modulus
110
127
HTTPTargets = basho_bench_config :normalize_ips (HTTPIPs , HTTPPort ),
111
- {HTTPTargetIp ,
112
- HTTPTargetPort } = lists :nth ((Id rem length (HTTPTargets ) + 1 ),
113
- HTTPTargets ),
114
- ? INFO (" Using http target ~p :~p for worker ~p \n " , [HTTPTargetIp ,
115
- HTTPTargetPort ,
116
- Id ]),
128
+ {HTTPTargetIp , HTTPTargetPort } =
129
+ lists :nth ((Id rem length (HTTPTargets ) + 1 ), HTTPTargets ),
130
+ ? INFO (" Using http target ~p :~p for worker ~p \n " ,
131
+ [HTTPTargetIp , HTTPTargetPort , Id ]),
117
132
118
133
% % Choose the target node using our ID as a modulus
119
134
PBTargets = basho_bench_config :normalize_ips (PBIPs , PBPort ),
120
- {PBTargetIp ,
121
- PBTargetPort } = lists :nth ((Id rem length (PBTargets ) + 1 ),
122
- PBTargets ),
123
- ? INFO (" Using pb target ~p :~p for worker ~p \n " , [PBTargetIp ,
124
- PBTargetPort ,
125
- Id ]),
135
+ {PBTargetIp , PBTargetPort } =
136
+ lists :nth ((Id rem length (PBTargets ) + 1 ), PBTargets ),
137
+ ? INFO (" Using pb target ~p :~p for worker ~p \n " ,
138
+ [PBTargetIp , PBTargetPort , Id ]),
139
+
126
140
ReplTargets = basho_bench_config :normalize_ips (ReplPBIPs , PBPort ),
127
- {ReplTargetIp ,
128
- ReplTargetPort } = lists :nth ((Id rem length (ReplTargets ) + 1 ),
129
- ReplTargets ),
141
+ {ReplTargetIp , ReplTargetPort } =
142
+ lists :nth ((Id rem length (ReplTargets ) + 1 ), ReplTargets ),
130
143
? INFO (" Using repl target ~p :~p for worker ~p \n " ,
131
144
[ReplTargetIp , ReplTargetPort , Id ]),
132
145
@@ -135,7 +148,64 @@ new(Id) ->
135
148
{DocSize , DocKeyOrder } =
136
149
basho_bench_config :get (unique , {8000 , key_order }),
137
150
138
- NodeID = basho_bench_config :get (node_name , node ()),
151
+ NodeID = basho_bench_config :get (node_name , node ()),
152
+ Host = inet_parse :ntoa (HTTPTargetIp ),
153
+ URLFun =
154
+ fun (Bucket ) ->
155
+ lists :flatten (
156
+ io_lib :format (" http://~s :~p /buckets/~s /props" ,
157
+ [Host , HTTPTargetPort , Bucket ]))
158
+ end ,
159
+
160
+ case Id of
161
+ 1 ->
162
+ ? INFO (" Node ID 1 to set bucket properties" , []),
163
+ ? INFO (
164
+ " Setting bucket properties for Record using ~s " ,
165
+ [URLFun (RecordBucket )]),
166
+ NodeConfirmsJ =
167
+ mochijson2 :encode (
168
+ {struct ,
169
+ [{<<" props" >>,
170
+ {struct ,
171
+ lists :flatten (
172
+ [{<<" node_confirms" >>, NodeConfirms }])
173
+ }}]}),
174
+ SyncOnWriteFun =
175
+ fun (SyncSetting ) ->
176
+ mochijson2 :encode (
177
+ {struct ,
178
+ [{<<" props" >>,
179
+ {struct ,
180
+ lists :flatten (
181
+ [{<<" sync_on_write" >>, SyncSetting }])
182
+ }}]})
183
+ end ,
184
+ ? INFO (" Setting node_confirms using ~p " , [NodeConfirms ]),
185
+ ibrowse :send_req (
186
+ URLFun (RecordBucket ),
187
+ [{" Content-Type" , " application/json" }],
188
+ put ,
189
+ NodeConfirmsJ ),
190
+ ibrowse :send_req (
191
+ URLFun (RecordBucket ),
192
+ [{" Content-Type" , " application/json" }],
193
+ put ,
194
+ SyncOnWriteFun (RecordSyncOnWrite )),
195
+ ? INFO (" Setting bucket properties for Document Bucket" , []),
196
+ ibrowse :send_req (
197
+ URLFun (DocumentBucket ),
198
+ [{" Content-Type" , " application/json" }],
199
+ put ,
200
+ NodeConfirmsJ ),
201
+ ibrowse :send_req (
202
+ URLFun (DocumentBucket ),
203
+ [{" Content-Type" , " application/json" }],
204
+ put ,
205
+ SyncOnWriteFun (DocumentSyncOnWrite ));
206
+ _ ->
207
+ ok
208
+ end ,
139
209
140
210
KeyIDint = erlang :phash2 (Id ) bxor erlang :phash2 (NodeID ),
141
211
? INFO (" Using Node ID ~w to generate ID ~w \n " , [node (), KeyIDint ]),
@@ -156,8 +226,8 @@ new(Id) ->
156
226
repl_pid = ReplPid ,
157
227
http_host = HTTPTargetIp ,
158
228
http_port = HTTPTargetPort ,
159
- recordBucket = << " domainRecord " >> ,
160
- documentBucket = << " domainDocument " >> ,
229
+ recordBucket = RecordBucket ,
230
+ documentBucket = DocumentBucket ,
161
231
pb_timeout = PBTimeout ,
162
232
http_timeout = HTTPTimeout ,
163
233
fold_timeout = FoldTimeout ,
@@ -170,7 +240,8 @@ new(Id) ->
170
240
alwaysget_keyorder = AGKeyOrder ,
171
241
unique_size = DocSize ,
172
242
unique_keyorder = DocKeyOrder ,
173
- keyid = <<KeyIDint :32 /integer >>
243
+ keyid = <<KeyIDint :32 /integer >>,
244
+ postcode_indexcount = PostCodeIndexCount
174
245
}};
175
246
{error , Reason2 } ->
176
247
? FAIL_MSG (" Failed to connect riakc_pb_socket to ~p port ~p : ~p \n " ,
@@ -282,7 +353,10 @@ run(alwaysget_updatewith2i, _KeyGen, ValueGen, State) ->
282
353
283
354
MD0 = riakc_obj :get_update_metadata (Robj0 ),
284
355
MD1 = riakc_obj :clear_secondary_indexes (MD0 ),
285
- MD2 = riakc_obj :set_secondary_index (MD1 , generate_binary_indexes ()),
356
+ MD2 =
357
+ riakc_obj :set_secondary_index (
358
+ MD1 ,
359
+ generate_binary_indexes (State # state .postcode_indexcount )),
286
360
Robj1 = riakc_obj :update_value (Robj0 , Value ),
287
361
Robj2 = riakc_obj :update_metadata (Robj1 , MD2 ),
288
362
@@ -332,11 +406,7 @@ run(alwaysget_updatewithout2i, _KeyGen, ValueGen, State) ->
332
406
{Robj , AGKC }
333
407
end ,
334
408
335
- % MD0 = riakc_obj:get_update_metadata(Robj0),
336
- % MD1 = riakc_obj:clear_secondary_indexes(MD0),
337
- % MD2 = riakc_obj:set_secondary_index(MD1, generate_binary_indexes()),
338
409
Robj2 = riakc_obj :update_value (Robj0 , Value ),
339
- % Robj2 = riakc_obj:update_metadata(Robj1, MD2),
340
410
341
411
% % Write the object...
342
412
case riakc_pb_socket :put (Pid , Robj2 , State # state .pb_timeout ) of
@@ -364,7 +434,10 @@ run(update_with2i, KeyGen, ValueGen, State) ->
364
434
365
435
MD0 = riakc_obj :get_update_metadata (Robj0 ),
366
436
MD1 = riakc_obj :clear_secondary_indexes (MD0 ),
367
- MD2 = riakc_obj :set_secondary_index (MD1 , generate_binary_indexes ()),
437
+ MD2 =
438
+ riakc_obj :set_secondary_index (
439
+ MD1 ,
440
+ generate_binary_indexes (State # state .postcode_indexcount )),
368
441
Robj1 = riakc_obj :update_value (Robj0 , Value ),
369
442
Robj2 = riakc_obj :update_metadata (Robj1 , MD2 ),
370
443
@@ -397,7 +470,6 @@ run(put_unique_bet365, _KeyGen, _ValueGen, State) ->
397
470
398
471
Robj0 = riakc_obj :new (Bucket , to_binary (Key )),
399
472
MD2 = riakc_obj :get_update_metadata (Robj0 ),
400
- % MD2 = riakc_obj:set_secondary_index(MD1, generate_binary_indexes()),
401
473
Robj1 = riakc_obj :update_value (Robj0 , Value ),
402
474
Robj2 = riakc_obj :update_metadata (Robj1 , MD2 ),
403
475
@@ -473,13 +545,15 @@ run(postcodequery_http, _KeyGen, _ValueGen, State) ->
473
545
Host = inet_parse :ntoa (State # state .http_host ),
474
546
Port = State # state .http_port ,
475
547
Bucket = State # state .recordBucket ,
476
-
548
+
477
549
L = length (? POSTCODE_AREAS ),
478
550
{_ , Area } = lists :keyfind (rand :uniform (L ), 1 , ? POSTCODE_AREAS ),
479
551
District = Area ++ integer_to_list (rand :uniform (26 )),
480
- StartKey = District ++ " |" ++ " a" ,
481
- EndKey = District ++ " |" ++ " h" ,
482
- URL = io_lib :format (" http://~s :~p /buckets/~s /index/postcode_bin/~s /~s " ,
552
+ StartPoints = [" ba" , " ca" , " da" , " ea" , " fa" , " ga" , " gb" , " gc" ],
553
+ StartPoint = lists :nth (rand :uniform (length (StartPoints )), StartPoints ),
554
+ StartKey = District ++ " |" ++ StartPoint ,
555
+ EndKey = District ++ " |" ++ " gd" ,
556
+ URL = io_lib :format (" http://~s :~p /buckets/~s /index/postcode_bin/~s /~s " ,
483
557
[Host , Port , Bucket , StartKey , EndKey ]),
484
558
485
559
case json_get (URL , State # state .http_timeout ) of
@@ -510,9 +584,10 @@ run(dobquery_http, _KeyGen, _ValueGen, State) ->
510
584
Port = State # state .http_port ,
511
585
Bucket = State # state .recordBucket ,
512
586
513
- RandYear = rand :uniform (70 ) + 1950 ,
514
- DoBStart = integer_to_list (RandYear ) ++ " 0101" ,
515
- DoBEnd = integer_to_list (RandYear ) ++ " 0110" ,
587
+ RandYear = integer_to_list (rand :uniform (70 ) + 1950 ),
588
+ RandMonth = integer_to_list (rand :uniform (9 )),
589
+ DoBStart = RandYear ++ " 0" ++ RandMonth ++ " 04" ,
590
+ DoBEnd = RandYear ++ " 0" ++ RandMonth ++ " 05" ,
516
591
517
592
URLSrc =
518
593
" http://~s :~p /buckets/~s /index/dateofbirth_bin/~s /~s ?term_regex=~s " ,
@@ -815,19 +890,22 @@ run_segmentfold(State) ->
815
890
% % ====================================================================
816
891
817
892
generate_binary_indexes () ->
818
- [{{binary_index , " postcode" }, postcode_index ()},
893
+ [{{binary_index , " lastmodified" }, lastmodified_index ()}].
894
+
895
+ generate_binary_indexes (PCIdxCount ) ->
896
+ [{{binary_index , " postcode" }, postcode_index (PCIdxCount )},
819
897
{{binary_index , " dateofbirth" }, dateofbirth_index ()},
820
898
{{binary_index , " lastmodified" }, lastmodified_index ()}].
821
899
822
- postcode_index () ->
900
+ postcode_index (PCIdxCount ) ->
823
901
NotVeryNameLikeThing = base64 :encode_to_string (crypto :strong_rand_bytes (4 )),
824
902
lists :map (fun (_X ) ->
825
903
L = length (? POSTCODE_AREAS ),
826
904
{_ , Area } = lists :keyfind (rand :uniform (L ), 1 , ? POSTCODE_AREAS ),
827
905
District = Area ++ integer_to_list (rand :uniform (26 )),
828
906
F = District ++ " |" ++ NotVeryNameLikeThing ,
829
907
list_to_binary (F ) end ,
830
- lists :seq (1 , rand :uniform (3 ))).
908
+ lists :seq (1 , rand :uniform (PCIdxCount ))).
831
909
832
910
dateofbirth_index () ->
833
911
Delta = rand :uniform (2500000000 ),
0 commit comments