diff options
author | 2014-07-14 16:25:55 +0900 | |
---|---|---|
committer | 2014-07-14 16:25:55 +0900 | |
commit | 1d6024d2f8051271e3c9abc1285d989114f5f1d7 (patch) | |
tree | 1b76ae784521bc80af0607e5c3a8c86e3866966e /java/src/com/android/inputmethod/latin/BinaryDictionary.java | |
parent | a2087e66e5d392a6ffc7991959235911c92a4d80 (diff) | |
download | latinime-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.java | 40 |
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 |