static int process_cont(const char *fpath, const struct stat *sb, int typeflag) { char contname[PATH_MAX]; char *slash; if ((typeflag & FTW_NS) == FTW_NS) // Stat failed: shouldn't happen return(0); if ((typeflag & FTW_DNR) == FTW_DNR)// Can not read: shouldn't happen return(0); if ((typeflag & FTW_D) == FTW_D) // Directory return 0; slash = strrchr(fpath, '/'); if (slash == NULL) // Can not find /: shouldn't happen assert(0); if (*(slash+1) == '\0') // mount point return 0; if (strcmp(slash+1, NKN_CONTAINER_NAME)) return 0; contname[0] = '\0'; strncat(contname, fpath, PATH_MAX); return read_container(contname); }
/* * Program: cont_read * */ int main(int argc, char *argv[]) { char *progname; int ch, ret = 0; struct stat sb; progname = argv[0]; if (argc < 2) cont_usage(progname); while ((ch = getopt(argc, argv, "1acCdEhlLmMpstvR5:")) != -1) { switch (ch) { case '1': print_one_entry_per++; break; case '5': print_md5_chksum++; md5_nbytes = atoi(optarg); if (md5_nbytes >= 0 && md5_nbytes <= 1024*1024*2) { if ( (md5_nbytes % 512) != 0) { printf("Number of bytes for md5 hash has to be multiple" " of 512 and less than or equal to 2MB.\n"); cont_usage(progname); } } break; case 'a': print_attrs++; print_temp++; break; case 'd': print_dirname++; break; case 'c': print_compact_output++; break; case 'C': checksum_output++; break; case 'E': syslog_errors++; break; case 'h': print_header++; break; case 'l': lowest_tier++; break; case 'L': print_content_len++; break; case 'm': print_for_cliweb++; break; case 'M': ram_drive++; break; case 'p': print_fullpath++; print_dirname = 0; break; case 's': skip_deleted++; break; case 't': print_temp++; break; case 'v': print_attr_version++; break; case 'R': recursive++; break; default: cont_usage(progname); break; } } if (optind >= argc) cont_usage(progname); while (optind < argc) { if ((ret = stat(argv[optind], &sb)) != 0) { fprintf(stderr, "Unable to find: %s\n", argv[optind]); exit(1); } if (print_md5_chksum) getrawpartfd(argv[optind]); if (recursive) { if (!S_ISDIR(sb.st_mode)) { fprintf(stderr,"%s is not a directory\n", argv[optind]); cont_usage(progname); } ftw(argv[optind], process_cont, 10); } else { if (!S_ISREG(sb.st_mode)) { fprintf(stderr,"%s is not a regular file\n", argv[optind]); cont_usage(progname); } read_container(argv[optind]); } optind++; if (print_md5_chksum) if (g_rawpart_fd > 0) close(g_rawpart_fd); } return 0; } /* main */
Container *container_cache_insert_container(ContainerCache *cc, ContainerId cid) { /* read container */ Container *container = 0; TIMER_DECLARE(b, e); TIMER_BEGIN(b); if (cc->enable_data) { if (simulation_level >= SIMULATION_RECOVERY) { container = read_container_meta_only(cid); } else { container = read_container(cid); } } else { container = read_container_meta_only(cid); } TIMER_END(read_container_time, b, e); /* If this container is newly appended, * maybe we can read nothing. */ if (container == NULL) { return NULL; } /* insert */ Container *evictor = lru_cache_insert(cc->lru_cache, container); /* evict */ if (evictor) { int32_t chunknum = container_get_chunk_num(evictor); Fingerprint *fingers = container_get_all_fingers(evictor); int i = 0; /* evict all fingers of evictor from map */ for (; i < chunknum; ++i) { GSequence* container_list = g_hash_table_lookup(cc->map, &fingers[i]); /* remove the specified container from list */ GSequenceIter *iter = g_sequence_lookup(container_list, evictor, container_cmp_des, NULL); if (iter) g_sequence_remove(iter); else dprint("Error! The sequence does not contain the container."); if (g_sequence_get_length(container_list) == 0) { g_hash_table_remove(cc->map, &fingers[i]); } } free(fingers); if (fragment_stream) fprintf(fragment_stream, "%.4f\n", 1.0 * evictor->used_size / CONTAINER_SIZE); container_free_full(evictor); } /* insert */ int32_t num = container_get_chunk_num(container); Fingerprint *nfingers = container_get_all_fingers(container); int i = 0; for (; i < num; ++i) { GSequence* container_list = g_hash_table_lookup(cc->map, &nfingers[i]); if (container_list == 0) { container_list = g_sequence_new(NULL); Fingerprint *finger = (Fingerprint *) malloc(sizeof(Fingerprint)); memcpy(finger, &nfingers[i], sizeof(Fingerprint)); g_hash_table_insert(cc->map, finger, container_list); } g_sequence_insert_sorted(container_list, container, container_cmp_des, NULL); } free(nfingers); return container; }