From e1f2fcdfaa11f9a22a5e4fb6c7f567ee53c855ae Mon Sep 17 00:00:00 2001 From: Patrick LeBlanc Date: Fri, 29 Mar 2019 09:05:37 -0500 Subject: [PATCH] Updated IOC::stat, updated its test. --- src/IOCoordinator.cpp | 4 +- src/unit_tests.cpp | 125 +++++++++++++++++++++--------------------- 2 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/IOCoordinator.cpp b/src/IOCoordinator.cpp index 574cd1c05..a1e6028db 100755 --- a/src/IOCoordinator.cpp +++ b/src/IOCoordinator.cpp @@ -382,7 +382,9 @@ int IOCoordinator::listDirectory(const char *filename, vector *listing) int IOCoordinator::stat(const char *path, struct stat *out) { - return ::stat(path, out); + ScopedReadLock s(this, path); + MetadataFile meta(path, MetadataFile::no_create_t()); + return meta.stat(out); } int IOCoordinator::truncate(const char *path, size_t newsize) diff --git a/src/unit_tests.cpp b/src/unit_tests.cpp index b5df567c9..38b41c1de 100755 --- a/src/unit_tests.cpp +++ b/src/unit_tests.cpp @@ -47,6 +47,61 @@ struct scoped_closer { int fd; }; +// (ints) 0 1 2 3 ... 2048 +void makeTestObject(const char *dest) +{ + int objFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); + assert(objFD >= 0); + scoped_closer s1(objFD); + + for (int i = 0; i < 2048; i++) + assert(write(objFD, &i, 4) == 4); +} + +// the merged version should look like +// (ints) 0 1 2 3 4 0 1 2 3 4 10 11 12 13... +void makeTestJournal(const char *dest) +{ + int journalFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); + assert(journalFD >= 0); + scoped_closer s2(journalFD); + + char header[] = "{ \"version\" : 1, \"max_offset\": 39 }"; + write(journalFD, header, strlen(header) + 1); + + uint64_t offlen[2] = { 20, 20 }; + write(journalFD, offlen, 16); + for (int i = 0; i < 5; i++) + assert(write(journalFD, &i, 4) == 4); +} + +const char *testObjKey = "12345_0_8192_test-file"; +const char *testFile = "test-file"; +const char *_metadata = +"{ \n\ + \"version\" : 1, \n\ + \"revision\" : 1, \n\ + \"objects\" : \n\ + [ \n\ + { \n\ + \"offset\" : 0, \n\ + \"length\" : 8192, \n\ + \"key\" : \"12345_0_8192_test-file\" \n\ + } \n\ + ] \n\ +}\n"; + + +void makeTestMetadata(const char *dest) +{ + int metaFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); + assert(metaFD >= 0); + scoped_closer sc(metaFD); + + // need to parameterize the object name in the objects list + write(metaFD, _metadata, strlen(_metadata)); +} + int getSocket() { int sock = ::socket(AF_UNIX, SOCK_STREAM, 0); @@ -386,18 +441,18 @@ bool unlinktask() bool stattask() { - const char *filename = "stattest1"; - ::unlink(filename); - int fd = ::open(filename, O_CREAT | O_RDWR, 0666); - assert(fd > 0); - scoped_closer f(fd); + string filename = "stattest1"; + string fullFilename = Config::get()->getValue("ObjectStorage", "metadata_path") + "/" + filename + ".meta"; + + ::unlink(fullFilename.c_str()); + makeTestMetadata(fullFilename.c_str()); uint8_t buf[1024]; stat_cmd *cmd = (stat_cmd *) buf; cmd->opcode = STAT; - cmd->flen = strlen(filename); - strcpy((char *) cmd->filename, filename); + cmd->flen = filename.length(); + strcpy((char *) cmd->filename, filename.c_str()); ::write(sessionSock, cmd, sizeof(*cmd) + cmd->flen); StatTask s(clientSock, sizeof(*cmd) + cmd->flen); @@ -416,9 +471,9 @@ bool stattask() // what can we verify about the stat... assert(_stat->st_uid == getuid()); assert(_stat->st_gid == getgid()); - assert(_stat->st_size == 0); + assert(_stat->st_size == 8192); - ::unlink(filename); + ::unlink(fullFilename.c_str()); cout << "stattask OK" << endl; return true; } @@ -642,59 +697,7 @@ bool cacheTest1() cout << "cache test 1 OK" << endl; } -// (ints) 0 1 2 3 ... 2048 -void makeTestObject(const char *dest) -{ - int objFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); - assert(objFD >= 0); - scoped_closer s1(objFD); - - for (int i = 0; i < 2048; i++) - assert(write(objFD, &i, 4) == 4); -} -// the merged version should look like -// (ints) 0 1 2 3 4 0 1 2 3 4 10 11 12 13... -void makeTestJournal(const char *dest) -{ - int journalFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); - assert(journalFD >= 0); - scoped_closer s2(journalFD); - - char header[] = "{ \"version\" : 1, \"max_offset\": 39 }"; - write(journalFD, header, strlen(header) + 1); - - uint64_t offlen[2] = { 20, 20 }; - write(journalFD, offlen, 16); - for (int i = 0; i < 5; i++) - assert(write(journalFD, &i, 4) == 4); -} - -const char *testObjKey = "12345_0_8192_test-file"; -const char *testFile = "test-file"; - -void makeTestMetadata(const char *dest) -{ - int metaFD = open(dest, O_WRONLY | O_CREAT | O_TRUNC, 0600); - assert(metaFD >= 0); - scoped_closer sc(metaFD); - - // need to parameterize the object name in the objects list - const char *metadata = - "{ \n\ - \"version\" : 1, \n\ - \"revision\" : 1, \n\ - \"objects\" : \n\ - [ \n\ - { \n\ - \"offset\" : 0, \n\ - \"length\" : 8192, \n\ - \"key\" : \"12345_0_8192_test-file\" \n\ - } \n\ - ] \n\ - }\n"; - write(metaFD, metadata, strlen(metadata)); -} bool mergeJournalTest() {