Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
147
Issues
147
List
Board
Labels
Milestones
Merge Requests
10
Merge Requests
10
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gargantext
haskell-gargantext
Commits
0a919635
Commit
0a919635
authored
Oct 18, 2022
by
Alp Mestanogullari
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add fairness test
parent
330d3ca5
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
59 additions
and
30 deletions
+59
-30
Main.hs
tests/queue/Main.hs
+59
-30
No files found.
tests/queue/Main.hs
View file @
0a919635
...
...
@@ -2,7 +2,6 @@
module
Main
where
import
Control.Concurrent
import
Control.Concurrent.Async
import
Control.Concurrent.STM
import
Control.Monad
import
Data.Either
...
...
@@ -10,11 +9,9 @@ import Data.List
import
Prelude
import
Test.Hspec
import
Gargantext.Utils.Jobs
import
Gargantext.Utils.Jobs.Map
import
Gargantext.Utils.Jobs.Monad
import
Gargantext.Utils.Jobs.Queue
(
applyPrios
,
defaultPrios
)
import
Gargantext.Utils.Jobs.Settings
import
Gargantext.Utils.Jobs.State
data
JobT
=
A
|
B
deriving
(
Eq
,
Ord
,
Show
,
Enum
,
Bounded
)
...
...
@@ -28,72 +25,70 @@ inc B cs = cs { countBs = countBs cs + 1 }
dec
A
cs
=
cs
{
countAs
=
countAs
cs
-
1
}
dec
B
cs
=
cs
{
countBs
=
countBs
cs
-
1
}
jobDuration
,
initialDelay
::
Int
jobDuration
=
100000
-- 100ms
initialDelay
=
30000
-- 10ms
testMaxRunners
::
IO
()
testMaxRunners
=
do
-- max runners = 2 with default settings
k
<-
genSecret
let
settings
=
defaultJobSettings
2
k
st
::
JobsState
JobT
[
String
]
()
<-
newJobsState
settings
defaultPrios
runningJs
<-
newTVarIO
[]
let
j
num
_inp
l
=
do
let
j
num
_inp
_
l
=
do
atomically
$
modifyTVar
runningJs
(
\
xs
->
(
"Job #"
++
show
num
)
:
xs
)
-- putStrLn $ "Job #" ++ show num ++ " started"
threadDelay
(
5
*
1000000
)
-- 5s
-- putStrLn $ "Job #" ++ show num ++ " done"
threadDelay
jobDuration
atomically
$
modifyTVar
runningJs
(
\
xs
->
filter
(
/=
(
"Job #"
++
show
num
))
xs
)
jobs
=
[
(
n
,
j
n
)
|
n
<-
[
1
..
4
]
]
jids
<-
forM
jobs
$
\
(
i
,
f
)
->
do
-- putStrLn ("Submitting job #" ++ show i)
pushJob
A
()
f
settings
st
threadDelay
10000
-- 10ms
jobs
=
[
j
n
|
n
<-
[
1
..
4
::
Int
]
]
_jids
<-
forM
jobs
$
\
f
->
pushJob
A
()
f
settings
st
threadDelay
initialDelay
r1
<-
readTVarIO
runningJs
-- putStrLn ("Jobs running: " ++ show r1)
sort
r1
`
shouldBe
`
[
"Job #1"
,
"Job #2"
]
threadDelay
(
6
*
1000000
)
-- 6s
threadDelay
jobDuration
r2
<-
readTVarIO
runningJs
sort
r2
`
shouldBe
`
[
"Job #3"
,
"Job #4"
]
threadDelay
(
5
*
1000000
)
-- 5s
threadDelay
jobDuration
r3
<-
readTVarIO
runningJs
r3
`
shouldBe
`
[]
testPrios
::
IO
()
testPrios
=
do
k
<-
genSecret
let
settings
=
defaultJobSettings
2
k
st
::
JobsState
JobT
[
String
]
()
<-
newJobsState
settings
$
applyPrios
[(
B
,
10
)]
defaultPrios
-- B has higher priority
runningJs
<-
newTVarIO
(
Counts
0
0
)
let
j
num
jobt
_inp
l
=
do
let
j
jobt
_inp
_
l
=
do
atomically
$
modifyTVar
runningJs
(
inc
jobt
)
-- putStrLn $ "Job #" ++ show num ++ " started"
threadDelay
(
5
*
1000000
)
-- 5s
-- putStrLn $ "Job #" ++ show num ++ " done"
threadDelay
jobDuration
atomically
$
modifyTVar
runningJs
(
dec
jobt
)
jobs
=
[
(
0
,
A
,
j
0
A
)
,
(
1
,
A
,
j
1
A
)
,
(
2
,
B
,
j
2
B
)
,
(
3
,
B
,
j
3
B
)
jobs
=
[
(
A
,
j
A
)
,
(
A
,
j
A
)
,
(
B
,
j
B
)
,
(
B
,
j
B
)
]
jids
<-
forM
jobs
$
\
(
i
,
t
,
f
)
->
do
-- putStrLn ("Submitting job #" ++ show i)
_jids
<-
forM
jobs
$
\
(
t
,
f
)
->
do
pushJob
t
()
f
settings
st
threadDelay
10000
-- 10ms
threadDelay
initialDelay
r1
<-
readTVarIO
runningJs
r1
`
shouldBe
`
(
Counts
0
2
)
threadDelay
(
6
*
1000000
)
-- 6s
threadDelay
jobDuration
r2
<-
readTVarIO
runningJs
r2
`
shouldBe
`
(
Counts
2
0
)
threadDelay
(
5
*
1000000
)
-- 5s
threadDelay
jobDuration
r3
<-
readTVarIO
runningJs
r3
`
shouldBe
`
(
Counts
0
0
)
testExceptions
::
IO
()
testExceptions
=
do
-- max runners = 2 with default settings
k
<-
genSecret
let
settings
=
defaultJobSettings
2
k
st
::
JobsState
JobT
[
String
]
()
<-
newJobsState
settings
defaultPrios
jid
<-
pushJob
A
()
(
\
_inp
_log
->
readFile
"/doesntexist.txt"
>>=
putStrLn
)
settings
st
threadDelay
50000
threadDelay
initialDelay
mjob
<-
lookupJob
jid
(
jobsData
st
)
case
mjob
of
Nothing
->
error
"boo"
...
...
@@ -102,6 +97,38 @@ testExceptions = do
_
->
error
"boo2"
return
()
testFairness
::
IO
()
testFairness
=
do
k
<-
genSecret
let
settings
=
defaultJobSettings
k
st
::
JobsState
JobT
[
String
]
()
<-
newJobsState
settings
defaultPrios
runningJs
<-
newTVarIO
(
Counts
0
0
)
let
j
jobt
_inp
_l
=
do
atomically
$
modifyTVar
runningJs
(
inc
jobt
)
threadDelay
jobDuration
atomically
$
modifyTVar
runningJs
(
dec
jobt
)
jobs
=
[
(
A
,
j
A
)
,
(
A
,
j
A
)
,
(
B
,
j
B
)
,
(
A
,
j
A
)
,
(
A
,
j
A
)
]
_jids
<-
forM
jobs
$
\
(
t
,
f
)
->
do
pushJob
t
()
f
settings
st
threadDelay
initialDelay
r1
<-
readTVarIO
runningJs
r1
`
shouldBe
`
(
Counts
2
0
)
threadDelay
jobDuration
r2
<-
readTVarIO
runningJs
r2
`
shouldBe
`
(
Counts
1
1
)
-- MOST IMPORTANT CHECK: the B got picked after the
-- two As, because it was inserted right after them
-- and has equal priority.
threadDelay
jobDuration
r3
<-
readTVarIO
runningJs
r3
`
shouldBe
`
(
Counts
1
0
)
threadDelay
jobDuration
r4
<-
readTVarIO
runningJs
r4
`
shouldBe
`
(
Counts
0
0
)
main
::
IO
()
main
=
hspec
$
do
...
...
@@ -112,3 +139,5 @@ main = hspec $ do
testPrios
it
"can handle exceptions"
$
testExceptions
it
"fairly picks equal-priority-but-different-kind jobs"
$
testFairness
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment