fix sync records

This commit is contained in:
fyears 2024-03-30 21:44:09 +08:00
parent 1c918d82da
commit 7930509e2a
2 changed files with 78 additions and 13 deletions

View File

@ -224,6 +224,8 @@ export interface MixedEntity {
decisionBranch?: number; decisionBranch?: number;
decision?: DecisionTypeForMixedEntity; decision?: DecisionTypeForMixedEntity;
conflictAction?: ConflictActionType; conflictAction?: ConflictActionType;
sideNotes?: any;
} }
/** /**

View File

@ -903,13 +903,27 @@ export const getSyncPlanInplace = async (
throw Error(`unexpectedly keptFolder no decisions: ${[...keptFolder]}`); throw Error(`unexpectedly keptFolder no decisions: ${[...keptFolder]}`);
} }
// finally we want to make our life easier
const currTime = Date.now();
const currTimeFmt = unixTimeToStr(currTime);
// because the path should not as / in the beginning,
// we should be safe to add these keys:
mixedEntityMappings["/$@meta"] = {
key: "/$@meta", // don't mess up with the types
sideNotes: {
generateTime: currTime,
generateTimeFmt: currTimeFmt,
},
};
return mixedEntityMappings; return mixedEntityMappings;
}; };
const splitThreeStepsOnEntityMappings = ( const splitFourStepsOnEntityMappings = (
mixedEntityMappings: Record<string, MixedEntity> mixedEntityMappings: Record<string, MixedEntity>
) => { ) => {
type StepArrayType = MixedEntity[] | undefined | null; type StepArrayType = MixedEntity[] | undefined | null;
const onlyMarkSyncedOps: StepArrayType[] = [];
const folderCreationOps: StepArrayType[] = []; const folderCreationOps: StepArrayType[] = [];
const deletionOps: StepArrayType[] = []; const deletionOps: StepArrayType[] = [];
const uploadDownloads: StepArrayType[] = []; const uploadDownloads: StepArrayType[] = [];
@ -925,6 +939,11 @@ const splitThreeStepsOnEntityMappings = (
for (let i = 0; i < sortedKeys.length; ++i) { for (let i = 0; i < sortedKeys.length; ++i) {
const key = sortedKeys[i]; const key = sortedKeys[i];
if (key === "/$@meta") {
continue; // special
}
const val = mixedEntityMappings[key]; const val = mixedEntityMappings[key];
if (!key.endsWith("/")) { if (!key.endsWith("/")) {
@ -932,14 +951,27 @@ const splitThreeStepsOnEntityMappings = (
} }
if ( if (
val.decision === "equal" ||
val.decision === "conflict_created_then_do_nothing" ||
val.decision === "folder_existed_both_then_do_nothing" ||
val.decision === "local_is_created_too_large_then_do_nothing" || val.decision === "local_is_created_too_large_then_do_nothing" ||
val.decision === "remote_is_created_too_large_then_do_nothing" || val.decision === "remote_is_created_too_large_then_do_nothing" ||
val.decision === "folder_to_skip" val.decision === "folder_to_skip"
) { ) {
// pass // pass
} else if (
val.decision === "equal" ||
val.decision === "conflict_created_then_do_nothing" ||
val.decision === "folder_existed_both_then_do_nothing"
) {
if (
onlyMarkSyncedOps.length === 0 ||
onlyMarkSyncedOps[0] === undefined ||
onlyMarkSyncedOps[0] === null
) {
onlyMarkSyncedOps[0] = [val];
} else {
onlyMarkSyncedOps[0].push(val); // only one level is needed here
}
// don't need to update realTotalCount here
} else if ( } else if (
val.decision === "folder_existed_local_then_also_create_remote" || val.decision === "folder_existed_local_then_also_create_remote" ||
val.decision === "folder_existed_remote_then_also_create_local" || val.decision === "folder_existed_remote_then_also_create_local" ||
@ -1019,6 +1051,7 @@ const splitThreeStepsOnEntityMappings = (
deletionOps.reverse(); // inplace reverse deletionOps.reverse(); // inplace reverse
return { return {
onlyMarkSyncedOps: onlyMarkSyncedOps,
folderCreationOps: folderCreationOps, folderCreationOps: folderCreationOps,
deletionOps: deletionOps, deletionOps: deletionOps,
uploadDownloads: uploadDownloads, uploadDownloads: uploadDownloads,
@ -1049,14 +1082,36 @@ const dispatchOperationToActualV3 = async (
if (r.decision === "only_history") { if (r.decision === "only_history") {
clearPrevSyncRecordByVaultAndProfile(db, vaultRandomID, profileID, key); clearPrevSyncRecordByVaultAndProfile(db, vaultRandomID, profileID, key);
} else if ( } else if (
r.decision === "equal" ||
r.decision === "conflict_created_then_do_nothing" ||
r.decision === "local_is_created_too_large_then_do_nothing" || r.decision === "local_is_created_too_large_then_do_nothing" ||
r.decision === "remote_is_created_too_large_then_do_nothing" || r.decision === "remote_is_created_too_large_then_do_nothing" ||
r.decision === "folder_to_skip" || r.decision === "folder_to_skip"
) {
// !! no actual sync being kept happens,
// so no sync record here
// pass
} else if (
r.decision === "equal" ||
r.decision === "conflict_created_then_do_nothing" ||
r.decision === "folder_existed_both_then_do_nothing" r.decision === "folder_existed_both_then_do_nothing"
) { ) {
// pass // !! we need to upsert the record,
// so that next time we can determine the change delta
const entity = r.remote ?? r.local;
console.debug(
`we are in actual operation of equal, entity=${JSON.stringify(
entity,
null,
2
)}`
);
if (entity !== undefined) {
await upsertPrevSyncRecordByVaultAndProfile(
db,
vaultRandomID,
profileID,
entity
);
}
} else if ( } else if (
r.decision === "local_is_modified_then_push" || r.decision === "local_is_modified_then_push" ||
r.decision === "local_is_created_then_push" || r.decision === "local_is_created_then_push" ||
@ -1207,13 +1262,15 @@ export const doActualSync = async (
) => { ) => {
console.debug(`concurrency === ${concurrency}`); console.debug(`concurrency === ${concurrency}`);
const { const {
onlyMarkSyncedOps,
folderCreationOps, folderCreationOps,
deletionOps, deletionOps,
uploadDownloads, uploadDownloads,
allFilesCount, allFilesCount,
realModifyDeleteCount, realModifyDeleteCount,
realTotalCount, realTotalCount,
} = splitThreeStepsOnEntityMappings(mixedEntityMappings); } = splitFourStepsOnEntityMappings(mixedEntityMappings);
// console.debug(`onlyMarkSyncedOps: ${JSON.stringify(onlyMarkSyncedOps)}`);
// console.debug(`folderCreationOps: ${JSON.stringify(folderCreationOps)}`); // console.debug(`folderCreationOps: ${JSON.stringify(folderCreationOps)}`);
// console.debug(`deletionOps: ${JSON.stringify(deletionOps)}`); // console.debug(`deletionOps: ${JSON.stringify(deletionOps)}`);
// console.debug(`uploadDownloads: ${JSON.stringify(uploadDownloads)}`); // console.debug(`uploadDownloads: ${JSON.stringify(uploadDownloads)}`);
@ -1248,11 +1305,17 @@ export const doActualSync = async (
} }
} }
const nested = [folderCreationOps, deletionOps, uploadDownloads]; const nested = [
onlyMarkSyncedOps,
folderCreationOps,
deletionOps,
uploadDownloads,
];
const logTexts = [ const logTexts = [
`1. create all folders from shadowest to deepest`, `1. record the items already being synced`,
`2. delete files and folders from deepest to shadowest`, `2. create all folders from shadowest to deepest`,
`3. upload or download files in parallel, with the desired concurrency=${concurrency}`, `3. delete files and folders from deepest to shadowest`,
`4. upload or download files in parallel, with the desired concurrency=${concurrency}`,
]; ];
let realCounter = 0; let realCounter = 0;