Added debug option to configure sqlite cache size

This commit is contained in:
M66B 2021-09-05 18:33:16 +02:00
parent c4c9499211
commit aaf4187631
5 changed files with 99 additions and 14 deletions

View File

@ -245,7 +245,7 @@ public class ApplicationEx extends Application
case "query_threads": // misc
case "wal": // misc
// Should be excluded for import
restart();
restart(this);
break;
case "debug":
case "log_level":
@ -254,10 +254,10 @@ public class ApplicationEx extends Application
}
}
void restart() {
Intent intent = new Intent(this, ActivityMain.class);
static void restart(Context context) {
Intent intent = new Intent(context, ActivityMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
context.startActivity(intent);
Runtime.getRuntime().exit(0);
}

View File

@ -117,9 +117,10 @@ public abstract class DB extends RoomDatabase {
private static Context sContext;
private static DB sInstance;
static final int DB_DEFAULT_CACHE = 5; // percentage
private static final String DB_NAME = "fairemail";
private static final int DB_CHECKPOINT = 1000; // requery/sqlite-android default
private static final int DB_CACHE_PERCENTAGE = 3;
private static final String[] DB_TABLES = new String[]{
"identity", "account", "folder", "message", "attachment", "operation", "contact", "certificate", "answer", "rule", "log"};
@ -374,6 +375,7 @@ public abstract class DB extends RoomDatabase {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
int threads = prefs.getInt("query_threads", 4); // AndroidX default thread count: 4
boolean wal = prefs.getBoolean("wal", true);
int sqlite_cache = prefs.getInt("sqlite_cache", DB.DB_DEFAULT_CACHE);
Log.i("DB query threads=" + threads + " wal=" + wal);
ExecutorService executorQuery = Helper.getBackgroundExecutor(threads, "query");
ExecutorService executorTransaction = Helper.getBackgroundExecutor(0, "transaction");
@ -404,7 +406,7 @@ public abstract class DB extends RoomDatabase {
try {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
int class_mb = am.getMemoryClass();
int cache_size = DB_CACHE_PERCENTAGE * class_mb * 1024 / 100;
int cache_size = sqlite_cache * class_mb * 1024 / 100;
if (cache_size > 2000) {
// https://www.sqlite.org/pragma.html#pragma_cache_size
cache_size = -cache_size; // kibibytes

View File

@ -124,6 +124,9 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private SwitchCompat swDebug;
private SwitchCompat swQueries;
private SwitchCompat swWal;
private TextView tvSqliteCache;
private SeekBar sbSqliteCache;
private ImageButton ibSqliteCache;
private SwitchCompat swModSeq;
private SwitchCompat swExpunge;
private SwitchCompat swAuthPlain;
@ -154,7 +157,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
"shortcuts", "fts",
"classification", "class_min_probability", "class_min_difference",
"language", "deepl_enabled", "watchdog", "updates", "weekly",
"experiments", "wal", "query_threads", "crash_reports", "cleanup_attachments",
"experiments", "wal", "query_threads", "sqlite_cache", "crash_reports", "cleanup_attachments",
"protocol", "debug", "log_level",
"use_modseq", "perform_expunge",
"auth_plain", "auth_login", "auth_ntlm", "auth_sasl",
@ -236,6 +239,9 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swDebug = view.findViewById(R.id.swDebug);
swQueries = view.findViewById(R.id.swQueries);
swWal = view.findViewById(R.id.swWal);
tvSqliteCache = view.findViewById(R.id.tvSqliteCache);
sbSqliteCache = view.findViewById(R.id.sbSqliteCache);
ibSqliteCache = view.findViewById(R.id.ibSqliteCache);
swModSeq = view.findViewById(R.id.swModSeq);
swExpunge = view.findViewById(R.id.swExpunge);
swAuthPlain = view.findViewById(R.id.swAuthPlain);
@ -608,6 +614,30 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
}
});
sbSqliteCache.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
prefs.edit().putInt("sqlite_cache", progress).apply();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// Do nothing
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Do nothing
}
});
ibSqliteCache.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ApplicationEx.restart(v.getContext());
}
});
swProtocol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
@ -1010,6 +1040,12 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
private void setOptions() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
ActivityManager am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
int class_mb = am.getMemoryClass();
int class_large_mb = am.getLargeMemoryClass();
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
swPowerMenu.setChecked(Helper.isComponentEnabled(getContext(), ServicePowerControl.class));
swExternalSearch.setChecked(Helper.isComponentEnabled(getContext(), ActivitySearch.class));
@ -1061,6 +1097,14 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swDebug.setChecked(prefs.getBoolean("debug", false));
swQueries.setChecked(prefs.getInt("query_threads", 4) < 4);
swWal.setChecked(prefs.getBoolean("wal", true));
int sqlite_cache = prefs.getInt("sqlite_cache", DB.DB_DEFAULT_CACHE);
int cache_size = sqlite_cache * class_mb * 1024 / 100;
tvSqliteCache.setText(getString(R.string.title_advanced_sqlite_cache,
NF.format(sqlite_cache),
Helper.humanReadableByteCount(cache_size * 1024L)));
sbSqliteCache.setProgress(sqlite_cache);
swModSeq.setChecked(prefs.getBoolean("use_modseq", true));
swExpunge.setChecked(prefs.getBoolean("perform_expunge", true));
swAuthPlain.setChecked(prefs.getBoolean("auth_plain", true));
@ -1071,12 +1115,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc
swTestIab.setChecked(prefs.getBoolean("test_iab", false));
tvProcessors.setText(getString(R.string.title_advanced_processors, Runtime.getRuntime().availableProcessors()));
ActivityManager am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
int class_mb = am.getMemoryClass();
int class_large_mb = am.getLargeMemoryClass();
ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
am.getMemoryInfo(mi);
tvMemoryClass.setText(getString(R.string.title_advanced_memory_class,
class_mb + " MB",
class_large_mb + " MB",

View File

@ -640,6 +640,50 @@
app:layout_constraintTop_toBottomOf="@id/tvQueriesRemark"
app:switchPadding="12dp" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvSqliteCache"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginEnd="48dp"
android:text="@string/title_advanced_sqlite_cache"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swWal" />
<SeekBar
android:id="@+id/sbSqliteCache"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:max="20"
android:min="0"
android:progress="5"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvSqliteCache" />
<ImageButton
android:id="@+id/ibSqliteCache"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/sbSqliteCache"
app:srcCompat="@drawable/twotone_check_24" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvSqliteCacheHint"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="48dp"
android:text="@string/title_advanced_english_hint"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textStyle="italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/ibSqliteCache" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/swModSeq"
android:layout_width="0dp"
@ -649,7 +693,7 @@
android:text="@string/title_advanced_modseq"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swWal"
app:layout_constraintTop_toBottomOf="@id/tvSqliteCacheHint"
app:switchPadding="12dp" />
<androidx.appcompat.widget.SwitchCompat

View File

@ -623,6 +623,7 @@
<string name="title_advanced_debug">Debug mode</string>
<string name="title_advanced_query_threads">Limit parallel database access</string>
<string name="title_advanced_wal" translatable="false">WAL</string>
<string name="title_advanced_sqlite_cache" translatable="false">Sqlite cache %1$s %% - %2$s</string>
<string name="title_advanced_modseq" translatable="false">MODSEQ</string>
<string name="title_advanced_expunge" translatable="false">EXPUNGE</string>
<string name="title_advanced_auth_plain" translatable="false">PLAIN</string>