// Test a restart with a good interim file, and validate we have all the data TEST(FTDCFileManagerTest, TestNormalCrashInterim) { Client* client = &cc(); FTDCConfig c; c.maxSamplesPerInterimMetricChunk = 3; c.maxFileSizeBytes = 10 * 1024 * 1024; c.maxDirectorySizeBytes = 10 * 1024 * 1024; unittest::TempDir tempdir("metrics_testpath"); boost::filesystem::path dir(tempdir.path()); createDirectoryClean(dir); BSONObj mdoc1 = BSON("name" << "some_metadata" << "key1" << 34 << "something" << 98); BSONObj sdoc1 = BSON("name" << "joe" << "key1" << 34 << "key2" << 45); BSONObj sdoc2 = BSON("name" << "joe" << "key3" << 34 << "key5" << 45); auto swFile = FTDCFileManager::generateArchiveFileName(dir, "0test-crash"); ASSERT_OK(swFile); { FTDCFileWriter writer(&c); ASSERT_OK(writer.open(swFile.getValue())); ASSERT_OK(writer.writeMetadata(mdoc1)); ASSERT_OK(writer.writeSample(sdoc1)); ASSERT_OK(writer.writeSample(sdoc1)); ASSERT_OK(writer.writeSample(sdoc2)); ASSERT_OK(writer.writeSample(sdoc2)); ASSERT_OK(writer.writeSample(sdoc2)); ASSERT_OK(writer.writeSample(sdoc2)); // leave some data in the interim file writer.closeWithoutFlushForTest(); } // Validate the interim file has data ValidateInterimFileHasData(dir, true); // Let the manager run the recovery over the interim file { FTDCCollectorCollection rotate; auto swMgr = FTDCFileManager::create(&c, dir, &rotate, client); ASSERT_OK(swMgr.getStatus()); auto mgr = std::move(swMgr.getValue()); ASSERT_OK(mgr->close()); } // Validate the file manager rolled over the changes to the current archive file // and did not start a new archive file. auto files = scanDirectory(dir); std::sort(files.begin(), files.end()); // Validate old file std::vector<BSONObj> docs1 = {mdoc1, sdoc1, sdoc1}; ValidateDocumentList(files[0], docs1); // Validate new file std::vector<BSONObj> docs2 = {sdoc2, sdoc2, sdoc2, sdoc2}; ValidateDocumentList(files[1], docs2); }
// Test a restart after a crash with a corrupt archive file TEST(FTDCFileManagerTest, TestCorruptCrashRestart) { Client* client = &cc(); FTDCConfig c; c.maxFileSizeBytes = 1000; c.maxDirectorySizeBytes = 3000; unittest::TempDir tempdir("metrics_testpath"); boost::filesystem::path dir(tempdir.path()); createDirectoryClean(dir); for (int i = 0; i < 2; i++) { // Do a few cases of stop and start to ensure it works as expected FTDCCollectorCollection rotate; auto swMgr = FTDCFileManager::create(&c, dir, &rotate, client); ASSERT_OK(swMgr.getStatus()); auto mgr = std::move(swMgr.getValue()); // Test a large numbers of zeros, and incremental numbers in a full buffer for (int j = 0; j < 4; j++) { ASSERT_OK(mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 3230792343LL << "key2" << 235135))); for (size_t i = 0; i <= FTDCConfig::kMaxSamplesPerArchiveMetricChunkDefault - 2; i++) { ASSERT_OK( mgr->writeSampleAndRotateIfNeeded( client, BSON("name" << "joe" << "key1" << static_cast<long long int>(i * j * 37) << "key2" << static_cast<long long int>(i * (645 << j))))); } ASSERT_OK(mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 34 << "key2" << 45))); // Add Value ASSERT_OK(mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 34 << "key2" << 45))); } mgr->close(); auto swFile = FTDCFileManager::generateArchiveFileName(dir, "0test-crash"); ASSERT_OK(swFile); std::ofstream stream(swFile.getValue().c_str()); // This test case caused us to allocate more memory then the size of the file the first time // I tried it stream << "Hello World"; stream.close(); } }
int main (int argc, char **argv) { uint32_t c; char *config_file; bool custom_config; char *tmpdir; struct sigaction sigact; set_quoting_style(NULL, escape_quoting_style); if (setlocale(LC_ALL, "") == NULL) warn(_("%s: Cannot set locale: %s\n"), argv[0], errstr); #ifdef ENABLE_NLS if (bindtextdomain(PACKAGE, LOCALEDIR) == NULL) warn(_("%s: Cannot bind message domain: %s\n"), argv[0], errstr); if (textdomain(PACKAGE) == NULL) warn(_("%s: Cannot set message domain: %s\n"), argv[0], errstr); #endif custom_config = false; get_package_file("config", &config_file); while (true) { c = getopt_long(argc, argv, short_opts, long_opts, NULL); if (c == -1) break; switch (c) { case 'c': /* --config */ custom_config = true; free(config_file); config_file = xstrdup(optarg); break; case 'n': /* --no-config */ free(config_file); config_file = NULL; break; case HELP_OPT: /* --help */ printf(_("Usage: %s [OPTION]...\n"), quotearg(argv[0])); puts(_("Start microdc, a command-line based Direct Connect client.\n")); printf(_(" -n, --no-config do not read config file on startup\n")); printf(_(" --help display this help and exit\n")); printf(_(" --version output version information and exit\n")); printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); exit(EXIT_SUCCESS); case VERSION_OPT: /* --version */ version_etc(stdout, NULL, PACKAGE, VERSION, /*"Oskar Liljeblad",*/ "Vladimir Chugunov", NULL); exit(EXIT_SUCCESS); default: exit(EXIT_FAILURE); } } if (pipe(signal_pipe) < 0) { warn(_("Cannot create pipe pair - %s\n"), errstr); goto cleanup; } main_process_id = getpid(); sigact.sa_handler = signal_received; if (sigemptyset(&sigact.sa_mask) < 0) { warn(_("Cannot empty signal set - %s\n"), errstr); goto cleanup; } sigact.sa_flags = SA_RESTART; #ifdef HAVE_STRUCT_SIGACTION_SA_RESTORER sigact.sa_restorer = NULL; #endif /* Note: every signal registered with a non-ignore action here must * also be registered in user.c, either with an action or as ignored. */ if (sigaction(SIGINT, &sigact, NULL) < 0 || sigaction(SIGTERM, &sigact, NULL) < 0 || sigaction(SIGUSR1, &sigact, NULL) < 0 || sigaction(SIGCHLD, &sigact, NULL) < 0) { warn(_("Cannot register signal handler - %s\n"), errstr); goto cleanup; } sigact.sa_handler = SIG_IGN; if (sigaction(SIGPIPE, &sigact, NULL) < 0) { warn(_("Cannot register signal handler - %s\n"), errstr); goto cleanup; } FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_SET(signal_pipe[0], &read_fds); /*FD_SET(STDIN_FILENO, &read_fds);*/ hub_recvq = byteq_new(128); hub_sendq = byteq_new(128); user_conns = hmap_new(); hub_users = hmap_new(); pending_userinfo = hmap_new(); set_main_charset(""); set_hub_charset(""); set_fs_charset(""); user_conn_unknown_free = ptrv_new(); delete_files = ptrv_new(); delete_dirs = ptrv_new(); search_udpmsg_out = ptrv_new(); our_searches = ptrv_new(); search_recvq = byteq_new(8192); // same size as DC++ my_nick = xstrdup(PACKAGE); my_description = xstrdup(""); my_email = xstrdup(""); my_speed = xstrdup("56Kbps"); my_tag = xasprintf("%s V:%s", PACKAGE, VERSION); download_dir = xstrdup("."); tmpdir = tempdir(); if (tmpdir == NULL) { warn(_("Cannot find directory for temporary files - %s\n"), errstr); goto cleanup; } { char *filename = xasprintf("%s.%d", PACKAGE, getpid()); listing_dir = catfiles(tmpdir, filename); free(filename); } ptrv_append(delete_dirs, xstrdup(listing_dir)); is_active = false; listen_port = 0; if (!local_file_list_update_init()) goto cleanup; if (!set_active(false, listen_port)) goto cleanup; if (!enable_search()) goto cleanup; my_ul_slots = 3; if (!lookup_init()) goto cleanup; if (!file_list_parse_init()) goto cleanup; command_init(); if (!local_file_list_init()) { goto cleanup; } if (config_file != NULL) { run_script(config_file, !custom_config); free(config_file); config_file = NULL; } screen_prepare(); while (running) { fd_set res_read_fds; fd_set res_write_fds; int res; struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; screen_redisplay_prompt(); res_read_fds = read_fds; res_write_fds = write_fds; res = TEMP_FAILURE_RETRY(select(FD_SETSIZE, &res_read_fds, &res_write_fds, NULL, &tv)); if (res < 0) { warn(_("Cannot select - %s\n"), errstr); break; } if (running && FD_ISSET(signal_pipe[0], &res_read_fds)) read_signal_input(); if (running && FD_ISSET(STDIN_FILENO, &res_read_fds)) screen_read_input(); if (running && listen_socket >= 0 && FD_ISSET(listen_socket, &res_read_fds)) handle_listen_connection(); if (running && hub_socket >= 0 && FD_ISSET(hub_socket, &res_read_fds)) hub_input_available(); if (running && hub_socket >= 0 && FD_ISSET(hub_socket, &res_write_fds)) hub_now_writable(); if (running) check_hub_activity(); if (running && search_socket >= 0 && FD_ISSET(search_socket, &res_read_fds)) search_input_available(); if (running && search_socket >= 0 && FD_ISSET(search_socket, &res_write_fds)) search_now_writable(); if (running && FD_ISSET(lookup_request_mq->fd, &res_write_fds)) lookup_request_fd_writable(); if (running && FD_ISSET(lookup_result_mq->fd, &res_read_fds)) lookup_result_fd_readable(); if (running && FD_ISSET(parse_request_mq->fd, &res_write_fds)) parse_request_fd_writable(); if (running && FD_ISSET(parse_result_mq->fd, &res_read_fds)) parse_result_fd_readable(); if (running && FD_ISSET(update_request_mq->fd, &res_write_fds)) update_request_fd_writable(); if (running && FD_ISSET(update_result_mq->fd, &res_read_fds)) update_result_fd_readable(); if (running) { HMapIterator it; hmap_iterator(user_conns, &it); while (running && it.has_next(&it)) { DCUserConn *uc = (DCUserConn*) it.next(&it); if (uc->put_mq != NULL && FD_ISSET(uc->put_mq->fd, &res_write_fds)) user_request_fd_writable(uc); if (uc->get_mq != NULL && FD_ISSET(uc->get_mq->fd, &res_read_fds)) user_result_fd_readable(uc); } } } cleanup: hub_disconnect(); screen_finish(); command_finish(); local_file_list_update_finish(); file_list_parse_finish(); lookup_finish(); byteq_free(hub_recvq); byteq_free(hub_sendq); hmap_free(hub_users); /* Emptied by hub_disconnect */ hmap_free(pending_userinfo); /* Emptied by hub_disconnect */ byteq_free(search_recvq); ptrv_foreach(user_conn_unknown_free, free); ptrv_free(user_conn_unknown_free); ptrv_foreach(search_udpmsg_out, free); ptrv_free(search_udpmsg_out); ptrv_foreach(our_searches, (PtrVForeachCallback) free_search_request); ptrv_free(our_searches); hmap_foreach_value(user_conns, (void (*) (void*)) user_conn_cancel); /* XXX: follow up and wait for user connections to die? */ hmap_free(user_conns); if (our_filelist != NULL) filelist_free(our_filelist); set_main_charset(NULL); set_hub_charset(NULL); set_fs_charset(NULL); free(hub_name); free(my_nick); free(my_description); free(my_email); free(my_speed); free(my_tag); free(download_dir); free(listing_dir); if (delete_files != NULL) { for (c = 0; c < delete_files->cur; c++) { char *filename = (char*) delete_files->buf[c]; struct stat st; if (stat(filename, &st) < 0) { if (errno != ENOENT) warn(_("%s: Cannot get file status - %s\n"), quotearg(filename), errstr); free(filename); continue; } if (unlink(filename) < 0) warn(_("%s: Cannot remove file - %s\n"), quotearg(filename), errstr); free(filename); } ptrv_free(delete_files); } if (delete_dirs != NULL) { for (c = 0; c < delete_dirs->cur; c++) { char *filename = (char*) delete_dirs->buf[c]; struct stat st; if (stat(filename, &st) < 0) { if (errno != ENOENT) warn(_("%s: Cannot get file status - %s\n"), quotearg(filename), errstr); free(filename); continue; } if (rmdir(filename) < 0) warn(_("%s: Cannot remove file - %s\n"), quotearg(filename), errstr); free(filename); } ptrv_free(delete_dirs); } if (search_socket >= 0 && close(search_socket) < 0) warn(_("Cannot close search results socket - %s\n"), errstr); if (listen_socket >= 0 && close(listen_socket) < 0) warn(_("Cannot close user connections socket - %s\n"), errstr); if (signal_pipe[0] >= 0 && close(signal_pipe[0]) < 0) warn(_("Cannot close signal pipe - %s\n"), errstr); if (signal_pipe[1] >= 0 && close(signal_pipe[1]) < 0) warn(_("Cannot close signal pipe - %s\n"), errstr); free(config_file); exit(EXIT_SUCCESS); }
void conkyrc_board () { FILE *fp; /* const char *playerdir=finddir("bin/conky%s", player);*/ /* const char *playertemplatedir=finddir("/templates/conkyPlayer.template");*/ /* const char *coverdir=finddir("bin/conkyCover");*/ if(board_width == 0 || board_height == 0) { printf("You have to set the width AND height of your screen (ex: 1280x800): --w=1280 --h=800\n"); exit(0); } fp = fopenf("%s/conkyrc", "w", tempdir()); if(fp == 0) { printf("failed to open %s/conkyrc with write permission", tempdir()); return; } //Global Setup fprintf(fp,"######################\n"); fprintf(fp,"# - Conky settings - #\n"); fprintf(fp,"######################\n"); fprintf(fp,"update_interval 1\n"); fprintf(fp,"total_run_times 0\n"); fprintf(fp,"net_avg_samples 1\n"); fprintf(fp,"cpu_avg_samples 1\n"); fprintf(fp,"\n"); fprintf(fp,"imlib_cache_size 0\n"); fprintf(fp,"double_buffer yes\n"); fprintf(fp,"no_buffers yes\n"); fprintf(fp,"\n"); fprintf(fp,"format_human_readable\n"); fprintf(fp,"\n"); fprintf(fp,"#####################\n"); fprintf(fp,"# - Text settings - #\n"); fprintf(fp,"#####################\n"); fprintf(fp,"use_xft yes\n"); fprintf(fp,"xftfont Ubuntu:size=8\n"); fprintf(fp,"override_utf8_locale yes\n"); fprintf(fp,"text_buffer_size 2048\n"); fprintf(fp,"\n"); fprintf(fp,"#############################\n"); fprintf(fp,"# - Window specifications - #\n"); fprintf(fp,"#############################\n"); fprintf(fp,"own_window_class Conky\n"); fprintf(fp,"own_window yes\n"); fprintf(fp,"own_window_type desktop\n"); fprintf(fp,"own_window_argb_visual yes\n"); fprintf(fp,"own_window_argb_value %d\n", argb_value); fprintf(fp,"own_window_transparent yes\n"); fprintf(fp,"own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager\n"); fprintf(fp,"\n"); fprintf(fp,"alignment top_left\n"); fprintf(fp,"gap_x 0\n"); fprintf(fp,"gap_y %.0f\n", board_height/4); fprintf(fp,"minimum_size %.0f %.0f\n", board_width, board_height); fprintf(fp,"maximum_width %.0f %.0f\n", board_width, board_height); fprintf(fp,"\n"); fprintf(fp,"default_bar_size 60 8\n"); fprintf(fp,"\n"); fprintf(fp,"#########################\n"); fprintf(fp,"# - Graphics settings - #\n"); fprintf(fp,"#########################\n"); fprintf(fp,"draw_shades no\n"); if(elementary == True && dark == True) fprintf(fp,"\ndefault_color 2B2B2B\n"); else if(dark == True || black == True) fprintf(fp,"\ndefault_color 212526\n"); else if(ambiance == True) fprintf(fp,"\ndefault_color E2DACB\n"); else if(radiance == True) fprintf(fp,"\ndefault_color 3C3B37\n"); else if(elementary == True) fprintf(fp,"\ndefault_color D6D6D6\n"); else fprintf(fp,"\ndefault_color cccccc\n"); fprintf(fp,"\n"); //COLOR0 if (dark == True || black == True) fprintf(fp,"color0 1E1C1A\n"); else if (custom == True || radiance == True || ambiance == True || elementary == True) fprintf(fp,"color0 %s\n", color0); else fprintf(fp,"color0 white\n"); //COLOR1 fprintf(fp,"color1 %s\n", color1); //COLOR2 if (dark == True || black == True) fprintf(fp,"color2 1E1C1A\n"); else if (custom == True || radiance == True || ambiance == True || (elementary == True && dark != True)) fprintf(fp,"color2 %s\n", color2); else fprintf(fp,"color2 white\n"); //COLOR3 fprintf(fp,"color3 %s\n", color3); fprintf(fp,"\n"); // LUA SCRIPTS fprintf(fp,"\nlua_load %s/scripts/conkyBoard.lua\n", finddir("scripts/conkyBoard.lua") ); fprintf(fp,"lua_draw_hook_pre main "); if (dark == True || white == True || radiance == True) fprintf(fp,"white "); else fprintf(fp,"black "); fprintf(fp,"%s ", color3); fprintf(fp,"%s ", color1); if ( nobg == True ) fprintf(fp,"off "); else fprintf(fp,"on "); if (set_weather == 1) fprintf(fp,"on %s", weather_code); else fprintf(fp,"off %s", weather_code); fprintf(fp,"\n"); fprintf(fp,"\n"); fprintf(fp,"TEXT\n"); fclose(fp); }
// Test a full buffer TEST(FTDCFileManagerTest, TestFull) { Client* client = &cc(); FTDCConfig c; c.maxFileSizeBytes = 300; c.maxDirectorySizeBytes = 1000; c.maxSamplesPerInterimMetricChunk = 1; unittest::TempDir tempdir("metrics_testpath"); boost::filesystem::path dir(tempdir.path()); createDirectoryClean(dir); FTDCCollectorCollection rotate; auto swMgr = FTDCFileManager::create(&c, dir, &rotate, client); ASSERT_OK(swMgr.getStatus()); auto mgr = std::move(swMgr.getValue()); // Test a large numbers of zeros, and incremental numbers in a full buffer for (int j = 0; j < 10; j++) { ASSERT_OK( mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 3230792343LL << "key2" << 235135), Date_t())); for (size_t i = 0; i <= FTDCConfig::kMaxSamplesPerArchiveMetricChunkDefault - 2; i++) { ASSERT_OK(mgr->writeSampleAndRotateIfNeeded( client, BSON("name" << "joe" << "key1" << static_cast<long long int>(i * j * 37) << "key2" << static_cast<long long int>(i * (645 << j))), Date_t())); } ASSERT_OK(mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 34 << "key2" << 45), Date_t())); // Add Value ASSERT_OK(mgr->writeSampleAndRotateIfNeeded(client, BSON("name" << "joe" << "key1" << 34 << "key2" << 45), Date_t())); } mgr->close(); auto files = scanDirectory(dir); int sum = 0; for (auto& file : files) { int fs = boost::filesystem::file_size(file); ASSERT_TRUE(fs < c.maxFileSizeBytes * 1.10); unittest::log() << "File " << file.generic_string() << " has size " << fs; if (file.generic_string().find("interim") == std::string::npos) { sum += fs; } } ASSERT_LESS_THAN_OR_EQUALS(sum, c.maxDirectorySizeBytes * 1.10); ASSERT_GREATER_THAN_OR_EQUALS(sum, c.maxDirectorySizeBytes * 0.90); }