refactor(GoogleDrive): add more logging, also use appdata folder.

Signed-off-by: KaiserBh <kaiserbh@proton.me>
This commit is contained in:
KaiserBh 2024-01-10 11:23:27 +11:00
parent 9a53f4c0ab
commit e04d191dfb
No known key found for this signature in database
GPG Key ID: 14D73B142042BBA9

View File

@ -67,40 +67,46 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync
private val googleDriveService = GoogleDriveService(context) private val googleDriveService = GoogleDriveService(context)
override suspend fun beforeSync() { override suspend fun beforeSync() {
try {
googleDriveService.refreshToken() googleDriveService.refreshToken()
val drive = googleDriveService.driveService ?: throw Exception("Google Drive service not initialized") val drive = googleDriveService.driveService ?: throw Exception("Google Drive service not initialized")
var backoff = 2000L // Start with 2 seconds var backoff = 2000L
while (true) { while (true) {
val lockFiles = findLockFile(drive) // Fetch the current list of lock files val lockFiles = findLockFile(drive)
logcat(LogPriority.DEBUG) { "Found ${lockFiles.size} lock file(s)" }
when { when {
lockFiles.isEmpty() -> { lockFiles.isEmpty() -> {
// No lock file exists, try to create a new one logcat(LogPriority.DEBUG) { "No lock file found, creating a new one" }
createLockFile(drive) createLockFile(drive)
} }
lockFiles.size == 1 -> { lockFiles.size == 1 -> {
// Exactly one lock file exists
val lockFile = lockFiles.first() val lockFile = lockFiles.first()
val createdTime = Instant.parse(lockFile.createdTime.toString()) val createdTime = Instant.parse(lockFile.createdTime.toString())
val ageMinutes = java.time.Duration.between(createdTime, Instant.now()).toMinutes() val ageMinutes = java.time.Duration.between(createdTime, Instant.now()).toMinutes()
logcat(LogPriority.DEBUG) { "Lock file age: $ageMinutes minutes" }
if (ageMinutes <= 3) { if (ageMinutes <= 3) {
// Lock file is new and presumably held by this process, break the loop to proceed logcat(LogPriority.DEBUG) { "Lock file is new, proceeding with sync" }
break break
} else { } else {
// Lock file is old, delete and attempt to create a new one logcat(LogPriority.DEBUG) { "Lock file is old, deleting and creating a new one" }
deleteLockFile(drive) deleteLockFile(drive)
createLockFile(drive) createLockFile(drive)
} }
} }
else -> { else -> {
// More than one lock file exists, likely due to a race condition logcat(LogPriority.DEBUG) { "Multiple lock files found, applying backoff" }
delay(backoff) // Apply backoff strategy delay(backoff) // Apply backoff strategy
backoff = (backoff * 2).coerceAtMost(32000L) // Max backoff of 32 seconds backoff = (backoff * 2).coerceAtMost(32000L)
logcat(LogPriority.DEBUG) { "Backoff increased to $backoff milliseconds" }
} }
} }
// The loop continues until it can confirm that there's exactly one new lock file. logcat(LogPriority.DEBUG) { "Loop iteration complete, backoff time: $backoff" }
}
} catch (e: Exception) {
logcat(LogPriority.ERROR) { "Error in GoogleDrive beforeSync: ${e.message}" }
} }
} }
@ -199,9 +205,11 @@ class GoogleDriveSyncService(context: Context, json: Json, syncPreferences: Sync
private fun createLockFile(drive: Drive) { private fun createLockFile(drive: Drive) {
try { try {
val fileMetadata = File() val fileMetadata = File().apply {
fileMetadata.name = lockFileName name = lockFileName
fileMetadata.mimeType = "text/plain" mimeType = "text/plain"
parents = listOf("appDataFolder")
}
// Create an empty content to upload as the lock file // Create an empty content to upload as the lock file
val emptyContent = ByteArrayContent.fromString("text/plain", "") val emptyContent = ByteArrayContent.fromString("text/plain", "")