Namdak Tonpa 9 лет назад
Родитель
Сommit
a5a5b8688b
1 измененных файлов с 12 добавлено и 8 удалено
  1. 12 8
      src/kvs.erl

+ 12 - 8
src/kvs.erl

@@ -31,10 +31,11 @@ destroy()          -> destroy (#kvs{mod=?DBA}).
 version()          -> version (#kvs{mod=?DBA}).
 dir()              -> dir     (#kvs{mod=?DBA}).
 next_id(Table,DX)  -> next_id(Table, DX,  #kvs{mod=?DBA}).
-                       % of
-                        %   Id when Id > 1000 -> kvs:rotate(Table);
-                        %                   E -> E end.
 
+generation(Table,Key) ->
+    case Key - topleft(Table,Key) < application:get_env(kvs,generation,250000) of
+         true -> skip;
+         false -> kvs:rotate(Table) end.
 
 % Implementation
 
@@ -139,7 +140,9 @@ link(Record,#kvs{mod=_Store}=Driver) ->
 
 add(Record, #kvs{mod=_Store}=Driver) when is_tuple(Record) ->
     Id = element(#iterator.id, Record),
-    case kvs:get(rname(element(1,Record)), Id, Driver) of
+    Name = rname(element(1,Record)),
+    generation(Name, Id),
+    case kvs:get(Name, Id, Driver) of
                 {error, _} -> ensure_link(Record, Driver);
          {aborted, Reason} -> {aborted, Reason};
                    {ok, _} -> {error, exist} end.
@@ -278,16 +281,17 @@ dump() ->
 
                 % Table Partitions
 
-range(RecordName,Id) -> Ranges = kvs:config(kvs:rname(RecordName)), find(Ranges,RecordName,Id).
+range(RecordName,Id)   -> (find(kvs:config(kvs:rname(RecordName)),RecordName,Id))#interval.name.
+topleft(RecordName,Id) -> (find(kvs:config(kvs:rname(RecordName)),RecordName,Id))#interval.left.
 
-find([],_,_Id) -> [];
+find([],_,_Id) -> #interval{left=1,right=infinity,name=[]};
 find([Range|T],RecordName,Id) ->
      case lookup(Range,Id) of
           [] -> find(T,RecordName,Id);
           Interval -> Interval end.
 
-lookup(#interval{left=Left,right=Right,name=Name}=I,Id) when Id =< Right, Id >= Left -> Name;
-lookup(#interval{},_Id) -> [].
+lookup(#interval{left=Left,right=Right,name=Name}=I,Id) when Id =< Right, Id >= Left -> I;
+lookup(#interval{},_) -> [].
 
 rotate_new()       -> N = [ kvs:rotate(kvs:table(T)) || {T,_} <- fold_tables(),
                             length(proplists:get_value(attributes,kvs:info(last_disc(T)),[])) /=