Keep config snapshots and network diagnostics precise
This commit is contained in:
1 parent
893e714422
commit
5382b686e9
3 files changed
+6
-5
No files matched your search
@@ -18,7 +18,7 @@ import kotlinx.coroutines.withContext
|
||||
|
||||
/**
|
||||
* Единственная очередь файловых операций ConfigProvider, живёт вместе с Application.
|
||||
* submit сразу фиксирует порядок запросов; ожидание Mutex приостанавливает coroutine, IO выполняется вне UI.
|
||||
* Последовательные submit сохраняют порядок вызова; конкурирующие запросы сериализует Mutex. IO выполняется вне UI.
|
||||
* Возвращённый Deferred принадлежит очереди: отмена coroutine, ожидающей await(), не отменяет принятую запись.
|
||||
* Чтение, формирование снимка и replace выполняются внутри submit. Лог содержит метаданные, без текста/ключей.
|
||||
*/
|
||||
|
||||
@@ -39,7 +39,7 @@ data class RadioCompressorSettings(val enabled: Boolean = true, val maxGainDb: I
|
||||
/**
|
||||
* Поставщик Application: getString/getInt остаются синхронным API для JNI.
|
||||
* Файловые операции возвращают Deferred общей очереди; await не блокирует UI и не передаёт ожидающему владение запросом.
|
||||
* Внутри операции настройки и keys.conf читаются один раз, чтение/запись utun.cfg сериализованы.
|
||||
* При формировании конфига настройки и keys.conf читаются один раз; чтение/запись utun.cfg сериализованы.
|
||||
*/
|
||||
class ConfigProvider(private val context: Context) {
|
||||
private val configFiles = ConfigFileStore { level, message -> LogManager.addLog(level, "CFG", message) }
|
||||
@@ -732,7 +732,7 @@ class ConfigProvider(private val context: Context) {
|
||||
val pubKey = stringValue("node.public_key", prefs, snapshot.keys) ?: ""
|
||||
val privKey = stringValue("node.private_key", prefs, snapshot.keys) ?: ""
|
||||
val nodeName = stringValue("node.name", prefs, snapshot.keys) ?: getDeviceName()
|
||||
val dbDir = stringValue("db.path", prefs, snapshot.keys) ?: context.filesDir.absolutePath
|
||||
val dbDir = snapshot.directory.path
|
||||
return buildString {
|
||||
appendLine("[global]")
|
||||
if (nodeName.isNotBlank()) appendLine("my_node_name=$nodeName")
|
||||
|
||||
@@ -19,7 +19,7 @@ object NetworkChangeMonitor {
|
||||
private var coreEpoch = Any()
|
||||
private var updating = false
|
||||
private var pending = false
|
||||
private var lastInterfaces: List<Pair<String, String>>? = null // Последний снимок, переданный в JNI; не ACK применения.
|
||||
private var lastInterfaces: List<Pair<String, String>>? = null // Наблюдавшиеся интерфейсы при подготовке; не ACK применения.
|
||||
private const val DEBOUNCE_MS = 500L
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
private val updateRunnable = Runnable { updateSockets() }
|
||||
@@ -82,7 +82,8 @@ object NetworkChangeMonitor {
|
||||
NativeLib.notifyNetworkActive()
|
||||
if (NativeLib.updateSockets(text)) {
|
||||
lastInterfaces = current
|
||||
LogManager.addLog("INFO", "NET", "socket config handed to JNI: [$previous] -> [$next] chars=${text.length}")
|
||||
LogManager.addLog("INFO", "NET", "socket config handed to JNI: chars=${text.length}; " +
|
||||
"observed interfaces: [$previous] -> [$next]")
|
||||
} else LogManager.addLog("ERROR", "NET", "socket update rejected by JNI")
|
||||
} else if (text != null && current != null) {
|
||||
LogManager.addLog("DEBUG", "NET", "prepared network config discarded: core not ready")
|
||||
|
||||
Reference in new issue
Block a user