aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/BinaryDictionary.java
diff options
context:
space:
mode:
authorKeisuke Kuroyanagi <ksk@google.com>2014-07-14 16:25:55 +0900
committerKeisuke Kuroyanagi <ksk@google.com>2014-07-14 16:25:55 +0900
commit1d6024d2f8051271e3c9abc1285d989114f5f1d7 (patch)
tree1b76ae784521bc80af0607e5c3a8c86e3866966e /java/src/com/android/inputmethod/latin/BinaryDictionary.java
parenta2087e66e5d392a6ffc7991959235911c92a4d80 (diff)
downloadlatinime-1d6024d2f8051271e3c9abc1285d989114f5f1d7.tar.gz
latinime-1d6024d2f8051271e3c9abc1285d989114f5f1d7.tar.xz
latinime-1d6024d2f8051271e3c9abc1285d989114f5f1d7.zip
Track crashing during migration to avoid crash loop.
Bug: 16213554 Bug: 16235703 Change-Id: Ib29b1a84b4c6ebae06d3dc6448f3c274ec6a7aab
Diffstat (limited to 'java/src/com/android/inputmethod/latin/BinaryDictionary.java')
-rw-r--r--java/src/com/android/inputmethod/latin/BinaryDictionary.java40
1 files changed, 29 insertions, 11 deletions
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index c799ac745..693e1cdcc 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -80,6 +80,7 @@ public final class BinaryDictionary extends Dictionary {
public static final int FORMAT_WORD_PROPERTY_COUNT_INDEX = 3;
public static final String DICT_FILE_NAME_SUFFIX_FOR_MIGRATION = ".migrate";
+ public static final String DIR_NAME_SUFFIX_FOR_RECORD_MIGRATION = ".migrating";
private long mNativeDict;
private final Locale mLocale;
@@ -559,22 +560,39 @@ public final class BinaryDictionary extends Dictionary {
if (!isValidDictionary()) {
return false;
}
- final String tmpDictFilePath = mDictFilePath + DICT_FILE_NAME_SUFFIX_FOR_MIGRATION;
- if (!migrateNative(mNativeDict, tmpDictFilePath, newFormatVersion)) {
+ final File isMigratingDir =
+ new File(mDictFilePath + DIR_NAME_SUFFIX_FOR_RECORD_MIGRATION);
+ if (isMigratingDir.exists()) {
+ isMigratingDir.delete();
+ Log.e(TAG, "Previous migration attempt failed probably due to a crash. "
+ + "Giving up using the old dictionary (" + mDictFilePath + ").");
return false;
}
- close();
- final File dictFile = new File(mDictFilePath);
- final File tmpDictFile = new File(tmpDictFilePath);
- if (!FileUtils.deleteRecursively(dictFile)) {
+ if (!isMigratingDir.mkdir()) {
+ Log.e(TAG, "Cannot create a dir (" + isMigratingDir.getAbsolutePath()
+ + ") to record migration.");
return false;
}
- if (!BinaryDictionaryUtils.renameDict(tmpDictFile, dictFile)) {
- return false;
+ try {
+ final String tmpDictFilePath = mDictFilePath + DICT_FILE_NAME_SUFFIX_FOR_MIGRATION;
+ if (!migrateNative(mNativeDict, tmpDictFilePath, newFormatVersion)) {
+ return false;
+ }
+ close();
+ final File dictFile = new File(mDictFilePath);
+ final File tmpDictFile = new File(tmpDictFilePath);
+ if (!FileUtils.deleteRecursively(dictFile)) {
+ return false;
+ }
+ if (!BinaryDictionaryUtils.renameDict(tmpDictFile, dictFile)) {
+ return false;
+ }
+ loadDictionary(dictFile.getAbsolutePath(), 0 /* startOffset */,
+ dictFile.length(), mIsUpdatable);
+ return true;
+ } finally {
+ isMigratingDir.delete();
}
- loadDictionary(dictFile.getAbsolutePath(), 0 /* startOffset */,
- dictFile.length(), mIsUpdatable);
- return true;
}
@UsedForTesting