Skip to content

Commit 92ab6ca

Browse files
committed
update
1 parent 7aab957 commit 92ab6ca

File tree

13 files changed

+1228
-224
lines changed

13 files changed

+1228
-224
lines changed

.check-build

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ REFERENCE_FILES=(
77
src/mrapps/crash.go
88
src/mrapps/indexer.go
99
src/mrapps/mtiming.go
10-
src/mrapps/rtiming.go
11-
src/mrapps/crash.go
1210
src/mrapps/nocrash.go
11+
src/mrapps/rtiming.go
12+
src/mrapps/wc.go
1313
src/main/mrsequential.go
1414
src/main/mrmaster.go
1515
src/main/mrworker.go

src/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ mrtmp.*
55
/mapreduce/x.txt
66
/pbservice/x.txt
77
/kvpaxos/x.txt
8+
*.so

src/kvraft/test_test.go

+28-16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package kvraft
22

3-
import "../linearizability"
4-
3+
import "../porcupine"
4+
import "../models"
55
import "testing"
66
import "strconv"
77
import "time"
@@ -10,6 +10,8 @@ import "log"
1010
import "strings"
1111
import "sync"
1212
import "sync/atomic"
13+
import "fmt"
14+
import "io/ioutil"
1315

1416
// The tester generously allows solutions to complete elections in one second
1517
// (much more than the paper's range of timeouts).
@@ -322,7 +324,7 @@ func GenericTestLinearizability(t *testing.T, part string, nclients int, nserver
322324
cfg.begin(title)
323325

324326
begin := time.Now()
325-
var operations []linearizability.Operation
327+
var operations []porcupine.Operation
326328
var opMu sync.Mutex
327329

328330
done_partitioner := int32(0)
@@ -344,24 +346,24 @@ func GenericTestLinearizability(t *testing.T, part string, nclients int, nserver
344346
for atomic.LoadInt32(&done_clients) == 0 {
345347
key := strconv.Itoa(rand.Int() % nclients)
346348
nv := "x " + strconv.Itoa(cli) + " " + strconv.Itoa(j) + " y"
347-
var inp linearizability.KvInput
348-
var out linearizability.KvOutput
349+
var inp models.KvInput
350+
var out models.KvOutput
349351
start := int64(time.Since(begin))
350352
if (rand.Int() % 1000) < 500 {
351353
Append(cfg, myck, key, nv)
352-
inp = linearizability.KvInput{Op: 2, Key: key, Value: nv}
354+
inp = models.KvInput{Op: 2, Key: key, Value: nv}
353355
j++
354356
} else if (rand.Int() % 1000) < 100 {
355357
Put(cfg, myck, key, nv)
356-
inp = linearizability.KvInput{Op: 1, Key: key, Value: nv}
358+
inp = models.KvInput{Op: 1, Key: key, Value: nv}
357359
j++
358360
} else {
359361
v := Get(cfg, myck, key)
360-
inp = linearizability.KvInput{Op: 0, Key: key}
361-
out = linearizability.KvOutput{Value: v}
362+
inp = models.KvInput{Op: 0, Key: key}
363+
out = models.KvOutput{Value: v}
362364
}
363365
end := int64(time.Since(begin))
364-
op := linearizability.Operation{Input: inp, Call: start, Output: out, Return: end}
366+
op := porcupine.Operation{Input: inp, Call: start, Output: out, Return: end, ClientId: cli}
365367
opMu.Lock()
366368
operations = append(operations, op)
367369
opMu.Unlock()
@@ -423,13 +425,23 @@ func GenericTestLinearizability(t *testing.T, part string, nclients int, nserver
423425

424426
cfg.end()
425427

426-
// log.Printf("Checking linearizability of %d operations", len(operations))
427-
// start := time.Now()
428-
ok := linearizability.CheckOperationsTimeout(linearizability.KvModel(), operations, linearizabilityCheckTimeout)
429-
// dur := time.Since(start)
430-
// log.Printf("Linearizability check done in %s; result: %t", time.Since(start).String(), ok)
431-
if !ok {
428+
res, info := porcupine.CheckOperationsVerbose(models.KvModel, operations, linearizabilityCheckTimeout)
429+
if res == porcupine.Illegal {
430+
file, err := ioutil.TempFile("", "*.html")
431+
if err != nil {
432+
fmt.Printf("info: failed to create temp file for visualization")
433+
} else {
434+
err = porcupine.Visualize(models.KvModel, info, file)
435+
if err != nil {
436+
fmt.Printf("info: failed to write history visualization to %s\n", file.Name())
437+
} else {
438+
fmt.Printf("info: wrote history visualization to %s\n", file.Name())
439+
}
440+
}
441+
t.Fatal("history is not linearizable")
432442
t.Fatal("history is not linearizable")
443+
} else if res == porcupine.Unknown {
444+
fmt.Println("info: linearizability check timed out, assuming history is ok")
433445
}
434446
}
435447

src/linearizability/models.go

-51
This file was deleted.

src/main/test-mr.sh

+34-27
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#!/bin/sh
22

3-
#
3+
#
44
# basic map-reduce test
55
#
66

7-
RACE=
7+
RACE=
88

99
# uncomment this to run the tests with the Go race detector.
1010
#RACE=-race
@@ -26,6 +26,8 @@ rm -f mr-*
2626
(cd .. && go build $RACE mrworker.go) || exit 1
2727
(cd .. && go build $RACE mrsequential.go) || exit 1
2828

29+
failed_any=0
30+
2931
# first word-count
3032

3133
# generate the correct output
@@ -35,15 +37,15 @@ rm -f mr-out*
3537

3638
echo '***' Starting wc test.
3739

38-
../mrmaster ../pg*txt &
40+
timeout -k 2s 180s ../mrmaster ../pg*txt &
3941

4042
# give the master time to create the sockets.
4143
sleep 1
4244

4345
# start multiple workers.
44-
../mrworker ../../mrapps/wc.so &
45-
../mrworker ../../mrapps/wc.so &
46-
../mrworker ../../mrapps/wc.so &
46+
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &
47+
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &
48+
timeout -k 2s 180s ../mrworker ../../mrapps/wc.so &
4749

4850
# wait for one of the processes to exit.
4951
# under bash, this waits for all processes,
@@ -61,7 +63,7 @@ then
6163
else
6264
echo '---' wc output is not the same as mr-correct-wc.txt
6365
echo '---' wc test: FAIL
64-
exit 1
66+
failed_any=1
6567
fi
6668

6769
# wait for remaining workers and master to exit.
@@ -77,12 +79,12 @@ rm -f mr-out*
7779

7880
echo '***' Starting indexer test.
7981

80-
../mrmaster ../pg*txt &
82+
timeout -k 2s 180s ../mrmaster ../pg*txt &
8183
sleep 1
8284

8385
# start multiple workers
84-
../mrworker ../../mrapps/indexer.so &
85-
../mrworker ../../mrapps/indexer.so
86+
timeout -k 2s 180s ../mrworker ../../mrapps/indexer.so &
87+
timeout -k 2s 180s ../mrworker ../../mrapps/indexer.so
8688

8789
sort mr-out* | grep . > mr-indexer-all
8890
if cmp mr-indexer-all mr-correct-indexer.txt
@@ -91,7 +93,7 @@ then
9193
else
9294
echo '---' indexer output is not the same as mr-correct-indexer.txt
9395
echo '---' indexer test: FAIL
94-
exit 1
96+
failed_any=1
9597
fi
9698

9799
wait ; wait
@@ -101,18 +103,18 @@ echo '***' Starting map parallelism test.
101103

102104
rm -f mr-out* mr-worker*
103105

104-
../mrmaster ../pg*txt &
106+
timeout -k 2s 180s ../mrmaster ../pg*txt &
105107
sleep 1
106108

107-
../mrworker ../../mrapps/mtiming.so &
108-
../mrworker ../../mrapps/mtiming.so
109+
timeout -k 2s 180s ../mrworker ../../mrapps/mtiming.so &
110+
timeout -k 2s 180s ../mrworker ../../mrapps/mtiming.so
109111

110112
NT=`cat mr-out* | grep '^times-' | wc -l | sed 's/ //g'`
111113
if [ "$NT" != "2" ]
112114
then
113115
echo '---' saw "$NT" workers rather than 2
114116
echo '---' map parallelism test: FAIL
115-
exit 1
117+
failed_any=1
116118
fi
117119

118120
if cat mr-out* | grep '^parallel.* 2' > /dev/null
@@ -121,7 +123,7 @@ then
121123
else
122124
echo '---' map workers did not run in parallel
123125
echo '---' map parallelism test: FAIL
124-
exit 1
126+
failed_any=1
125127
fi
126128

127129
wait ; wait
@@ -131,18 +133,18 @@ echo '***' Starting reduce parallelism test.
131133

132134
rm -f mr-out* mr-worker*
133135

134-
../mrmaster ../pg*txt &
136+
timeout -k 2s 180s ../mrmaster ../pg*txt &
135137
sleep 1
136138

137-
../mrworker ../../mrapps/rtiming.so &
138-
../mrworker ../../mrapps/rtiming.so
139+
timeout -k 2s 180s ../mrworker ../../mrapps/rtiming.so &
140+
timeout -k 2s 180s ../mrworker ../../mrapps/rtiming.so
139141

140142
NT=`cat mr-out* | grep '^[a-z] 2' | wc -l | sed 's/ //g'`
141143
if [ "$NT" -lt "2" ]
142144
then
143145
echo '---' too few parallel reduces.
144146
echo '---' reduce parallelism test: FAIL
145-
exit 1
147+
failed_any=1
146148
else
147149
echo '---' reduce parallelism test: PASS
148150
fi
@@ -158,30 +160,30 @@ rm -f mr-out*
158160
echo '***' Starting crash test.
159161

160162
rm -f mr-done
161-
(../mrmaster ../pg*txt ; touch mr-done ) &
163+
(timeout -k 2s 180s ../mrmaster ../pg*txt ; touch mr-done ) &
162164
sleep 1
163165

164166
# start multiple workers
165-
../mrworker ../../mrapps/crash.so &
167+
timeout -k 2s 180s ../mrworker ../../mrapps/crash.so &
166168

167169
# mimic rpc.go's masterSock()
168170
SOCKNAME=/var/tmp/824-mr-`id -u`
169171

170172
( while [ -e $SOCKNAME -a ! -f mr-done ]
171173
do
172-
../mrworker ../../mrapps/crash.so
174+
timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
173175
sleep 1
174176
done ) &
175177

176178
( while [ -e $SOCKNAME -a ! -f mr-done ]
177179
do
178-
../mrworker ../../mrapps/crash.so
180+
timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
179181
sleep 1
180182
done ) &
181183

182184
while [ -e $SOCKNAME -a ! -f mr-done ]
183185
do
184-
../mrworker ../../mrapps/crash.so
186+
timeout -k 2s 180s ../mrworker ../../mrapps/crash.so
185187
sleep 1
186188
done
187189

@@ -197,7 +199,12 @@ then
197199
else
198200
echo '---' crash output is not the same as mr-correct-crash.txt
199201
echo '---' crash test: FAIL
200-
exit 1
202+
failed_any=1
201203
fi
202204

203-
echo '***' PASSED ALL TESTS
205+
if [ $failed_any -eq 0 ]; then
206+
echo '***' PASSED ALL TESTS
207+
else
208+
echo '***' FAILED SOME TESTS
209+
exit 1
210+
fi

0 commit comments

Comments
 (0)