docs: public static Deferred<List<Annotation>> getGlobalAnnotations(final TSDB tsdb, 
        final long start_time, final long end_time) {
      if (end_time < 1) {
        throw new IllegalArgumentException("The end timestamp has not been set");
      }
      if (end_time < start_time) {
        throw new IllegalArgumentException(
            "The end timestamp cannot be less than the start timestamp");
      }
      
      /**
       * Scanner that loops through the [0, 0, 0, timestamp] rows looking for
       * global annotations. Returns a list of parsed annotation objects.
       * The list may be empty.
       */
      final class ScannerCB implements Callback<Deferred<List<Annotation>>, 
        ArrayList<ArrayList<KeyValue>>> {
        final Scanner scanner;
        final ArrayList<Annotation> annotations = new ArrayList<Annotation>();
        
        /**
         * Initializes the scanner
         */
        public ScannerCB() {
          final byte[] start = new byte[Const.SALT_WIDTH() + 
                                        TSDB.metrics_width() + 
                                        Const.TIMESTAMP_BYTES];
          final byte[] end = new byte[Const.SALT_WIDTH() + 
                                      TSDB.metrics_width() + 
                                      Const.TIMESTAMP_BYTES];
          
          final long normalized_start = (start_time - 
              (start_time % Const.MAX_TIMESPAN));
          final long normalized_end = (end_time - 
              (end_time % Const.MAX_TIMESPAN) + Const.MAX_TIMESPAN);
          
          Bytes.setInt(start, (int) normalized_start, 
              Const.SALT_WIDTH() + TSDB.metrics_width());
          Bytes.setInt(end, (int) normalized_end, 
              Const.SALT_WIDTH() + TSDB.metrics_width());
  
          scanner = tsdb.getClient().newScanner(tsdb.dataTable());
          scanner.setStartKey(start);
          scanner.setStopKey(end);
          scanner.setFamily(FAMILY);
        }
        
        public Deferred<List<Annotation>> scan() {
          return scanner.nextRows().addCallbackDeferring(this);
        }
        
        @Override
        public Deferred<List<Annotation>> call (
            final ArrayList<ArrayList<KeyValue>> rows) throws Exception {
          if (rows == null || rows.isEmpty()) {
            return Deferred.fromResult((List<Annotation>)annotations);
          }
          
          for (final ArrayList<KeyValue> row : rows) {
            for (KeyValue column : row) {
              if ((column.qualifier().length == 3 || column.qualifier().length == 5) 
                  && column.qualifier()[0] == PREFIX()) {
                Annotation note = JSON.parseToObject(column.value(),
                    Annotation.class);
                if (note.start_time < start_time || note.end_time > end_time) {
                  continue;
                }
                annotations.add(note);
              }
            }
          }
          
          return scan();
        }
        
      }
  
      return new ScannerCB().scan();
    }