[Kai-commits] SF.net SVN: kai:[70] branches/shino_vector_clocks
Kai is a distributed key-value datastore
Status: Beta
Brought to you by:
takemaru
From: <shi...@us...> - 2008-08-15 06:38:35
|
Revision: 70 http://kai.svn.sourceforge.net/kai/?rev=70&view=rev Author: shino_shun Date: 2008-08-15 06:38:42 +0000 (Fri, 15 Aug 2008) Log Message: ----------- Add: let kai_version:order use vector clocks Modified Paths: -------------- branches/shino_vector_clocks/src/kai_version.erl branches/shino_vector_clocks/test/kai_version_SUITE.erl Modified: branches/shino_vector_clocks/src/kai_version.erl =================================================================== --- branches/shino_vector_clocks/src/kai_version.erl 2008-08-14 04:53:43 UTC (rev 69) +++ branches/shino_vector_clocks/src/kai_version.erl 2008-08-15 06:38:42 UTC (rev 70) @@ -47,20 +47,26 @@ NewState } end. -do_order([], UniqData) -> - UniqData; -do_order([Data|RestData], UniqData) -> - % TODO: resolve ordering of versions by using VectorClocks - Checksum = Data#data.checksum, - case length( - lists:filter(fun(U) -> Checksum =:= U#data.checksum end, UniqData) - ) of - 0 -> do_order(RestData, [Data|UniqData]); - _ -> do_order(RestData, UniqData) +do_order([], []) -> + undefined; +do_order([], UniqList) -> + UniqList; +do_order([Data|Rest], UniqList) -> + VClock = Data#data.vector_clocks, + case lists:any(fun(Other) -> vclock:descends(Other#data.vector_clocks, VClock) end, Rest) of + true -> + do_order(Rest, UniqList); + _ -> + case lists:any(fun(Other) -> vclock:descends(Other#data.vector_clocks, VClock) end, UniqList) of + true -> + do_order(Rest, UniqList); + _ -> + do_order(Rest, [Data|UniqList]) + end end. -order([Data|Rest], State) -> - OrderedData = do_order(Rest, [Data]), +order(ListOfData, State) when is_list(ListOfData) -> + OrderedData = do_order(ListOfData, []), {reply, OrderedData, State}; order(_Other, State) -> {reply, undefined, State}. Modified: branches/shino_vector_clocks/test/kai_version_SUITE.erl =================================================================== --- branches/shino_vector_clocks/test/kai_version_SUITE.erl 2008-08-14 04:53:43 UTC (rev 69) +++ branches/shino_vector_clocks/test/kai_version_SUITE.erl 2008-08-15 06:38:42 UTC (rev 70) @@ -1,14 +1,14 @@ -% Licensed under the Apache License, Version 2.0 (the "License"); you may not -% use this file except in compliance with the License. You may obtain a copy of -% the License at -% -% http://www.apache.org/licenses/LICENSE-2.0 -% -% Unless required by applicable law or agreed to in writing, software -% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -% License for the specific language governing permissions and limitations under -% the License. +%% Licensed under the Apache License, Version 2.0 (the "License"); you may not +%% use this file except in compliance with the License. You may obtain a copy of +%% the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +%% License for the specific language governing permissions and limitations under +%% the License. -module(kai_version_SUITE). -compile(export_all). @@ -16,68 +16,66 @@ -include("kai.hrl"). -include("kai_test.hrl"). -all() -> [test_update]. +init_per_testcase(_TestCase, Conf) -> + kai_config:start_link([ + {hostname, "localhost"}, + {port, 11011}, + {memcache_port, 11211}, + {max_connections, 2}, + {n, 1}, {r, 1}, {w, 1}, + {number_of_buckets, 8}, + {number_of_virtual_nodes, 2} + ]), + kai_version:start_link(), + Conf. +end_per_testcase(_TestCase, _Conf) -> + kai_config:stop(), + kai_version:stop(), + ok. + +all() -> [test_update, test_order]. + test_update() -> []. test_update(_Conf) -> - kai_config:start_link([ - {hostname, "localhost"}, - {port, 11011}, - {memcache_port, 11211}, - {max_connections, 2}, - {n, 1}, {r, 1}, {w, 1}, - {number_of_buckets, 8}, - {number_of_virtual_nodes, 2} - ]), - kai_version:start_link(), + VClock1 = vclock:increment(kai_config:get(node), vclock:fresh()), - VClock = vclock:increment(kai_config:get(node), vclock:fresh()), Data1 = #data{ - key = "item-1", - vector_clocks = VClock, - bucket = 3, - checksum = erlang:md5(<<"value-1">>), - flags = "0", - value = (<<"value-1">>) - }, + vector_clocks = VClock1 + }, {ok, Data2} = kai_version:update(Data1), + ct:log(test_update, "Data2.vector_clocks: ~p~n", [Data2#data.vector_clocks]), + ?assert(is_list(Data2#data.vector_clocks)), + ?assert(vclock:descends(Data2#data.vector_clocks, Data1#data.vector_clocks)), + ?assertNot(vclock:descends(Data1#data.vector_clocks, Data2#data.vector_clocks)), - ?assert(is_tuple(Data2#data.last_modified)), - - ListOfData1 = kai_version:order([Data2, Data2]), - - ?assertEqual(1, length(ListOfData1)), - - VClock2 = vclock:increment(kai_config:get(node), vclock:fresh()), Data3 = #data{ - key = "item-1", - vector_clocks = VClock2, - bucket = 3, - checksum = erlang:md5(<<"value-1b">>), - flags = "0", - value = (<<"value-1b">>) + vector_clocks = vclock:increment(otherNode, vclock:fresh()) }, + {error, _Reason} = kai_version:update(Data3). - {ok, Data4} = kai_version:update(Data3), +test_order() -> []. +test_order(_Conf) -> + VClock1 = vclock:increment(node1, vclock:fresh()), + Data1 = #data{ + vector_clocks = VClock1 + }, - ListOfData2 = kai_version:order([Data2, Data4]), + %% trivial case + ?assertEqual(1, length(kai_version:order([Data1]))), - ?assertEqual(2, length(ListOfData2)), + %% two concurrent data + Data2 = Data1#data{ + vector_clocks = vclock:increment(otherNode, vclock:fresh()) + }, + ListOfData12 = kai_version:order([Data1, Data2]), + ?assertEqual(2, length(ListOfData12)), - ?assertEqual(undefined, kai_version:order([])), - - VClock3 = vclock:increment(kai_config:get(other_node), vclock:fresh()), - Data5 = #data{ - key = "item-3", - vector_clocks = VClock3, - bucket = 3, - checksum = erlang:md5(<<"value-1b">>), - flags = "0", - value = (<<"value-1b">>) - }, - - {error, _Reason} = kai_version:update(Data5), - - kai_config:stop(), - kai_version:stop(). + %% one data is dropped + Data3 = Data1#data{ + vector_clocks = vclock:increment(otherNode2, Data1#data.vector_clocks) + }, + ListOfData23 = kai_version:order([Data1, Data2, Data3]), + ?assertEqual(2, length(ListOfData23)), + ok. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |