Skip to content

Commit a317b11

Browse files
authored
Remove min cache size and cache size allocation (#828)
* Remove min cache size and available space allocation from DiskManager * Remove unused available space and allocation methods * Modify DiskManager tests * Modify otel rum builder test * Revert import conversion to wildcard grouping * Remove maxFolderSize calculation caching * Fix lint issue
1 parent 5130a47 commit a317b11

File tree

5 files changed

+12
-153
lines changed

5 files changed

+12
-153
lines changed

core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import io.opentelemetry.android.internal.processors.ScreenAttributesLogRecordProcessor;
3232
import io.opentelemetry.android.internal.processors.SessionIdLogRecordAppender;
3333
import io.opentelemetry.android.internal.services.CacheStorage;
34-
import io.opentelemetry.android.internal.services.Preferences;
3534
import io.opentelemetry.android.internal.services.Services;
3635
import io.opentelemetry.android.internal.services.periodicwork.PeriodicWork;
3736
import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler;
@@ -427,10 +426,9 @@ public OpenTelemetryRumBuilder setExportScheduleHandler(
427426
}
428427

429428
private StorageConfiguration createStorageConfiguration(Services services) throws IOException {
430-
Preferences preferences = services.getPreferences();
431429
CacheStorage storage = services.getCacheStorage();
432430
DiskBufferingConfig config = this.config.getDiskBufferingConfig();
433-
DiskManager diskManager = new DiskManager(storage, preferences, config);
431+
DiskManager diskManager = new DiskManager(storage, config);
434432
return StorageConfiguration.builder()
435433
.setRootDir(diskManager.getSignalsBufferDir())
436434
.setMaxFileSize(diskManager.getMaxCacheFileSize())

core/src/main/java/io/opentelemetry/android/internal/features/persistence/DiskManager.kt

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ import android.util.Log
99
import io.opentelemetry.android.common.RumConstants
1010
import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig
1111
import io.opentelemetry.android.internal.services.CacheStorage
12-
import io.opentelemetry.android.internal.services.Preferences
1312
import java.io.File
1413
import java.io.IOException
1514

1615
internal class DiskManager(
1716
private val cacheStorage: CacheStorage,
18-
private val preferences: Preferences,
1917
private val diskBufferingConfig: DiskBufferingConfig,
2018
) {
2119
@get:Throws(IOException::class)
@@ -37,48 +35,21 @@ internal class DiskManager(
3735

3836
val maxFolderSize: Int
3937
/**
40-
* It checks for the available cache space in disk, then it attempts to divide by 3 in order to
41-
* get each signal's folder max size. The resulting value is subtracted the max file size value
42-
* in order to account for temp files used during the reading process.
38+
* It divides the requested cache size by 3 in order to
39+
* get each signal's folder max size.
4340
*
44-
* @return If the calculated size is < the max file size value, it returns 0. The calculated
45-
* size is stored in the preferences and returned otherwise.
41+
* @return The calculated size is stored in the preferences and returned.
4642
*/
4743
get() {
48-
val storedSize = preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1)
49-
if (storedSize > 0) {
50-
Log.d(
51-
RumConstants.OTEL_RUM_LOG_TAG,
52-
String.format("Returning max folder size from preferences: %s", storedSize),
53-
)
54-
return storedSize
55-
}
5644
val requestedSize = diskBufferingConfig.maxCacheSize
57-
val availableCacheSize =
58-
cacheStorage.ensureCacheSpaceAvailable(requestedSize.toLong()).toInt()
59-
// Divides the available cache size by 3 (for each signal's folder) and then subtracts the
60-
// size of a single file to be aware of a temp file used when reading data back from the
61-
// disk.
62-
val maxCacheFileSize = maxCacheFileSize
63-
val calculatedSize = availableCacheSize / 3 - maxCacheFileSize
64-
if (calculatedSize < maxCacheFileSize) {
65-
Log.w(
66-
RumConstants.OTEL_RUM_LOG_TAG,
67-
String.format(
68-
"Insufficient folder cache size: %s, it must be at least: %s",
69-
calculatedSize,
70-
maxCacheFileSize,
71-
),
72-
)
73-
return 0
74-
}
75-
preferences.store(MAX_FOLDER_SIZE_KEY, calculatedSize)
45+
46+
// Divides the available cache size by 3 (for each signal's folder)
47+
val calculatedSize = requestedSize / 3
7648
Log.d(
7749
RumConstants.OTEL_RUM_LOG_TAG,
7850
String.format(
79-
"Requested cache size: %s, available cache size: %s, folder size: %s",
51+
"Requested cache size: %s, folder size: %s",
8052
requestedSize,
81-
availableCacheSize,
8253
calculatedSize,
8354
),
8455
)
@@ -89,8 +60,6 @@ internal class DiskManager(
8960
get() = diskBufferingConfig.maxCacheFileSize
9061

9162
companion object {
92-
private const val MAX_FOLDER_SIZE_KEY = "max_signal_folder_size"
93-
9463
private fun deleteFiles(dir: File) {
9564
val files = dir.listFiles()
9665
if (files != null) {

core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313
import static io.opentelemetry.semconv.incubating.SessionIncubatingAttributes.SESSION_ID;
1414
import static org.awaitility.Awaitility.await;
1515
import static org.mockito.ArgumentMatchers.anyCollection;
16-
import static org.mockito.ArgumentMatchers.anyLong;
1716
import static org.mockito.ArgumentMatchers.eq;
1817
import static org.mockito.ArgumentMatchers.isA;
1918
import static org.mockito.Mockito.doAnswer;
20-
import static org.mockito.Mockito.doReturn;
2119
import static org.mockito.Mockito.mock;
2220
import static org.mockito.Mockito.never;
2321
import static org.mockito.Mockito.verify;
@@ -420,9 +418,7 @@ public void setLogRecordExporterCustomizer() {
420418

421419
@Test
422420
public void diskBufferingEnabled() {
423-
Services services = createAndSetServiceManager();
424-
CacheStorage cacheStorage = services.getCacheStorage();
425-
doReturn(60 * 1024 * 1024L).when(cacheStorage).ensureCacheSpaceAvailable(anyLong());
421+
createAndSetServiceManager();
426422
OtelRumConfig config = buildConfig();
427423
ExportScheduleHandler scheduleHandler = mock();
428424
config.setDiskBufferingConfig(new DiskBufferingConfig(true));
@@ -450,7 +446,6 @@ public void diskBufferingEnabled_when_exception_thrown() {
450446
Services services = createAndSetServiceManager();
451447
CacheStorage cacheStorage = services.getCacheStorage();
452448
ExportScheduleHandler scheduleHandler = mock();
453-
doReturn(60 * 1024 * 1024L).when(cacheStorage).ensureCacheSpaceAvailable(anyLong());
454449
doAnswer(
455450
invocation -> {
456451
throw new IOException();

core/src/test/java/io/opentelemetry/android/internal/features/persistence/DiskManagerTest.kt

Lines changed: 3 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,11 @@ package io.opentelemetry.android.internal.features.persistence
77

88
import io.mockk.Called
99
import io.mockk.MockKAnnotations
10-
import io.mockk.Runs
11-
import io.mockk.clearMocks
12-
import io.mockk.confirmVerified
1310
import io.mockk.every
1411
import io.mockk.impl.annotations.MockK
15-
import io.mockk.just
1612
import io.mockk.verify
1713
import io.opentelemetry.android.features.diskbuffering.DiskBufferingConfig
1814
import io.opentelemetry.android.internal.services.CacheStorage
19-
import io.opentelemetry.android.internal.services.Preferences
2015
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat
2116
import org.junit.jupiter.api.Assertions.assertTrue
2217
import org.junit.jupiter.api.BeforeEach
@@ -28,9 +23,6 @@ internal class DiskManagerTest {
2823
@MockK
2924
lateinit var cacheStorage: CacheStorage
3025

31-
@MockK
32-
lateinit var preferences: Preferences
33-
3426
@MockK
3527
lateinit var diskBufferingConfig: DiskBufferingConfig
3628

@@ -43,7 +35,7 @@ internal class DiskManagerTest {
4335
MockKAnnotations.init(this)
4436
every { cacheStorage.cacheDir }.returns(cacheDir)
4537
diskManager =
46-
DiskManager(cacheStorage, preferences, diskBufferingConfig)
38+
DiskManager(cacheStorage, diskBufferingConfig)
4739
}
4840

4941
@Test
@@ -90,48 +82,11 @@ internal class DiskManagerTest {
9082
val maxCacheFileSize = 1024 * 1024 // 1 MB
9183
every { diskBufferingConfig.maxCacheSize }.returns(maxCacheSize.toInt())
9284
every { diskBufferingConfig.maxCacheFileSize }.returns(maxCacheFileSize)
93-
every { cacheStorage.ensureCacheSpaceAvailable(maxCacheSize) }.returns(maxCacheSize)
94-
every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(-1)
95-
every { preferences.store(any(), any()) } just Runs
9685

97-
// Expects the size of a single signal type folder minus the size of a cache file, to use as
98-
// temporary space for reading.
99-
val expected = 2446677
86+
// Expects the size of a single signal type folder, to use as temporary space for reading.
87+
val expected = (maxCacheSize / 3).toInt()
10088
assertThat(diskManager.maxFolderSize).isEqualTo(expected)
101-
verify {
102-
preferences.store(MAX_FOLDER_SIZE_KEY, expected)
103-
}
10489

105-
// On a second call, should get the value from the preferences.
106-
clearMocks(cacheStorage, diskBufferingConfig, preferences)
107-
every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(expected)
108-
assertThat(diskManager.maxFolderSize).isEqualTo(expected)
109-
110-
verify {
111-
preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1)
112-
}
113-
confirmVerified(preferences)
11490
verify { cacheStorage wasNot Called }
115-
verify { diskBufferingConfig wasNot Called }
116-
}
117-
118-
@Test
119-
fun `max folder size is used when calculated size is invalid`() {
120-
val maxCacheSize = (1024 * 1024).toLong() // 1 MB
121-
val maxCacheFileSize = 1024 * 1024 // 1 MB
122-
every { diskBufferingConfig.maxCacheSize }.returns(maxCacheSize.toInt())
123-
every { diskBufferingConfig.maxCacheFileSize }.returns(maxCacheFileSize)
124-
every { cacheStorage.ensureCacheSpaceAvailable(maxCacheSize) }.returns(maxCacheSize)
125-
every { preferences.retrieveInt(MAX_FOLDER_SIZE_KEY, -1) }.returns(-1)
126-
// Expects the size of a single signal type folder minus the size of a cache file, to use as
127-
// temporary space for reading.
128-
assertThat(diskManager.maxFolderSize).isEqualTo(0)
129-
verify(inverse = true) {
130-
preferences.store(any(), any())
131-
}
132-
}
133-
134-
companion object {
135-
private const val MAX_FOLDER_SIZE_KEY = "max_signal_folder_size"
13691
}
13792
}

services/src/main/java/io/opentelemetry/android/internal/services/CacheStorage.java

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,7 @@
66
package io.opentelemetry.android.internal.services;
77

88
import android.content.Context;
9-
import android.os.Build;
10-
import android.os.storage.StorageManager;
11-
import android.util.Log;
12-
import androidx.annotation.RequiresApi;
13-
import androidx.annotation.WorkerThread;
14-
import io.opentelemetry.android.common.RumConstants;
159
import java.io.File;
16-
import java.io.IOException;
17-
import java.util.UUID;
1810

1911
/**
2012
* Utility to get information about the host app.
@@ -32,54 +24,4 @@ public CacheStorage(Context appContext) {
3224
public File getCacheDir() {
3325
return appContext.getCacheDir();
3426
}
35-
36-
/**
37-
* Checks for available cache space in the device and compares it to the max amount needed, if
38-
* the available space is lower than the provided max value, the available space is returned,
39-
* otherwise, the provided amount is returned.
40-
*
41-
* <p>On Android OS with API level 26 and above, it will also ask the OS to clear stale cache
42-
* from the device in order to make room for the provided max value if needed.
43-
*/
44-
@WorkerThread
45-
public long ensureCacheSpaceAvailable(long maxSpaceNeeded) {
46-
File cacheDir = getCacheDir();
47-
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.O) {
48-
return getLegacyAvailableSpace(cacheDir, maxSpaceNeeded);
49-
}
50-
return getAvailableSpace(cacheDir, maxSpaceNeeded);
51-
}
52-
53-
@RequiresApi(api = Build.VERSION_CODES.O)
54-
private long getAvailableSpace(File directory, long maxSpaceNeeded) {
55-
Log.d(
56-
RumConstants.OTEL_RUM_LOG_TAG,
57-
String.format(
58-
"Getting available space for %s, max needed is: %s",
59-
directory, maxSpaceNeeded));
60-
try {
61-
StorageManager storageManager = appContext.getSystemService(StorageManager.class);
62-
UUID appSpecificInternalDirUuid = storageManager.getUuidForPath(directory);
63-
// Get the minimum amount of allocatable space.
64-
long spaceToAllocate =
65-
Math.min(
66-
storageManager.getAllocatableBytes(appSpecificInternalDirUuid),
67-
maxSpaceNeeded);
68-
// Ensure the space is available by asking the OS to clear stale cache if needed.
69-
storageManager.allocateBytes(appSpecificInternalDirUuid, spaceToAllocate);
70-
return spaceToAllocate;
71-
} catch (IOException e) {
72-
Log.w(RumConstants.OTEL_RUM_LOG_TAG, "Failed to get available space", e);
73-
return getLegacyAvailableSpace(directory, maxSpaceNeeded);
74-
}
75-
}
76-
77-
private long getLegacyAvailableSpace(File directory, long maxSpaceNeeded) {
78-
Log.d(
79-
RumConstants.OTEL_RUM_LOG_TAG,
80-
String.format(
81-
"Getting legacy available space for %s max needed is: %s",
82-
directory, maxSpaceNeeded));
83-
return Math.min(directory.getUsableSpace(), maxSpaceNeeded);
84-
}
8527
}

0 commit comments

Comments
 (0)