| 54 | // 所有以long为key的记录访问可以使用这个基类。 |
| 55 | // 其他类型的key需要再定义新的基类。 |
| 56 | static abstract class Task implements FuncLong { |
| 57 | final Set<Long> Keys = new HashSet<>(); |
| 58 | demo.App App; |
| 59 | |
| 60 | int getKeyNumber() { |
| 61 | return 1; |
| 62 | } |
| 63 | |
| 64 | int getKeyBound() { |
| 65 | return Simulate.AccessKeyBound; |
| 66 | } |
| 67 | |
| 68 | boolean IsProcedure() { |
| 69 | return true; |
| 70 | } |
| 71 | |
| 72 | App Run() throws ExecutionException, InterruptedException { |
| 73 | var app = Simulate.getInstance().randApp(); |
| 74 | app.Run(this); |
| 75 | return app; |
| 76 | } |
| 77 | |
| 78 | void prepare() throws Exception { |
| 79 | } |
| 80 | |
| 81 | abstract long process(); |
| 82 | |
| 83 | void verify() throws Exception { |
| 84 | // default verify |
| 85 | var name = getClass().getName(); |
| 86 | var runCount = getRunCounter(name).sum(); |
| 87 | var successCount = getSuccessCounter(name).sum(); |
| 88 | var stats = PerfCounter.instance().getOrAddProcedureInfo(name); |
| 89 | var abortCount = stats.getOrAddResult(Procedure.AbortException).sum(); |
| 90 | var tooManyTry = stats.getOrAddResult(Procedure.TooManyTry).sum(); |
| 91 | Simulate.logger.info(" totalCount({})={}", name, runCount); |
| 92 | Simulate.logger.info("successCount({})={}", name, successCount); |
| 93 | if (abortCount != 0) |
| 94 | Simulate.logger.warn(" abortCount({})={}", name, abortCount); |
| 95 | if (tooManyTry != 0) |
| 96 | Simulate.logger.warn(" tooManyTry({})={}", name, tooManyTry); |
| 97 | if (runCount != successCount + abortCount + tooManyTry) { |
| 98 | Simulate.logger.error("verify failed({}): {} != {} = {} + {} + {}\n{}", |
| 99 | name, runCount, successCount + abortCount + tooManyTry, successCount, abortCount, tooManyTry, |
| 100 | stats.toString(false)); |
| 101 | Assert.fail(); |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | @Override |
| 106 | public long call() { |
| 107 | var name = getClass().getName(); |
| 108 | var result = process(); |
| 109 | if (result == 0) { |
| 110 | var txn = Transaction.getCurrent(); |
| 111 | if (txn != null) |
| 112 | txn.runWhileCommit(() -> getSuccessCounter(name).increment()); |
| 113 | else |
nothing calls this directly
no outgoing calls
no test coverage detected