in entity-store/src/main/java/jetbrains/exodus/entitystore/PersistentEntityStoreImpl.java [1224:1292]
public String getBlobString(@NotNull final PersistentStoreTransaction txn,
@NotNull final PersistentEntity entity,
@NotNull final String blobName) throws IOException {
final int blobId = getPropertyId(txn, blobName, false);
if (blobId < 0) {
return null;
}
String result = txn.getCachedBlobString(entity, blobId);
if (result != null) {
return result;
}
final Pair<Long, InputStream> blobStream = getInPlaceBlobStream(txn, entity, blobName);
if (blobStream == null) {
return null;
}
final long blobHandle = blobStream.getFirst();
if (blobHandle == EMPTY_BLOB_HANDLE) {
result = "";
} else {
try {
final InputStream stream = blobStream.getSecond();
if (stream == null) {
var envTxn = txn.getEnvironmentTransaction();
var blobLength = getBlobFileLength(blobHandle, envTxn);
var blobString = blobVault.getStringContent(blobHandle, envTxn,
blobLength);
if (blobString != null) {
return blobString;
}
int counter = 0;
final int sleepInterval = 50;
final int counterMaxValue = config.getBlobMaxReadWaitingInterval() * 1000 / sleepInterval;
while (true) {
try {
Thread.sleep(sleepInterval);
} catch (InterruptedException e) {
throw new ExodusException("Store : " + getName() +
" . Reading of blob content was interrupted.", e);
}
counter++;
blobString = blobVault.getStringContent(blobHandle, envTxn,
blobLength);
if (blobString != null) {
return blobString;
}
if (counter >= counterMaxValue) {
final String message = generateBlobBrokenMessage(txn,
entity, blobName, blobHandle, blobLength);
throw new ExodusException(message);
}
}
}
result = UTFUtil.readUTF(stream);
} catch (UTFDataFormatException e) {
result = e.toString();
}
}
if (result != null) {
txn.cacheBlobString(entity, blobId, result);
}
return result;
}