/* * Class: hdf_hdf5lib_H5 * Method: H5Gflush * Signature: (J)V */ JNIEXPORT void JNICALL Java_hdf_hdf5lib_H5_H5Gflush (JNIEnv *env, jclass clss, jlong loc_id) { if (H5Gflush((hid_t)loc_id) < 0) h5libraryError(env); } /* end Java_hdf_hdf5lib_H5_H5Gflush */
/*------------------------------------------------------------------------- * Function: test_flush * * Purpose: This function tests flushing individual objects' metadata * from the metadata cache. * * Return: 0 on Success, 1 on Failure * * Programmer: Mike McGreevy * July 1, 2010 * * Modifications: * *------------------------------------------------------------------------- */ herr_t test_flush(void) { /************************************************************************** * * Test Description: * * This test will build an HDF5 file with several objects in a varying * hierarchical layout. It will then attempt to flush the objects * in the file one by one, individually, using the four H5*flush * routines (D,G,T, and O). After each call to either create or flush an * object, a series of verifications will occur on each object in the file. * * Each verification consists of spawning off a new process and determining * if the object can be opened and its information retreived in said * alternate process. It reports the results, which are compared to an * expected value (either that the object can be found on disk, or that it * cannot). * * Note that to spawn a verification, this program sends a signal (by creating * a file on disk) to the test script controlling it, indicating how to * run the verification. * * Implementation is funky, but basically, an example: * * Step 1. Dataset is created. * Step 2. Verify that dataset can't be opened by separate process, as * it should not have been flushed to disk yet. * Step 3. Group is created. * Step 4. Verify that group can't be opened by separate process. * Step 5. H5Gflush is called on the group. * Step 6. Verify that group CAN be opened, but dataset still has * yet to hit disk, and CANNOT be opened. Success! Only the group * was flushed. * **************************************************************************/ /************************************************************************** * Generated Test File will look like this: * * GROUP "/" * DATASET "Dataset1" * GROUP "Group1" { * DATASET "Dataset2" * GROUP "Group2" { * DATATYPE "CommittedDatatype3" * } * } * GROUP "Group3" { * DATASET "Dataset3" * DATATYPE "CommittedDatatype2" * } * DATATYPE "CommittedDatatype1" **************************************************************************/ /* Variables */ hid_t fid,gid,gid2,gid3,sid,tid1,tid2,tid3,did,did2,did3,rid,fapl,status = 0; hsize_t dims[2] = {3,5}; /* Testing Message */ HDfprintf(stdout, "Testing individual object flush behavior:\n"); /* Cleanup any old error or signal files */ CLEANUP_FILES; /* ================ */ /* CREATE TEST FILE */ /* ================ */ /* Create file, open root group - have to use latest file format for SWMR */ if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) TEST_ERROR; if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0) TEST_ERROR; if ((rid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) TEST_ERROR; /* Create data space and types */ if ((sid = H5Screate_simple(2, dims, dims)) < 0) TEST_ERROR; if ((tid1 = H5Tcopy(H5T_NATIVE_INT)) < 0) TEST_ERROR; if ((tid2 = H5Tcopy(H5T_NATIVE_CHAR)) < 0) TEST_ERROR; if ((tid3 = H5Tcopy(H5T_NATIVE_LONG)) < 0) TEST_ERROR; /* Create Group1 */ if ((gid = H5Gcreate2(fid, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create Group2 */ if ((gid2 = H5Gcreate2(gid, "Group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create Group3 */ if ((gid3 = H5Gcreate2(fid, "Group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create Dataset1 */ if ((did = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create Dataset2 */ if ((did2 = H5Dcreate2(gid, "Dataset2", tid3, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create Dataset3 */ if ((did3 = H5Dcreate2(gid3, "Dataset3", tid2, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create CommittedDatatype1 */ if ((status = H5Tcommit2(fid, "CommittedDatatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create CommittedDatatype2 */ if ((status = H5Tcommit2(gid2, "CommittedDatatype2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* Create CommittedDatatype3 */ if ((status = H5Tcommit2(gid3, "CommittedDatatype3", tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; /* ============ */ /* FLUSH GROUPS */ /* ============ */ /* Test */ TESTING("to ensure H5Gflush correctly flushes single groups"); /* First, let's verify that nothing is currently flushed. */ if (run_flush_verification_process(RG, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Then, flush the root group and verify it's the only thing on disk */ if ((status = H5Gflush(rid)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush Group1 and Verify it is recently flushed, and nothing * else has changed. */ if ((status = H5Gflush(gid)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush Group2 and Verify it is recently flushed, and nothing * else has changed. */ if ((status = H5Gflush(gid2)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; PASSED(); /* ============== */ /* FLUSH DATASETS */ /* ============== */ /* Test */ TESTING("to ensure H5Dflush correctly flushes single datasets"); /* Flush Dataset1 and verify it's the only thing that hits disk. */ if ((status = H5Dflush(did)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush Dataset2 and verify it's the only thing that hits disk. */ if ((status = H5Dflush(did2)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; PASSED(); /* =============== */ /* FLUSH DATATYPES */ /* =============== */ /* Test */ TESTING("to ensure H5Tflush correctly flushes single datatypes"); /* Flush Datatype 1 and verify it's the only thing that hits disk. */ if ((status = H5Tflush(tid1)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush Datatype 2 and verify it's the only thing that hits disk. */ if ((status = H5Tflush(tid2)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; PASSED(); /* ============= */ /* FLUSH OBJECTS */ /* ============= */ /* Test */ TESTING("to ensure H5Oflush correctly flushes single objects"); /* Flush Group3 and verify it's the only thing that hits disk. */ if ((status = H5Oflush(gid3)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush Dataset3 and verify it's the only thing that hits disk. */ if ((status = H5Oflush(did3)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR; /* Flush CommittedDatatype3 and verify it's the only thing that hits disk. */ if ((status = H5Oflush(tid3)) < 0) TEST_ERROR; if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(D3, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR; if (run_flush_verification_process(T3, FLUSHED) != 0) TEST_ERROR; PASSED(); /* ================== */ /* Cleanup and Return */ /* ================== */ if (H5Pclose(fapl) < 0) TEST_ERROR; if (H5Gclose(gid) < 0) TEST_ERROR; if (H5Gclose(gid2) < 0) TEST_ERROR; if (H5Dclose(did) < 0) TEST_ERROR; if (H5Dclose(did2) < 0) TEST_ERROR; if (H5Gclose(rid) < 0) TEST_ERROR; if (H5Fclose(fid) < 0) TEST_ERROR; /* Delete test file */ HDremove(FILENAME); if (end_verification() < 0) TEST_ERROR; return SUCCEED; error: return FAIL; } /* end test_flush */