DedSec Project

Γλωσσάρι: καταγραφή, διαρροές μνήμης και migrations — DedSec Project

Γλωσσάρι: καταγραφή, διαρροές μνήμης και migrations Logging Έννοια και όρια Καταγραφή συμβάντων με severity, timestamps και correlation IDs για διάγνωση. Τα logs μπορούν να εκθέσουν tokens…

Logging

Έννοια και όρια

Καταγραφή συμβάντων με severity, timestamps και correlation IDs για διάγνωση. Τα logs μπορούν να εκθέσουν tokens ή προσωπικά στοιχεία χωρίς σωστό sanitization.

Πρακτικό δείγμα

import logging
logging.basicConfig(level=logging.INFO)
logging.info('processed %d records',3)

Οδηγούμενη διερεύνηση

Κατέγραψε απορριφθείσα εγγραφή με συνθετικό request ID χωρίς credentials. Έλεγξε ποια fields φτάνουν στον handler, όχι μόνο το console.

Κριτήριο κατανόησης

Στην έννοια Καταγραφή συμβάντων, άλλαξε μία είσοδο του παραδείγματος και εξήγησε αν η συμπεριφορά συνεχίζει να συμφωνεί με τον ορισμό. Κατέγραψε αποτέλεσμα και ξεχώρισε σφάλμα κώδικα από λανθασμένη υπόθεση.

Memory leak

Έννοια και όρια

Ακούσια διατήρηση αντικειμένων πέρα από τη χρήσιμη διάρκεια ζωής τους. Μακρόβιες caches, callbacks και references προκαλούν προβλήματα ακόμη και με garbage collector. Μεγάλη μνήμη δεν σημαίνει πάντα leak.

Πρακτικό δείγμα

from collections import deque
recent=deque(maxlen=10)
for n in range(10000): recent.append(n)
assert len(recent)==10

Οδηγούμενη διερεύνηση

Σύγκρινε unbounded list με bounded deque σε επαναλαμβανόμενες εισόδους. Χρησιμοποίησε tracemalloc snapshots για retained allocations.

Retained references που παρατείνουν τη ζωή objects

Ένα object μπορεί να παραμένει προσβάσιμο από registry παρότι η αρχική τοπική μεταβλητή διαγράφτηκε. Το weak reference επιτρέπει έλεγχο χωρίς τεράστια allocations.

import gc, weakref
class Entry: pass
registry = []
entry = Entry()
watch = weakref.ref(entry)
registry.append(entry)
del entry
gc.collect()
assert watch() is not None
registry.clear()
gc.collect()
assert watch() is None

Σχεδίασε cache με όριο 100 entries και μέτρησε objects μετά από χιλιάδες διαφορετικά keys. Μόνο το RSS δεν αποδεικνύει leak: ο allocator μπορεί να κρατά ελεύθερα pools.

Migration

Έννοια και όρια

Ελεγχόμενη αναβάθμιση schema ή έκδοσης. Migration λαμβάνει υπόψη παλιές γραμμές, σταδιακό deployment και επιλογές rollback, όχι μόνο μία αλλαγή σχήματος.

Πρακτικό δείγμα

CREATE TABLE tasks(id INTEGER PRIMARY KEY,title TEXT);
ALTER TABLE tasks ADD COLUMN archived INTEGER NOT NULL DEFAULT 0;

Οδηγούμενη διερεύνηση

Χρησιμοποίησε προσωρινή SQLite με παλιές γραμμές· έλεγξε ότι το νέο archived είναι 0 και σχεδίασε rollback.

Κριτήριο κατανόησης

Στην έννοια Μετάβαση σχήματος, άλλαξε μία είσοδο του παραδείγματος και εξήγησε αν η συμπεριφορά συνεχίζει να συμφωνεί με τον ορισμό. Κατέγραψε αποτέλεσμα και ξεχώρισε σφάλμα κώδικα από λανθασμένη υπόθεση.

Αλλαγή schema χωρίς απώλεια παλιών εγγραφών

Μία migration είναι σωστή όταν οι υπάρχουσες εγγραφές παραμένουν έγκυρες και το νέο schema υποστηρίζεται από την εφαρμογή.

import sqlite3
db = sqlite3.connect(":memory:")
db.execute("CREATE TABLE tasks(id INTEGER PRIMARY KEY,title TEXT)")
db.execute("INSERT INTO tasks(title) VALUES (?)", ("review",))
with db:
    db.execute("ALTER TABLE tasks ADD COLUMN archived INTEGER NOT NULL DEFAULT 0")
assert db.execute("SELECT title,archived FROM tasks").fetchone() == ("review",0)
db.close()

Πρόσθεσε PRAGMA user_version και εκτέλεσε upgrade δύο φορές. Τη δεύτερη πρέπει να ανιχνεύεται ότι έχει ήδη εφαρμοστεί. Για destructive migrations σχεδίασε backup/rollback πριν από αλλαγές. Τα DDL semantics διαφέρουν ανά engine.