[ https://issues.apache.org/jira/browse/STORM-876?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15015250#comment-15015250 ]
ASF GitHub Bot commented on STORM-876: -------------------------------------- Github user d2r commented on the pull request: https://github.com/apache/storm/pull/845#issuecomment-158283901 Utils.java * In general, the new methods we are adding here might be better off somewhere in the blobstore package. * Check indentation of changed code. I see some indented at 2 spaces, some at 4. Also, I see some inconsistent initial indentation. * Some of these methods are synchronized and hold a lock on Utils while they access ZK. I can see this causing lots of problems. Can we try and use more granular locking? Some of this can be helped by moving the code to a more appropriate class or namespace. ``` 447 nconf.put(Config.BLOBSTORE_CLEANUP_ENABLE, new Boolean(true)); ``` I read it is dangerous to create instances of Boolean with given values, and is preferable to use `Boolean.TRUE` and `Boolean.FALSE`. ``` 452 // Meant to be called only by the supervisor for stormjar/stormconf/stormcode files. 453 public static void downloadResourcesAsSupervisor(Map conf, String key, String localFile, 454 ClientBlobStore cb) throws AuthorizationExcep tion, KeyNotFoundException, IOException { 455 final int MAX_RETRY_ATTEMPTS = 2; 456 final int ATTEMPTS_INTERVAL_TIME = 100; 457 for (int retryAttempts = 0; retryAttempts < MAX_RETRY_ATTEMPTS; retryAttempts++) { 458 if (downloadResourcesAsSupervisorAttempt(cb, key, localFile)) { 459 break; 460 } 461 Utils.sleep(ATTEMPTS_INTERVAL_TIME); 462 } 463 //NO Exception on error the supervisor will try again after a while 464 } ``` * `conf` parameter not used. * The values here are hard-coded and are small. What benefit does the sleep have? Could we unroll the `for` loop? * If this is meant for the supervisor, does it belong in supervisor.clj? ``` 486 } finally { 487 try { 488 if (out != null) out.close(); 489 } catch (IOException ignored) {} 490 try { 491 if (in != null) in.close(); 492 } catch (IOException ignored) {} 493 } ``` * minor: braces for the `if` statements ``` 510 try { 511 ReadableBlobMeta metadata = cb.getBlobMeta(key); 512 nimbusBlobVersion = metadata.get_version(); 513 } catch (AuthorizationException | KeyNotFoundException exp) { 514 throw exp; 515 } catch (TException e) { 516 throw new RuntimeException(e); 517 } ``` Can we ever catch a `TException` here? ``` 562 // only works on operating systems that support posix 563 public static void restrictPermissions(String baseDir) { 564 try { 565 Set<PosixFilePermission> perms = new HashSet<PosixFilePermission>( 566 Arrays.asList(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE, 567 PosixFilePermission.OWNER_EXECUTE, PosixFilePermission.GROUP_READ, 568 PosixFilePermission.GROUP_EXECUTE)); 569 Files.setPosixFilePermissions(FileSystems.getDefault().getPath(baseDir), perms); 570 } catch (IOException e) { 571 throw new RuntimeException(e); 572 } 573 } ``` If this is only used by the supervisor, should we move it to supervisor.clj? ``` 627 public static byte[] thriftSerialize(TBase t) { 641 public static <T> T thriftDeserialize(Class c, byte[] b, int offset, int length) { 652 public static <T> T thriftDeserialize(Class c, byte[] b) { ``` * `thriftDeserialize(Class c, byte[] b, int offset, int length)` does not appear to be used anywhere * The other two methods look nearly identical to code that is in Trident. Could we make these common? ``` 756 * @param in InputStrem to read from ``` `InputStream` ``` 928 // java equivalent of util.on-windows? 929 public static boolean onWindows() { 930 return System.getenv("OS") == "Windows_NT"; 931 } ``` * Use `.equals` for String * Remove comment * Remove `util.on-windows?` and have clojure code call into this one. ``` 933 public static long unpack(File localrsrc, File dst) throws IOException { ``` This always returns `0`, and the only place it's called ignores the return value. We can make it `void`. ``` 1102 * Takes an input dir or file and returns the du on that local directory. Very basic ``` `du` -> `disk usage` ``` 1375 if (isSuccess != true) { ``` `!isSuccess` ``` 1405 public static synchronized void updateKeyForBlobStore (Map conf, BlobStore blobStore, CuratorFramework zkClient, String key, NimbusInfo nimbusDetails) { 1406 try { 1407 // This is to avoid mocking of unit tests at several places as nimbusDetails 1408 // and moreover the nimbusInfo is not required for HdfsBlobstore only for LocalFsBlobstore 1409 if (nimbusDetails == null) { 1410 return; 1411 } 1412 boolean isListContainsCurrentNimbusInfo = false; 1413 List<String> stateInfo = new ArrayList<String>(); ``` * Check indentation throughout this method * Remove extra space before signature in declaration * If `nimbusDetails` is not required for HdfsBlobStore, why are we returning immediately if it is `null`? Won't that break the HDFS case? * Could this be a member method of a BlobStore instead of a static method here in Utils? * No need to initialize `stateInfo` > Dist Cache: Basic Functionality > ------------------------------- > > Key: STORM-876 > URL: https://issues.apache.org/jira/browse/STORM-876 > Project: Apache Storm > Issue Type: Improvement > Components: storm-core > Reporter: Robert Joseph Evans > Assignee: Robert Joseph Evans > Attachments: DISTCACHE.md, DistributedCacheDesignDocument.pdf > > > Basic functionality for the Dist Cache feature. > As part of this a new API should be added to support uploading and > downloading dist cache items. storm-core.ser, storm-conf.ser and storm.jar > should be written into the blob store instead of residing locally. We need a > default implementation of the blob store that does essentially what nimbus > currently does and does not need anything extra. But having an HDFS backend > too would be great for scalability and HA. > The supervisor should provide a way to download and manage these blobs and > provide a working directory for the worker process with symlinks to the > blobs. It should also allow the blobs to be updated and switch the symlink > atomically to point to the new blob once it is downloaded. > All of this is already done by code internal to Yahoo! we are in the process > of getting it ready to push back to open source shortly. -- This message was sent by Atlassian JIRA (v6.3.4#6332)