hdfs_test.c
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:17k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. #include "hdfs.h" 
  19. void permission_disp(short permissions, char *rtr) {
  20.   rtr[9] = '';
  21.   int i;
  22.   for(i=2;i>=0;i--)
  23.     {
  24.       short permissionsId = permissions >> (i * 3) & (short)7;
  25.       char* perm;
  26.       switch(permissionsId) {
  27.       case 7:
  28.         perm = "rwx"; break;
  29.       case 6:
  30.         perm = "rw-"; break;
  31.       case 5:
  32.         perm = "r-x"; break;
  33.       case 4:
  34.         perm = "r--"; break;
  35.       case 3:
  36.         perm = "-wx"; break;
  37.       case 2:
  38.         perm = "-w-"; break;
  39.       case 1:
  40.         perm = "--x"; break;
  41.       case 0:
  42.         perm = "---"; break;
  43.       default:
  44.         perm = "???";
  45.       }
  46.       strncpy(rtr, perm, 3);
  47.       rtr+=3;
  48.     }
  49. int main(int argc, char **argv) {
  50.     hdfsFS fs = hdfsConnect("default", 0);
  51.     if(!fs) {
  52.         fprintf(stderr, "Oops! Failed to connect to hdfs!n");
  53.         exit(-1);
  54.     } 
  55.  
  56.     hdfsFS lfs = hdfsConnect(NULL, 0);
  57.     if(!lfs) {
  58.         fprintf(stderr, "Oops! Failed to connect to 'local' hdfs!n");
  59.         exit(-1);
  60.     } 
  61.         const char* writePath = "/tmp/testfile.txt";
  62.     {
  63.         //Write tests
  64.         
  65.         
  66.         hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
  67.         if(!writeFile) {
  68.             fprintf(stderr, "Failed to open %s for writing!n", writePath);
  69.             exit(-1);
  70.         }
  71.         fprintf(stderr, "Opened %s for writing successfully...n", writePath);
  72.         char* buffer = "Hello, World!";
  73.         tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);
  74.         fprintf(stderr, "Wrote %d bytesn", num_written_bytes);
  75.         tOffset currentPos = -1;
  76.         if ((currentPos = hdfsTell(fs, writeFile)) == -1) {
  77.             fprintf(stderr, 
  78.                     "Failed to get current file position correctly! Got %ld!n",
  79.                     currentPos);
  80.             exit(-1);
  81.         }
  82.         fprintf(stderr, "Current position: %ldn", currentPos);
  83.         if (hdfsFlush(fs, writeFile)) {
  84.             fprintf(stderr, "Failed to 'flush' %sn", writePath); 
  85.             exit(-1);
  86.         }
  87.         fprintf(stderr, "Flushed %s successfully!n", writePath); 
  88.         hdfsCloseFile(fs, writeFile);
  89.     }
  90.     {
  91.         //Read tests
  92.         
  93.         const char* readPath = "/tmp/testfile.txt";
  94.         int exists = hdfsExists(fs, readPath);
  95.         if (exists) {
  96.           fprintf(stderr, "Failed to validate existence of %sn", readPath);
  97.           exit(-1);
  98.         }
  99.         hdfsFile readFile = hdfsOpenFile(fs, readPath, O_RDONLY, 0, 0, 0);
  100.         if (!readFile) {
  101.             fprintf(stderr, "Failed to open %s for reading!n", readPath);
  102.             exit(-1);
  103.         }
  104.         fprintf(stderr, "hdfsAvailable: %dn", hdfsAvailable(fs, readFile));
  105.         tOffset seekPos = 1;
  106.         if(hdfsSeek(fs, readFile, seekPos)) {
  107.             fprintf(stderr, "Failed to seek %s for reading!n", readPath);
  108.             exit(-1);
  109.         }
  110.         tOffset currentPos = -1;
  111.         if((currentPos = hdfsTell(fs, readFile)) != seekPos) {
  112.             fprintf(stderr, 
  113.                     "Failed to get current file position correctly! Got %ld!n", 
  114.                     currentPos);
  115.             exit(-1);
  116.         }
  117.         fprintf(stderr, "Current position: %ldn", currentPos);
  118.         static char buffer[32];
  119.         tSize num_read_bytes = hdfsRead(fs, readFile, (void*)buffer, 
  120.                 sizeof(buffer));
  121.         fprintf(stderr, "Read following %d bytes:n%sn", 
  122.                 num_read_bytes, buffer);
  123.         num_read_bytes = hdfsPread(fs, readFile, 0, (void*)buffer, 
  124.                 sizeof(buffer));
  125.         fprintf(stderr, "Read following %d bytes:n%sn", 
  126.                 num_read_bytes, buffer);
  127.         hdfsCloseFile(fs, readFile);
  128.     }
  129.     int totalResult = 0;
  130.     int result = 0;
  131.     {
  132.         //Generic file-system operations
  133.         const char* srcPath = "/tmp/testfile.txt";
  134.         const char* dstPath = "/tmp/testfile2.txt";
  135.         fprintf(stderr, "hdfsCopy(remote-local): %sn", ((result = hdfsCopy(fs, srcPath, lfs, srcPath)) ? "Failed!" : "Success!"));
  136.         totalResult += result;
  137.         fprintf(stderr, "hdfsCopy(remote-remote): %sn", ((result = hdfsCopy(fs, srcPath, fs, dstPath)) ? "Failed!" : "Success!"));
  138.         totalResult += result;
  139.         fprintf(stderr, "hdfsMove(local-local): %sn", ((result = hdfsMove(lfs, srcPath, lfs, dstPath)) ? "Failed!" : "Success!"));
  140.         totalResult += result;
  141.         fprintf(stderr, "hdfsMove(remote-local): %sn", ((result = hdfsMove(fs, srcPath, lfs, srcPath)) ? "Failed!" : "Success!"));
  142.         totalResult += result;
  143.         fprintf(stderr, "hdfsRename: %sn", ((result = hdfsRename(fs, dstPath, srcPath)) ? "Failed!" : "Success!"));
  144.         totalResult += result;
  145.         fprintf(stderr, "hdfsCopy(remote-remote): %sn", ((result = hdfsCopy(fs, srcPath, fs, dstPath)) ? "Failed!" : "Success!"));
  146.         totalResult += result;
  147.         const char* slashTmp = "/tmp";
  148.         const char* newDirectory = "/tmp/newdir";
  149.         fprintf(stderr, "hdfsCreateDirectory: %sn", ((result = hdfsCreateDirectory(fs, newDirectory)) ? "Failed!" : "Success!"));
  150.         totalResult += result;
  151.         fprintf(stderr, "hdfsSetReplication: %sn", ((result = hdfsSetReplication(fs, srcPath, 2)) ? "Failed!" : "Success!"));
  152.         totalResult += result;
  153.         char buffer[256];
  154.         const char *resp;
  155.         fprintf(stderr, "hdfsGetWorkingDirectory: %sn", ((resp = hdfsGetWorkingDirectory(fs, buffer, sizeof(buffer))) ? buffer : "Failed!"));
  156.         totalResult += (resp ? 0 : 1);
  157.         fprintf(stderr, "hdfsSetWorkingDirectory: %sn", ((result = hdfsSetWorkingDirectory(fs, slashTmp)) ? "Failed!" : "Success!"));
  158.         totalResult += result;
  159.         fprintf(stderr, "hdfsGetWorkingDirectory: %sn", ((resp = hdfsGetWorkingDirectory(fs, buffer, sizeof(buffer))) ? buffer : "Failed!"));
  160.         totalResult += (resp ? 0 : 1);
  161.         fprintf(stderr, "hdfsGetDefaultBlockSize: %ldn", hdfsGetDefaultBlockSize(fs));
  162.         fprintf(stderr, "hdfsGetCapacity: %ldn", hdfsGetCapacity(fs));
  163.         fprintf(stderr, "hdfsGetUsed: %ldn", hdfsGetUsed(fs));
  164.         hdfsFileInfo *fileInfo = NULL;
  165.         if((fileInfo = hdfsGetPathInfo(fs, slashTmp)) != NULL) {
  166.             fprintf(stderr, "hdfsGetPathInfo - SUCCESS!n");
  167.             fprintf(stderr, "Name: %s, ", fileInfo->mName);
  168.             fprintf(stderr, "Type: %c, ", (char)(fileInfo->mKind));
  169.             fprintf(stderr, "Replication: %d, ", fileInfo->mReplication);
  170.             fprintf(stderr, "BlockSize: %ld, ", fileInfo->mBlockSize);
  171.             fprintf(stderr, "Size: %ld, ", fileInfo->mSize);
  172.             fprintf(stderr, "LastMod: %s", ctime(&fileInfo->mLastMod)); 
  173.             fprintf(stderr, "Owner: %s, ", fileInfo->mOwner);
  174.             fprintf(stderr, "Group: %s, ", fileInfo->mGroup);
  175.             char permissions[10];
  176.             permission_disp(fileInfo->mPermissions, permissions);
  177.             fprintf(stderr, "Permissions: %d (%s)n", fileInfo->mPermissions, permissions);
  178.             hdfsFreeFileInfo(fileInfo, 1);
  179.         } else {
  180.             totalResult++;
  181.             fprintf(stderr, "waah! hdfsGetPathInfo for %s - FAILED!n", slashTmp);
  182.         }
  183.         hdfsFileInfo *fileList = 0;
  184.         int numEntries = 0;
  185.         if((fileList = hdfsListDirectory(fs, slashTmp, &numEntries)) != NULL) {
  186.             int i = 0;
  187.             for(i=0; i < numEntries; ++i) {
  188.                 fprintf(stderr, "Name: %s, ", fileList[i].mName);
  189.                 fprintf(stderr, "Type: %c, ", (char)fileList[i].mKind);
  190.                 fprintf(stderr, "Replication: %d, ", fileList[i].mReplication);
  191.                 fprintf(stderr, "BlockSize: %ld, ", fileList[i].mBlockSize);
  192.                 fprintf(stderr, "Size: %ld, ", fileList[i].mSize);
  193.                 fprintf(stderr, "LastMod: %s", ctime(&fileList[i].mLastMod));
  194.                 fprintf(stderr, "Owner: %s, ", fileList[i].mOwner);
  195.                 fprintf(stderr, "Group: %s, ", fileList[i].mGroup);
  196.                 char permissions[10];
  197.                 permission_disp(fileList[i].mPermissions, permissions);
  198.                 fprintf(stderr, "Permissions: %d (%s)n", fileList[i].mPermissions, permissions);
  199.             }
  200.             hdfsFreeFileInfo(fileList, numEntries);
  201.         } else {
  202.             if (errno) {
  203.                 totalResult++;
  204.                 fprintf(stderr, "waah! hdfsListDirectory - FAILED!n");
  205.             } else {
  206.                 fprintf(stderr, "Empty directory!n");
  207.             }
  208.         }
  209.         char*** hosts = hdfsGetHosts(fs, srcPath, 0, 1);
  210.         if(hosts) {
  211.             fprintf(stderr, "hdfsGetHosts - SUCCESS! ... n");
  212.             int i=0; 
  213.             while(hosts[i]) {
  214.                 int j = 0;
  215.                 while(hosts[i][j]) {
  216.                     fprintf(stderr, 
  217.                             "thosts[%d][%d] - %sn", i, j, hosts[i][j]);
  218.                     ++j;
  219.                 }
  220.                 ++i;
  221.             }
  222.         } else {
  223.             totalResult++;
  224.             fprintf(stderr, "waah! hdfsGetHosts - FAILED!n");
  225.         }
  226.        
  227.         char *newOwner = "root";
  228.         // setting tmp dir to 777 so later when connectAsUser nobody, we can write to it
  229.         short newPerm = 0666;
  230.         // chown write
  231.         fprintf(stderr, "hdfsChown: %sn", ((result = hdfsChown(fs, writePath, NULL, "users")) ? "Failed!" : "Success!"));
  232.         totalResult += result;
  233.         fprintf(stderr, "hdfsChown: %sn", ((result = hdfsChown(fs, writePath, newOwner, NULL)) ? "Failed!" : "Success!"));
  234.         totalResult += result;
  235.         // chmod write
  236.         fprintf(stderr, "hdfsChmod: %sn", ((result = hdfsChmod(fs, writePath, newPerm)) ? "Failed!" : "Success!"));
  237.         totalResult += result;
  238.         sleep(2);
  239.         tTime newMtime = time(NULL);
  240.         tTime newAtime = time(NULL);
  241.         // utime write
  242.         fprintf(stderr, "hdfsUtime: %sn", ((result = hdfsUtime(fs, writePath, newMtime, newAtime)) ? "Failed!" : "Success!"));
  243.         totalResult += result;
  244.         // chown/chmod/utime read
  245.         hdfsFileInfo *finfo = hdfsGetPathInfo(fs, writePath);
  246.         fprintf(stderr, "hdfsChown read: %sn", ((result = (strcmp(finfo->mOwner, newOwner) != 0)) ? "Failed!" : "Success!"));
  247.         totalResult += result;
  248.         fprintf(stderr, "hdfsChmod read: %sn", ((result = (finfo->mPermissions != newPerm)) ? "Failed!" : "Success!"));
  249.         totalResult += result;
  250.         // will later use /tmp/ as a different user so enable it
  251.         fprintf(stderr, "hdfsChmod: %sn", ((result = hdfsChmod(fs, "/tmp/", 0777)) ? "Failed!" : "Success!"));
  252.         totalResult += result;
  253.         fprintf(stderr,"newMTime=%ldn",newMtime);
  254.         fprintf(stderr,"curMTime=%ldn",finfo->mLastMod);
  255.         fprintf(stderr, "hdfsUtime read (mtime): %sn", ((result = (finfo->mLastMod != newMtime)) ? "Failed!" : "Success!"));
  256.         totalResult += result;
  257.         // No easy way to turn on access times from hdfs_test right now
  258.         //        fprintf(stderr, "hdfsUtime read (atime): %sn", ((result = (finfo->mLastAccess != newAtime)) ? "Failed!" : "Success!"));
  259.         //        totalResult += result;
  260.         hdfsFreeFileInfo(finfo, 1);
  261.         // Clean up
  262.         fprintf(stderr, "hdfsDelete: %sn", ((result = hdfsDelete(fs, newDirectory)) ? "Failed!" : "Success!"));
  263.         totalResult += result;
  264.         fprintf(stderr, "hdfsDelete: %sn", ((result = hdfsDelete(fs, srcPath)) ? "Failed!" : "Success!"));
  265.         totalResult += result;
  266.         fprintf(stderr, "hdfsDelete: %sn", ((result = hdfsDelete(lfs, srcPath)) ? "Failed!" : "Success!"));
  267.         totalResult += result;
  268.         fprintf(stderr, "hdfsDelete: %sn", ((result = hdfsDelete(lfs, dstPath)) ? "Failed!" : "Success!"));
  269.         totalResult += result;
  270.         fprintf(stderr, "hdfsExists: %sn", ((result = hdfsExists(fs, newDirectory)) ? "Success!" : "Failed!"));
  271.         totalResult += (result ? 0 : 1);
  272.     }
  273.     {
  274.       // TEST APPENDS
  275.       const char *writePath = "/tmp/appends";
  276.       // CREATE
  277.       hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY, 0, 0, 0);
  278.       if(!writeFile) {
  279.         fprintf(stderr, "Failed to open %s for writing!n", writePath);
  280.         exit(-1);
  281.       }
  282.       fprintf(stderr, "Opened %s for writing successfully...n", writePath);
  283.       char* buffer = "Hello,";
  284.       tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer));
  285.       fprintf(stderr, "Wrote %d bytesn", num_written_bytes);
  286.       if (hdfsFlush(fs, writeFile)) {
  287.         fprintf(stderr, "Failed to 'flush' %sn", writePath); 
  288.         exit(-1);
  289.         }
  290.       fprintf(stderr, "Flushed %s successfully!n", writePath); 
  291.       hdfsCloseFile(fs, writeFile);
  292.       // RE-OPEN
  293.       writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_APPEND, 0, 0, 0);
  294.       if(!writeFile) {
  295.         fprintf(stderr, "Failed to open %s for writing!n", writePath);
  296.         exit(-1);
  297.       }
  298.       fprintf(stderr, "Opened %s for writing successfully...n", writePath);
  299.       buffer = " World";
  300.       num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer) + 1);
  301.       fprintf(stderr, "Wrote %d bytesn", num_written_bytes);
  302.       if (hdfsFlush(fs, writeFile)) {
  303.         fprintf(stderr, "Failed to 'flush' %sn", writePath); 
  304.         exit(-1);
  305.       }
  306.       fprintf(stderr, "Flushed %s successfully!n", writePath); 
  307.       hdfsCloseFile(fs, writeFile);
  308.       // CHECK size
  309.       hdfsFileInfo *finfo = hdfsGetPathInfo(fs, writePath);
  310.       fprintf(stderr, "fileinfo->mSize: == total %sn", ((result = (finfo->mSize == strlen("Hello, World") + 1)) ? "Success!" : "Failed!"));
  311.       totalResult += (result ? 0 : 1);
  312.       // READ and check data
  313.       hdfsFile readFile = hdfsOpenFile(fs, writePath, O_RDONLY, 0, 0, 0);
  314.       if (!readFile) {
  315.         fprintf(stderr, "Failed to open %s for reading!n", writePath);
  316.         exit(-1);
  317.       }
  318.       char rdbuffer[32];
  319.       tSize num_read_bytes = hdfsRead(fs, readFile, (void*)rdbuffer, sizeof(rdbuffer));
  320.       fprintf(stderr, "Read following %d bytes:n%sn", 
  321.               num_read_bytes, rdbuffer);
  322.       fprintf(stderr, "read == Hello, World %sn", (result = (strcmp(rdbuffer, "Hello, World") == 0)) ? "Success!" : "Failed!");
  323.       hdfsCloseFile(fs, readFile);
  324.       // DONE test appends
  325.     }
  326.       
  327.       
  328.     totalResult += (hdfsDisconnect(fs) != 0);
  329.     {
  330.       //
  331.       // Now test as connecting as a specific user
  332.       // This is only meant to test that we connected as that user, not to test
  333.       // the actual fs user capabilities. Thus just create a file and read
  334.       // the owner is correct.
  335.       const char *tuser = "nobody";
  336.       const char* writePath = "/tmp/usertestfile.txt";
  337.       const char **groups =  (const char**)malloc(sizeof(char*)* 2);
  338.       groups[0] = "users";
  339.       groups[1] = "nobody";
  340.       fs = hdfsConnectAsUser("default", 0, tuser, groups, 2);
  341.       if(!fs) {
  342.         fprintf(stderr, "Oops! Failed to connect to hdfs as user %s!n",tuser);
  343.         exit(-1);
  344.       } 
  345.         hdfsFile writeFile = hdfsOpenFile(fs, writePath, O_WRONLY|O_CREAT, 0, 0, 0);
  346.         if(!writeFile) {
  347.             fprintf(stderr, "Failed to open %s for writing!n", writePath);
  348.             exit(-1);
  349.         }
  350.         fprintf(stderr, "Opened %s for writing successfully...n", writePath);
  351.         char* buffer = "Hello, World!";
  352.         tSize num_written_bytes = hdfsWrite(fs, writeFile, (void*)buffer, strlen(buffer)+1);
  353.         fprintf(stderr, "Wrote %d bytesn", num_written_bytes);
  354.         if (hdfsFlush(fs, writeFile)) {
  355.             fprintf(stderr, "Failed to 'flush' %sn", writePath); 
  356.             exit(-1);
  357.         }
  358.         fprintf(stderr, "Flushed %s successfully!n", writePath); 
  359.         hdfsCloseFile(fs, writeFile);
  360.         hdfsFileInfo *finfo = hdfsGetPathInfo(fs, writePath);
  361.         fprintf(stderr, "hdfs new file user is correct: %sn", ((result = (strcmp(finfo->mOwner, tuser) != 0)) ? "Failed!" : "Success!"));
  362.         totalResult += result;
  363.     }
  364.     
  365.     totalResult += (hdfsDisconnect(fs) != 0);
  366.     if (totalResult != 0) {
  367.         return -1;
  368.     } else {
  369.         return 0;
  370.     }
  371. }
  372. /**
  373.  * vim: ts=4: sw=4: et:
  374.  */