Hi Once in a while, I see an error when doing a "VACUUM" operation.
sqlite3_exec3(...) returns status=14 (unable to open database file). I suppose that it fails to open a temporary database when doing the VACUUM operation, but I don't see why. sqlite3_extended_errcode(db) also returns extendedErrorCode=14 The code to vacuum looks simple, it does these operations: ========================================================== sqlite3* db; int status = sqlite3_open(dbName, &db); if (status != SQLITE_OK) { ... no error happening here. } char* errMsg = NULL; status = sqlite3_exec(db, "PRAGMA synchronous=OFF;", NULL, NULL, &errMsg); if (status != SQLITE_OK) { ... no error happening here. } status = sqlite3_exec(db, "VACUUM;", NULL, NULL, &errMsg); if (status != SQLITE_OK) { ... and here I get status is 14 once in a while?! } status = sqlite3_close(db); if (status != SQLITE_OK) { ... no error happening here, even when above VACUUM failed. } ========================================================== I precise that: - It's doing VACUUM of fairly large DBs (1 or a couple of Gb in general) but the file system has far more free space. I realize that VACUUM needs free space (>= 2 or 3 times the size of the DB?) That should not be the problem. And if it was, I would expect a different error code than 14. - I'm doing several VACUUM in parallel of different DBs in different processes. I'm not using threads. Each process VACUUM a different database which is simple. - The DB is opened just before doing the VACUUM (as in above code) There is no other opened connection to it. - It's not 100% reproducible. It happens maybe 1/10 of the times, which suggests that it could be a race condition. Yet it's not using threads. Different processes uses different databases, so it does not seem possible to have race conditions in those conditions. - Even though VACUUM fails, the DB looks fine. - It's using SQLite-3.7.3 (actually, Spatialite-2.4.0) on Linux x86_64. (OK, maybe time to upgrade SQLite) - I've checked with Valgrind memory checker on tiny databases: it sees no problem. -> Any idea what could be wrong? I wonder whether VACUUM of different databases happening in parallel in different processes could use the same temporary file names, causing conflicts. Regards -- Dominique _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users