static int jerror (sqlite3 *db, chirp_jobid_t id, const char *errmsg) { static const char SQL[] = "UPDATE Job" " SET" " status = 'ERRORED'," " time_error = strftime('%s', 'now')," " error = ?" " WHERE id = ?;"; int rc; sqlite3_stmt *stmt = NULL; const char *current = SQL; sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatch(sqlite3_bind_text(stmt, 1, errmsg, -1, SQLITE_STATIC)); sqlcatch(sqlite3_bind_int64(stmt, 2, (sqlite3_int64)id)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); debug(D_DEBUG, "job %" PRICHIRP_JOBID_T " entered error state: `%s'", id, errmsg); rc = 0; goto out; out: sqlite3_finalize(stmt); return rc; }
static int sn_ticket (confuga *C, const struct confuga_host *host) { static const char SQL[] = "UPDATE Confuga.StorageNode" " SET ticket = ?2" " WHERE hostport = ?1;" ; int rc; sqlite3 *db = C->db; sqlite3_stmt *stmt = NULL; const char *current = SQL; time_t stoptime = STOPTIME_SHORT; char ticket[PATH_MAX]; char path[CHIRP_PATH_MAX]; struct stat info; FILE *stream = NULL; CATCHUNIX(snprintf(ticket, sizeof(ticket), "%s/ticket", C->root)); CATCHUNIX(chirp_reli_ticket_register(host->hostport, ticket, "self", TICKET_DURATION, stoptime)); /* The list permission is necessary because chirp_fs_local_scheduler.c:geturl does a stat. */ CATCHUNIX(snprintf(path, sizeof(path), "%s/file", host->root)); CATCHUNIX(chirp_reli_ticket_modify(host->hostport, ticket, path, "lr", stoptime)); /* Add write permission because a putfile may need retried. */ CATCHUNIX(snprintf(path, sizeof(path), "%s/open", host->root)); CATCHUNIX(chirp_reli_ticket_modify(host->hostport, ticket, path, "pw", stoptime)); CATCHUNIX(snprintf(path, sizeof(path), "%s/ticket", host->root)); stream = fopen(ticket, "r"); CATCHUNIX(stream ? 0 : -1); CATCHUNIX(fstat(fileno(stream), &info)); CATCHUNIX(chirp_reli_putfile(host->hostport, path, stream, S_IRUSR, info.st_size, stoptime)); sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatch(sqlite3_bind_text(stmt, 1, host->hostport, -1, SQLITE_STATIC)); sqlcatch(sqlite3_bind_blob(stmt, 2, C->ticket, sizeof(C->ticket), SQLITE_STATIC)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); rc = 0; goto out; out: if (stream) fclose(stream); sqlite3_finalize(stmt); return rc; }
static int bindfile (sqlite3 *db, chirp_jobid_t id, const char *subject, const char *sandbox, struct url_binding **urlsp, const char *task_path, const char *serv_path, const char *binding, const char *type, enum BINDSTATE mode) { static const char SQL[] = "UPDATE JobFile" " SET serv_path = ?, size = ?" " WHERE id = ? AND task_path = ? AND type = 'OUTPUT'"; int rc; sqlite3_stmt *stmt = NULL; const char *current = SQL; char task_path_resolved[CHIRP_PATH_MAX] = ""; char serv_path_interpolated[CHIRP_PATH_MAX] = ""; char serv_path_resolved[CHIRP_PATH_MAX] = ""; char task_path_dir[CHIRP_PATH_MAX] = ""; /* directory containing task_path_resolved */ CATCHUNIX(snprintf(task_path_resolved, sizeof(task_path_resolved), "%s/%s", sandbox, task_path)); if ((size_t)rc >= sizeof(task_path_resolved)) CATCH(ENAMETOOLONG); path_dirname(task_path_resolved, task_path_dir); if (strcmp(binding, "URL") == 0) { if (strcmp(type, "INPUT") != 0) CATCH(EINVAL); if (mode == BOOTSTRAP) { debug(D_DEBUG, "binding `%s' for future URL fetch `%s'", task_path, serv_path); CATCHUNIX(create_dir(task_path_dir, S_IRWXU) ? 0 : -1); struct url_binding *url = malloc(sizeof(struct url_binding)); CATCHUNIX(url ? 0 : -1); memset(url, 0, sizeof(struct url_binding)); strncpy(url->path, "", sizeof(url->path)); url->url = NULL; url->next = *urlsp; *urlsp = url; CATCHUNIX(snprintf(url->path, sizeof(url->path), "%s", task_path)); CATCHUNIX((url->url = strdup(serv_path)) ? 0 : -1); } rc = 0; goto out; } strncpy(serv_path_interpolated, serv_path, sizeof(serv_path_interpolated)-1); if (mode == STRAPBOOT && strcmp(type, "OUTPUT") == 0) CATCH(interpolate(id, task_path_resolved, serv_path_interpolated)); serv_path = serv_path_interpolated; CATCH(chirp_fs_local_resolve(serv_path, serv_path_resolved)); if (mode == BOOTSTRAP) { debug(D_DEBUG, "binding `%s' as `%s'", task_path, serv_path); CATCHUNIX(create_dir(task_path_dir, S_IRWXU) ? 0 : -1); if (strcmp(type, "INPUT") == 0) { if (strcmp(binding, "LINK") == 0) { CATCHUNIX(link(serv_path_resolved, task_path_resolved)); } else if (strcmp(binding, "COPY") == 0) { CATCHUNIX(copy_file_to_file(serv_path_resolved, task_path_resolved)); } else assert(0); CATCHUNIX(chmod(serv_path_resolved, S_IRWXU)); } } else if (mode == STRAPBOOT) { if (strcmp(type, "OUTPUT") == 0) { struct stat info; debug(D_DEBUG, "binding output file `%s' as `%s'", task_path, serv_path); if (strcmp(binding, "LINK") == 0) { CATCHUNIXIGNORE(unlink(serv_path_resolved), ENOENT); /* ignore error/success */ CATCHUNIX(link(task_path_resolved, serv_path_resolved)); } else if (strcmp(binding, "COPY") == 0) { CATCHUNIXIGNORE(unlink(serv_path_resolved), ENOENT); CATCHUNIX(copy_file_to_file(task_path_resolved, serv_path_resolved)); } if (stat(serv_path_resolved, &info) == 0) { sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatch(sqlite3_bind_text(stmt, 1, serv_path, -1, SQLITE_STATIC)); sqlcatch(sqlite3_bind_int64(stmt, 2, info.st_size)); sqlcatch(sqlite3_bind_int64(stmt, 3, (sqlite3_int64)id)); sqlcatch(sqlite3_bind_text(stmt, 4, task_path, -1, SQLITE_STATIC)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); } } } else assert(0);
CONFUGA_IAPI int confugaS_catalog_sync (confuga *C) { static const char SQL[] = "SELECT COUNT(*) FROM Confuga.StorageNode WHERE strftime('%s', 'now', '-2 minutes') <= lastheardfrom;" "BEGIN IMMEDIATE TRANSACTION;" "UPDATE Confuga.StorageNode" " SET address = ?, avail = ?, backend = ?, bytes_read = ?, bytes_written = ?, cpu = ?, cpus = ?, lastheardfrom = ?, load1 = ?, load5 = ?, load15 = ?, memory_avail = ?, memory_total = ?, minfree = ?, name = ?, opsys = ?, opsysversion = ?, owner = ?, port = ?, starttime = ?, total = ?, total_ops = ?, url = ?, version = ?" " WHERE hostport = ? || ':' || ? OR" " hostport = ? || ':' || ? OR" " 'chirp://' || hostport = ?;" "END TRANSACTION;"; int rc; sqlite3 *db = C->db; sqlite3_stmt *stmt = NULL; const char *current = SQL; time_t stoptime = time(NULL)+15; struct catalog_query *Q = NULL; struct nvpair *nv = NULL; sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatchcode(sqlite3_step(stmt), SQLITE_ROW); if (sqlite3_column_int(stmt, 0) > 0) { rc = 0; goto out; } sqlcatch(sqlite3_finalize(stmt); stmt = NULL); debug(D_DEBUG|D_CONFUGA, "syncing with catalog"); Q = catalog_query_create(C->catalog_host, C->catalog_port, stoptime); CATCH(Q == NULL ? errno : 0); /* FIXME sqlcatch is silent about EAGAIN, what should we do? */ sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); while ((nv = catalog_query_read(Q, stoptime))) { const char *type = nvpair_lookup_string(nv, "type"); if (type && strcmp(type, "chirp") == 0) { int n = 1; /* UPDATE */ sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "address"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "avail"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "backend"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "bytes_read"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "bytes_written"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "cpu"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "cpus"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "lastheardfrom"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "load1"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "load5"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "load15"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "memory_avail"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "memory_total"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "minfree"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "name"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "opsys"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "opsysversion"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "owner"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "port"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "starttime"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "total"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "total_ops"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "url"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "version"), -1, SQLITE_TRANSIENT)); /* WHERE hostport = ? */ sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "name"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "port"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "address"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "port"), -1, SQLITE_TRANSIENT)); sqlcatch(sqlite3_bind_text(stmt, n++, nvpair_lookup_string(nv, "url"), -1, SQLITE_TRANSIENT)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_reset(stmt)); sqlcatch(sqlite3_clear_bindings(stmt)); } } sqlcatch(sqlite3_finalize(stmt); stmt = NULL); sqlcatch(sqlite3_prepare_v2(db, current, -1, &stmt, ¤t)); sqlcatchcode(sqlite3_step(stmt), SQLITE_DONE); sqlcatch(sqlite3_finalize(stmt); stmt = NULL); rc = 0; goto out; out: if (Q) catalog_query_delete(Q); sqlite3_finalize(stmt); sqlend(db); return rc; }