Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -293,8 +293,8 @@ public final class DataNodePipeMessages {
+ "PipeInsertNodeTabletInsertionEvent({}) overlaps with the time range: [{}, {}]. "
+ "Returning true to ensure data integrity.";
public static final String FAILED_TO_ALLOCATE_MEMORY_FOR_PARSING_TSFILE =
"{}: failed to allocate memory for parsing TsFile {}, tablet event no. {}, retry count "
+ "is {}, will keep retrying.";
"{}: failed to allocate memory for parsing TsFile {}, tablet event no. {}, "
+ "will release parser memory and retry the TsFile event later.";
public static final String FAILED_TO_BUILD_TABLET = "Failed to build tablet";
public static final String FAILED_TO_CHECK_NEXT = "Failed to check next";
public static final String FAILED_TO_CLOSE_TSFILEREADER = "Failed to close TsFileReader";
Expand Down Expand Up @@ -2473,5 +2473,11 @@ private DataNodePipeMessages() {}
"Invalid aligned value chunk index %d, while there are %d time chunks.";
public static final String MESSAGE_FAILED_TO_ROLLBACK_CREATED_REALTIME_PIPE_ARG_STATUS_ARG_CE14334A =
"Failed to rollback created realtime pipe {}. Status: {}";
public static final String LOG_REPORTING_PIPE_META_ARG_ISCOMPLETED_ARG_REMAININGEVENTCOUNT_ARG_8F996DF3 =
"Reporting pipe meta: %s, isCompleted: %s, remainingEventCount: %s";
public static final String LOG_REPORTED_ARG_PIPE_METAS_12068FC6 =
"Reported %s pipe metas.";
public static final String MESSAGE_TRANSFER_FILE_ARG_ERROR_RESULT_STATUS_ARG_E565D9FD =
"Transfer file %s error, result status %s.";

}
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ public final class DataNodePipeMessages {
"判断 PipeInsertNodeTabletInsertionEvent({}) 的事件时间是否与时间范围 [{}, {}] 重叠时"
+ "发生异常。为保证数据完整性返回 true。";
public static final String FAILED_TO_ALLOCATE_MEMORY_FOR_PARSING_TSFILE =
"{}:为解析 TsFile {} 分配内存失败,tablet event 序号 {},重试次数 {},将持续重试。";
"{}:为解析 TsFile {} 分配内存失败,tablet 事件编号 {},"
+ "将释放解析器内存并稍后重试该 TsFile 事件。";
public static final String FAILED_TO_BUILD_TABLET = "构建 tablet 失败";
public static final String FAILED_TO_CHECK_NEXT = "check next 失败";
public static final String FAILED_TO_CLOSE_TSFILEREADER = "关闭 TsFileReader 失败";
Expand Down Expand Up @@ -2311,5 +2312,11 @@ private DataNodePipeMessages() {}
"对齐值 chunk 索引 %d 无效,而共有 %d 个 time chunk。";
public static final String MESSAGE_FAILED_TO_ROLLBACK_CREATED_REALTIME_PIPE_ARG_STATUS_ARG_CE14334A =
"回滚已创建的 realtime pipe {} 失败。状态:{}";
public static final String LOG_REPORTING_PIPE_META_ARG_ISCOMPLETED_ARG_REMAININGEVENTCOUNT_ARG_8F996DF3 =
"正在上报 pipe meta:%s,isCompleted:%s,remainingEventCount:%s";
public static final String LOG_REPORTED_ARG_PIPE_METAS_12068FC6 =
"已上报 %s 个 pipe meta。";
public static final String MESSAGE_TRANSFER_FILE_ARG_ERROR_RESULT_STATUS_ARG_E565D9FD =
"传输文件 %s 出错,结果状态为 %s。";

}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ protected boolean executeOnce() throws Exception {
event1 -> {
try {
pipeProcessor.process(event1, outputEventCollector);
} catch (PipeRuntimeOutOfMemoryCriticalException e) {
throw e;
} catch (Exception e) {
ex.set(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -529,7 +529,7 @@
}

@Override
public void throwIfNoPrivilege() {

Check warning on line 532 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

A "Brain Method" was detected. Refactor it to reduce at least one of the following metrics: LOC from 103 to 64, Complexity from 21 to 14, Nesting Level from 5 to 2, Number of Variables from 13 to 6.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRY&open=AZ8bkCfStSRAbF5ZBDRY&pullRequest=18051
try {
if (AuthorityChecker.SUPER_USER.equals(userName)) {
return;
Expand Down Expand Up @@ -726,38 +726,37 @@

public void consumeTabletInsertionEventsWithRetry(
final TabletInsertionEventConsumer consumer, final String callerName) throws Exception {
final Iterable<TabletInsertionEvent> iterable = toTabletInsertionEvents();
final Iterator<TabletInsertionEvent> iterator = iterable.iterator();
int tabletEventCount = 0;
while (iterator.hasNext()) {
final TabletInsertionEvent parsedEvent = iterator.next();
tabletEventCount++;
int retryCount = 0;
while (true) {
// If failed due do insufficient memory, retry until success to avoid race among multiple
// processor threads
try {
final Iterable<TabletInsertionEvent> iterable = toTabletInsertionEvents();
final Iterator<TabletInsertionEvent> iterator = iterable.iterator();
while (iterator.hasNext()) {
final TabletInsertionEvent parsedEvent = iterator.next();
tabletEventCount++;
try {

Check warning on line 736 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Extract this nested try block into a separate method.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRT&open=AZ8bkCfStSRAbF5ZBDRT&pullRequest=18051
consumer.consume((PipeRawTabletInsertionEvent) parsedEvent);
break;
} catch (final PipeRuntimeOutOfMemoryCriticalException e) {
if (retryCount++ % 100 == 0) {
LOGGER.warn(
DataNodePipeMessages.FAILED_TO_ALLOCATE_MEMORY_FOR_PARSING_TSFILE,
callerName,
getTsFile(),
tabletEventCount,
retryCount);
} else if (LOGGER.isDebugEnabled()) {
LOGGER.debug(
DataNodePipeMessages.FAILED_TO_ALLOCATE_MEMORY_FOR_PARSING_TSFILE,
callerName,
getTsFile(),
tabletEventCount,
retryCount,
e);
}
releaseParsedTabletEvent(parsedEvent);
throw e;
}
}
} catch (final PipeRuntimeOutOfMemoryCriticalException e) {

Check warning on line 743 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Either log this exception and handle it, or rethrow it with some contextual information.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRU&open=AZ8bkCfStSRAbF5ZBDRU&pullRequest=18051
close();
LOGGER.warn(
DataNodePipeMessages.FAILED_TO_ALLOCATE_MEMORY_FOR_PARSING_TSFILE,
callerName,
getTsFile(),
tabletEventCount,
e);
throw e;
}
}

private void releaseParsedTabletEvent(final TabletInsertionEvent parsedEvent) {
if (parsedEvent instanceof PipeRawTabletInsertionEvent

Check warning on line 756 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof PipeRawTabletInsertionEvent piperawtabletinsertionevent'

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRV&open=AZ8bkCfStSRAbF5ZBDRV&pullRequest=18051

Check warning on line 756 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof PipeRawTabletInsertionEvent piperawtabletinsertionevent'

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRX&open=AZ8bkCfStSRAbF5ZBDRX&pullRequest=18051

Check warning on line 756 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/PipeTsFileInsertionEvent.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof PipeRawTabletInsertionEvent piperawtabletinsertionevent'

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCfStSRAbF5ZBDRW&open=AZ8bkCfStSRAbF5ZBDRW&pullRequest=18051
&& ((PipeRawTabletInsertionEvent) parsedEvent).getReferenceCount() == 0
&& !((PipeRawTabletInsertionEvent) parsedEvent).isReleased()) {
((PipeRawTabletInsertionEvent) parsedEvent).clearReferenceCount(getClass().getName());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
import org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.i18n.DataNodePipeMessages;
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
import org.apache.iotdb.db.pipe.event.common.tsfile.parser.table.TsFileInsertionEventTableParser;
Expand Down Expand Up @@ -109,9 +108,7 @@ protected TsFileInsertionEventParser(
this.sourceEvent = sourceEvent;

this.allocatedMemoryBlockForTablet =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(
IoTDBDescriptor.getInstance().getConfig().getPipeDataStructureTabletSizeInBytes());
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);

LOGGER.debug(
DataNodePipeMessages.TSFILE_HAS_INITIALIZED_PIPENAME_CREATION_TIME_PATTERN,
Expand Down Expand Up @@ -180,6 +177,13 @@ protected void recordTabletMetrics(final Tablet tablet) {
}
}

protected void releaseTabletMemoryBlock() {
if (allocatedMemoryBlockForTablet != null
&& allocatedMemoryBlockForTablet.getMemoryUsageInBytes() > 0) {
PipeDataNodeResourceManager.memory().forceResize(allocatedMemoryBlockForTablet, 0);
}
}

@Override
public void close() {
tabletInsertionIterable = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,7 @@ public TabletInsertionEvent next() {
final Tablet tablet = tabletIterator.next();
// Record tablet metrics
recordTabletMetrics(tablet);
releaseTabletMemoryBlock();
final boolean isAligned =
deviceIsAlignedMap.getOrDefault(
IDeviceID.Factory.DEFAULT_FACTORY.create(tablet.getDeviceId()), false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import org.apache.iotdb.commons.pipe.config.PipeConfig;
import org.apache.iotdb.commons.pipe.datastructure.pattern.TreePattern;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.i18n.DataNodePipeMessages;
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
import org.apache.iotdb.db.pipe.event.common.tablet.PipeRawTabletInsertionEvent;
Expand Down Expand Up @@ -144,12 +143,9 @@
filter = Objects.nonNull(timeFilterExpression) ? timeFilterExpression.getFilter() : null;

this.allocatedMemoryBlockForBatchData =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(
IoTDBDescriptor.getInstance().getConfig().getPipeDataStructureTabletSizeInBytes());
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);
this.allocatedMemoryBlockForChunk =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(PipeConfig.getInstance().getPipeMaxReaderChunkSize());
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);

try {
currentModifications =
Expand Down Expand Up @@ -225,6 +221,9 @@
throw new NoSuchElementException();
}

// Release the previous parser-owned tablet buffer before allocating the next
// tablet.
releaseTabletMemoryBlock();
// currentIsAligned is initialized when TsFileInsertionEventScanParser is
// constructed.
// When the getNextTablet function is called, currentIsAligned may be updated,
Expand Down Expand Up @@ -263,6 +262,9 @@
sourceEvent,
isLast);
} finally {
// The raw event owns the generated tablet; only release the parser-side memory
// accounting.
releaseTabletMemoryBlock();
if (isLast) {
recordParseEndTimeIfNecessary();
close();
Expand Down Expand Up @@ -451,7 +453,7 @@
}
}

private boolean putValueToColumns(final BatchData data, final Tablet tablet, final int rowIndex) {

Check warning on line 456 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

A "Brain Method" was detected. Refactor it to reduce at least one of the following metrics: LOC from 134 to 64, Complexity from 34 to 14, Nesting Level from 4 to 2, Number of Variables from 8 to 6.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8Rr3kEfwQ4mSZzoAMB&open=AZ8Rr3kEfwQ4mSZzoAMB&pullRequest=18051
boolean isNeedFillTime = false;
if (data.getDataType() == TSDataType.VECTOR) {
for (int i = 0; i < tablet.getSchemas().size(); ++i) {
Expand Down Expand Up @@ -588,7 +590,7 @@
return isNeedFillTime;
}

private void moveToNextChunkReader()

Check warning on line 593 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/event/common/tsfile/parser/scan/TsFileInsertionEventScanParser.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

A "Brain Method" was detected. Refactor it to reduce at least one of the following metrics: LOC from 123 to 64, Complexity from 25 to 14, Nesting Level from 4 to 2, Number of Variables from 12 to 6.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8Rr3kEfwQ4mSZzoAMC&open=AZ8Rr3kEfwQ4mSZzoAMC&pullRequest=18051
throws IOException, IllegalStateException, IllegalPathException {
ChunkHeader chunkHeader;
currentMeasurements.clear();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@
import org.apache.iotdb.commons.audit.IAuditEntity;
import org.apache.iotdb.commons.exception.auth.AccessDeniedException;
import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
import org.apache.iotdb.commons.pipe.config.PipeConfig;
import org.apache.iotdb.commons.pipe.datastructure.pattern.TablePattern;
import org.apache.iotdb.commons.queryengine.plan.relational.metadata.QualifiedObjectName;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.i18n.DataNodePipeMessages;
import org.apache.iotdb.db.pipe.event.common.PipeInsertionEvent;
import org.apache.iotdb.db.pipe.event.common.tablet.PipeRawTabletInsertionEvent;
Expand Down Expand Up @@ -94,25 +92,14 @@ public TsFileInsertionEventTableParser(
allocatedMemoryBlockForModifications =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(currentModifications.ramBytesUsed());
long tableSize =
Math.min(
IoTDBDescriptor.getInstance().getConfig().getPipeDataStructureTabletSizeInBytes(),
IoTDBDescriptor.getInstance().getConfig().getTargetChunkSize());

this.allocatedMemoryBlockForChunk =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(
PipeConfig.getInstance().getPipeMaxReaderChunkSize());
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);
this.allocatedMemoryBlockForBatchData =
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(tableSize);
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);
this.allocatedMemoryBlockForChunkMeta =
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(tableSize);
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);
this.allocatedMemoryBlockForTableSchemas =
PipeDataNodeResourceManager.memory()
.forceAllocateForTabletWithRetry(
IoTDBDescriptor.getInstance()
.getConfig()
.getPipeDataStructureTabletSizeInBytes());
PipeDataNodeResourceManager.memory().forceAllocateForTabletWithRetry(0);

this.startTime = startTime;
this.endTime = endTime;
Expand Down Expand Up @@ -240,6 +227,7 @@ && hasTablePrivilege(entry.getKey()),

final Tablet tablet = tabletIterator.next();
recordTabletMetrics(tablet);
releaseTabletMemoryBlock();
if (!PipeRawTabletInsertionEvent.isTabletEmpty(tablet)) {
bufferedTablet = tablet;
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.apache.iotdb.commons.consensus.index.impl.MinimumProgressIndex;
import org.apache.iotdb.commons.consensus.index.impl.TimeWindowStateProgressIndex;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.pipe.PipeRuntimeOutOfMemoryCriticalException;
import org.apache.iotdb.commons.pipe.agent.task.meta.PipeTaskMeta;
import org.apache.iotdb.commons.pipe.config.plugin.env.PipeTaskProcessorRuntimeEnvironment;
import org.apache.iotdb.commons.pipe.event.EnrichedEvent;
Expand Down Expand Up @@ -433,7 +434,7 @@
}
}

private Map<String, Pair<Long, ByteBuffer>> processRow(

Check warning on line 437 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/aggregate/AggregateProcessor.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

A "Brain Method" was detected. Refactor it to reduce at least one of the following metrics: LOC from 93 to 64, Complexity from 17 to 14, Nesting Level from 4 to 2, Number of Variables from 12 to 6.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCf0tSRAbF5ZBDRZ&open=AZ8bkCf0tSRAbF5ZBDRZ&pullRequest=18051
final Row row, final RowCollector rowCollector, final AtomicReference<Exception> exception) {
final Map<String, Pair<Long, ByteBuffer>> resultMap = new HashMap<>();

Expand Down Expand Up @@ -549,6 +550,8 @@
event -> {
try {
process(event, eventCollector);
} catch (PipeRuntimeOutOfMemoryCriticalException e) {
throw e;
} catch (Exception e) {
ex.set(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
package org.apache.iotdb.db.pipe.processor.downsampling;

import org.apache.iotdb.commons.consensus.DataRegionId;
import org.apache.iotdb.commons.exception.pipe.PipeRuntimeOutOfMemoryCriticalException;
import org.apache.iotdb.commons.pipe.config.plugin.env.PipeTaskProcessorRuntimeEnvironment;
import org.apache.iotdb.db.pipe.event.common.tablet.PipeInsertNodeTabletInsertionEvent;
import org.apache.iotdb.db.pipe.event.common.tablet.PipeRawTabletInsertionEvent;
Expand Down Expand Up @@ -145,7 +146,7 @@
* usage.
*/
@Override
public void process(TsFileInsertionEvent tsFileInsertionEvent, EventCollector eventCollector)

Check failure on line 149 in iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/processor/downsampling/DownSamplingProcessor.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this method to reduce its Cognitive Complexity from 19 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AZ8bkCgLtSRAbF5ZBDRa&open=AZ8bkCgLtSRAbF5ZBDRa&pullRequest=18051
throws Exception {
if (shouldSplitFile) {
try {
Expand All @@ -156,6 +157,8 @@
event -> {
try {
process(event, eventCollector);
} catch (PipeRuntimeOutOfMemoryCriticalException e) {
throw e;
} catch (Exception e) {
ex.set(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,6 @@ public synchronized void resize(
}

final long oldSize = block.getMemoryUsageInBytes();
if (oldSize == 0) {
// If the memory block is not registered, we need to register it first.
// Otherwise, the memory usage will be inconsistent.
// See registerMemoryBlock for more details.
allocatedBlocks.add(block);
}

if (oldSize >= targetSize) {
memoryBlock.release(oldSize - targetSize);
Expand All @@ -349,6 +343,8 @@ public synchronized void resize(
if (targetSize == 0) {
allocatedBlocks.remove(block);
}

this.notifyAll();
return;
}

Expand All @@ -358,6 +354,12 @@ public synchronized void resize(
if (getTotalNonFloatingMemorySizeInBytes() - memoryBlock.getUsedMemoryInBytes()
>= sizeInBytes) {
memoryBlock.forceAllocateWithoutLimitation(sizeInBytes);
if (oldSize == 0) {
// If the memory block is not registered, we need to register it first.
// Otherwise, the memory usage will be inconsistent.
// See registerMemoryBlock for more details.
allocatedBlocks.add(block);
}
if (block instanceof PipeTabletMemoryBlock) {
usedMemorySizeInBytesOfTablets += sizeInBytes;
}
Expand Down Expand Up @@ -485,6 +487,9 @@ public synchronized boolean tryAllocate(
if (getTotalNonFloatingMemorySizeInBytes() - memoryBlock.getUsedMemoryInBytes()
>= memoryInBytesNeededToBeAllocated) {
memoryBlock.forceAllocateWithoutLimitation(memoryInBytesNeededToBeAllocated);
if (block.getMemoryUsageInBytes() == 0) {
allocatedBlocks.add(block);
}
if (block instanceof PipeTabletMemoryBlock) {
usedMemorySizeInBytesOfTablets += memoryInBytesNeededToBeAllocated;
}
Expand Down
Loading
Loading