Plasma GitLab Archive
Projects Blog Knowledge

(* $Id: ps_blocklist.ml 325 2010-11-17 16:30:18Z gerd $ *)

(* Tests Nn_blocklist *)

(* The underlying RangeMap implementation is already covered by
   ps_rangemap, so we do simply assume here this part works correctly.
   It is mainly interesting here whether the blocks are handled right
   when they refer to various datanodes
 *)

open Plasma_util
open Pfs_rpcapi_aux
open Printf

let mk_block ident index block =
  { index = index;
    node = "";
    identity = ident;
    block = block;
    length = 1L;
    node_alive = true;
    checksum = None;
    inode_seqno = 0L;
    inode_committed = true;
    ticket = Nn_blocklist.empty_ticket
  }

let mk_blocks ident index block number =
  let rec loop k =
    if k < number then
      let b = mk_block ident (Int64.add index k) (Int64.add block k) in
      b :: loop (Int64.succ k)
    else
      [] in
  loop 0L

let dest_block b =
  (b.identity, b.index, b.block, b.length)

let print_blocks l =
  String.concat " , "
    (List.map (fun (id,idx,b,l) -> sprintf "%s:%Ld/%Ld/%Ld" id idx b l) l)

let ( >> ) = fun n f -> if n=0 then f() else n

let cmp_blocks b1 b2 =
  String.compare b1.identity b2.identity
  >> (fun () ->
	Int64.compare b1.index b2.index
     )


let do_test name f =
  try
    printf "Test: %s %!" name;
    if f() then
      printf "PASSED\n%!"
    else
      printf "FAILED\n%!"
  with
    | err ->
	printf "EXCEPTION %s\n%!" (Printexc.to_string err)

let test1() =
  do_test "test1" (
    fun () ->
      let l =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L @
        mk_blocks "d2" 0L 200L 10L @
        mk_blocks "d3" 0L 200L 10L in
      let bl = Nn_blocklist.to_blocklist l in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 0L, 100L, 10L;
	     "d1", 0L, 100L, 10L;
	     "d2", 0L, 200L, 10L;
	     "d3", 0L, 200L, 10L ]
  )


let test2() =
  do_test "test2" (
    fun () ->
      let l =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L @
        mk_blocks "d2" 0L 200L 10L @
        mk_blocks "d3" 0L 200L 10L in
      let bl0 = Nn_blocklist.to_blocklist l in
      let bl = Nn_blocklist.sub (2L, 8L) bl0 in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 2L, 102L, 7L;
	     "d1", 2L, 102L, 7L;
	     "d2", 2L, 202L, 7L;
	     "d3", 2L, 202L, 7L ]
  )

let test3() =
  do_test "test3" (
    fun () ->
      let l =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L @
        mk_blocks "d0" 15L 200L 10L @
        mk_blocks "d1" 15L 200L 10L in
      let bl0 = Nn_blocklist.to_blocklist l in
      let bl = Nn_blocklist.sub (5L, 15L) bl0 in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 5L, 105L, 5L;
	     "d0", 15L, 200L, 1L;
	     "d1", 5L, 105L, 5L;
	     "d1", 15L, 200L, 1L ]
  )

let test4() =
  do_test "test4" (
    fun () ->
      let l =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L @
        mk_blocks "d0" 15L 200L 10L @
        mk_blocks "d1" 15L 200L 10L in
      let bl0 = Nn_blocklist.to_blocklist l in
      let bl = Nn_blocklist.remove (5L, 6L) bl0 in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 0L, 100L, 5L;
	     "d0", 7L, 107L, 3L;
	     "d0", 15L, 200L, 10L;
	     "d1", 0L, 100L, 5L;
	     "d1", 7L, 107L, 3L;
	     "d1", 15L, 200L, 10L ]
  )

let test5() =
  do_test "test5" (
    fun () ->
      let l1 =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L in
      let l2 =
        mk_blocks "d0" 10L 200L 10L @
        mk_blocks "d1" 10L 110L 10L @
	  mk_blocks "d2" 0L 300L 20L in
      let bl1 = Nn_blocklist.to_blocklist l1 in
      let bl2 = Nn_blocklist.to_blocklist l2 in
      let bl = Nn_blocklist.merge bl1 bl2 in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 0L, 100L, 10L;
	     "d0", 10L, 200L, 10L;
	     "d1", 0L, 100L, 20L;
	     "d2", 0L, 300L, 20L ]
  )

let test6() =
  do_test "test6" (
    fun () ->
      let l1 =
	mk_blocks "d0" 0L 100L 10L @
	mk_blocks "d1" 0L 100L 10L in
      let l2 =
        mk_blocks "d0" 5L 200L 1L @
        mk_blocks "d1" 10L 110L 10L in
      let bl1 = Nn_blocklist.to_blocklist l1 in
      let bl2 = Nn_blocklist.to_blocklist l2 in
      let bl = Nn_blocklist.merge bl1 bl2 in
      let l1 = Nn_blocklist.to_blockinfo_list bl in
      let l2 = List.sort cmp_blocks l1 in
      let l3 = List.map dest_block l2 in
      l3 = [ "d0", 0L, 100L, 5L;
	     "d0", 5L, 200L, 1L;
	     "d0", 6L, 106L, 4L;
	     "d1", 0L, 100L, 20L ]
  )
		     
let () =
  printf "ps_blocklist\n%!";
  test1();
  test2();
  test3();
  test4();
  test5();
  test6();
  printf "ps_blocklist done\n%!"

This web site is published by Informatikbüro Gerd Stolpmann
Powered by Caml