From: Smart W. G. F. W. <f.w...@sm...> - 2008-04-05 21:29:54
|
Hi list, now this code works well: diff -Nuar ../mysqlfs/query.c query.c --- ../mysqlfs/query.c 2008-04-04 20:33:32.000000000 +0200 +++ query.c 2008-04-05 18:24:17.000000000 +0200 @@ -27,6 +27,7 @@ #include "log.h" #define SQL_MAX 10240 +#define INODE_CACHE_MAX 4096 static inline int lock_inode(MYSQL *mysql, long inode) { @@ -64,11 +65,10 @@ char sql[SQL_MAX]; MYSQL_RES* result; MYSQL_ROW row; - -/* ret = query_inode_full(mysql, path, NULL, 0, &inode, NULL, &nlinks); + ret = query_inode_full(mysql, path, NULL, 0, &inode, NULL, &nlinks); if (ret < 0) return ret; -*/ + snprintf(sql, SQL_MAX, "SELECT inode, mode, uid, gid, atime, mtime " "FROM inodes WHERE inode=%ld", @@ -296,7 +296,7 @@ long new_inode_number = 0; char *name, esc_name[PATH_MAX * 2]; - if (path[0] == '/' && path[1] == '\0') { + if (path[0] == '/' && path[1] == '\0') { snprintf(sql, SQL_MAX, "INSERT INTO tree (name, parent) VALUES ('/', NULL)"); @@ -306,9 +306,9 @@ goto err_out; } else { name = strrchr(path, '/'); - if (!name || *++name == '\0') + if (!name || *++name == '\0') return -ENOENT; - + mysql_real_escape_string(mysql, esc_name, name, strlen(name)); snprintf(sql, SQL_MAX, "INSERT INTO tree (name, parent) VALUES ('%s', %ld)", @@ -919,6 +919,127 @@ int query_fsck(MYSQL *mysql) { - // See TODO file for what should be here... - return 0; + + /* + query_fsck by florian wiessner (f.w...@sm...) + */ + printf("Starting fsck\n"); + + // 1. delete inodes with deleted==1 + int ret; +// int ret2; + int result; + char sql[SQL_MAX]; + printf("Stage 1...\n"); + snprintf(sql, SQL_MAX, + "DELETE from inodes WHERE inodes.deleted = 1"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + + ret = mysql_query(mysql, sql); + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } + // 2. - delete direntries without corresponding inode + printf("Stage 2...\n"); + snprintf(sql, SQL_MAX, "delete from tree where tree.inode not in (select inode from inodes);"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + ret = mysql_query(mysql, sql); + + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } + + + + // 3. set inuse=0 for all inodes + printf("Stage 3...\n"); + snprintf(sql, SQL_MAX, "UPDATE inodes SET inuse=0;"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + + ret = mysql_query(mysql, sql); + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } + + + // 4. delete data without existing inode + printf("Stage 4...\n"); + snprintf(sql, SQL_MAX, "delete from data_blocks where inode not in (select inode from inodes);"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + + ret = mysql_query(mysql, sql); + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } + + + // 5. synchronize inodes.size=data.LENGTH(data) + printf("Stage 5...\n"); + long int inode; + long int size; + + snprintf(sql, SQL_MAX, "select inode, sum(OCTET_LENGTH(data)) as size from data_blocks group by inode"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + + ret = mysql_query(mysql, sql); + + MYSQL_RES* myresult; + MYSQL_ROW row; + + myresult = mysql_store_result(mysql); + while ((row = mysql_fetch_row(myresult)) != NULL) { + inode = atol(row[0]); + size = atol(row[1]); + + snprintf(sql, SQL_MAX, "update inodes set size=%ld where inode=%ld;", size, inode); + log_printf(LOG_D_SQL, "sql=%s\n", sql); + result = mysql_query(mysql, sql); + +/* if (myresult) { // something has gone wrong.. delete datablocks... + + snprintf(sql, SQL_MAX, "delete from inodes where inode=%ld;", inode); + log_printf(LOG_D_SQL, "sql=%s\n", sql); + ret2 = mysql_query(mysql, sql); + + } +*/ // skip this for now! + + } + + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } + mysql_free_result(myresult); + +/* printf("optimizing tables\n"); + snprintf(sql, SQL_MAX, + "OPTIMIZE TABLE inodes;"); + + log_printf(LOG_D_SQL, "sql=%s\n", sql); + + ret = mysql_query(mysql, sql); + if(ret){ + log_printf(LOG_ERROR, "Error: mysql_query()\n"); + log_printf(LOG_ERROR, "mysql_error: %s\n", mysql_error(mysql)); + return -EIO; + } +*/ + printf("fsck done!\n"); + return ret; + } How can i submit this code to the cvs? -- Mit freundlichen Grüßen, Florian Wiessner Smart Weblications GmbH Martinsberger Str. 1 D-95119 Naila fon.: +49 700 762 789 32 - 0,12 EUR/Min* fax.: +49 700 762 789 32 - 0,12 EUR/Min* 24/7: +49 900 311 886 00 - 1,99 EUR/Min* http://www.smart-weblications.de -- Sitz der Gesellschaft: Naila Geschäftsführer: Florian Wiessner HRB-Nr.: HRB 3840 Amtsgericht Hof *aus dem dt. Festnetz, ggf. abweichende Preise aus dem Mobilfunknetz |