accumulo-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ctubbsii <...@git.apache.org>
Subject [GitHub] accumulo pull request #292: ACCUMULO-4681 Created Table & Namespace WeakRefe...
Date Mon, 14 Aug 2017 21:46:11 GMT
Github user ctubbsii commented on a diff in the pull request:

    https://github.com/apache/accumulo/pull/292#discussion_r133070150
  
    --- Diff: core/src/main/java/org/apache/accumulo/core/client/impl/Table.java ---
    @@ -16,24 +16,59 @@
      */
     package org.apache.accumulo.core.client.impl;
     
    +import java.lang.ref.WeakReference;
    +import java.util.WeakHashMap;
    +
     import org.apache.accumulo.core.client.Instance;
     
     public class Table {
     
       /**
        * Object representing an internal table ID. This class was created to help with type
safety. For help obtaining the value of a table ID from Zookeeper, see
        * {@link Tables#getTableId(Instance, String)}
    +   *
    +   * Uses an internal WeakHashMap and private constructor for storing a WeakReference
of every Table.ID. Therefore, a Table.ID can't be instantiated outside
    +   * this class and is accessed by calling Table.ID.{@link #of(String)}.
        */
       public static class ID extends AbstractId {
         private static final long serialVersionUID = 7399913185860577809L;
    +    static final WeakHashMap<String,WeakReference<Table.ID>> tableIds = new
WeakHashMap<>();
     
    -    public static final ID METADATA = new ID("!0");
    -    public static final ID REPLICATION = new ID("+rep");
    -    public static final ID ROOT = new ID("+r");
    +    public static final ID METADATA = of("!0");
    +    public static final ID REPLICATION = of("+rep");
    +    public static final ID ROOT = of("+r");
     
    -    public ID(final String canonical) {
    +    private ID(final String canonical) {
           super(canonical);
         }
    +
    +    /**
    +     * Get a Table.ID object for the provided canonical string.
    +     *
    +     * @param canonical
    +     *          table ID string
    +     * @return Table.ID object
    +     */
    +    public static Table.ID of(final String canonical) {
    +      return dedupeTableId(canonical);
    +    }
    +
    +    private static Table.ID dedupeTableId(String tableIdString) {
    +      Table.ID tableId;
    +      synchronized (tableIds) {
    +        WeakReference<Table.ID> tableIdRef = tableIds.get(tableIdString);
    +        if (tableIdRef != null) {
    +          tableId = tableIdRef.get();
    +          if (tableId != null) {
    +            return tableId;
    +          }
    +        }
    +
    +        tableId = new ID(tableIdString);
    +        tableIds.put(tableIdString, new WeakReference<>(tableId));
    --- End diff --
    
    The main point is that these objects, even the extra String instances, would only be created
when needed. Usually, the previous instance would be used. Still can't avoid the potential
duplicates I mentioned earlier, unless you force removal of the old value before calling `put`
in the case where `ref != null && ref.get() == null`, but the new String instances
should dramatically decrease the liklihood of this happening, and a few dupes are probably
okay.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---

Mime
View raw message