Merge "Add logging upon failure to edit SystemSettings" into qt-qpr1-dev
This commit is contained in:
@@ -64,6 +64,8 @@ import java.io.FileOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -716,6 +718,23 @@ final class SettingsState {
|
|||||||
}
|
}
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Slog.wtf(LOG_TAG, "Failed to write settings, restoring backup", t);
|
Slog.wtf(LOG_TAG, "Failed to write settings, restoring backup", t);
|
||||||
|
if (t instanceof IOException) {
|
||||||
|
// we failed to create a directory, so log the permissions and existence
|
||||||
|
// state for the settings file and directory
|
||||||
|
logSettingsDirectoryInformation(destination.getBaseFile());
|
||||||
|
if (t.getMessage().contains("Couldn't create directory")) {
|
||||||
|
// attempt to create the directory with Files.createDirectories, which
|
||||||
|
// throws more informative errors than File.mkdirs.
|
||||||
|
Path parentPath = destination.getBaseFile().getParentFile().toPath();
|
||||||
|
try {
|
||||||
|
Files.createDirectories(parentPath);
|
||||||
|
Slog.i(LOG_TAG, "Successfully created " + parentPath);
|
||||||
|
} catch (Throwable t2) {
|
||||||
|
Slog.e(LOG_TAG, "Failed to write " + parentPath
|
||||||
|
+ " with Files.writeDirectories", t2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
destination.failWrite(out);
|
destination.failWrite(out);
|
||||||
} finally {
|
} finally {
|
||||||
IoUtils.closeQuietly(out);
|
IoUtils.closeQuietly(out);
|
||||||
@@ -729,6 +748,33 @@ final class SettingsState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void logSettingsDirectoryInformation(File settingsFile) {
|
||||||
|
File parent = settingsFile.getParentFile();
|
||||||
|
Slog.i(LOG_TAG, "directory info for directory/file " + settingsFile
|
||||||
|
+ " with stacktrace ", new Exception());
|
||||||
|
File ancestorDir = parent;
|
||||||
|
while (ancestorDir != null) {
|
||||||
|
if (!ancestorDir.exists()) {
|
||||||
|
Slog.i(LOG_TAG, "ancestor directory " + ancestorDir
|
||||||
|
+ " does not exist");
|
||||||
|
ancestorDir = ancestorDir.getParentFile();
|
||||||
|
} else {
|
||||||
|
Slog.i(LOG_TAG, "ancestor directory " + ancestorDir
|
||||||
|
+ " exists");
|
||||||
|
Slog.i(LOG_TAG, "ancestor directory " + ancestorDir
|
||||||
|
+ " permissions: r: " + ancestorDir.canRead() + " w: "
|
||||||
|
+ ancestorDir.canWrite() + " x: " + ancestorDir.canExecute());
|
||||||
|
File ancestorParent = ancestorDir.getParentFile();
|
||||||
|
if (ancestorParent != null) {
|
||||||
|
Slog.i(LOG_TAG, "ancestor's parent directory " + ancestorParent
|
||||||
|
+ " permissions: r: " + ancestorParent.canRead() + " w: "
|
||||||
|
+ ancestorParent.canWrite() + " x: " + ancestorParent.canExecute());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void writeSingleSetting(int version, XmlSerializer serializer, String id,
|
static void writeSingleSetting(int version, XmlSerializer serializer, String id,
|
||||||
String name, String value, String defaultValue, String packageName,
|
String name, String value, String defaultValue, String packageName,
|
||||||
String tag, boolean defaultSysSet) throws IOException {
|
String tag, boolean defaultSysSet) throws IOException {
|
||||||
@@ -803,6 +849,7 @@ final class SettingsState {
|
|||||||
in = new AtomicFile(mStatePersistFile).openRead();
|
in = new AtomicFile(mStatePersistFile).openRead();
|
||||||
} catch (FileNotFoundException fnfe) {
|
} catch (FileNotFoundException fnfe) {
|
||||||
Slog.i(LOG_TAG, "No settings state " + mStatePersistFile);
|
Slog.i(LOG_TAG, "No settings state " + mStatePersistFile);
|
||||||
|
logSettingsDirectoryInformation(mStatePersistFile);
|
||||||
addHistoricalOperationLocked(HISTORICAL_OPERATION_INITIALIZE, null);
|
addHistoricalOperationLocked(HISTORICAL_OPERATION_INITIALIZE, null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user