Github user Librago commented on a diff in the pull request:

    https://github.com/apache/incubator-hawq/pull/1384#discussion_r208437762
  
    --- Diff: src/backend/cdb/cdbdatalocality.c ---
    @@ -1579,7 +1700,242 @@ static void ParquetGetSegFileDataLocation(Relation 
relation,
        return;
     }
     
    +static void InvokeHDFSProtocolBlockLocation(Oid    procOid,
    +                                            List  *locs,
    +                                            List **blockLocations)
    +{
    +   ExtProtocolValidatorData   *validator_data;
    +   FmgrInfo                                   *validator_udf;
    +   FunctionCallInfoData            fcinfo;
    +
    +   validator_data = (ExtProtocolValidatorData *)
    +                                    palloc0 
(sizeof(ExtProtocolValidatorData));
    +   validator_udf = palloc(sizeof(FmgrInfo));
    +   fmgr_info(procOid, validator_udf);
    +
    +   validator_data->type            = T_ExtProtocolValidatorData;
    +   validator_data->url_list        = locs;
    +   validator_data->format_opts = NULL;
    +   validator_data->errmsg          = NULL;
    +   validator_data->direction       = EXT_VALIDATE_READ;
    +   validator_data->action          = EXT_VALID_ACT_GETBLKLOC;
    +
    +   InitFunctionCallInfoData(/* FunctionCallInfoData */ fcinfo,
    +                                                    /* FmgrInfo */ 
validator_udf,
    +                                                    /* nArgs */ 0,
    +                                                    /* Call Context */ 
(Node *) validator_data,
    +                                                    /* ResultSetInfo */ 
NULL);
    +
    +   /* invoke validator. if this function returns - validation passed */
    +   FunctionCallInvoke(&fcinfo);
    +
    +   ExtProtocolBlockLocationData *bls =
    +           (ExtProtocolBlockLocationData *)(fcinfo.resultinfo);
    +   /* debug output block location. */
    +   if (bls != NULL)
    +   {
    +           ListCell *c;
    +           foreach(c, bls->files)
    +           {
    +                   blocklocation_file *blf = (blocklocation_file 
*)(lfirst(c));
    +                   elog(DEBUG3, "DEBUG LOCATION for %s with %d blocks",
    +                                        blf->file_uri, blf->block_num);
    +                   for ( int i = 0 ; i < blf->block_num ; ++i )
    +                   {
    +                           BlockLocation *pbl = &(blf->locations[i]);
    +                           elog(DEBUG3, "DEBUG LOCATION for block %d : %d, 
"
    +                                                INT64_FORMAT ", " 
INT64_FORMAT ", %d",
    +                                                i,
    +                                                pbl->corrupt, pbl->length, 
pbl->offset,
    +                                                    pbl->numOfNodes);
    +                           for ( int j = 0 ; j < pbl->numOfNodes ; ++j )
    +                           {
    +                                   elog(DEBUG3, "DEBUG LOCATION for block 
%d : %s, %s, %s",
    +                                                        i,
    +                                                        pbl->hosts[j], 
pbl->names[j],
    +                                                            
pbl->topologyPaths[j]);
    +                           }
    +                   }
    +           }
    +   }
     
    +   elog(DEBUG3, "after invoking get block location API");
    +
    +   /* get location data from fcinfo.resultinfo. */
    +   if (bls != NULL)
    +   {
    +           Assert(bls->type == T_ExtProtocolBlockLocationData);
    +           while(list_length(bls->files) > 0)
    +           {
    +                   void *v = lfirst(list_head(bls->files));
    +                   bls->files = list_delete_first(bls->files);
    +                   *blockLocations = lappend(*blockLocations, v);
    +           }
    +   }
    +   pfree(validator_data);
    +   pfree(validator_udf);
    +}
    +
    +Oid
    +LookupCustomProtocolBlockLocationFunc(char *protoname)
    +{
    +   List*   funcname        = NIL;
    --- End diff --
    
    incorrect indent


---

Reply via email to