Patch title: Release 94 bulk changes
Abstract:
File: /pliant/storage/database/stresstest.pli
Key:
    Removed line
    Added line
   
doc
  [A tiny stess test for the database engine with split fields.]

module "/pliant/language/unsafe.pli"
module "/pliant/language/context.pli"
module "/pliant/storage/database.pli"
module "/pliant/storage/database/split.pli"
module "/pliant/util/crypto/random.pli"
module "/pliant/language/schedule/threads_engine.pli"

constant nb_records 1000
constant nb_subrecords 1000


function random n -> r
  arg Int n r
  memory_strong_random addressof:(var uInt u) uInt:size
  r := u%(cast n uInt)


type TestSubrecord
  field Int i1 <- 0
  field Str s
  field Array:Str a

type TestRecord
  field Str s1
  field Float f1 <- 0
  field Set:Str a1
  split_field Set:TestSubrecord sub
  split_field Str s2

type TestDatabase
  field Set:TestRecord record

(gvar Database:TestDatabase test_database) load "file:/tmp/test.pdb" log "file:/tmp/test.log" mount "/pliant/test"

function basic
  test_database:data:record create "foo"
  var Data:TestRecord r :> test_database:data:record "foo"
  r:sub create "bar"
  r:sub:"bar" s := "abc"
  console "value is " test_database:data:record:"foo":sub:"bar":s eol
  data_store

function basic2
  console "value is " test_database:data:record:"foo":sub:"bar":s eol
  test_database:data:record delete "foo"

gvar CBool continue := true
gvar Int running := 0
gvar Int store_counter := 0
gvar Int access_counter := 0
gvar Int hold_counter := 0

function store
  while continue
    sleep random:120000/1000+30
    test_database store
    store_counter += 1

function access
  while continue
    sleep random:10/1000
    for (var Int i) 1 100
      var Str key := string random:nb_records
      var Data:TestRecord r :> test_database:data:record key
      if not exists:r
        test_database:data:record create key
        r :> test_database:data:record key
      if i%2=1
        r f1 += 1
      var Str key := string random:nb_subrecords
      var Data:TestSubrecord s :> r:sub key
      if not exists:s
        r:sub create key
        s :> r:sub key
      if s:s:len<1000
        s s := repeat 1000 " "
      if i%10=3
        s i1 += 1
      if i=50
        r:sub delete keyof:s
      if i=100
        test_database:data:record delete keyof:r
    access_counter += 1

function hold
  while continue
    sleep random:1000/1000
    var Str key := string random:nb_records
    var Data:TestRecord r :> test_database:data:record key
    var Str key := string random:nb_subrecords
    var Data:TestSubrecord s :> r:sub key
    if random:2=0
      s i1 += 1
    hold_counter += 1

function stresstest delay
  arg Int delay
  if true
    running += 1
    thread
      store
      running -= 1
  if true
    for (var Int i) 1 3
      running += 1 
      thread
        access
        running -= 1
  if true
    for (var Int i) 1 5
      running += 1 
      thread
        hold
        running -= 1
  for (var Int lap) 1 delay
    sleep 1
    console "lap " lap ": store " store_counter "  access " access_counter "  hold " hold_counter " mem " memory_current_used "/" memory_assigned eol
  continue := false
  var Int i := 0
  while i<2400 and running>0
    threads_shrink
    sleep 0.1
    i += 1
  sleep 0.1
  if running>0
    console "still running threads: " running eol
    sleep 3600
  else
    console "ok " i\10 "s" eol

export basic basic2 stresstest