diff --git a/README.md b/README.md index 1f11bc0d201df3944d7dee68aa950d43c715f0bc..2f6560b7c73376ad7aa9751bcb7b78da7417b47f 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,17 @@ have to change the `getXLockTuple()` function and also the `compatibility_list` * [20 points] Function `restartRecovery()` in `transaction.py`: This function is called if the log file indicates an inconsistency (i.e., if the logfile does not end with an empty CHECKPOINT record). If that's the case, then you must analyze the logfile and do a - recovery on that (see 16.4.2 for details). + recovery on that. See 16.4.2 for details, though: + * Our CLR records have a different format (see example logfiles for + details), and + * The book says to undo incomplete transactions in reverse order of their + start records. You should + undo tranactions *in the order they appear in the original log*, as shown + in the slides. The order that the transactions are undone does not matter, + as we have 2PL. There will never be more than a single incomplete + transaction that modifies a given record. + The individual operations of a single transaction, of course, are + a different matter. For the recovery, you will need to write the code for both `revertChanges` and `restartRecovery`. `revertChanges` works by writing a compensating log record (CLR) for each update that a failed transaction does, in the correct diff --git a/recoverytests-answers/recoverytest1_logfile b/recoverytests-answers/recoverytest1_logfile new file mode 100644 index 0000000000000000000000000000000000000000..eb2688d618addaacbc9839bf0798064d983babf2 --- /dev/null +++ b/recoverytests-answers/recoverytest1_logfile @@ -0,0 +1,26 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[5, "START"] +[6, "START"] +[5, "UPDATE", "recoverytest1_relation", "2", "A", "10", "7"] +[5, "UPDATE", "recoverytest1_relation", "21", "A", "10", "13"] +[4, "UPDATE", "recoverytest1_relation", "1", "A", "10", "7"] +[4, "UPDATE", "recoverytest1_relation", "11", "A", "10", "13"] +[6, "UPDATE", "recoverytest1_relation", "3", "A", "10", "7"] +[6, "UPDATE", "recoverytest1_relation", "31", "A", "10", "13"] +[5, "COMMIT"] +[4, "CLR", "recoverytest1_relation", "11", "A", "10"] +[6, "CLR", "recoverytest1_relation", "31", "A", "10"] +[4, "CLR", "recoverytest1_relation", "1", "A", "10"] +[4, "ABORT"] +[6, "CLR", "recoverytest1_relation", "3", "A", "10"] +[6, "ABORT"] +[1, "UPDATE", "recoverytest1_relation", "0", "A", "10", "20"] +[2, "UPDATE", "recoverytest1_relation", "10", "A", "10", "20"] +[3, "UPDATE", "recoverytest1_relation", "20", "A", "10", "20"] +[1, "COMMIT"] +[2, "COMMIT"] +[3, "COMMIT"] +[-1, "CHECKPOINT", []] diff --git a/recoverytests-answers/recoverytest1_relation b/recoverytests-answers/recoverytest1_relation new file mode 100644 index 0000000000000000000000000000000000000000..5f98751cd4575ad990e5f353c84b096898e61330 --- /dev/null +++ b/recoverytests-answers/recoverytest1_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "20"], ["1", "10"], ["2", "7"], ["3", "10"], ["4", "10"], ["5", "10"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "20"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "20"], ["21", "13"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/recoverytests-answers/recoverytest2_logfile b/recoverytests-answers/recoverytest2_logfile new file mode 100644 index 0000000000000000000000000000000000000000..81aad4def92f14f174aaf356d5a57af2ca62f935 --- /dev/null +++ b/recoverytests-answers/recoverytest2_logfile @@ -0,0 +1,27 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[5, "START"] +[6, "START"] +[7, "START"] +[6, "UPDATE", "recoverytest2_relation", "2", "A", "10", "0"] +[7, "UPDATE", "recoverytest2_relation", "4", "A", "10", "0"] +[4, "UPDATE", "recoverytest2_relation", "1", "A", "10", "7"] +[5, "UPDATE", "recoverytest2_relation", "3", "A", "10", "7"] +[4, "UPDATE", "recoverytest2_relation", "11", "A", "10", "13"] +[5, "UPDATE", "recoverytest2_relation", "31", "A", "10", "13"] +[5, "CLR", "recoverytest2_relation", "31", "A", "10"] +[4, "CLR", "recoverytest2_relation", "11", "A", "10"] +[5, "CLR", "recoverytest2_relation", "3", "A", "10"] +[4, "CLR", "recoverytest2_relation", "1", "A", "10"] +[5, "ABORT"] +[4, "ABORT"] +[1, "ABORT"] +[2, "ABORT"] +[3, "ABORT"] +[6, "CLR", "recoverytest2_relation", "2", "A", "10"] +[6, "ABORT"] +[7, "CLR", "recoverytest2_relation", "4", "A", "10"] +[7, "ABORT"] +[-1, "CHECKPOINT", []] diff --git a/recoverytests-answers/recoverytest2_relation b/recoverytests-answers/recoverytest2_relation new file mode 100644 index 0000000000000000000000000000000000000000..8613de843d50561269399bdb0aacb75f19192f0b --- /dev/null +++ b/recoverytests-answers/recoverytest2_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "10"], ["1", "10"], ["2", "10"], ["3", "10"], ["4", "10"], ["5", "10"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "10"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "10"], ["21", "10"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/recoverytests-answers/recoverytest3_logfile b/recoverytests-answers/recoverytest3_logfile new file mode 100644 index 0000000000000000000000000000000000000000..04935aa0632ca22a761a8e18192241cd827e19e8 --- /dev/null +++ b/recoverytests-answers/recoverytest3_logfile @@ -0,0 +1,94 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[1, "UPDATE", "recoverytest3_relation", "0", "A", "10", "2"] +[2, "UPDATE", "recoverytest3_relation", "1", "A", "10", "0"] +[5, "START"] +[6, "START"] +[3, "UPDATE", "recoverytest3_relation", "2", "A", "10", "0"] +[7, "START"] +[3, "COMMIT"] +[8, "START"] +[4, "UPDATE", "recoverytest3_relation", "3", "A", "10", "5"] +[5, "UPDATE", "recoverytest3_relation", "4", "A", "10", "10"] +[4, "COMMIT"] +[9, "START"] +[6, "UPDATE", "recoverytest3_relation", "6", "A", "10", "10"] +[5, "UPDATE", "recoverytest3_relation", "14", "A", "10", "2"] +[10, "START"] +[11, "START"] +[12, "START"] +[8, "UPDATE", "recoverytest3_relation", "7", "A", "10", "9"] +[13, "START"] +[7, "UPDATE", "recoverytest3_relation", "5", "A", "10", "3"] +[9, "UPDATE", "recoverytest3_relation", "8", "A", "10", "6"] +[10, "UPDATE", "recoverytest3_relation", "9", "A", "10", "5"] +[14, "START"] +[8, "UPDATE", "recoverytest3_relation", "17", "A", "10", "6"] +[15, "START"] +[16, "START"] +[13, "UPDATE", "recoverytest3_relation", "2", "A", "0", "-1"] +[17, "START"] +[18, "START"] +[14, "UPDATE", "recoverytest3_relation", "3", "A", "5", "4"] +[19, "START"] +[20, "START"] +[6, "UPDATE", "recoverytest3_relation", "16", "A", "10", "3"] +[5, "UPDATE", "recoverytest3_relation", "24", "A", "10", "8"] +[7, "COMMIT"] +[16, "UPDATE", "recoverytest3_relation", "5", "A", "3", "0"] +[10, "CLR", "recoverytest3_relation", "9", "A", "10"] +[9, "UPDATE", "recoverytest3_relation", "18", "A", "10", "0"] +[10, "ABORT"] +[20, "UPDATE", "recoverytest3_relation", "9", "A", "10", "2"] +[1, "UPDATE", "recoverytest3_relation", "10", "A", "10", "5"] +[8, "UPDATE", "recoverytest3_relation", "27", "A", "10", "6"] +[16, "UPDATE", "recoverytest3_relation", "15", "A", "10", "2"] +[14, "UPDATE", "recoverytest3_relation", "13", "A", "10", "6"] +[2, "UPDATE", "recoverytest3_relation", "11", "A", "10", "4"] +[13, "UPDATE", "recoverytest3_relation", "12", "A", "10", "1"] +[5, "UPDATE", "recoverytest3_relation", "34", "A", "10", "7"] +[16, "UPDATE", "recoverytest3_relation", "25", "A", "10", "7"] +[16, "UPDATE", "recoverytest3_relation", "35", "A", "10", "0"] +[1, "CLR", "recoverytest3_relation", "10", "A", "10"] +[1, "CLR", "recoverytest3_relation", "0", "A", "10"] +[1, "ABORT"] +[2, "CLR", "recoverytest3_relation", "11", "A", "10"] +[2, "CLR", "recoverytest3_relation", "1", "A", "10"] +[2, "ABORT"] +[5, "CLR", "recoverytest3_relation", "34", "A", "10"] +[5, "CLR", "recoverytest3_relation", "24", "A", "10"] +[5, "CLR", "recoverytest3_relation", "14", "A", "10"] +[5, "CLR", "recoverytest3_relation", "4", "A", "10"] +[5, "ABORT"] +[6, "CLR", "recoverytest3_relation", "16", "A", "10"] +[6, "CLR", "recoverytest3_relation", "6", "A", "10"] +[6, "ABORT"] +[8, "CLR", "recoverytest3_relation", "27", "A", "10"] +[8, "CLR", "recoverytest3_relation", "17", "A", "10"] +[8, "CLR", "recoverytest3_relation", "7", "A", "10"] +[8, "ABORT"] +[9, "CLR", "recoverytest3_relation", "18", "A", "10"] +[9, "CLR", "recoverytest3_relation", "8", "A", "10"] +[9, "ABORT"] +[11, "ABORT"] +[12, "ABORT"] +[13, "CLR", "recoverytest3_relation", "12", "A", "10"] +[13, "CLR", "recoverytest3_relation", "2", "A", "0"] +[13, "ABORT"] +[14, "CLR", "recoverytest3_relation", "13", "A", "10"] +[14, "CLR", "recoverytest3_relation", "3", "A", "5"] +[14, "ABORT"] +[15, "ABORT"] +[16, "CLR", "recoverytest3_relation", "35", "A", "10"] +[16, "CLR", "recoverytest3_relation", "25", "A", "10"] +[16, "CLR", "recoverytest3_relation", "15", "A", "10"] +[16, "CLR", "recoverytest3_relation", "5", "A", "3"] +[16, "ABORT"] +[17, "ABORT"] +[18, "ABORT"] +[19, "ABORT"] +[20, "CLR", "recoverytest3_relation", "9", "A", "10"] +[20, "ABORT"] +[-1, "CHECKPOINT", []] diff --git a/recoverytests-answers/recoverytest3_relation b/recoverytests-answers/recoverytest3_relation new file mode 100644 index 0000000000000000000000000000000000000000..4ad22771069e5d652a61502def10df564f1fed5f --- /dev/null +++ b/recoverytests-answers/recoverytest3_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "10"], ["1", "10"], ["2", "0"], ["3", "5"], ["4", "10"], ["5", "3"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "10"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "10"], ["21", "10"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/recoverytests-original/recoverytest1_logfile b/recoverytests-original/recoverytest1_logfile new file mode 100644 index 0000000000000000000000000000000000000000..8a5ee8449969a4e90757feeca5b0ea2cc019db08 --- /dev/null +++ b/recoverytests-original/recoverytest1_logfile @@ -0,0 +1,25 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[5, "START"] +[6, "START"] +[5, "UPDATE", "recoverytest1_relation", "2", "A", "10", "7"] +[5, "UPDATE", "recoverytest1_relation", "21", "A", "10", "13"] +[4, "UPDATE", "recoverytest1_relation", "1", "A", "10", "7"] +[4, "UPDATE", "recoverytest1_relation", "11", "A", "10", "13"] +[6, "UPDATE", "recoverytest1_relation", "3", "A", "10", "7"] +[6, "UPDATE", "recoverytest1_relation", "31", "A", "10", "13"] +[5, "COMMIT"] +[4, "CLR", "recoverytest1_relation", "11", "A", "10"] +[6, "CLR", "recoverytest1_relation", "31", "A", "10"] +[4, "CLR", "recoverytest1_relation", "1", "A", "10"] +[4, "ABORT"] +[6, "CLR", "recoverytest1_relation", "3", "A", "10"] +[6, "ABORT"] +[1, "UPDATE", "recoverytest1_relation", "0", "A", "10", "20"] +[2, "UPDATE", "recoverytest1_relation", "10", "A", "10", "20"] +[3, "UPDATE", "recoverytest1_relation", "20", "A", "10", "20"] +[1, "COMMIT"] +[2, "COMMIT"] +[3, "COMMIT"] diff --git a/recoverytests-original/recoverytest1_relation b/recoverytests-original/recoverytest1_relation new file mode 100644 index 0000000000000000000000000000000000000000..8613de843d50561269399bdb0aacb75f19192f0b --- /dev/null +++ b/recoverytests-original/recoverytest1_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "10"], ["1", "10"], ["2", "10"], ["3", "10"], ["4", "10"], ["5", "10"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "10"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "10"], ["21", "10"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/recoverytests-original/recoverytest2_logfile b/recoverytests-original/recoverytest2_logfile new file mode 100644 index 0000000000000000000000000000000000000000..cada5f01ba33e106a09d3e7f856f71da8ce5d374 --- /dev/null +++ b/recoverytests-original/recoverytest2_logfile @@ -0,0 +1,19 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[5, "START"] +[6, "START"] +[7, "START"] +[6, "UPDATE", "recoverytest2_relation", "2", "A", "10", "0"] +[7, "UPDATE", "recoverytest2_relation", "4", "A", "10", "0"] +[4, "UPDATE", "recoverytest2_relation", "1", "A", "10", "7"] +[5, "UPDATE", "recoverytest2_relation", "3", "A", "10", "7"] +[4, "UPDATE", "recoverytest2_relation", "11", "A", "10", "13"] +[5, "UPDATE", "recoverytest2_relation", "31", "A", "10", "13"] +[5, "CLR", "recoverytest2_relation", "31", "A", "10"] +[4, "CLR", "recoverytest2_relation", "11", "A", "10"] +[5, "CLR", "recoverytest2_relation", "3", "A", "10"] +[4, "CLR", "recoverytest2_relation", "1", "A", "10"] +[5, "ABORT"] +[4, "ABORT"] diff --git a/recoverytests-original/recoverytest2_relation b/recoverytests-original/recoverytest2_relation new file mode 100644 index 0000000000000000000000000000000000000000..8613de843d50561269399bdb0aacb75f19192f0b --- /dev/null +++ b/recoverytests-original/recoverytest2_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "10"], ["1", "10"], ["2", "10"], ["3", "10"], ["4", "10"], ["5", "10"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "10"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "10"], ["21", "10"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/recoverytests-original/recoverytest3_logfile b/recoverytests-original/recoverytest3_logfile new file mode 100644 index 0000000000000000000000000000000000000000..2563c84046c0566f1a11560de2ee4782c310019c --- /dev/null +++ b/recoverytests-original/recoverytest3_logfile @@ -0,0 +1,53 @@ +[1, "START"] +[2, "START"] +[3, "START"] +[4, "START"] +[1, "UPDATE", "recoverytest3_relation", "0", "A", "10", "2"] +[2, "UPDATE", "recoverytest3_relation", "1", "A", "10", "0"] +[5, "START"] +[6, "START"] +[3, "UPDATE", "recoverytest3_relation", "2", "A", "10", "0"] +[7, "START"] +[3, "COMMIT"] +[8, "START"] +[4, "UPDATE", "recoverytest3_relation", "3", "A", "10", "5"] +[5, "UPDATE", "recoverytest3_relation", "4", "A", "10", "10"] +[4, "COMMIT"] +[9, "START"] +[6, "UPDATE", "recoverytest3_relation", "6", "A", "10", "10"] +[5, "UPDATE", "recoverytest3_relation", "14", "A", "10", "2"] +[10, "START"] +[11, "START"] +[12, "START"] +[8, "UPDATE", "recoverytest3_relation", "7", "A", "10", "9"] +[13, "START"] +[7, "UPDATE", "recoverytest3_relation", "5", "A", "10", "3"] +[9, "UPDATE", "recoverytest3_relation", "8", "A", "10", "6"] +[10, "UPDATE", "recoverytest3_relation", "9", "A", "10", "5"] +[14, "START"] +[8, "UPDATE", "recoverytest3_relation", "17", "A", "10", "6"] +[15, "START"] +[16, "START"] +[13, "UPDATE", "recoverytest3_relation", "2", "A", "0", "-1"] +[17, "START"] +[18, "START"] +[14, "UPDATE", "recoverytest3_relation", "3", "A", "5", "4"] +[19, "START"] +[20, "START"] +[6, "UPDATE", "recoverytest3_relation", "16", "A", "10", "3"] +[5, "UPDATE", "recoverytest3_relation", "24", "A", "10", "8"] +[7, "COMMIT"] +[16, "UPDATE", "recoverytest3_relation", "5", "A", "3", "0"] +[10, "CLR", "recoverytest3_relation", "9", "A", "10"] +[9, "UPDATE", "recoverytest3_relation", "18", "A", "10", "0"] +[10, "ABORT"] +[20, "UPDATE", "recoverytest3_relation", "9", "A", "10", "2"] +[1, "UPDATE", "recoverytest3_relation", "10", "A", "10", "5"] +[8, "UPDATE", "recoverytest3_relation", "27", "A", "10", "6"] +[16, "UPDATE", "recoverytest3_relation", "15", "A", "10", "2"] +[14, "UPDATE", "recoverytest3_relation", "13", "A", "10", "6"] +[2, "UPDATE", "recoverytest3_relation", "11", "A", "10", "4"] +[13, "UPDATE", "recoverytest3_relation", "12", "A", "10", "1"] +[5, "UPDATE", "recoverytest3_relation", "34", "A", "10", "7"] +[16, "UPDATE", "recoverytest3_relation", "25", "A", "10", "7"] +[16, "UPDATE", "recoverytest3_relation", "35", "A", "10", "0"] diff --git a/recoverytests-original/recoverytest3_relation b/recoverytests-original/recoverytest3_relation new file mode 100644 index 0000000000000000000000000000000000000000..8613de843d50561269399bdb0aacb75f19192f0b --- /dev/null +++ b/recoverytests-original/recoverytest3_relation @@ -0,0 +1 @@ +[["ID", "A"], 10, {"24": 3, "25": 3, "26": 3, "27": 3, "20": 3, "21": 3, "22": 3, "23": 3, "28": 3, "29": 3, "0": 1, "4": 1, "8": 1, "59": 6, "58": 6, "55": 6, "54": 6, "57": 6, "56": 6, "51": 6, "50": 6, "53": 6, "52": 6, "88": 9, "89": 9, "82": 9, "83": 9, "80": 9, "81": 9, "86": 9, "87": 9, "84": 9, "85": 9, "3": 1, "7": 1, "39": 4, "38": 4, "33": 4, "32": 4, "31": 4, "30": 4, "37": 4, "36": 4, "35": 4, "34": 4, "60": 7, "61": 7, "62": 7, "63": 7, "64": 7, "65": 7, "66": 7, "67": 7, "68": 7, "69": 7, "2": 1, "6": 1, "99": 10, "98": 10, "91": 10, "90": 10, "93": 10, "92": 10, "95": 10, "94": 10, "97": 10, "96": 10, "11": 2, "10": 2, "13": 2, "12": 2, "15": 2, "14": 2, "17": 2, "16": 2, "19": 2, "18": 2, "48": 5, "49": 5, "46": 5, "47": 5, "44": 5, "45": 5, "42": 5, "43": 5, "40": 5, "41": 5, "1": 1, "5": 1, "9": 1, "77": 8, "76": 8, "75": 8, "74": 8, "73": 8, "72": 8, "71": 8, "70": 8, "79": 8, "78": 8}] [["0", "10"], ["1", "10"], ["2", "10"], ["3", "10"], ["4", "10"], ["5", "10"], ["6", "10"], ["7", "10"], ["8", "10"], ["9", "10"]] [["10", "10"], ["11", "10"], ["12", "10"], ["13", "10"], ["14", "10"], ["15", "10"], ["16", "10"], ["17", "10"], ["18", "10"], ["19", "10"]] [["20", "10"], ["21", "10"], ["22", "10"], ["23", "10"], ["24", "10"], ["25", "10"], ["26", "10"], ["27", "10"], ["28", "10"], ["29", "10"]] [["30", "10"], ["31", "10"], ["32", "10"], ["33", "10"], ["34", "10"], ["35", "10"], ["36", "10"], ["37", "10"], ["38", "10"], ["39", "10"]] [["40", "10"], ["41", "10"], ["42", "10"], ["43", "10"], ["44", "10"], ["45", "10"], ["46", "10"], ["47", "10"], ["48", "10"], ["49", "10"]] [["50", "10"], ["51", "10"], ["52", "10"], ["53", "10"], ["54", "10"], ["55", "10"], ["56", "10"], ["57", "10"], ["58", "10"], ["59", "10"]] [["60", "10"], ["61", "10"], ["62", "10"], ["63", "10"], ["64", "10"], ["65", "10"], ["66", "10"], ["67", "10"], ["68", "10"], ["69", "10"]] [["70", "10"], ["71", "10"], ["72", "10"], ["73", "10"], ["74", "10"], ["75", "10"], ["76", "10"], ["77", "10"], ["78", "10"], ["79", "10"]] [["80", "10"], ["81", "10"], ["82", "10"], ["83", "10"], ["84", "10"], ["85", "10"], ["86", "10"], ["87", "10"], ["88", "10"], ["89", "10"]] [["90", "10"], ["91", "10"], ["92", "10"], ["93", "10"], ["94", "10"], ["95", "10"], ["96", "10"], ["97", "10"], ["98", "10"], ["99", "10"]] \ No newline at end of file diff --git a/testingRecovery.py b/testingRecovery.py index dc521acb24ba1926624e97d1396513c0f9bfc82a..cfbac47a97d3488b1600080fa9e8f00ba5d3349a 100644 --- a/testingRecovery.py +++ b/testingRecovery.py @@ -10,6 +10,7 @@ from exampletransactions import * ##################################################################################################### # Initial Setup +print("Reading from '{}' and '{}\n".format("logfile", "relation1")) bpool = BufferPool() r = Relation('relation1') LogManager.setAndAnalyzeLogFile('logfile') diff --git a/transactions.py b/transactions.py index 1376c352f46e7fba35b391ec632ba65d1599cb4a..688159dec87e2940af2eef2523bd47a152f6c410 100644 --- a/transactions.py +++ b/transactions.py @@ -169,8 +169,10 @@ class LogManager: # - fix by: # - reverting transactions that did not finish by calling `revertChanges` on them # - redo transactions that did finish by calling `redoChanges` - # - telling the buffer manager to write all changes to disk - # After the restart recovery is done,we can now write out a CHECKPOINT record to signify + + # After the restart recovery is done (i.e., 'revertChanges' called on aborted or not finished transactions, + # 'redoChanges' called on + # undone, and all the pages have been written to disk), we can now write out a CHECKPOINT record to signify # that the file contents are in a consistent state lr = LogRecord([-1, LogRecord.CHECKPOINT, list()]) LogManager.writeLogRecord(lr)