nickva commented on a change in pull request #2638: Prototype/fdb layer couch views size tests URL: https://github.com/apache/couchdb/pull/2638#discussion_r388493215
########## File path: src/couch_views/test/couch_views_size_test.erl ########## @@ -0,0 +1,564 @@ +% 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(couch_views_size_test). + +-include_lib("eunit/include/eunit.hrl"). +-include_lib("couch/include/couch_db.hrl"). +-include_lib("couch/include/couch_eunit.hrl"). +-include_lib("couch_mrview/include/couch_mrview.hrl"). +-include_lib("fabric/include/fabric2.hrl"). +-include_lib("couch_views/include/couch_views.hrl"). + +% N.B., we should move to couch_ejson_size instead +% of erlang:external_size +% +% to calculate view size: +% total = 0 +% for (fdb_k, fdb_v) in VIEW_MAP_RANGE: +% {EncUserKey, EncUserval} = erlfdb_tuple:unpack(fdb_v), +% UserKey = couch_views_encoding:decode(EncUserKey), +% UserVal = couch_views_encoding:decode(EncUserVal), +% total += erlang:external_size(UserKey), +% total += erlang:external_size(UserVal) +% +% Our goal in checking the size calculations is that we cover +% as much of the possible key mutation space as possible while +% not relying on fuzzing out the edge cases. Conceptually we have +% two sets of keys E and U. E is keys as currently exist in the +% view, and U is the new set of keys corresponding to an update. +% +% Both sets E and U have the same possible set of state variables: +% +% 1. N unique keys, where 0 =< N =< infinity +% 2. D keys with duplicates, where 0 =< D =< N, +% 3. R repeats for each member of D, for 2 =< R =< infinity +% +% Given two sets S1 and S2, we then have a set of transition variables: +% +% 1. deltaN - shared unique keys, where 0 =< deltaN =< N +% 2. deltaD - shared duplicates, where 0 =< deltaD =< N +% 3. deltaR - shared repeats for each D, where 2 =< deltaR =< infinity +% +% To search our state transition space, we can create two functions to +% first define our start and end states, and for each transition we have +% a function that defines the shared overlap between states. +% +% Given a list of transitions are checks then become simple in that +% we can iterate over each transition checking that our index is valid +% after each one. Index validation will purely look at the existing +% state of the index in fdb and validate correctness. + +-define(NUM_SINGLE_TESTS, 100). +-define(NUM_MULTI_TESTS, 100). + +-define(N_DOMAIN, [0, 1, 2, 5]). +-define(D_DOMAIN, [0, 1, 2, 5]). +-define(R_DOMAIN, [2, 4]). + +-define(DELTA_N_DOMAIN, [0, 1, 2, 5]). +-define(DELTA_D_DOMAIN, [0, 1, 2, 5]). +-define(DELTA_R_DOMAIN, [1, 2, 4]). + + +generate_sets() -> + permute(?N_DOMAIN, ?D_DOMAIN, ?R_DOMAIN, fun(N, D, R) -> + % We can't have more duplicates than total keys + case D > N of + true -> throw(skip); + false -> ok + end, + + % Only include one of the repeat values + % for our zero sets + case D == 0 of + true when R == 2 -> ok; + true -> throw(skip); + false -> ok + end, + + % Replace R with a sentinel value for sanity + % when there are no dupes to have repeats + ActualR = if D == 0 -> 0; true -> R end, + + {N, D, ActualR} + end). + + +generate_transitions() -> + Sets = generate_sets(), + %Pairs0 = [{Set1, Set2} || Set1 <- Sets, Set2 <- Sets], Review comment: The comment is how to generate a smaller list of transitions? ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services