Skip to content

Commit 5566196

Browse files
committed
optimize loading tenant state speed during startup and range reset
1 parent bc329a7 commit 5566196

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

bifromq-inbox/bifromq-inbox-rpc-definition/src/main/java/com/baidu/bifromq/inbox/util/KeyUtil.java

+13
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,19 @@ public static boolean isMetadataKey(ByteString key) {
8888
return key.size() == inboxKeyPrefixLength(key);
8989
}
9090

91+
public static boolean hasInboxKeyPrefix(ByteString key) {
92+
if (key.size() > SCHEMA_VER.size() + Integer.BYTES) {
93+
int tenantPrefixLength = tenantPrefixLength(key);
94+
if (key.size() > tenantPrefixLength + Integer.BYTES) {
95+
int inboxPrefixLength = inboxPrefixLength(key);
96+
if (key.size() >= inboxPrefixLength + Long.BYTES) {
97+
return true;
98+
}
99+
}
100+
}
101+
return false;
102+
}
103+
91104
public static boolean isQoS0MessageKey(ByteString key) {
92105
// QOS0 MessageKey: <INBOX_KEY_PREFIX><QOS0INBOX_SIGN><SEQ>
93106
int inboxKeyPrefixLen = inboxKeyPrefixLength(key);

bifromq-inbox/bifromq-inbox-rpc-definition/src/test/java/com/baidu/bifromq/inbox/util/KeyUtilTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ public void buildAndParse() {
3838
assertTrue(isInboxKey(inboxKeyPrefix));
3939
assertTrue(isInboxKey(qos0MsgKey));
4040
assertTrue(isInboxKey(bufferMsgKey));
41+
assertFalse(KeyUtil.hasInboxKeyPrefix(tenantPrefix));
42+
assertFalse(KeyUtil.hasInboxKeyPrefix(inboxPrefix));
43+
assertTrue(KeyUtil.hasInboxKeyPrefix(inboxKeyPrefix));
44+
assertTrue(KeyUtil.hasInboxKeyPrefix(qos0MsgKey));
45+
assertTrue(KeyUtil.hasInboxKeyPrefix(bufferMsgKey));
4146

4247
assertTrue(inboxPrefix.startsWith(tenantPrefix));
4348
assertTrue(inboxKeyPrefix.startsWith(inboxPrefix));

bifromq-inbox/bifromq-inbox-store/src/main/java/com/baidu/bifromq/inbox/store/InboxStoreCoProc.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
package com.baidu.bifromq.inbox.store;
1515

1616
import static com.baidu.bifromq.inbox.util.KeyUtil.bufferMsgKey;
17+
import static com.baidu.bifromq.inbox.util.KeyUtil.hasInboxKeyPrefix;
1718
import static com.baidu.bifromq.inbox.util.KeyUtil.inboxKeyPrefix;
1819
import static com.baidu.bifromq.inbox.util.KeyUtil.inboxKeyUpperBound;
1920
import static com.baidu.bifromq.inbox.util.KeyUtil.isBufferMessageKey;
2021
import static com.baidu.bifromq.inbox.util.KeyUtil.isMetadataKey;
2122
import static com.baidu.bifromq.inbox.util.KeyUtil.isQoS0MessageKey;
23+
import static com.baidu.bifromq.inbox.util.KeyUtil.parseInboxKeyPrefix;
2224
import static com.baidu.bifromq.inbox.util.KeyUtil.parseSeq;
2325
import static com.baidu.bifromq.inbox.util.KeyUtil.parseTenantId;
2426
import static com.baidu.bifromq.inbox.util.KeyUtil.qos0InboxMsgKey;
@@ -109,6 +111,7 @@ final class InboxStoreCoProc implements IKVRangeCoProc {
109111
// make it configurable?
110112
private static final int MAX_GC_BATCH_SIZE = 10000;
111113
private static long initTime;
114+
private final KVRangeId id;
112115
private final ISettingProvider settingProvider;
113116
private final IEventCollector eventCollector;
114117
private final TenantsState tenantStates;
@@ -120,12 +123,14 @@ final class InboxStoreCoProc implements IKVRangeCoProc {
120123
ISettingProvider settingProvider,
121124
IEventCollector eventCollector,
122125
Supplier<IKVReader> rangeReaderProvider) {
126+
this.id = id;
123127
initTime = HLC.INST.getPhysical();
124128
this.settingProvider = settingProvider;
125129
this.eventCollector = eventCollector;
126130
this.rangeReaderProvider = rangeReaderProvider;
127131
this.tenantStates = new TenantsState(rangeReaderProvider.get(),
128132
"clusterId", clusterId, "storeId", storeId, "rangeId", KVRangeIdUtil.toString(id));
133+
log.debug("Loading tenant states: rangeId={}", KVRangeIdUtil.toString(id));
129134
load();
130135
}
131136

@@ -212,6 +217,7 @@ public Supplier<RWCoProcOutput> mutate(RWCoProcInput input, IKVReader reader, IK
212217
@Override
213218
public void reset(Boundary boundary) {
214219
tenantStates.reset();
220+
log.debug("Reloading tenant states: rangeId={}", KVRangeIdUtil.toString(id));
215221
load();
216222
}
217223

@@ -987,17 +993,33 @@ private void commitToInbox(ByteString scopedInboxId,
987993
private void load() {
988994
IKVReader reader = rangeReaderProvider.get();
989995
IKVIterator itr = reader.iterator();
996+
int probe = 0;
990997
for (itr.seekToFirst(); itr.isValid(); ) {
991998
if (isMetadataKey(itr.key())) {
999+
probe = 0;
9921000
try {
9931001
tenantStates.upsert(parseTenantId(itr.key()), InboxMetadata.parseFrom(itr.value()));
9941002
} catch (InvalidProtocolBufferException e) {
9951003
log.error("Unexpected error", e);
9961004
} finally {
997-
itr.seek(inboxKeyUpperBound(itr.key()));
1005+
itr.next();
1006+
probe++;
1007+
}
1008+
} else {
1009+
if (probe < 20) {
1010+
itr.next();
1011+
probe++;
1012+
} else {
1013+
if (hasInboxKeyPrefix(itr.key())) {
1014+
itr.seek(inboxKeyUpperBound(parseInboxKeyPrefix(itr.key())));
1015+
} else {
1016+
itr.next();
1017+
probe++;
1018+
}
9981019
}
9991020
}
10001021
}
1022+
log.debug("Tenant states loaded: rangeId={}", KVRangeIdUtil.toString(id));
10011023
}
10021024

10031025
private boolean hasExpired(InboxMetadata metadata, long nowTS) {

0 commit comments

Comments
 (0)