1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-12-15 12:09:09 +03:00

Fixed up existing unit test for unlinktask & simplified IOC::unlink().

This commit is contained in:
Patrick LeBlanc
2019-04-03 10:50:50 -05:00
parent fc0321b036
commit 91c05d1000
3 changed files with 65 additions and 38 deletions

View File

@@ -505,32 +505,24 @@ void IOCoordinator::deleteMetaFile(const bf::path &file)
void IOCoordinator::remove(const bf::path &p) void IOCoordinator::remove(const bf::path &p)
{ {
if (bf::is_regular_file(p) && p.extension() == ".meta") if (bf::is_directory(p))
{ {
deleteMetaFile(p); bf::directory_iterator dend;
return; bf::directory_iterator entry(p);
} while (entry != dend)
else if (bf::is_regular_file(p)) {
{ remove(p/(*entry));
logger->log(LOG_WARNING, "IOC::unlink(): deleting something that should be here: %s", p.string().c_str()); ++entry;
}
bf::remove(p); bf::remove(p);
return; return;
} }
if (!bf::is_directory(p))
{
logger->log(LOG_WARNING, "IOC::unlink(): Ignoring something that isn't a directory or a regular file: %s",
p.string().c_str());
return;
}
bf::directory_iterator dend; bf::path possibleMetaFile = p.string() + ".meta";
bf::directory_iterator entry(p); if (bf::is_regular_file(possibleMetaFile))
while (entry != dend) deleteMetaFile(possibleMetaFile);
{ else
remove(p/(*entry)); bf::remove(p);
++entry;
}
} }
/* Need to rename this one. The corresponding fcn in IDBFileSystem specifies that it /* Need to rename this one. The corresponding fcn in IDBFileSystem specifies that it
@@ -545,15 +537,13 @@ int IOCoordinator::unlink(const char *path)
tell cache they were deleted tell cache they were deleted
tell synchronizer to delete them in cloud storage tell synchronizer to delete them in cloud storage
*/ */
/* TODO! We need to make sure the input params to IOC fcns don't go up to parent dirs,
ex, if path = '../../../blahblah'. */
bf::path p(metaPath/path); bf::path p(metaPath/path);
try try
{ {
if (!bf::exists(p))
{
errno = ENOENT;
return -1;
}
remove(p); remove(p);
} }
catch (bf::filesystem_error &e) catch (bf::filesystem_error &e)

View File

@@ -35,16 +35,16 @@ PosixTask::~PosixTask()
void PosixTask::handleError(const char *name, int errCode) void PosixTask::handleError(const char *name, int errCode)
{ {
SMLogging* logger = SMLogging::get(); SMLogging* logger = SMLogging::get();
char buf[sizeof(sm_response) + 4]; char buf[80];
// send an error response if possible // send an error response if possible
sm_response *resp = (sm_response *) buf; sm_response *resp = (sm_response *) buf;
resp->returnCode = -1; resp->returnCode = -1;
*((int *) resp->payload) = errCode; *((int *) resp->payload) = errCode;
write(*resp, 4); bool success = write(*resp, 4);
// TODO: construct and log a message if (!success)
logger->log(LOG_ERR,"%s caught an error: %s.",name,strerror_r(errCode, buf, 80)); logger->log(LOG_ERR, "%s caught an error: %s.", name, strerror_r(errCode, buf, 80));
} }
uint PosixTask::getRemainingLength() uint PosixTask::getRemainingLength()

View File

@@ -407,12 +407,14 @@ bool appendtask()
bool unlinktask() bool unlinktask()
{ {
// make a file and delete it // make a meta file and delete it
const char *filename = "unlinktest1"; const char *filename = "unlinktest1";
::unlink(filename); IOCoordinator *ioc = IOCoordinator::get();
int fd = ::open(filename, O_CREAT | O_RDWR, 0666); bf::path fullPath = ioc->getMetadataPath()/(string(filename) + ".meta");
assert(fd > 0); bf::remove(fullPath);
scoped_closer f(fd);
MetadataFile meta(filename);
assert(bf::exists(fullPath));
uint8_t buf[1024]; uint8_t buf[1024];
unlink_cmd *cmd = (unlink_cmd *) buf; unlink_cmd *cmd = (unlink_cmd *) buf;
@@ -436,7 +438,35 @@ bool unlinktask()
assert(resp->returnCode == 0); assert(resp->returnCode == 0);
// confirm it no longer exists // confirm it no longer exists
assert(!boost::filesystem::exists(filename)); assert(!bf::exists(fullPath));
// delete it again, make sure we get an error message & reasonable error code
// Interesting. boost::filesystem::remove() doesn't consider it an error if the file doesn't
// exist. Need to look into the reasoning for that, and decide whether IOC
// should return an error anyway. For now, this test below doesn't get
// an error msg.
#if 0
memset(buf, 0, 1024);
cmd->opcode = UNLINK;
cmd->flen = strlen(filename);
memcpy(&cmd->filename, filename, cmd->flen);
UnlinkTask u2(clientSock, sizeof(unlink_cmd) + cmd->flen);
::write(sessionSock, cmd, sizeof(unlink_cmd) + cmd->flen);
u2.run();
// verify response
err = ::recv(sessionSock, buf, 1024, MSG_DONTWAIT);
resp = (sm_response *) buf;
assert(err == sizeof(*resp) + 4);
assert(resp->header.type == SM_MSG_START);
assert(resp->header.payloadLen == 8);
assert(resp->header.flags == 0);
assert(resp->returnCode == -1);
err = (*(int *) resp->payload);
assert(err == ENOENT);
#endif
cout << "unlink task OK" << endl; cout << "unlink task OK" << endl;
} }
@@ -696,7 +726,7 @@ bool listdirtask()
{ {
listdir_resp_entry *e = (listdir_resp_entry *) &buf[off]; listdir_resp_entry *e = (listdir_resp_entry *) &buf[off];
//cout << "len = " << e->flen << endl; //cout << "len = " << e->flen << endl;
assert(off + e->flen + sizeof(listdir_resp_entry) < 8092); assert(off + e->flen + sizeof(listdir_resp_entry) < 8192);
string file(e->filename, e->flen); string file(e->filename, e->flen);
assert(files.find((tmpPath/file).string()) != files.end()); assert(files.find((tmpPath/file).string()) != files.end());
fileCounter++; fileCounter++;
@@ -1196,6 +1226,12 @@ void IOCReadTest1()
cout << "IOC read test 1 OK" << endl; cout << "IOC read test 1 OK" << endl;
} }
void IOCUnlink()
{
cout << "IOCUnlink not implmemented yet" << endl;
}
int main() int main()
{ {
std::size_t sizeKB = 1024; std::size_t sizeKB = 1024;
@@ -1238,6 +1274,7 @@ int main()
s3storageTest1(); s3storageTest1();
IOCReadTest1(); IOCReadTest1();
IOCTruncate(); IOCTruncate();
IOCUnlink();
return 0; return 0;
} }