docs: public Deferred<Boolean> syncToStorage(final TSDB tsdb, 
        final Boolean overwrite) {
      if (start_time < 1) {
        throw new IllegalArgumentException("The start timestamp has not been set");
      }
      
      boolean has_changes = false;
      for (Map.Entry<String, Boolean> entry : changed.entrySet()) {
        if (entry.getValue()) {
          has_changes = true;
          break;
        }
      }
      if (!has_changes) {
        LOG.debug(this + " does not have changes, skipping sync to storage");
        throw new IllegalStateException("No changes detected in Annotation data");
      }
      
      final class StoreCB implements Callback<Deferred<Boolean>, Annotation> {
  
        @Override
        public Deferred<Boolean> call(final Annotation stored_note) 
          throws Exception {
          final byte[] original_note = stored_note == null ? new byte[0] :
            stored_note.getStorageJSON();
          
          if (stored_note != null) {
            Annotation.this.syncNote(stored_note, overwrite);
          }
          
          final byte[] tsuid_byte = tsuid != null && !tsuid.isEmpty() ? 
              UniqueId.stringToUid(tsuid) : null;
          final PutRequest put = RequestBuilder.buildPutRequest(tsdb.getConfig(), tsdb.dataTable(),
              getRowKey(start_time, tsuid_byte), FAMILY, 
              getQualifier(start_time), 
              Annotation.this.getStorageJSON(), start_time);
          return tsdb.getClient().compareAndSet(put, original_note);
        }
        
      }
      
      if (tsuid != null && !tsuid.isEmpty()) {
        return getAnnotation(tsdb, UniqueId.stringToUid(tsuid), start_time)
          .addCallbackDeferring(new StoreCB());
      }
      return getAnnotation(tsdb, start_time).addCallbackDeferring(new StoreCB());
    }