Skip to content

Commit 74ecc7c

Browse files
committed
opt for lsop serialize
1 parent 78f5292 commit 74ecc7c

File tree

9 files changed

+119
-105
lines changed

9 files changed

+119
-105
lines changed

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/AbstractPayload.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public abstract class AbstractPayload implements ObPayload {
4444
private long version = 1;
4545
protected long timeout = RPC_OPERATION_TIMEOUT.getDefaultLong();
4646
protected int groupId = 0;
47+
protected long payLoadContentSize = -1;
4748

4849
/*
4950
* Get pcode.

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableLSOpRequest.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public class ObTableLSOpRequest extends AbstractPayload implements Credentialabl
3939
protected ObTableEntityType entityType = ObTableEntityType.KV;
4040
protected ObTableConsistencyLevel consistencyLevel = ObTableConsistencyLevel.STRONG;
4141
private ObTableLSOperation lsOperation = null;
42-
4342
/*
4443
* Get pcode.
4544
*/
@@ -100,8 +99,11 @@ public Object decode(ByteBuf buf) {
10099
*/
101100
@Override
102101
public long getPayloadContentSize() {
103-
return lsOperation.getPayloadSize() + Serialization.getNeedBytes(credential) + 1 // entityType
104-
+ 1; // consistencyLevel
102+
if (payLoadContentSize == -1) {
103+
payLoadContentSize = lsOperation.getPayloadSize() + Serialization.getNeedBytes(credential) + 1 // entityType
104+
+ 1; // consistencyLevel
105+
}
106+
return payLoadContentSize;
105107
}
106108

107109
/*

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableLSOperation.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -169,24 +169,28 @@ public Object decode(ByteBuf buf) {
169169
*/
170170
@Override
171171
public long getPayloadContentSize() {
172-
long payloadContentSize = 0;
173-
payloadContentSize += Serialization.getNeedBytes(tabletOperations.size());
174-
for (ObTableTabletOp operation : tabletOperations) {
175-
payloadContentSize += operation.getPayloadSize();
176-
}
172+
if (this.payLoadContentSize == -1) {
173+
long payloadContentSize = 0;
174+
payloadContentSize += Serialization.getNeedBytes(tabletOperations.size());
175+
for (ObTableTabletOp operation : tabletOperations) {
176+
payloadContentSize += operation.getPayloadSize();
177+
}
177178

178-
payloadContentSize += Serialization.getNeedBytes(rowKeyNames.size());
179-
for (String rowKeyName : rowKeyNames) {
180-
payloadContentSize += Serialization.getNeedBytes(rowKeyName);
181-
}
179+
payloadContentSize += Serialization.getNeedBytes(rowKeyNames.size());
180+
for (String rowKeyName : rowKeyNames) {
181+
payloadContentSize += Serialization.getNeedBytes(rowKeyName);
182+
}
182183

183-
payloadContentSize += Serialization.getNeedBytes(propertiesNames.size());
184-
for (String propertyName : propertiesNames) {
185-
payloadContentSize += Serialization.getNeedBytes(propertyName);
184+
payloadContentSize += Serialization.getNeedBytes(propertiesNames.size());
185+
for (String propertyName : propertiesNames) {
186+
payloadContentSize += Serialization.getNeedBytes(propertyName);
187+
}
188+
189+
this.payLoadContentSize = payloadContentSize + LS_ID_SIZE + Serialization.getNeedBytes(optionFlag.getValue())
190+
+ Serialization.getNeedBytes(tableName) + Serialization.getNeedBytes(tableId);
186191
}
192+
return this.payLoadContentSize;
187193

188-
return payloadContentSize + LS_ID_SIZE + Serialization.getNeedBytes(optionFlag.getValue())
189-
+ Serialization.getNeedBytes(tableName) + Serialization.getNeedBytes(tableId);
190194
}
191195

192196
/*

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOp.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,19 @@ public Object decode(ByteBuf buf) {
103103
*/
104104
@Override
105105
public long getPayloadContentSize() {
106-
long payloadContentSize = Serialization.getNeedBytes(singleOpType.getByteValue());
107-
payloadContentSize += Serialization.getNeedBytes(singleOpFlag.getValue());
108-
if (ObTableOperationType.needEncodeQuery(singleOpType)) {
109-
payloadContentSize += query.getPayloadSize();
110-
}
111-
payloadContentSize += Serialization.getNeedBytes(entities.size());
112-
for (ObTableSingleOpEntity entity : entities) {
113-
payloadContentSize += entity.getPayloadSize();
106+
if (this.payLoadContentSize == -1) {
107+
long payloadContentSize = Serialization.getNeedBytes(singleOpType.getByteValue());
108+
payloadContentSize += Serialization.getNeedBytes(singleOpFlag.getValue());
109+
if (ObTableOperationType.needEncodeQuery(singleOpType)) {
110+
payloadContentSize += query.getPayloadSize();
111+
}
112+
payloadContentSize += Serialization.getNeedBytes(entities.size());
113+
for (ObTableSingleOpEntity entity : entities) {
114+
payloadContentSize += entity.getPayloadSize();
115+
}
116+
this.payLoadContentSize = payloadContentSize;
114117
}
115-
return payloadContentSize;
118+
return this.payLoadContentSize;
116119
}
117120

118121
public List<ObNewRange> getScanRange() {

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpEntity.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -162,29 +162,32 @@ public Object decode(ByteBuf buf) {
162162
*/
163163
@Override
164164
public long getPayloadContentSize() {
165-
long payloadContentSize = 0;
165+
if (this.payLoadContentSize == -1) {
166+
long payloadContentSize = 0;
166167

167-
payloadContentSize += Serialization.getNeedBytes(rowKeyBitLen);
168-
payloadContentSize += rowKeyBitMap.length;
168+
payloadContentSize += Serialization.getNeedBytes(rowKeyBitLen);
169+
payloadContentSize += rowKeyBitMap.length;
169170

170-
payloadContentSize += Serialization.getNeedBytes(rowkey.size());
171-
for (ObObj obj : rowkey) {
172-
payloadContentSize += ObTableSerialUtil.getEncodedSize(obj);
173-
}
171+
payloadContentSize += Serialization.getNeedBytes(rowkey.size());
172+
for (ObObj obj : rowkey) {
173+
payloadContentSize += ObTableSerialUtil.getEncodedSize(obj);
174+
}
174175

175-
if (ignoreEncodePropertiesColumnNames) {
176-
payloadContentSize += Serialization.getNeedBytes(0L);
177-
} else {
178-
payloadContentSize += Serialization.getNeedBytes(propertiesBitLen);
179-
payloadContentSize += propertiesBitMap.length;
180-
}
176+
if (ignoreEncodePropertiesColumnNames) {
177+
payloadContentSize += Serialization.getNeedBytes(0L);
178+
} else {
179+
payloadContentSize += Serialization.getNeedBytes(propertiesBitLen);
180+
payloadContentSize += propertiesBitMap.length;
181+
}
181182

182-
payloadContentSize += Serialization.getNeedBytes(propertiesValues.size());
183-
for (ObObj obj : propertiesValues) {
184-
payloadContentSize += ObTableSerialUtil.getEncodedSize(obj);
183+
payloadContentSize += Serialization.getNeedBytes(propertiesValues.size());
184+
for (ObObj obj : propertiesValues) {
185+
payloadContentSize += ObTableSerialUtil.getEncodedSize(obj);
186+
}
187+
this.payLoadContentSize = payloadContentSize;
185188
}
186189

187-
return payloadContentSize;
190+
return this.payLoadContentSize;
188191
}
189192

190193
public static boolean areArraysSameLengthOrBothNull(Object[] a, Object[] b) {

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableSingleOpQuery.java

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -151,40 +151,43 @@ public Object decode(ByteBuf buf) {
151151
*/
152152
@Override
153153
public long getPayloadContentSize() {
154-
long payloadContentSize = 0;
154+
if (this.payLoadContentSize == -1) {
155+
long payloadContentSize = 0;
155156

156-
payloadContentSize += Serialization.getNeedBytes(scanRangeBitLen);
157-
payloadContentSize += scanRangeBitMap.length;
157+
payloadContentSize += Serialization.getNeedBytes(scanRangeBitLen);
158+
payloadContentSize += scanRangeBitMap.length;
158159

159-
payloadContentSize += Serialization.getNeedBytes(keyRanges.size());
160-
for (ObNewRange range : keyRanges) {
161-
payloadContentSize += ObTableSerialUtil.getEncodedSize(range);
162-
}
160+
payloadContentSize += Serialization.getNeedBytes(keyRanges.size());
161+
for (ObNewRange range : keyRanges) {
162+
payloadContentSize += ObTableSerialUtil.getEncodedSize(range);
163+
}
163164

164-
payloadContentSize += Serialization.getNeedBytes(indexName);
165-
payloadContentSize += Serialization.getNeedBytes(filterString);
165+
payloadContentSize += Serialization.getNeedBytes(indexName);
166+
payloadContentSize += Serialization.getNeedBytes(filterString);
166167

167-
// calculate part required by HBase Batch Get
168-
if (isHbaseQuery && ObGlobal.isHBaseBatchGetSupport()) {
169-
payloadContentSize += Serialization.getNeedBytes(selectColumns.size());
170-
for (String selectColumn : selectColumns) {
171-
payloadContentSize += Serialization.getNeedBytes(selectColumn);
172-
}
173-
payloadContentSize += 1; // scanOrder
168+
// calculate part required by HBase Batch Get
169+
if (isHbaseQuery && ObGlobal.isHBaseBatchGetSupport()) {
170+
payloadContentSize += Serialization.getNeedBytes(selectColumns.size());
171+
for (String selectColumn : selectColumns) {
172+
payloadContentSize += Serialization.getNeedBytes(selectColumn);
173+
}
174+
payloadContentSize += 1; // scanOrder
174175

175-
if (isHbaseQuery) {
176-
payloadContentSize += hTableFilter.getPayloadSize();
177-
} else {
178-
payloadContentSize += HTABLE_DUMMY_BYTES.length;
179-
}
180-
if (isHbaseQuery && obKVParams != null) {
181-
payloadContentSize += obKVParams.getPayloadSize();
182-
} else {
183-
payloadContentSize += HTABLE_DUMMY_BYTES.length;
176+
if (isHbaseQuery) {
177+
payloadContentSize += hTableFilter.getPayloadSize();
178+
} else {
179+
payloadContentSize += HTABLE_DUMMY_BYTES.length;
180+
}
181+
if (isHbaseQuery && obKVParams != null) {
182+
payloadContentSize += obKVParams.getPayloadSize();
183+
} else {
184+
payloadContentSize += HTABLE_DUMMY_BYTES.length;
185+
}
184186
}
187+
this.payLoadContentSize = payloadContentSize;
185188
}
186189

187-
return payloadContentSize;
190+
return this.payLoadContentSize;
188191
}
189192

190193
// Support class, which is used for column name sorted

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/ObTableTabletOp.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,16 @@ public Object decode(ByteBuf buf) {
105105
*/
106106
@Override
107107
public long getPayloadContentSize() {
108-
long payloadContentSize = 0;
109-
payloadContentSize += Serialization.getNeedBytes(singleOperations.size());
110-
for (ObTableSingleOp operation : singleOperations) {
111-
payloadContentSize += operation.getPayloadSize();
112-
}
108+
if (this.payLoadContentSize == -1) {
109+
long payloadContentSize = 0;
110+
payloadContentSize += Serialization.getNeedBytes(singleOperations.size());
111+
for (ObTableSingleOp operation : singleOperations) {
112+
payloadContentSize += operation.getPayloadSize();
113+
}
113114

114-
return payloadContentSize + tabletIdSize + Serialization.getNeedBytes(optionFlag.getValue());
115+
this.payLoadContentSize = payloadContentSize + tabletIdSize + Serialization.getNeedBytes(optionFlag.getValue());
116+
}
117+
return this.payLoadContentSize;
115118
}
116119

117120
/*

src/main/java/com/alipay/oceanbase/rpc/protocol/payload/impl/execute/query/ObHTableFilter.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,24 @@ public Object decode(ByteBuf buf) {
130130
*/
131131
@Override
132132
public long getPayloadContentSize() {
133-
long contentSize = 0;
134-
contentSize += 1; // isValid
135-
136-
contentSize += Serialization.getNeedBytes(selectColumnQualifier.size());
137-
for (ObBytesString q : selectColumnQualifier) {
138-
contentSize += Serialization.getNeedBytes(q);
133+
if (this.payLoadContentSize == -1) {
134+
long contentSize = 0;
135+
contentSize += 1; // isValid
136+
137+
contentSize += Serialization.getNeedBytes(selectColumnQualifier.size());
138+
for (ObBytesString q : selectColumnQualifier) {
139+
contentSize += Serialization.getNeedBytes(q);
140+
}
141+
142+
contentSize += Serialization.getNeedBytes(minStamp);
143+
contentSize += Serialization.getNeedBytes(maxStamp);
144+
contentSize += Serialization.getNeedBytes(maxVersions);
145+
contentSize += Serialization.getNeedBytes(limitPerRowPerCf);
146+
contentSize += Serialization.getNeedBytes(offsetPerRowPerCf);
147+
contentSize += Serialization.getNeedBytes(filterString);
148+
this.payLoadContentSize = contentSize;
139149
}
140-
141-
contentSize += Serialization.getNeedBytes(minStamp);
142-
contentSize += Serialization.getNeedBytes(maxStamp);
143-
contentSize += Serialization.getNeedBytes(maxVersions);
144-
contentSize += Serialization.getNeedBytes(limitPerRowPerCf);
145-
contentSize += Serialization.getNeedBytes(offsetPerRowPerCf);
146-
contentSize += Serialization.getNeedBytes(filterString);
147-
return contentSize;
150+
return this.payLoadContentSize;
148151
}
149152

150153
/*

src/main/java/com/alipay/oceanbase/rpc/util/Serialization.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -441,15 +441,11 @@ public static void encodeFloat(ObByteBuf buf, float f) {
441441
* @return bytes need for serialize long data
442442
*/
443443
public static int getNeedBytes(long l) {
444-
if (l < 0)
445-
return 10;
446-
int needBytes = 0;
447-
for (long max : OB_MAX) {
448-
needBytes++;
449-
if (l <= max)
450-
break;
444+
if (l < 0) {
445+
return 10; // 负数固定返回10字节
451446
}
452-
return needBytes;
447+
// 计算最高位的位置,然后除以8(一个字节8位)向上取整
448+
return (Long.SIZE - Long.numberOfLeadingZeros(l) + 7) >>> 3;
453449
}
454450

455451
/**
@@ -458,15 +454,11 @@ public static int getNeedBytes(long l) {
458454
* @return bytes need for serialize int data
459455
*/
460456
public static int getNeedBytes(int l) {
461-
if (l < 0)
462-
return 5;
463-
int needBytes = 0;
464-
for (long max : OB_MAX) {
465-
needBytes++;
466-
if (l <= max)
467-
break;
457+
if (l < 0) {
458+
return 5; // 负数固定返回5字节
468459
}
469-
return needBytes;
460+
// 计算最高位的位置,然后除以8(一个字节8位)向上取整
461+
return (Integer.SIZE - Integer.numberOfLeadingZeros(l) + 7) >>> 3;
470462
}
471463

472464
/**

0 commit comments

Comments
 (0)