提交 73e45928 authored 作者: andrei's avatar andrei

fix boundary check

上级 36ac7567
...@@ -70,7 +70,8 @@ public class Transaction { ...@@ -70,7 +70,8 @@ public class Transaction {
}; };
static final int LOG_ID_BITS = 40; static final int LOG_ID_BITS = 40;
private static final int LOG_ID_BITS1 = LOG_ID_BITS + 1; private static final int LOG_ID_BITS1 = LOG_ID_BITS + 1;
private static final long LOG_ID_MASK = (1L << LOG_ID_BITS) - 1; private static final long LOG_ID_LIMIT = 1L << LOG_ID_BITS;
private static final long LOG_ID_MASK = (1L << LOG_ID_BITS1) - 1;
private static final int STATUS_BITS = 4; private static final int STATUS_BITS = 4;
private static final int STATUS_MASK = (1 << STATUS_BITS) - 1; private static final int STATUS_MASK = (1 << STATUS_BITS) - 1;
...@@ -89,7 +90,7 @@ public class Transaction { ...@@ -89,7 +90,7 @@ public class Transaction {
* Transation state is an atomic composite field: * Transation state is an atomic composite field:
* bit 45 : flag whether transaction had rollback(s) * bit 45 : flag whether transaction had rollback(s)
* bits 44-41 : status * bits 44-41 : status
* bits 40 : overflow control bit, always 0 * bits 40 : overflow control bit, 1 indicates overflow
* bits 39-0 : log id of the last entry in the undo log map * bits 39-0 : log id of the last entry in the undo log map
*/ */
private final AtomicLong statusAndLogId; private final AtomicLong statusAndLogId;
...@@ -209,7 +210,7 @@ public class Transaction { ...@@ -209,7 +210,7 @@ public class Transaction {
void log(int mapId, Object key, VersionedValue oldValue) { void log(int mapId, Object key, VersionedValue oldValue) {
long currentState = statusAndLogId.getAndIncrement(); long currentState = statusAndLogId.getAndIncrement();
long logId = getLogId(currentState); long logId = getLogId(currentState);
if (logId > LOG_ID_MASK) { if (logId >= LOG_ID_LIMIT) {
throw DataUtils.newIllegalStateException( throw DataUtils.newIllegalStateException(
DataUtils.ERROR_TRANSACTION_TOO_BIG, DataUtils.ERROR_TRANSACTION_TOO_BIG,
"Transaction {0} has too many changes", "Transaction {0} has too many changes",
...@@ -224,7 +225,7 @@ public class Transaction { ...@@ -224,7 +225,7 @@ public class Transaction {
void logUndo() { void logUndo() {
long currentState = statusAndLogId.decrementAndGet(); long currentState = statusAndLogId.decrementAndGet();
long logId = getLogId(currentState); long logId = getLogId(currentState);
if (logId == LOG_ID_MASK) { if (logId >= LOG_ID_LIMIT) {
throw DataUtils.newIllegalStateException( throw DataUtils.newIllegalStateException(
DataUtils.ERROR_TRANSACTION_CORRUPT, DataUtils.ERROR_TRANSACTION_CORRUPT,
"Transaction {0} has internal error", "Transaction {0} has internal error",
...@@ -393,7 +394,7 @@ public class Transaction { ...@@ -393,7 +394,7 @@ public class Transaction {
} }
private static long composeState(int status, long logId, boolean hasRollback) { private static long composeState(int status, long logId, boolean hasRollback) {
assert (logId & ~LOG_ID_MASK) == 0 : logId; assert logId < LOG_ID_LIMIT : logId;
assert (status & ~STATUS_MASK) == 0 : status; assert (status & ~STATUS_MASK) == 0 : status;
if (hasRollback) { if (hasRollback) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论