69
69
aae_merge_root /2 ,
70
70
aae_merge_branches /3 ,
71
71
aae_fetch_clocks /3 ,
72
+ aae_fetch_clocks /4 ,
72
73
aae_range_tree /7 ,
73
74
aae_range_clocks /5 ,
74
75
aae_range_replkeys /5 ,
@@ -299,7 +300,7 @@ rt_enqueue(Rhc, Bucket, Key, Options) ->
299
300
aae_merge_root (Rhc , NVal ) ->
300
301
Url = make_cached_aae_url (Rhc , root , NVal , undefined ),
301
302
302
- case request (get , Url , [" 200" ], [], [], Rhc ) of
303
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
303
304
{ok , _Status , _Headers , Body } ->
304
305
{struct , Response } = mochijson2 :decode (Body ),
305
306
{ok , erlify_aae_root (Response )};
@@ -317,16 +318,16 @@ aae_merge_root(Rhc, NVal) ->
317
318
aae_merge_branches (Rhc , NVal , Branches ) ->
318
319
Url = make_cached_aae_url (Rhc , branch , NVal , Branches ),
319
320
320
- case request (get , Url , [" 200" ], [], [], Rhc ) of
321
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
321
322
{ok , _Status , _Headers , Body } ->
322
323
{struct , Response } = mochijson2 :decode (Body ),
323
324
{ok , erlify_aae_branches (Response )};
324
325
{error , Error } ->
325
326
{error , Error }
326
327
end .
327
328
328
- % % @doc get the aae merged branches for the given `NVal', restricted
329
- % % to the given list of `Branches '
329
+ % % @doc fetch the keys and clocks for the given `NVal', restricted
330
+ % % to the given list of `Segments '
330
331
-spec aae_fetch_clocks (rhc (),
331
332
NVal :: pos_integer (),
332
333
Segments :: list (pos_integer ())) ->
@@ -335,7 +336,26 @@ aae_merge_branches(Rhc, NVal, Branches) ->
335
336
aae_fetch_clocks (Rhc , NVal , Segments ) ->
336
337
Url = make_cached_aae_url (Rhc , keysclocks , NVal , Segments ),
337
338
338
- case request (get , Url , [" 200" ], [], [], Rhc ) of
339
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
340
+ {ok , _Status , _Headers , Body } ->
341
+ {struct , Response } = mochijson2 :decode (Body ),
342
+ {ok , erlify_aae_keysclocks (Response )};
343
+ {error , Error } ->
344
+ {error , Error }
345
+ end .
346
+
347
+ % % @doc fetch the keys and clocks for the given `NVal', restricted
348
+ % % to the given list of `Segments' and by a modified range
349
+ -spec aae_fetch_clocks (rhc (),
350
+ NVal :: pos_integer (),
351
+ Segments :: list (pos_integer ()),
352
+ ModifiedRange :: modified_range ()) ->
353
+ {ok , {keysclocks , [{{riakc_obj :bucket (), riakc_obj :key ()}, binary ()}]}} |
354
+ {error , any ()}.
355
+ aae_fetch_clocks (Rhc , NVal , Segments , ModifiedRange ) ->
356
+ Url =
357
+ make_cached_aae_url (Rhc , keysclocks , NVal , {Segments , ModifiedRange }),
358
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
339
359
{ok , _Status , _Headers , Body } ->
340
360
{struct , Response } = mochijson2 :decode (Body ),
341
361
{ok , erlify_aae_keysclocks (Response )};
@@ -381,7 +401,7 @@ aae_range_tree(Rhc, BucketAndType, KeyRange,
381
401
" ?filter=" , encode_aae_range_filter (KeyRange , SegmentFilter , ModifiedRange , HashMethod )
382
402
]),
383
403
384
- case request (get , Url , [" 200" ], [], [], Rhc ) of
404
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
385
405
{ok , _Status , _Headers , Body } ->
386
406
{struct , Response } = mochijson2 :decode (Body ),
387
407
{ok , erlify_aae_tree (Response )};
@@ -404,7 +424,7 @@ aae_range_clocks(Rhc, BucketAndType, KeyRange, SegmentFilter, ModifiedRange) ->
404
424
" ?filter=" , encode_aae_range_filter (KeyRange , SegmentFilter , ModifiedRange , undefined )
405
425
]),
406
426
407
- case request (get , Url , [" 200" ], [], [], Rhc ) of
427
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
408
428
{ok , _Status , _Headers , Body } ->
409
429
{struct , Response } = mochijson2 :decode (Body ),
410
430
{ok , erlify_aae_keysclocks (Response )};
@@ -436,7 +456,7 @@ aae_range_replkeys(Rhc, BucketType, KeyRange, ModifiedRange, QueueName) ->
436
456
encode_aae_range_filter (KeyRange , all , ModifiedRange , undefined )
437
457
]),
438
458
439
- case request (get , Url , [" 200" ], [], [], Rhc ) of
459
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
440
460
{ok , _Status , _Headers , Body } ->
441
461
{struct , Response } = mochijson2 :decode (Body ),
442
462
[{<<" dispatched_count" >>, DispatchedCount }] = Response ,
@@ -486,7 +506,7 @@ aae_find_keys(Rhc, BucketAndType, KeyRange, ModifiedRange, Query) ->
486
506
" ?filter=" , encode_aae_find_keys_filter (KeyRange , undefined , ModifiedRange )
487
507
]),
488
508
489
- case request (get , Url , [" 200" ], [], [], Rhc ) of
509
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
490
510
{ok , _Status , _Headers , Body } ->
491
511
{struct , Response } = mochijson2 :decode (Body ),
492
512
{ok , erlify_aae_find_keys (Response )};
@@ -520,7 +540,7 @@ aae_find_tombs(Rhc, BucketAndType, KeyRange, SegmentFilter, ModifiedRange) ->
520
540
ModifiedRange )
521
541
]),
522
542
523
- case request (get , Url , [" 200" ], [], [], Rhc ) of
543
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
524
544
{ok , _Status , _Headers , Body } ->
525
545
{struct , Response } = mochijson2 :decode (Body ),
526
546
{ok , erlify_aae_find_keys (Response )};
@@ -566,7 +586,7 @@ aae_reap_tombs(Rhc,
566
586
ChangeMethod )
567
587
]),
568
588
569
- case request (get , Url , [" 200" ], [], [], Rhc ) of
589
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
570
590
{ok , _Status , _Headers , Body } ->
571
591
{struct , Response } = mochijson2 :decode (Body ),
572
592
[{<<" dispatched_count" >>, DispatchedCount }] = Response ,
@@ -613,7 +633,7 @@ aae_erase_keys(Rhc,
613
633
ChangeMethod )
614
634
]),
615
635
616
- case request (get , Url , [" 200" ], [], [], Rhc ) of
636
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
617
637
{ok , _Status , _Headers , Body } ->
618
638
{struct , Response } = mochijson2 :decode (Body ),
619
639
[{<<" dispatched_count" >>, DispatchedCount }] = Response ,
@@ -655,7 +675,7 @@ aae_object_stats(Rhc, BucketAndType, KeyRange, ModifiedRange) ->
655
675
" ?filter=" , encode_aae_find_keys_filter (KeyRange , undefined , ModifiedRange )
656
676
]),
657
677
658
- case request (get , Url , [" 200" ], [], [], Rhc ) of
678
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
659
679
{ok , _Status , _Headers , Body } ->
660
680
{struct , Response } = mochijson2 :decode (Body ),
661
681
{ok , {stats , erlify_aae_object_stats (Response )}};
@@ -681,7 +701,7 @@ aae_list_buckets(Rhc, MinNVal) when is_integer(MinNVal), MinNVal > 0 ->
681
701
" ?filter=" , integer_to_list (MinNVal )]),
682
702
aae_list_buckets (Rhc , Url );
683
703
aae_list_buckets (Rhc , Url ) when is_list (Url ) ->
684
- case request (get , Url , [" 200" ], [], [], Rhc ) of
704
+ case request (get , Url , [" 200" ], [], [], Rhc , ? AAEFOLD_TIMEOUT ) of
685
705
{ok , _Status , _Headers , Body } ->
686
706
{struct , [{<<" results" >>, Response }]} = mochijson2 :decode (Body ),
687
707
{ok , erlify_aae_buckets (Response )};
@@ -1355,25 +1375,51 @@ make_rtenqueue_url(Rhc=#rhc{}, BucketAndType, Key, Query) ->
1355
1375
-spec make_cached_aae_url (rhc (),
1356
1376
root | branch | keysclocks ,
1357
1377
NVal :: pos_integer (),
1358
- Filter :: proplists :proplist ()|undefined ) ->
1378
+ IDs :: list (non_neg_integer ())|
1379
+ undefined |
1380
+ {list (non_neg_integer ()),
1381
+ modified_range ()}) ->
1359
1382
iolist ().
1360
- make_cached_aae_url (Rhc , Type , NVal , Filter ) ->
1383
+ make_cached_aae_url (Rhc , Type , NVal , undefined ) ->
1384
+ complete_cached_aae_url (Rhc , NVal , Type , []);
1385
+ make_cached_aae_url (Rhc , Type , NVal , IDs ) when is_list (IDs ) ->
1386
+ Filter = [" ?filter=" , encode_aae_cached_filter (IDs )],
1387
+ complete_cached_aae_url (Rhc , NVal , Type , Filter );
1388
+ make_cached_aae_url (Rhc , Type , NVal , {IDs , ModifiedRange }) ->
1389
+ Filter = [" ?filter=" , encode_aae_cached_filter (IDs , ModifiedRange )],
1390
+ complete_cached_aae_url (Rhc , NVal , Type , Filter ).
1391
+
1392
+
1393
+ complete_cached_aae_url (Rhc , NVal , Type , Filter ) ->
1361
1394
lists :flatten (
1362
1395
[root_url (Rhc ),
1363
1396
" cachedtrees" , " /" , % % the AAE-Fold cachedtrees prefix
1364
1397
" nvals" , " /" ,
1365
1398
integer_to_list (NVal ), " /" ,
1366
1399
atom_to_list (Type ),
1367
- [ [ " ?filter= " , encode_aae_cached_filter ( Filter )] || Filter =/= undefined ]
1400
+ Filter
1368
1401
]).
1369
1402
1403
+
1404
+
1370
1405
% % @doc this is a list of integers. Segment IDs or Branches, but
1371
1406
% % either way, just json encode a list of ints
1372
1407
-spec encode_aae_cached_filter (list (pos_integer ())) -> string ().
1373
1408
encode_aae_cached_filter (Filter ) ->
1374
1409
JSON = mochijson2 :encode (Filter ),
1375
1410
base64 :encode_to_string (lists :flatten (JSON )).
1376
1411
1412
+ -spec encode_aae_cached_filter (list (pos_integer ()),
1413
+ modified_range ()) -> string ().
1414
+ encode_aae_cached_filter (SegmentIDs , ModifiedRange ) ->
1415
+ FilterElems = [EncodeFun (FilterElem ) || {EncodeFun , FilterElem } <-
1416
+ [{fun encode_segment_filter /1 ,
1417
+ {SegmentIDs , large }},
1418
+ {fun encode_modified_range /1 ,
1419
+ ModifiedRange }]],
1420
+ JSON = mochijson2 :encode ({struct , lists :flatten (FilterElems )}),
1421
+ base64 :encode_to_string (iolist_to_binary (JSON )).
1422
+
1377
1423
-spec encode_aae_find_keys_filter (key_range (),
1378
1424
segment_filter () | undefined ,
1379
1425
modified_range ()) ->
@@ -1483,11 +1529,15 @@ make_datatype_url(Rhc, BucketAndType, Key, Query) ->
1483
1529
1484
1530
% % @doc send an ibrowse request
1485
1531
request (Method , Url , Expect , Headers , Body , Rhc ) ->
1532
+ request (Method , Url , Expect , Headers , Body , Rhc , ? DEFAULT_TIMEOUT ).
1533
+
1534
+ request (Method , Url , Expect , Headers , Body , Rhc , Timeout ) ->
1486
1535
AuthHeader = get_auth_header (Rhc # rhc .options ),
1487
1536
SSLOptions = get_ssl_options (Rhc # rhc .options ),
1488
1537
Accept = {" Accept" , " multipart/mixed, */*;q=0.9" },
1489
1538
case ibrowse :send_req (Url , [Accept |Headers ] ++ AuthHeader , Method , Body ,
1490
- [{response_format , binary }] ++ SSLOptions ) of
1539
+ [{response_format , binary }] ++ SSLOptions ,
1540
+ Timeout ) of
1491
1541
Resp = {ok , Status , _ , _ } ->
1492
1542
case lists :member (Status , Expect ) of
1493
1543
true -> Resp ;
0 commit comments